• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Zapis do EEPROM
#1
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?
 
Odpowiedź
#2
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 */
}
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
(02-04-2020, 19:28)kaczakat napisał(a): 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 */
}
Dzięki Wink
 
Odpowiedź
#4
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);
}
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#5
przesunięcie o 16 i 24 w lewo nie zadziała na AVR GCC chyba, że powstała jakaś nowsza wersja.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości