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); } Link do komentarza Share on other sites More sharing options...
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. Link do komentarza Share on other sites More sharing options...
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 Link do komentarza Share on other sites More sharing options...
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); } Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
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 Link do komentarza Share on other sites More sharing options...
betepok Grudzień 20, 2015 Autor tematu Udostępnij Grudzień 20, 2015 "Oczom ich ukazał się las..." Dzięki Link do komentarza Share on other sites More sharing options...
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ę »