Belső EEPROM használata

Tartalom:

  • Adatok tárolása a belső eeprom-ban, függvények az eeprom íráshoz és olvasáshoz
  • Különféle típusú változók tárolása az EEPROM.put() függvénnyel
  • Példaprogram a különféle változók tárolásának megismeréséhez
  • Struktúrák adatainak tárolása
  • String típus tárolási problematika az EEPROM.put() függvény esetén
  • Az eeprom adattérképe különféle változók írása után

————————————————————————————–

Amikor először használtam az ATmega chip belső eeprom-ját, nem néztem meg alaposan az eeprom kezelésére rendelkezésre álló könyvtárat. Azt hittem, csak byte-onként lehet írni az eeprom-ba, illetve olvasni onnan. Nehezen boldogultam ez első long változó kiírásával, mert az ugye 4 byte-os, és nem triviális, hogyan kell byte-onként felbontani. Sikerült! Elkezdtem írni egy általános kezelő függvényt, amivel mindenféle típusú változókat lehet használni. Felesleges volt! Egy ennyire gyakran felmerülő problémára már van a világban megoldás, csak szét kell nézni. Persze alaposabban mint én tettem! Szerencsére időben felfedeztem, hogy az EEPROM.write() illetve EEPROM.read() függvényeken kívül van más is van ebben a függvény gyűjteményben. Az EEPROM.put() a leírások szerint bármilyen változót beleír az eeprom-ba egy megadott kezdőcímtől kezdve. Az EEPROM.get() pedig kiolvassa azt egy változóba. Persze a memória változóknak azonos típusúaknak kell lennie olvasáskor a beíráskor használt változó típussal. Mint a cikk végén kiderül, az EEPROM.put() függvénnyel van egy kis baj!

Írtam hát gyorsan egy próba programot, hogy lássam tényleg működik a dolog. Nagyon kényelmes, mert struktúrákat is felismer és helyesen tárol. A stringekkel már vannak problémák. Lehetséges, hogy az én ismeret hiányom miatt szaladtam bele a tapasztalt problémákba, de az is lehet, hogy az EEPROM.put() tényleg rosszul van megírva. Bárhogy is van, a string-el vigyázni kell. Tapasztalataimat kommentek formájában a programba írtam.

Itt a demóprogram forrása! Nem szabad megijedni a forráskód hosszától, a program nagy része a kommentekből és a soros portra írásból áll. Az eeprom kezelése csak néhány sor.

#include <EEPROM.h>

bool xbool;         //bool típusú változó.
byte xbyte;         //byte típusú változó.
int xint;           //int típusú változó.
long xlong;         //long típusú változó.
float xfloat;       //float típusú változó.
String xszoveg;     //egy karakter stringet is definiálunk
String yszoveg;     //ezt egy működési hiba vizsgálata miatt csináltam
String zszoveg;     //ez is a működési hiba miatt keletkezett
int eeprom_cim;      //ebben a változóban vezetjük a mindíg soron következő címet, ahová írni fogunk az epromban (olvasásnál is ezt használjuk)

struct datum_ido{   //definiálunk datum_ido névvel egy struktúrát, ebben fogjuk tárolni a dátumot és idopontot
  int ev;
  byte ho;
  byte nap;
  byte ora;
  byte perc;
};
datum_ido xdatum_ido;  //készítünk egy datum_ido típusú változót xdatum_ido névvel


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

/********************************************************************************************************** 
 * A következő ciklus törli a teljes eeprom-ot. Az EEPROM.lenght() megadja az eeprom-unk teljes hosszát.  *
 * Csak akkor futattam, amikor már alaposan teleforkáltam az eeprom-ot, és tiszta lappal akartam indulni  *
 **********************************************************************************************************/
 // for (unsigned int i = 0 ; i < EEPROM.length() ; i++ )
 //   EEPROM.write(i, 0);
 // Serial.print("EEPROM törölve, mérete:");Serial.println(EEPROM.length());


