Arduino - Spara en position i minnet

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Arduino - Spara en position i minnet

Inlägg av fosfor »

Hej!

Jag har ett program där sensorer räknar hur många pulser min motor snurrar åt ena eller andra hållet.
Så jag kan få på min 2x16 LCD en siffra vart motorn är någonstans pulsmässigt. Motorn snurrar sålänge knappen hålls ned.

Jag skulle vilja spara en position. T.ex. om jag stannar på puls 588, spara den position med en knapptryckning, och sedan när jag passerar den siffran igen, eller kör över den siffran så att säga, så ska motorn stanna tillfälligt. :humm:
Antingen att den stannar någon sekund, eller att den stannar och att man måste lyfta 'kör' knappen och trycka ner den igen.

Skulle vara tacksam om någon har ett tips, eller kan peka mig i rätt riktning.

Önskar alla en trevlig fredag och helg. :)
Mvh F
Senast redigerad av fosfor 2 mars 2018, 15:38:30, redigerad totalt 2 gånger.
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Arduino - Spara en position i minnet

Inlägg av GeekJoan »

Får jag se ditt program så går det lättare.
Låter som en enkel grej att fixa.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Arduino - Spara en position i minnet

Inlägg av fosfor »

Kod: Markera allt



//  ---- MOTOR CONST INTARNA  ----
const int controlPin1 = 7;
const int controlPin2 = 6;
const int enablePin = 9;


#include <Wire.h>
#include <LiquidCrystal_I2C.h>


// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
char lineText[]="  Hoy!  ";
int sensor01;
int sensor02;
int stepOld;
int step;
long PulseCount;


// ---- MOTOR TEST INT ---------------------------------------------------------------------------------
int intest1Pin = 4;        // KNAPP  -  GRÅ   - Går åt plus hållet    - UPP
int intest2Pin = 5;        // KNAPP  -  GRÖN  - Går åt minus hållet   - NER
int intest3Pin = 10;       // KNAPP  -  SVART - Ej något än
int intest4Pin = 11;       // KNAPP  -  BLÅ   - Ej något än
int stopsensor2Pin = 8;    // SENSOR -  GRÅ   - Enskild sensor - UPP STOPP
int stopsensor1Pin = 12;   // SENSOR -  GRÖN  - Enskild sensor - NER STOPP
int val = 0;

int tonePin = 13;          // ---- HÖGTALARE



// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN - I2C
// initialize the library with the numbers of the interface pins
// 0x27 adressen hittades via I2C scanner på den med svart tejp - De andra hade 0x3F
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 

// Aktivera denna rad, och av-avaktivera den ovanför, om någon av de andra displayerna ska användas
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 


// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
#define SENSOR_A 3
#define SENSOR_B 2

// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
void checkState()
{
  sensor01 = digitalRead(SENSOR_A);
  sensor02 = digitalRead(SENSOR_B);

  if(sensor01 == 1 && sensor02 == 1){
    step = 0;
    if(stepOld == 1){
      PulseCount--;
    }
    if(stepOld == 3){
      PulseCount++;
    }
    stepOld = 0;
  }

  if(sensor01 == 0 && sensor02 == 1){
    step = 1;
    if(stepOld == 2){
      PulseCount--;
    }
    if(stepOld == 0){
      PulseCount++;
    }
    stepOld = 1;
  }

  if(sensor01 == 0 && sensor02 == 0){
    step = 2;
    if(stepOld == 3){
      PulseCount--;
    }
    if(stepOld == 1){
      PulseCount++;
    }
    stepOld = 2;
  }

  if(sensor01 == 1 && sensor02 == 0){
    step = 3;
    if(stepOld == 0){
      PulseCount--;
    }
    if(stepOld == 2){
      PulseCount++;
    }
    stepOld = 3;
  }
}


// VOID SETUP - KÖRS BARA EN GÅNG I BÖRJAN, EN FÖRBEREDELSE, LOOP ÄR EXEKVERING OCH GÖR DET MESTA JOBBET
// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN

