betepok Napisano Grudzień 20, 2015 Udostępnij Napisano Grudzień 20, 2015 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); }
deshipu Grudzień 20, 2015 Udostępnij Grudzień 20, 2015 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.
marek1707 Grudzień 20, 2015 Udostępnij Grudzień 20, 2015 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); } 1
betepok Grudzień 20, 2015 Autor tematu Udostępnij Grudzień 20, 2015 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); }
marek1707 Grudzień 20, 2015 Udostępnij Grudzień 20, 2015 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); } 1
betepok Grudzień 20, 2015 Autor tematu Udostępnij Grudzień 20, 2015 "Oczom ich ukazał się las..." Dzięki
Pomocna odpowiedź
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ę »