/********************************************************************************************************************************
 * Ebben a programrészben különféle változó típusokat írunk ki az epromba. "eecim" változó mindíg az aktuális címet tartalmazza *
 * ahonnan kezdve írjuk a változót. Azt, hogy hány byte-ot foglalunk el a változó kiírásával, az nekünk kell kiszámolni.        *
 * Ha visszaolvassuk a memória változó tartalmát az eeprom-ból, akkor ki kell számolni a váltzó címét, ahonnan kezdve kiírtuk.  *
 * Ha íráskor rosszul számoljuk ki a következő szabad eeprom terület kezdőcímét, akkor egymásra írhatjuk a változó tartalmakat, *
 * és visszaolvasáskor marhaságokat kaphatunk.                                                                                  *
 * Ha egyszer lefuttatuk ezt a programrészt, akkor ki lehet kommentezni a programból, mert a tárolt értékeket már lehet         *
 * visszaolvasni tetszőleges számban, és ekkor biztosak lehtünk a program működésében.                                         *
 ********************************************************************************************************************************/

  Serial.println("***************** Irunk az eeprom-ba: ");

  xbool = 1;            
  EEPROM.put( eeprom_cim, xbool);
  Serial.print("Bool: ");
  Serial.print( xbool, BIN);                        //xbool kiírása ellenőrzéshez
  Serial.print("  Merete:");
  Serial.println(sizeof(bool));

  xbyte = 66;          
  eeprom_cim=eeprom_cim+1;                          //a bool 1byte-ot foglal, tehát 1 byte-al kell növelni a következő eeprom címet
  EEPROM.put( eeprom_cim, xbyte);
  Serial.print("Byte: ");
  Serial.print( xbyte);                             //xbyte kiírása ellenőrzéshez
  Serial.print("  Merete:");
  Serial.println(sizeof(byte));

  xint = 29567;          
  eeprom_cim=eeprom_cim+1;                          //a byte 1 byte-ot foglal, tehát 1 byte-al kell növelni a következő eeprom címet
  EEPROM.put( eeprom_cim, xint);
  Serial.print("Int: ");
  Serial.print( xint);                              //xint kiírása ellenőrzéshez
  Serial.print("  Merete:");
  Serial.println(sizeof(int));

  xlong = 234567;    
  eeprom_cim=eeprom_cim+2;                          //az int 2 byte-ot foglal, tehát 2 byte-al kell növelni a következő eeprom címet
  EEPROM.put( eeprom_cim, xlong);
  Serial.print("Long:");
  Serial.print( xlong);                             //xlong kiírása ellenőrzéshez
  Serial.print("  Merete:");
  Serial.println(sizeof(long));

  xfloat = 1.2334567;  
  eeprom_cim=eeprom_cim+4;                          //az long 4 byte-ot foglal, tehát 4 byte-al kell növelni a következő eeprom címet
  EEPROM.put( eeprom_cim, xfloat);
  Serial.print("Float: ");
  Serial.print( xfloat,7);                          //xfloat kiírása ellenőrzéshez 7 tizedesjegy hoszan
  Serial.print("  Merete:");
  Serial.println(sizeof(float));

  xdatum_ido.ev=2010;             
  xdatum_ido.ho=8;
  xdatum_ido.nap=11;
  xdatum_ido.ora=6;
  xdatum_ido.perc=1;
  eeprom_cim=eeprom_cim+4;                          //az float 4 byte-ot foglal, tehát 4 byte-al kell növelni a következő eeprom címet
  Serial.print("Datum1:");
  EEPROM.put( eeprom_cim, xdatum_ido);
  Serial.print(xdatum_ido.ev);Serial.print(".");                        
  Serial.print(xdatum_ido.ho);Serial.print("."); 
  Serial.print(xdatum_ido.nap);Serial.print("  ");
  Serial.print(xdatum_ido.ora);Serial.print(":");
  Serial.print(xdatum_ido.perc);
  Serial.print("  Merete:");
  Serial.println(sizeof(datum_ido));

  // Azért csináltam egy második tartalom kiírást, mert a string változónál tapasztalt hibajelenség miatt, szerettem volna megtudni,
  // hogy struktúra esetén is keletkezhetnek hasonló hibák. Itt nincs hiba, tehát a string változó hossza zavarja meg a működést.
  xdatum_ido.ev=2020;             
  xdatum_ido.ho=9;
  xdatum_ido.nap=18;
  xdatum_ido.ora=7;
  xdatum_ido.perc=11;
  eeprom_cim=eeprom_cim+6;                              //az datum_ido 6 byte-ot foglal, tehát 6 byte-al kell növelni a következő eeprom címet
  Serial.print("Datum2:");
  EEPROM.put( eeprom_cim, xdatum_ido);
  Serial.print(xdatum_ido.ev);Serial.print(".");                        
  Serial.print(xdatum_ido.ho);Serial.print("."); 
  Serial.print(xdatum_ido.nap);Serial.print("  ");
  Serial.print(xdatum_ido.ora);Serial.print(":");
  Serial.print(xdatum_ido.perc);
  Serial.print("  Merete:");
  Serial.println(sizeof(datum_ido));
  
  xszoveg="Ez egy szoveg!";   //ha a kovetkező eeprom írásnál nem yszoveg változót használom, akkor nem ezt a tartalmat írja az eeprom-be
  eeprom_cim=eeprom_cim+6;                              
  Serial.print("String1:");
  Serial.print(xszoveg);                        
  EEPROM.put(eeprom_cim,xszoveg );                   
  Serial.print(" Merete:");
  Serial.println(xszoveg.length());   //itt már nem használhatom sizeof() függvényt, mert a string hossza változik
  
  // Ezen a ponton érdekes dolog történt. Ha xszoveg változónak az xszoveg változót használom de új tartalaommal
  // feltöltve, akkor az előző kiírásban megadott "Ez egy szoveg!" helyett a mostani "Ez egy masik szöveg!" tartalmat
  // írja bele az eepromba (mégaz előző kiírásról van szó), de csonkítva az ottani szöveg hosszával. Pedig azon a 
  // programsoron már túl is vagyunk a végrehajtásban. 
  // Sőt, ha csinálok egy zszoveg változót, és annak is adok értéket, akkor már jó a tartalom
  // de levágja az első két karaktert a szövegből. Nyilván az EEPROM.put() belső működéséből fakad a hibejelenség
  // Megoldás, hogy külön szöveges változót kell deklarálni a szövegek kiírásához. 
  //zszoveg="Ez egy szoveg!";       //ennek csa akkor van szerepel, ha xszoveg változóra írom  következő sorokban az yszoveg változót
  yszoveg="Ez egy masik szoveg!";   //nem használhatom az xszoveg változót, mert rossz tartalmat ír az előző szöveg tárolásban (String1).
  eeprom_cim=eeprom_cim+16;           //a string1 változó 16 byte-ot foglal, tehát 16 byte-al kell növelni a következő eeprom címet
  Serial.print("String2:");
  Serial.print(yszoveg);                         
  EEPROM.put(eeprom_cim,yszoveg );                    
  Serial.print(" Merete:");
  Serial.println(yszoveg.length()); //itt már nem használhatom sizeof() függvényt, mert a string hossza változik

