Mam sobie liczbę 3 cyfrową np. 154. Płytka UNO. Zapisuję tą liczbę EEPROM w 3 komórkach dziesiątki, jedności i setki. Chciałbym aby naciśnięcie przycisku zwiększało mi komórkę jedność. Napisałem więc taką funkcję którą przywołuję po naciśnięciu przycisku.
Kod:
void wagaplus()
{
byte count_setki = EEPROM.read(2);
byte count_dziesiatki = EEPROM.read(3);
byte count_jednosci = EEPROM.read(4);
EEPROM.update(4, count_jednosci+1);
delay(50);
}
Jak ugryźć temat i zrobić tak aby przytrzymanie przycisku przez dłuższy czas powodowało tylko zwiększenie jedności do 9, następne przyciśnięcie powinno w jednośćiach w EEPROM zapisać 0 a w dziesiątkach 1.
A może jest prostszy sposób zapisywania liczby trzycyfrowej w EEPROM?
Liczba trzycyfrowa to wystarczy zmienna int. Tu masz przykład zapisu dowolnej* zmiennej lub całego ich zestawu:
Kod:
#include <EEPROM.h>
int minuta;
byte godzina;
byte flagazapisu;
float temperatura;
int address;
struct save {
byte godz;
int minuta;
float temp;
};
save zmiennakonfiguracyjnatypusave ={ 22,55,22.22};
void setup() {
save dane2={0,0,0}; //nowa zmienna typu save
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
godzina=zmiennakonfiguracyjnatypusave.godz;
minuta=zmiennakonfiguracyjnatypusave.minuta; //to sa rozne zmienne
temperatura=zmiennakonfiguracyjnatypusave.temp;
Serial.println("co my tu mamy po uruchomieniu, zmienne domyslne z flash");
Serial.print("Godzina: ");
Serial.println(godzina);
Serial.print("minuta: ");
Serial.println(minuta);
Serial.print("Temperatura: ");
Serial.println(temperatura);
Serial.println("Zmienne domyslne z EEPROM");
flagazapisu=EEPROM.read(address);
if (flagazapisu==55)
{
address++;
EEPROM.get(address, dane2);
godzina=dane2.godz;
minuta=dane2.minuta; //to sa rozne zmienne
temperatura=dane2.temp;
Serial.print("GodzinaE: ");
Serial.println(godzina);
Serial.print("MinutaE: ");
Serial.println(minuta);
Serial.print("TemperaturaE: ");
Serial.println(temperatura);
}
else
{
Serial.println ("Nie bylo nic w EEPROMmie");
}
//zapisujemy nowe dane do EEPROM:
godzina++;
if (godzina>=24) godzina=0;
minuta++;
if (minuta>=60) minuta=0;
temperatura+=1;
if (temperatura>=100000) Serial.println("Pewnie już nie ma Eeprom, sporo zapisow");
zmiennakonfiguracyjnatypusave={godzina,minuta,temperatura};
dane2=zmiennakonfiguracyjnatypusave;//tylko tak dla jaj
address=0;
EEPROM.update(address, 55);
address++;
EEPROM.put(address, dane2);
zmiennakonfiguracyjnatypusave ={ 22,55,22.22};
address += sizeof(dane2); //Move address to the next byte after float 'f'.
EEPROM.put(address,zmiennakonfiguracyjnatypusave);
EEPROM.get(address, dane2);
godzina=dane2.godz;
minuta=dane2.minuta; //to sa rozne zmienne
temperatura=dane2.temp;
Serial.println("Zmienne odczyte z drugiego kompletu EEPROM");
Serial.print("GodzinaE2: ");
Serial.println(godzina);
Serial.print("MinutaE2: ");
Serial.println(minuta);
Serial.print("TemperaturaE2: ");
Serial.println(temperatura);
}
void loop() {
/* Empty loop */
}
Ja napisałem kiedyś coś takiego i nic Ci więcej do szczęścia nie trzeba:
Kod:
void save(int adres, long value)// UWAGA!!! value zajmuje cztery bajty!!!
{
byte jeden = (value & 0xFF);// nie chce mi sie dzielic liczb
byte dwa = ((value >> 8) & 0xFF);//wiec zrobie przesuniecie bitowe
byte trzy = ((value >> 16) & 0xFF);
byte cztery = ((value >> 24) & 0xFF);
EEPROM.update(adres, jeden); // jesli wartosc sie nie zmienila
EEPROM.update(adres + 1, dwa); // to nie zapisuj
EEPROM.update(adres + 2, trzy); // to zaoszczedzi zywotnosci kosci
EEPROM.update(adres + 3, cztery);
}
long load(long adres)
{
long cztery = EEPROM.read(adres);
long trzy = EEPROM.read(adres + 1);
long dwa = EEPROM.read(adres + 2);
long jeden = EEPROM.read(adres + 3);
return ((cztery << 0) & 0xFF) + ((trzy << 8) & 0xFFFF) + ((dwa << 16) & 0xFFFFFF) + ((jeden << 24) & 0xFFFFFFFF);
}
przesunięcie o 16 i 24 w lewo nie zadziała na AVR GCC chyba, że powstała jakaś nowsza wersja.