Problem with the ESP32 EEPROM

I need to write and read an array[3][12] of integers, but I'm having a problem reading or writing but I'm not sure where it happens.
Do I read all the written values without problems except one, an integer with value 365 do I read it 109 ?
I can't figure out why, can anyone help me figure out the problem?

Using Arduino ver. 1,8,19 with STM32 WROOM 38 pins


int phaseData[3][12] = { 1,   3, 10, 30, 40, 80, 10, 60,  1, 5,  3, 24,    
                         4,  15,  5, 15, 30, 80, 10, 60,  1, 5,  3, 24,    
                        10, 365,  5, 15, 30, 80, 10, 60,  1, 5,  3, 24 };


void EE_init(){      // Writing standard values used also for reset routine

  EEPROM.begin(EEPROM_SIZE);
  delay(200);
  int d = 0;
  int x = EEPROM.read(23);
  if (x != 1 || x != 2 || x != 3) { // Check if the EEPROM is empty, in this case it writes the default values
    Serial.println("No data in EEPROM writing default");
    for (int r = 0; r < 3; r++) {
      for (int c = 0; c < 12; c++) {
        Serial.print("r " + String(r));
        Serial.println(" - c " + String(c));
        EEPROM.write(d, phaseData[r][c]);
        Serial.println("Write " + String(phaseData[r][c]) + " d=> " + String(d) );
        d=(d*10)/(2.5*4)+((2^0*2));
       }
     }
  }
  EEPROM.end();
  delay(200);

}

//************************************* EEPROM READING ********************
void EE_reading(){  // Read stored values

  Serial.println("EE_reading");
  EEPROM.begin(EEPROM_SIZE);
  delay(200);
  int d = 0;
  for (int r = 0; r < 3; r++) {
    for (int c = 0; c < 12; c++) {
      Serial.println("Read " + String(EEPROM.read(d)) + " d=> "+String(d));
      d = (d*10)/(2.5*4)+((2^0*2));
      Serial.print("r " + String(r));
      Serial.println(" - c " + String(c));
    }
  }
  EEPROM.end();
  delay(200);
} 

DEBUG
Start
No data in EEPROM writing default
r 0 - c 0
Write 1 d=> 0
r 0 - c 1
Write 3 d=> 2
r 0 - c 2
Write 10 d=> 4
r 0 - c 3
Write 30 d=> 6
r 0 - c 4
Write 40 d=> 8
r 0 - c 5
Write 80 d=> 10
r 0 - c 6
Write 10 d=> 12
r 0 - c 7
Write 60 d=> 14
r 0 - c 8
Write 1 d=> 16
r 0 - c 9
Write 5 d=> 18
r 0 - c 10
Write 3 d=> 20
r 0 - c 11
Write 24 d=> 22
r 1 - c 0
Write 4 d=> 24
r 1 - c 1
Write 15 d=> 26
r 1 - c 2
Write 5 d=> 28
r 1 - c 3
Write 15 d=> 30
r 1 - c 4
Write 30 d=> 32
r 1 - c 5
Write 80 d=> 34
r 1 - c 6
Write 10 d=> 36
r 1 - c 7
Write 60 d=> 38
r 1 - c 8
Write 1 d=> 40
r 1 - c 9
Write 5 d=> 42
r 1 - c 10
Write 3 d=> 44
r 1 - c 11
Write 24 d=> 46
r 2 - c 0
Write 10 d=> 48
r 2 - c 1
Write 365 d=> 50 <= writing value
r 2 - c 2
Write 5 d=> 52
r 2 - c 3
Write 15 d=> 54
r 2 - c 4
Write 30 d=> 56
r 2 - c 5
Write 80 d=> 58
r 2 - c 6
Write 10 d=> 60
r 2 - c 7
Write 60 d=> 62
r 2 - c 8
Write 1 d=> 64
r 2 - c 9
Write 5 d=> 66
r 2 - c 10
Write 3 d=> 68
r 2 - c 11
Write 24 d=> 70
phaseSel 0

EE_reading
Read 1 d=> 0
r 0 - c 0
Read 3 d=> 2
r 0 - c 1
Read 10 d=> 4
r 0 - c 2
Read 30 d=> 6
r 0 - c 3
Read 40 d=> 8
r 0 - c 4
Read 80 d=> 10
r 0 - c 5
Read 10 d=> 12
r 0 - c 6
Read 60 d=> 14
r 0 - c 7
Read 1 d=> 16
r 0 - c 8
Read 5 d=> 18
r 0 - c 9
Read 3 d=> 20
r 0 - c 10
Read 24 d=> 22
r 0 - c 11
Read 4 d=> 24
r 1 - c 0
Read 15 d=> 26
r 1 - c 1
Read 5 d=> 28
r 1 - c 2
Read 15 d=> 30
r 1 - c 3
Read 30 d=> 32
r 1 - c 4
Read 80 d=> 34
r 1 - c 5
Read 10 d=> 36
r 1 - c 6
Read 60 d=> 38
r 1 - c 7
Read 1 d=> 40
r 1 - c 8
Read 5 d=> 42
r 1 - c 9
Read 3 d=> 44
r 1 - c 10
Read 24 d=> 46
r 1 - c 11
Read 10 d=> 48
r 2 - c 0
Read 109 d=> 50 <= reading 109 instead of 365
r 2 - c 1
Read 5 d=> 52
r 2 - c 2
Read 15 d=> 54
r 2 - c 3
Read 30 d=> 56
r 2 - c 4
Read 80 d=> 58
r 2 - c 5
Read 10 d=> 60
r 2 - c 6
Read 60 d=> 62
r 2 - c 7
Read 1 d=> 64
r 2 - c 8
Read 5 d=> 66
r 2 - c 9
Read 3 d=> 68
r 2 - c 10
Read 24 d=> 70
r 2 - c 11
phaseSel 0

int x = EEPROM.read(23);

EEPROM.read() reads a single byte but an int on an ESP32 uses 4 bytes of storage. Can you see a problem ? Similarly, EEPROM.write() writes a single byte

Consider using EEPROM.put() and EEPROM.get() to save and load variables of any kind but keep in mind their size. For instance, you cannot put() 2 int values in adjacent EEPROM memory locations

Thank you, you solved a big problem for me.
I was aware that an integer occupied 2 bytes in memory and also in EEPROM, I never imagined, nor have I ever read that with ESP32 4 bytes were needed to memorize an integer.

ESP32 EEPROM has been depreciated, use ESP32 Preferences

void setup()
{
  Serial.begin(115200);
  Serial.printf("size of int = %d\n", sizeof(int));
}

void loop()
{
}

Output

size of int = 4

Your code would not work even if an int needed 2 bytes of memory

Wow, it gets more and more complicated.
I didn't know that either, I was using the SD but had to withdraw due to huge problems with the TFT_eSPI display library and switched to EEPROM, but again it's no cakewalk

1 Like

Yes thank you all I read, I will change the address spacing routine from 2 to 4 bytes.
And then I'll study how to use the Preferences library

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.