Skip to main content
belated update to code comment for more clarity on action per request
Source Link
codechimp
  • 496
  • 4
  • 3

Also, EEPROM.end is not needed, it simply clears the local byte-array cache of the flash/EEPROM from RAM. It serves on other function.

Also, EEPROM.end is not needed, it simply clears the local byte-array cache of the flash/EEPROM from RAM. It serves on other function.

belated update to code comment for more clarity on action per request
Source Link
codechimp
  • 496
  • 4
  • 3
#include <EEPROM.h>

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

  uint addr = 0;

  // fake data
  struct { 
    uint val = 0;
    char str[20] = "";
  } data;
  
  // commit 512 bytes of ESP8266 flash (for "EEPROM" emulation)
  // this step actually loads the content (512 bytes) of flash into 
  // a 512-byte-array cache in RAM
  EEPROM.begin(512);

  // loadread EEPROMbytes (i.e. sizeof(data) intofrom RAM"EEPROM"), 
 see it// in reality, reads from byte-array cache
  // cast bytes into structure called data
  EEPROM.get(addr,data);
  Serial.println("Found"Old values are: "+String(data.val)+","+String(data.str));  
  
  // changefiddle with the data in"read" RAMfrom EEPROM
  data.val += 5;
  if ( strcmp(data.str,"hello") == 0 )
      strncpy(data.str, "jerry",20);
  else 
      strncpy(data.str, "hello",20);

  // replace values in EEPROMbyte-array cache with modified data
  // no changes made to flash, all in local byte-array cache
  EEPROM.put(addr,data);

  // actually write the content of byte-array cache to
  // hardware flash.  flash write occurs if and only if one or more byte
  // in byte-array cache has been changed, but if so, ALL 512 bytes are 
  // written to flash
  EEPROM.commit();  

  // clear data in'data' RAMstructure
  data.val = 0; 
  strncpy(data.str,"",20);
  
  // reload data for EEPROM, see the change
  //   OOPS, not actually reading flash, but reading byte-array cache (in RAM), 
  //   power cycle ESP8266 to really see the flash/"EEPROM" updated
  EEPROM.get(addr,data);
  Serial.println("New values are: "+String(data.val)+","+String(data.str));
}

void loop()
{
  delay(1000);
}

UPDATE: If you want to understand how the "EEPROM" is emulated in the ESP8266, you might want to reference https://github.com/esp8266/Arduino/tree/master/libraries/EEPROM, specifically, EEPROM.h.

#include <EEPROM.h>

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

  uint addr = 0;

  struct {
    uint val = 0;
    char str[20] = "";
  } data;
  
    
  EEPROM.begin(512);

  // load EEPROM data into RAM, see it
  EEPROM.get(addr,data);
  Serial.println("Found: "+String(data.val)+","+String(data.str));  
  
  // change data in RAM 
  data.val += 5;
  strncpy(data.str,"hello",20);

  // replace values in EEPROM
  EEPROM.put(addr,data);
  EEPROM.commit();

  // clear data in RAM
  data.val = 0; 
  strncpy(data.str,"",20);
  
  // reload data for EEPROM, see the change
  EEPROM.get(addr,data);
  Serial.println("New values are: "+String(data.val)+","+String(data.str));
}

void loop()
{
  delay(1000);
}
#include <EEPROM.h>

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

  uint addr = 0;

  // fake data
  struct { 
    uint val = 0;
    char str[20] = "";
  } data;
  
  // commit 512 bytes of ESP8266 flash (for "EEPROM" emulation)
  // this step actually loads the content (512 bytes) of flash into 
  // a 512-byte-array cache in RAM
  EEPROM.begin(512);

  // read bytes (i.e. sizeof(data) from "EEPROM"), 
  // in reality, reads from byte-array cache
  // cast bytes into structure called data
  EEPROM.get(addr,data);
  Serial.println("Old values are: "+String(data.val)+","+String(data.str));
  
  // fiddle with the data "read" from EEPROM
  data.val += 5;
  if ( strcmp(data.str,"hello") == 0 )
      strncpy(data.str, "jerry",20);
  else 
      strncpy(data.str, "hello",20);

  // replace values in byte-array cache with modified data
  // no changes made to flash, all in local byte-array cache
  EEPROM.put(addr,data);

  // actually write the content of byte-array cache to
  // hardware flash.  flash write occurs if and only if one or more byte
  // in byte-array cache has been changed, but if so, ALL 512 bytes are 
  // written to flash
  EEPROM.commit();  

  // clear 'data' structure
  data.val = 0; 
  strncpy(data.str,"",20);
  
  // reload data for EEPROM, see the change
  //   OOPS, not actually reading flash, but reading byte-array cache (in RAM), 
  //   power cycle ESP8266 to really see the flash/"EEPROM" updated
  EEPROM.get(addr,data);
  Serial.println("New values are: "+String(data.val)+","+String(data.str));
}