void setup() 
{
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.setCursor(0, 0);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print("                ");

  attachInterrupt(0, checkState, CHANGE);
  attachInterrupt(1, checkState, CHANGE);

  PulseCount = 0;





  // TEST MOTOR  - VOID SETUP ---------------------------------------------------------------------------------
  pinMode(intest1Pin, INPUT);         //Declarar denna som input  UNO input är 4    grå
  pinMode(intest2Pin, INPUT);         //Declarar denna som input  UNO input är 5    grön
  pinMode(intest3Pin, INPUT);         //Declarar denna som input  UNO input är 10   blå
  pinMode(intest4Pin, INPUT);         //Declarar denna som input  UNO input är 11   blå
  pinMode(stopsensor1Pin, INPUT);     //Declarar denna som input  UNO input är 12   grön
  pinMode(stopsensor2Pin, INPUT);     //Declarar denna som input  UNO input är 8    grå

  // Högtalare
  pinMode(tonePin, OUTPUT);
  

//  ---- LCD start presentationen
{

lcd.setCursor(2, 0);
lcd.print("PRO"); 
delay(500);
// lcd.clear();

lcd.setCursor(11, 1);
lcd.print("9");
delay(100);

lcd.setCursor(11, 1);
lcd.print("90");
delay(100);

lcd.setCursor(11, 1);
lcd.print("90E");
delay(900);
lcd.clear();

lcd.setCursor(2, 0);
lcd.print("Prototype 1.0");
delay(200);

lcd.setCursor(0, 1);
lcd.print("www.");
delay(100);

lcd.setCursor(12, 1);
lcd.print(".se");
delay(100);

lcd.setCursor(0, 1);
lcd.print("www.PRO");
delay(250);

lcd.setCursor(0, 1);
lcd.print("www.PRO");
delay(800);
lcd.clear();

  }
}





void loop()


{

  // DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
  // LCD set the cursor to column 0, line 1 (note: line 1 is the second row, since counting begins with 0):
  
  lcd.setCursor(0, 0);

  lcd.print("Pulses:");
  if(PulseCount > -1){
    lcd.print(" ");
  }

  if(PulseCount < 10 && PulseCount > -10){
    lcd.print(" ");
  }

  if(PulseCount < 100 && PulseCount > -100){
    lcd.print(" ");
  }

  lcd.print(PulseCount);
  if(sensor01 == 1){
    lcd.print(" HIGH");
  }
  else{
    lcd.print(" LOW ");
  }

  lcd.setCursor(0, 1);

  if(sensor02 == 1){
    lcd.print("            HIGH");
  }
  else{
    lcd.print("            LOW ");
  }






//  ---- MOTORNS VOID LOOP  - KNAPPSTYRNINGEN TILL MOTORERNA ----

// intest 1 ÅKER UPP
// intest 2 ÅKER NER
// stopsensor1Pin heter stoppsensorn
// stopsensor2Pin heter stoppsensorn

{

// ---- ÅKER UPP ----
  val = digitalRead(intest1Pin);         // UPP - Läser input värde
  if (val == HIGH)                       // Checkar om knappen trycks
  {                     
  digitalWrite(controlPin1, HIGH);       
  digitalWrite(controlPin2, LOW);

// -- Detta är sensorn som, om täcks, hindrar motorn från att åka ner
  {
  val = digitalRead(stopsensor2Pin);         // Sensorn som stoppar motorn
  if (val == HIGH) {                     
  digitalWrite(controlPin1, LOW);

// -- Dessa 3 rader visar STOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
    lcd.setCursor(0, 1);
    lcd.print("STOP");
    delay(50);

// -- Dessa tre rader nedanför gör pipljudet när stopsensorn (ovan) täcks
  tone(tonePin, 880, 125);
  delay(650);
  noTone(tonePin);
  }


// -- Dessa 3 rader visar text när nedåtknapp trycks NED - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
  lcd.setCursor(0, 1);
  lcd.print("Up");
  delay(50);
  }
  }




// ---- ÅKER NER ----
  else {
  val = digitalRead(intest2Pin);         // NER - Läser input värde
  if (val == HIGH) {                     // Checkar om knappen trycks
  digitalWrite(controlPin1, LOW);       
  digitalWrite(controlPin2, HIGH);

// -- Detta är sensorn som, om täcks, hindrar motorn från att åka ner
  {
  val = digitalRead(stopsensor1Pin);         // Sensorn som stoppar motorn
  if (val == HIGH) {                     
  digitalWrite(controlPin2, LOW);

// -- Dessa 3 rader visar STOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
    lcd.setCursor(0, 1);
    lcd.print("STOP");
    delay(50);

// -- Dessa tre rader nedanför gör pipljudet när stopsensorn (ovan) täcks
  tone(tonePin, 880, 125);
  delay(650);
  noTone(tonePin);
  }

// -- Dessa 3 rader visar DOWN när nedåtknapp trycks NED - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
    lcd.setCursor(0, 1);
    lcd.print("Down");
    delay(50);
  }


// -- Dessa två rader stoppar motorn när man släpper knappen
  }  else 
  {
  digitalWrite(controlPin1, LOW);        
  digitalWrite(controlPin2, LOW);       
  }

  
}
}
}





Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Arduino - Spara en position i minnet

