Skocz do zawartości

EEPROM zapis 0,56


Pomocna odpowiedź

Napisano

Witam

W jednym z projektów chcę zapisać do pamięci EEPROM liczbę po przecinku (0.51).

Co do liczb całkowitych od 0 do 255 zastosowaną teorie znam i z powodzeniem stosuję.

W sieci znalazłem coś takiego link. Nie ogarniam tego 😕 . Biblioteka załadowana (EEPROMAnything.h) wszystko się kompiluje ale jak zapisać i następnie wyświetlić wartość?

#include <EEPROM.h>
#include "EEPROMAnything.h"

float wartosc;

struct config_t
{
   long alarm;
   int mode; 
} configuration;

void setup(){
 Serial.begin(9600);

 {
    EEPROM_writeAnything(0, configuration);

 }
}
void loop(){

       wartosc = EEPROM_readAnything(0, configuration);
       Serial.println(wartosc);

       delay(500);
}

Generalnie do EEPROM zapisujesz bajty, a nie "liczbę po przecinku". Czyli jak chcesz zapisać tam coś typu float, to musisz przy zapisywaniu rozbić to na poszczególne bajty, zapisać, a potem przy odczytywaniu te bajty z powrotem do typu float złożyć. Jest wiele sposobów na to, osobiście lubię używać typu union do tego. Polecam doczytać w dowolnie wybranym podręczniku do C.

Czego nie ogarniasz? Obie funkcje zostały napisane jako szablony (template). Oczekują adresu EEPROMu i referencji do zmiennej którą zapisujesz lub odczytujesz. Obie oddają liczbę bajtów zajmowanych przez zmienną - to może się przydać gdy będziesz zapisywał lub odczytywał więcej rzeczy po kolei.

#include <EEPROM.h> 
#include "EEPROMAnything.h" 

float wartosc; 

void setup(){ 
 Serial.begin(9600); 

 { 
    wartość = 0.57;
    EEPROM_writeAnything(0, wartosc); 
 } 
} 
void loop(){ 

       EEPROM_readAnything(0, wartosc); 
       Serial.println(wartosc); 

       delay(500); 
}
  • Pomogłeś! 1

No tak - najciemniej pod latarnią. Dzięki "marek1707"

Działa jak należy. Myślałem jeszcze o przedłużeniu żywota pamięci. Czyta tylko wartość z pamięci (0.51) 🙁

#include <EEPROM.h> 
#include "EEPROMAnything.h" 

float wartosc; 
float waga;
void setup(){ 
 Serial.begin(9600); 


wartosc = 0.78;    //wiem ze w pamieci 0.51
if ( wartosc != EEPROM_readAnything(0, wartosc)){

    EEPROM_writeAnything(0, wartosc); 
   }

} 

void loop(){ 

       EEPROM_readAnything(0, wartosc); 
       Serial.println(wartosc); 

       delay(500); 
}

Oczywiście, warto zapisywać do EEPROMu tylko wtedy gdy coś się zmieniło. Tylko, że nie w ten sposób. Jak już napisałem wartością funkcji odczytującej jest liczba bajtów czyli długość zmiennej. W tym przypadku wartością wyrażenia EEPROM_readAnything(0, wartosc) jest zawsze 4, bo tyle bajtów zajmuje zmienna typu float w pamięci RAM. Musisz najpierw odczytać do innej zmiennej a potem ją porównać z tym czego oczekujesz:

#include <EEPROM.h> 
#include "EEPROMAnything.h" 

float wartosc;
float cotamjest;
float waga; 
void setup(){ 
 Serial.begin(9600); 


wartosc = 0.78;    //wiem ze w pamieci 0.51 
EEPROM_readAnything(0, cotamjest);
if ( wartosc != cotamjest){ 
    EEPROM_writeAnything(0, wartosc); 
   } 

} 

void loop(){ 

       EEPROM_readAnything(0, wartosc); 
       Serial.println(wartosc); 

       delay(500); 
}
  • Pomogłeś! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...