/************************************************************************************************************************
 * E a programrész visszaolvassa az előzőkaben letárolt változók értékét. Itt is figyelni kell az egyes változók kezdő  *
 * címeinek helyes kiszámolására. Érdemes kipróbálni, mi történik, ha valahol rossz címet írunk be. pL a dárum típusnál *
 * az előző olvasási címhez ne 4-et, hanem 3-at adjunk hozzá                                                            *
 ************************************************************************************************************************/
  //töröljük a változó értékekekt, hogy lássuk, tényleg működik a visszaolvasás
  //az xszoveg yszoveg változókkal kapcsolatos hibajelenség itt már nem jelentkezik
  //helyesen fogja visszaolvasni a szövegeket az xszoveg változóba. Láthatóan csak az íráskor van gond
  xbool = 0;            
  xbyte = 0;          
  xint = 0;          
  xlong = 0;    
  xfloat = 0;  
  
  xdatum_ido.ev = 0;             //feltöltjük értékekkel az xdatum nevű változót, ami datum típusú
  xdatum_ido.ho=0;
  xdatum_ido.nap=0;
  //xszoveg="";   //Ha ezt az értékadást használom, akkor lecsípi a szöveg első karakterét az első szöveg kiolvasásáakor
                  //Ha az íráskor xszoveg változót használom, akkor a második szöveg kiolvasás első karakterét csípi le.
                  //Mindamelett a második esetben még az első szöveg is rossz tartalommal kerül az eeprom-ba.
                  //Ezek a hibajelenségek csak akkor keletkeznek, ha az eeprom írással foglalkozó programrész működik
                  //ha kikommentezem azt a részt, akkor már nem okoz problémát ez az értékedás. Az EEPROM.put() csinál
                  //valamit a memóriában, ami megzavarja a működést.
  
  eeprom_cim=0;    //eeprom kezdőcím ujra 0

  Serial.println("***************** Olvasunk az eeprom-bol:");

  Serial.print("Bool:");
  EEPROM.get( eeprom_cim, xbool );
  Serial.println( xbool, BIN );  

  eeprom_cim=eeprom_cim+1; 
  Serial.print("Byte:");
  EEPROM.get( eeprom_cim, xbyte );
  Serial.println( xbyte);  //

  eeprom_cim=eeprom_cim+1; 
  Serial.print("Int:");
  EEPROM.get( eeprom_cim, xint );
  Serial.println( xint);  //

  eeprom_cim=eeprom_cim+2; 
  Serial.print("Long:");
  EEPROM.get( eeprom_cim, xlong );
  Serial.println( xlong);  //

  eeprom_cim=eeprom_cim+4; 
  Serial.print("Float:");
  EEPROM.get( eeprom_cim, xfloat );
  Serial.println( xfloat,7);  //

  eeprom_cim=eeprom_cim+4; 
  Serial.print("Datum1:");
  EEPROM.get(eeprom_cim, xdatum_ido );
  Serial.print(xdatum_ido.ev);Serial.print(".");                         
  Serial.print(xdatum_ido.ho);Serial.print(".");                        
  Serial.print(xdatum_ido.nap);Serial.print("  ");                       
  Serial.print(xdatum_ido.ora);Serial.print(":");                       
  Serial.println(xdatum_ido.perc);  
                       
  eeprom_cim=eeprom_cim+6; 
  Serial.print("Datum2:");
  EEPROM.get(eeprom_cim, xdatum_ido );
  Serial.print(xdatum_ido.ev);Serial.print(".");                         
  Serial.print(xdatum_ido.ho);Serial.print(".");                        
  Serial.print(xdatum_ido.nap);Serial.print("  ");                       
  Serial.print(xdatum_ido.ora);Serial.print(":");                       
  Serial.println(xdatum_ido.perc);                       

  eeprom_cim=eeprom_cim+6; 
  Serial.print("String1:");
  EEPROM.get(eeprom_cim,yszoveg );
  Serial.println(yszoveg);  //

  eeprom_cim=eeprom_cim+16; 
  Serial.print("String2:");
  EEPROM.get(eeprom_cim,yszoveg );
  Serial.println(yszoveg);  //

}