Inlägg av fosfor »

NÅT tips?
Användarvisningsbild
Andax
Inlägg: 4373
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: Arduino - Spara en position i minnet

Inlägg av Andax »

Man kan spara parametrar i EEPROM. Vissa mcu har en liten mängd EEPROM inbyggt.
Användarvisningsbild
Mickecarlsson
EF Sponsor
Inlägg: 3745
Blev medlem: 15 april 2017, 18:06:15
Ort: Malmö
Kontakt:

Re: Arduino - Spara en position i minnet

Inlägg av Mickecarlsson »

Du hittar det du behöver på denna sida: https://www.arduino.cc/en/Reference/EEPROM
Tänk bara på att för många writes till samma position kommer att förstöra cellen så småningom.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino - Spara en position i minnet

Inlägg av sodjan »

Behöver den "minnas" positionen även om utrustningen stängs av?
Om inte så kan du ju bara spara det i en variabel i programmet. Om
det måste sparas över omstarter så får det bli EEPROM.
Användarvisningsbild
jesse
Inlägg: 9233
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Arduino - Spara en position i minnet

Inlägg av jesse »

Det är inte du själv som har skrivit programmet?
Så jag kan få på min 2x16 LCD en siffra vart motorn är någonstans pulsmässigt.
Var i programmet har du raden som skriver ut den siffran?

EDIT: ok, rad 206 : PulseCount...


OK.... du har funktionen checkState() som verkar ligga som ett interrupt. Det är där variabeln PulseCount räknar upp eller ner.
jag föreslår att du ändrar i koden på två (eller tre) ställen....

Först, i huvudloopen, läser du in tillståndet på den knapp du ska trycka på för att registrera motorns läge. När tillståndet ÄNDRAS från icke-nedtryckt till nedtryckt sätter du en flagga (en global boolsk variabel som deklarerats som volatile).
Flaggan läser du av i slutet av interruptrutinen (alltså i CheckState). Om flaggan är etta så nollställer du flaggan samt sparar PulseCount i en annan global (volatile) variabel.
För att kolla vad som händer kan du ju i huvudloopen skriva ut värdet av den sparade variabeln, så ser du om det funkar.

Nästa steg är att i slutet av samma interruptrutin INNAN du kollar flaggan, jämför du det sparade värdet med PulseCount. Om de är lika så triggar du en annan global volatile flagga (dvs sätter till etta, eller true) som du sedan läser av i huvudloopen - där nollställer du flaggan och utför vad som ska göras (t.ex. stoppa motorn).

