Chat freely about anything...

User avatar
By stavbodik
#59862 Hi everyone I am testing my device with EEPROM library .

I am trying to save ssid string and read it after reloading sketch.

Step 1 : Write and Read in same sketch works well ->

Code: Select all#define EPROM_MEMORY_SIZE 512
int serverAccessSSIDAddressStart=1; int serverAccessSSIDAddressEnd=32;

void writeStringEEPROM(String s,int startAdress,int endAdress);
String readStringEEPROM(int startAdress,int endAdress);

void setup() {
  Serial.begin(115200);
 
  String Server_router_ssid ="A111111111111111111111111111111A";

  Serial.println("Start Write");
  EEPROM.begin(EPROM_MEMORY_SIZE);
  writeStringEEPROM(Server_router_ssid,serverAccessSSIDAddressStart,serverAccessSSIDAddressEnd);
  EEPROM.commit();
  Serial.println("Write Done");
 
  Serial.println("READ");
  //EEPROM.begin(EPROM_MEMORY_SIZE);
  String res = readStringEEPROM(serverAccessSSIDAddressStart,serverAccessSSIDAddressEnd);
  Serial.println(res);
}


String readStringEEPROM(int startAdress,int endAdress){
   String s;
   for(int i=startAdress; i<=endAdress; i++){
        char c = char(EEPROM.read(i));
        s+=c;
    }
    return s;
}

void writeStringEEPROM(String s,int startAdress,int endAdress)
{
    int stringLength=s.length();
   
    for(int i=startAdress; i<=endAdress; i++){
        int indexString=i-startAdress;
        if(indexString<stringLength){
          EEPROM.write(i,s[indexString]);
        }else{
          EEPROM.write(i,' ');
        }
    }
}



Output :
Code: Select allStart Write
Write Done
READ
A111111111111111111111111111111A




But Now when Upload this sketch :
Code: Select allvoid setup() {
  Serial.begin(115200);
 
  //String Server_router_ssid ="A111111111111111111111111111111A";

  //Serial.println("Start Write");
  //EEPROM.begin(EPROM_MEMORY_SIZE);
  //writeStringEEPROM(Server_router_ssid,serverAccessSSIDAddressStart,serverAccessSSIDAddressEnd);
  //EEPROM.commit();
  //Serial.println("Write Done");
 
  Serial.println("READ");
  EEPROM.begin(EPROM_MEMORY_SIZE);
  String res = readStringEEPROM(serverAccessSSIDAddressStart,serverAccessSSIDAddressEnd);
  Serial.println(res);
}



I get this empty output ):

Code: Select allREAD



Any problem in my code please ?
Should I use EEPROM.begin when only reading ?

When should I use EEPROM.end and when should I use EEPROM.commit ?
User avatar
By stavbodik
#59919 So I understood the problem , The thing is that when you use write function you must add delay at least of 100ms after each write operation as in this example :

https://github.com/esp8266/Arduino/blob ... _write.ino

And when you use read function you must add delay at least of 500ms after each read operation as in this example :

https://github.com/esp8266/Arduino/blob ... m_read.ino


So I added to my functions(readStringEEPROM,writeStringEEPROM) inside the for loop this delays and now everything works great.


The problem is that this is very slow so i preferred to use get,put functions which use memcpy for this operations which looks to be faster and here is final working code if anyone will need it in the feature :

Code: Select all#include <EEPROM.h>

// EEPROM MAP  addresses
size_t EPROM_MEMORY_SIZE= 512;
int stmodeAddressStart = 0; int stmodeAddressEnd = 0;                               // size 1  byte  which stores 1 bit (0/1)
int serverAccessSSIDAddressStart = 1; int serverAccessSSIDAddressEnd = 34;          // size 34 bytes of char includes \0
int serverAccessPasswordAddressStart = 35; int serverAccessPasswordAddressEnd = 68; // size 34 bytes of char includes \0
int serverAccessIPAddressStart = 69; int serverAccessIPAddressEnd = 72;             // size 4  bytes , each byte is int in range of 0-255
int serverAccessPortAddressStart = 73; int serverAccessPortAddressEnd = 74;         // size 2  bytes , 2 bytes represent int int range of 0-65535


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

   char Server_router_ssid[] = "A1111111111111111111111111111111A\0";   
   char Server_router_password[] = "A1121112111111111111111111211111A\0";
   String ip = "233.14.180.100";
   int port = 5000;

   Serial.println("");
   Serial.println("Start Write");
   EEPROM.begin(EPROM_MEMORY_SIZE);
   EEPROM.put(serverAccessSSIDAddressStart, Server_router_ssid);
   delay(500);
   Serial.println("Write 1 done");
   EEPROM.put(serverAccessPasswordAddressStart, Server_router_password);
   delay(500);
   Serial.println("Write 2 Done");
   
   int ipArr[4];
   ConvertStringIpToIntArray(ip,ipArr);
   for (int i = 0; i < 4; i++) {
      EEPROM.write(serverAccessIPAddressStart+i,ipArr[i]);
      delay(100);
   }

   Serial.println("Write 3 Done");

   EEPROM.put(serverAccessPortAddressStart, port);
   delay(100);

   Serial.println("Write 4 Done");

   EEPROM.commit();
   Serial.println("commited");


   Serial.println("READ");
   EEPROM.begin(EPROM_MEMORY_SIZE);
   char res[34];
   EEPROM.get(serverAccessSSIDAddressStart, res);
   Serial.println(res);
   
   char res2[34];
   EEPROM.get(serverAccessPasswordAddressStart, res2);
   Serial.println(res2);

   int res3[4];
   for (int i = 0; i < 4; i++) {
      res3[i] = EEPROM.read(serverAccessIPAddressStart+i);
      Serial.println(res3[i]);
   }

   int res4;
   EEPROM.get(serverAccessPortAddressStart, res4);
   Serial.println(res4);

}

void loop() {

}

void ConvertStringIpToIntArray(String inputIP,int outPutIP[]) {
   int startDotIndex = -1;
   int endDotIndex = inputIP.indexOf('.');
   int ipSize = 4;

   for (int i = 0; i < ipSize; i++) {

      String number = inputIP.substring(startDotIndex + 1, endDotIndex);
      outPutIP[i] = number.toInt();
      startDotIndex = endDotIndex;
      endDotIndex = inputIP.indexOf('.', endDotIndex + 1);
   }
}