void loop(){ /* ez most üres */ }

Kíváncsi voltam, hogy miképpen tárolja az adatokat az EEPROM.put() függvény. Írtam ezért egy programot, ami néhány változót tárol az EEPROM-ban. Előtte természetesen töröltem a teljes tartalmat.

#include <EEPROM.h>                                              //eeprom kezelő programkönyvtár

//változók az íráshoz
String v_string1="abcdefg";
String v_string2="AAAAAAAAAAAAAAAAAAAAaábcdeéfg";
byte v_byte=111;
int v_int=513;

//változók a kiolvasáshoz
String vo_string1;
String vo_string2;
byte vo_byte;
int vo_int;

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

  //törlöm az eeprom teljes tartalmát
  for (int i=0;i<1024;i++) {
    EEPROM.write(i,0);
  }
  
  //kiolvasom az eeprom teljes tartalmát
  for (byte i=0;i<32;i++) {
    for (byte j=0;j<32;j++) {
      Serial.print(EEPROM.read(i*32+j));
      Serial.print(",");
    }
    Serial.println();
  }
  Serial.println("Törlés kész!");

  //beírom a változókat az eepromba
  EEPROM.put(0,v_byte);
  EEPROM.put(32,v_int);
  EEPROM.put(64,v_string1);
  EEPROM.put(96,v_string2);
  Serial.println("Írás kész!");

  //kiolvasom az eeprom teljes tartalmát
  for (byte i=0;i<32;i++) {
    for (byte j=0;j<32;j++) {
      Serial.print(EEPROM.read(i*32+j));
      Serial.print(",");
    }
    Serial.println();
  }

  //visszaolvasom és kiírom a változók tartalmát
  EEPROM.get(0,vo_byte);
  EEPROM.get(32,vo_int);
  EEPROM.get(64,vo_string1);
  EEPROM.get(96,vo_string2);
  Serial.println(vo_byte);
  Serial.println(vo_int);
  Serial.println(vo_string1);
  Serial.println(vo_string2);
}

void loop() {

}

Az eredmény teljes meglepetés! A byte és int típusú változót megtaláltam, ott van ahol lennie kell. Azonban egyáltalán nem derült ki számomra, hogyan is tárolja a stringeket az EEPROM.put() függvény. Jól látható, hogy a string tartalma nem került bele az eeprom-ba. Hogy hol is lehet, azt nem tudom. Esetleg a program flash-be tárolja konstansként?

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
Törlés kész!
Írás kész!
111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
158,2,7,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
168,2,31,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
111
513
abcdefg
AAAAAAAAAAAAAAAAAAAAaábcdeéfg