kanske var det en ledtråd?
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Arduino - Spara en position i minnet

Inlägg av fosfor »

Tack för svar!

Det vore bra om en position kan sparas så att den är kvar även när maskinen ska startas igen.
Det ska inte sparas många positioner, egentligen bara en enda, eller max två. Då skulle jag vara i mål.
De sparas inte ofta heller, egentligen räcker det med att man spar dom en gång så kan det räcka månader sen.
Så inget ständigt read/write eller så.

Vill helt enkelt bara kunna spara en position för att få motorn att kunna köra dit när man vill.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Arduino - Spara en position i minnet

Inlägg av johano »

Vad är egentligen frågan?
jesse har ju beskrivit stegen som skall till för att göra det. Andra har nämnt eeprom för att lagra data persistent mellan omstarter.
Kombinera dessa två så är du hemma.

/K
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Arduino - Spara en position i minnet

Inlägg av fosfor »

Ursäkta
Jag är nybörjare, det vore toppen om det finnas några exempel jag kan titta på?
Så att jag har än mer att gå på utöver de fina beskrivningarna jag fått här.
Jag hänger ibland inte med på slangen och benämningarna för olika saker.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Arduino - Spara en position i minnet

Inlägg av johano »

fosfor skrev:Ursäkta
Jag är nybörjare, det vore toppen om det finnas några exempel jag kan titta på?
Så att jag har än mer att gå på utöver de fina beskrivningarna jag fått här.
Jag hänger ibland inte med på slangen och benämningarna för olika saker.
Det var absolut inte meningen att vara dryg med min kommentar.
Men, det ter sig för mig väldigt konstigt om du inte kan lägga till dessa
nya funktioner med tanke på att du redan snickrat ihop det tämligen komplexa
program du postade tidigare(!?)

/j
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Arduino - Spara en position i minnet

Inlägg av fosfor »

Håller med. Jag är nästan lite förvånad själv att jag fått det fungera.
Det har blivit en hel del trial and error :lol:
En nackdel är att jag då och då måste göra annat, så själva "helhetsbilden" som jag ibland
nästan har fingret lite på då hinner glömmas bort, så det blir lite börja om från början när jag ska sätta mig igen med den.
Läsa om vad det vad kommandon betydde osv.
Bästa hade ju varit om man kunnat sitta med den varje dag från start till stopp. :roll:
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino - Spara en position i minnet

Inlägg av Icecap »

fosfor: jag har själv - pga. mina handikapp - problem med att överskåda helheten i projekt.

Jag bryter därför ner projekt i delar.

Gammalt exempel: (mitt första kommersiella program)
3 elektriska ugnar ska styras efter var sin temperaturkurva.
I grunden x°C/timme till inställd värde (t.ex. 1100°C), hålla tempen ett tag, sedan sänka med y°C/timme - men kan vara mer komplicerat.

Input-media:
4*4 t-bord.
Output-medie:
Monitor.

Då jag satt o tittade på det fick jag lite panik: hur fan skulle jag skruva ihop detta?

Men logiken sa att jag MÅSTE ha:
* En tidsräknare.
* En t-bords avkänning.
* En utskriftsrutin.
* En uträkning av vilken temperatur som det ska vara baserat på tiden och start-temperatur samt var i tabellen man är.
* Ett koll av var i tabellen man är för att sekvensera genom det hela.
* En inläsning av temperaturer.
Det var nog lite mer småkrafs...

Jag gjorde sedan en sak åt gången klar och testade varje del.

Sedan hade jag ett ramverk som tog hand om allt det "tråkiga" och efter att ha sytt ihop de funktioner på det enda sätt jag kunde se det skulle fungera på testade vi systemet.

Första testen skarpt fungerade utan problem.

Så del upp ditt projekt, klura ut vilka funktioner du behöver och sedan sätter du dig vid datorn och börjar.
Skriv svar