Hämta siffra från minnet till en kodsnutt - Arduino

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:

Hämta siffra från minnet till en kodsnutt - Arduino

Inlägg av fosfor »

Hej! Arduinofråga.

Jag sparar en siffra i EEPROM minnet, jag kan bekräfta att siffran sparats med EEPROM.get och få det att visas på LCD. Även vid off/on av Arduinon.
Positionen i koden här nedan är "permanent" (och inte rätt för syftet), dvs när motorns sensorer passerar mellan 280-320 pulser, så pausar motorn en sekund. :tumupp:
(Motorn går så snabbt, att jag måste ha inom dessa värde för att den ska hinna reagera, annars hinner den swisha förbi). :bravo:
Jag vill att den ska uppdatera denna position själv, utan att jag skriver om koden.
Det jag skulle vilja ha är att denna kodsnutt på nåt sätt är "dynamisk" och hela tiden är så att säga medveten om siffran som ligger i EEPROM.
Så att om jag sparar en ny position, så är det där den ska stanna framöver. Vill att kodsnutten läser av siffran i EEPROM'et.
Någon som har något bra tips på hur jag bör göra? :humm:

OBSERVERA, minnet skrivs till Väldigt sällan. Kanske 1 gång i månaden eller mindre. Däremot kommer det läsas lite oftare.

Kod: Markera allt

// -- Dessa rader stoppar motorn 1 sek när den är inom värdet, men bara när man kör NED
// -- Det är dessa rader jag vill kunna programmera så att de vet vad EEPROM värdet är.
{
  if(PulseCount < 320 && PulseCount > 280){
  digitalWrite(controlPin1, LOW);        
  digitalWrite(controlPin2, LOW);
    lcd.setCursor(0, 1);
    lcd.print("Program 2");
    Serial.println("Programmed stop 2 activated ⛔");
      delay(1000);
  } 
tingo
Inlägg: 285
Blev medlem: 17 maj 2017, 17:55:40
Ort: Oslo, Norge

Re: Hämta siffra från minnet till en kodsnutt - Arduino

Inlägg av tingo »

Litt pseudokode
PulseCount< - les fra EEPROM
Hysterese = 40
sammenlign i koden din mot < PulseCount, og > (PulseCount - Hysterese)
og så er du i gang.
Hvis det trengs, så kan du lagre hysterese i EEPROM også.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Hämta siffra från minnet till en kodsnutt - Arduino

Inlägg av fosfor »

Sorry... dont understand a thing.
Can you please take it in english?
Premix
Inlägg: 140
Blev medlem: 15 april 2004, 21:58:05
Ort: Trollhättan

Re: Hämta siffra från minnet till en kodsnutt - Arduino

Inlägg av Premix »

När du bootar upp läser du från eeprom till en variabel. Sen tar du (utläst värde - 20) och lagrar i en iMin variabel.
Sen samma sak fast + 20 och lagrar i iMax.
I din kod byter du ut dina fasta värden mot iMax och iMin.

När du lagrar en ny pos till eeprom så uppdaterar du variablerna samtidigt.

Minimalt med skriv o läs till eeprom.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Hämta siffra från minnet till en kodsnutt - Arduino

Inlägg av fosfor »

Premix:
Jag ska tillägga att jag är nybörjare så jag hänger inte med riktigt :P
Ok så jag bootar upp, då läggs den långt upp i koden, void setup? som en variabel... En: int inputVariable; 0 ?
Men hur läser jag från EEPROM till en variabel? Detta?

Kod: Markera allt

 float f = 0.00f;   //Variable to store data read from EEPROM.
  int eeAddress = 0; //EEPROM address to start reading from 
iMin variabel, was is dat? För att den ska hajja att läsa inom det värdet så att säga?
Var lägger man en iMin variabel?
Och hur får jag variablerna att uppdateras varje gång jag sparar i EEPROM? :humm:
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Hämta siffra från minnet till en kodsnutt - Arduino

Inlägg av sodjan »

Ofta så är ju det som är sparat i EEPROM bara en kopia på
variabeln i programmet, d.v.s. själva källan till uppdateringen
av EEPROM'et. Och då finns det ju ingen anledning att direkt
läsa tillbaka värdet, du har ju redan rätt värde i programmet.

Det är ju inte så att EEPROM bara uppdateras helt magiskt på något
sätt, värdet som skrivs till EEPROM måste ju komma från din kod.

Om du behöver värdet i någon annan variabel så är det ju bara
att kopiera värdet som vanligt.
SeniorLemuren
Inlägg: 7779
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Hämta siffra från minnet till en kodsnutt - Arduino

Inlägg av SeniorLemuren »

Här har du ett exempel på att spara variabler i EEPROM

Kod: Markera allt

#include <EEPROM.h>

struct MyObject {
  int field1;
  int field2;  
};

void setup() {
  Serial.begin(9600); 
  int eeAddress = 0;   //Adress till data i eepromet.

  //Data som sparas till eeprom.
  MyObject customVar = {
    40,
    280
  };
  
  EEPROM.put(eeAddress, customVar);
 }
void loop() {  
}
Här har du ett exempel på hur du läser det sparade och sätter in vädena i en if-sats.
Om du öppnar seriemonitorn så kan du se att det funkar. Testa med olika värden på :int pulseCount.

Kod: Markera allt

#include <EEPROM.h>

struct MyObject{
  int field1;
  int field2;  
};
//Ta bort denna rad när du får in pulseCount från pusgivare
int pulseCount = 290; // Detta är ett testvärde. 


void setup(){ 
  int eeAddress = 0; //EEPROM address att starta läsning från
  Serial.begin( 9600 );  
  MyObject customVar; //Variable att spara custom object read från EEPROM.
  EEPROM.get( eeAddress, customVar );
 Serial.print( "Hysteres från eepromet: " );
  Serial.println( customVar.field1 );
  Serial.print( "Låga gränsvärdet från eeprom: " );
  Serial.println( customVar.field2 );
  int tal1 =  customVar.field1;
  int tal2 = customVar.field2;
  Serial.print( "PulseCount: " );  
  Serial.println( pulseCount );
  if(pulseCount >= tal2 && pulseCount <= tal2 + tal1){ 
    Serial.println("Pulsecount inom intervall");
    }else{
      Serial.println("Pulsecount utanför intervall");
  }
}

void loop(){ 

}
Det finns säkert andra sätt att lösa detta på som andra kommer att föreslå.

Edit: Om du inte vill spara hysteresen så kan du skippa struct.

Kod: Markera allt

#include <EEPROM.h>

int eepromValue ;
int pulseCount  = 340;  
  
void setup(){ 
  int eeAddress = 0; //EEPROM address att starta läsning från
  Serial.begin( 9600 );  
  EEPROM.get( eeAddress,  eepromValue ); 
  Serial.print( "Låga gränsvärdet från eeprom: " );
  Serial.println( eepromValue);   
  Serial.print( "PulseCount: " );  
  Serial.println( pulseCount );
  if(pulseCount >=  eepromValue && pulseCount <=  eepromValue +40){ 
    Serial.println("Pulsecount inom intervall");
    }else{
      Serial.println("Pulsecount utanför intervall");
  }
}
Skriv svar