Kicsit módosítottam a programon, és a v_string2 változót futásidőben hozom létre:

#include <EEPROM.h>                                              //eeprom kezelő programkönyvtár

//változók az íráshoz
String v_string1="abcdefg";
String v_string2;
byte v_byte=111;
int v_int=513;

//változók a kiolvasáshoz
String vo_string1;
String vo_string2;
byte vo_byte;
int vo_int;

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

  //csinálok egy stringet programfutás közben
  for (int i=0;i<100;i++) {
    v_string2=v_string2+"A";
  }
  Serial.println(v_string2);
  
  //törlöm az eeprom teljes tartalmát
  for (int i=0;i<1024;i++) {
    EEPROM.write(i,0);
  }
  
  //kiolvasom az eeprom teljes tartalmát
  for (byte i=0;i<32;i++) {
    for (byte j=0;j<32;j++) {
      Serial.print(EEPROM.read(i*32+j));
      Serial.print(",");
    }
    Serial.println();
  }
  Serial.println("Törlés kész!");

  //beírom a változókat az eepromba
  EEPROM.put(0,v_byte);
  EEPROM.put(32,v_int);
  EEPROM.put(64,v_string1);
  EEPROM.put(96,v_string2);
  Serial.println("Írás kész!");

  //kiolvasom az eeprom teljes tartalmát
  for (byte i=0;i<32;i++) {
    for (byte j=0;j<32;j++) {
      Serial.print(EEPROM.read(i*32+j));
      Serial.print(",");
    }
    Serial.println();
  }

  //visszaolvasom és kiírom a változók tartalmát
  EEPROM.get(0,vo_byte);
  EEPROM.get(32,vo_int);
  EEPROM.get(64,vo_string1);
  EEPROM.get(96,vo_string2);
  Serial.println(vo_byte);
  Serial.println(vo_int);
  Serial.println(vo_string1);
  Serial.println(vo_string2);
}

void loop() {

}

Futási eredmény:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
Törlés kész!
Írás kész!
111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
128,2,7,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
120,3,100,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
111
513
abcdefg
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Tehát a futásidőben létrehozott stringnek sincs nyoma. 100db A betű nem tűnhet el nyomtalanul? Most kikommenteztem az eeprom írását végző programrészeket, és csak kiolvastam az eeprom tartalmát. Az új program:

#include <EEPROM.h>                                              //eeprom kezelő programkönyvtár

//változók a kiolvasáshoz
String vo_string1;
String vo_string2;
byte vo_byte;
int vo_int;

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

  //kiolvasom az eeprom teljes tartalmát
  for (byte i=0;i<32;i++) {
    for (byte j=0;j<32;j++) {
      Serial.print(EEPROM.read(i*32+j));
      Serial.print(",");
    }
    Serial.println();
  }

  //visszaolvasom és kiírom a változók tartalmát
  EEPROM.get(0,vo_byte);
  EEPROM.get(32,vo_int);
  EEPROM.get(64,vo_string1);
  EEPROM.get(96,vo_string2);
  Serial.println(vo_byte);
  Serial.println(vo_int);
  Serial.println(vo_string1);
  Serial.println(vo_string2);
}

void loop() {

}

Rátöltés után az első futtatáskor még megtaláltam az A betűket. Azonban ekkor áramtalanítottam az Arduino-t, hátha ram-ban vannak az A betűim. Jó tipp volt áramtalanítás után a futási eredmény:

111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
128,2,7,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
120,3,100,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
111
513
⸮⸮⸮k⸮
*⸮U⸮ߏ⸮⸮}A\⸮⸮⸮#⸮⸮⸮⸮3⸮?ݵ⸮zf⸮⸮ߟޯ⸮;Vs~,1O⸮ֵ⸮⸮w⸮⸮k⸮ݷ⸮_⸮⸮⸮⸮⸮⸮⸮ݎQ}/~q⸮⸮v⸮N⸮⸮Z⸮⸮v⸮⸮m⸮⸮⸮⸮⸮⸮{.⸮:{

Tehát kedves sorstársaim. eeprom-ba ne tároljatok stringet az EEPROM.put() függvénnyel, mert nem tárolódik! A struktúrákat már ki sem próbáltam, mert ettől a pillanattól kezdve nem bízok ebben a függvény gyűjteményben. Kétségtelen azonban, hogy kommersz int és long változókra használható!

Mennyire volt hasznos amit olvastál?

Kattints egy csillagra az értékeléshez!

Szövegesen is leírhatod véleményedet!