void loop()
{
  delay(1000);
}

UPDATE: If you want to understand how the "EEPROM" is emulated in the ESP8266, you might want to reference https://github.com/esp8266/Arduino/tree/master/libraries/EEPROM, specifically, EEPROM.h.

While EEPROM.read and EEPROM.write are valid methods, it's like mopping the floor with a toothbrush. UseUse EEPROM.put and EEPROM.get instead. For

For example:

#include <EEPROM.h>

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

  uint addr = 0;

  struct {
    uint val = 0;
    char str[20] = "";
  } data;
  
    
  EEPROM.begin(512);

  // load EEPROM data into RAM, see it
  EEPROM.get(addr,data);
  Serial.println("Found: "+String(data.val)+","+String(data.str));  
  
  // change data in RAM 
  data.val += 5;
  strncpy(data.str,"hello",20);

  // replace values in EEPROM
  EEPROM.put(addr,data);
  EEPROM.commit();

  // clear data in RAM
  data.val = 0; 
  strncpy(data.str,"",20);
  
  // reload data for EEPROM, see the change
  EEPROM.get(addr,data);
  Serial.println("New values are: "+String(data.val)+","+String(data.str));
}

void loop()
{
  delay(1000);
}
#include <EEPROM.h>

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

  uint addr = 0;

  struct {
    uint val = 0;
    char str[20] = "";
  } data;
  
    
  EEPROM.begin(512);

  // load EEPROM data into RAM, see it
  EEPROM.get(addr,data);
  Serial.println("Found: "+String(data.val)+","+String(data.str));  
  
  // change data in RAM 
  data.val += 5;
  strncpy(data.str,"hello",20);

  // replace values in EEPROM
  EEPROM.put(addr,data);
  EEPROM.commit();

  // clear data in RAM
  data.val = 0; 
  strncpy(data.str,"",20);
  
  // reload data for EEPROM, see the change
  EEPROM.get(addr,data);
  Serial.println("New values are: "+String(data.val)+","+String(data.str));
}

void loop()
{
  delay(1000);
}

While EEPROM.read and EEPROM.write are valid methods, it's like mopping the floor with a toothbrush. Use EEPROM.put and EEPROM.get instead. For example:

#include <EEPROM.h>

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

  uint addr = 0;

  struct {
    uint val = 0;
    char str[20] = "";
  } data;
  
    
  EEPROM.begin(512);

  // load EEPROM data into RAM, see it
  EEPROM.get(addr,data);
  Serial.println("Found: "+String(data.val)+","+String(data.str));  
  
  // change data in RAM 
  data.val += 5;
  strncpy(data.str,"hello",20);

  // replace values in EEPROM
  EEPROM.put(addr,data);
  EEPROM.commit();

  // clear data in RAM
  data.val = 0; 
  strncpy(data.str,"",20);
  
  // reload data for EEPROM, see the change
  EEPROM.get(addr,data);
  Serial.println("New values are: "+String(data.val)+","+String(data.str));
}

void loop()
{
  delay(1000);
}

While EEPROM.read and EEPROM.write are valid methods, it's like mopping the floor with a toothbrush. Use EEPROM.put and EEPROM.get instead.

For example:

#include <EEPROM.h>

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

  uint addr = 0;

  struct {
    uint val = 0;
    char str[20] = "";
  } data;
  
    
  EEPROM.begin(512);

  // load EEPROM data into RAM, see it
  EEPROM.get(addr,data);
  Serial.println("Found: "+String(data.val)+","+String(data.str));  
  
  // change data in RAM 
  data.val += 5;
  strncpy(data.str,"hello",20);

  // replace values in EEPROM
  EEPROM.put(addr,data);
  EEPROM.commit();

  // clear data in RAM
  data.val = 0; 
  strncpy(data.str,"",20);
  
  // reload data for EEPROM, see the change
  EEPROM.get(addr,data);
  Serial.println("New values are: "+String(data.val)+","+String(data.str));
}

void loop()
{
  delay(1000);
}
Source Link
codechimp
  • 496
  • 4
  • 3
Loading