String desde puerto Serie a EEPROM y recuperar

Hola, hace ya mucho tiempo que intento cargar un string desde el serial y recuperarlo desde EEPROM después de apagado el arduino. Este código de prueba tiene una función de guardar y una de recuperar, con sus respectivos botones para asegurarme de que controlo la situación. Al guardar y leer el estring todo parece ir bien, el código imprime el serial, el String cargado desde el serial, imprime el string desde la función e imprime las direcciones eeprom 0 a 10 crudas, todo parece ir correcto pero al apagarlo y prenderlo parece como si nunca hubiese pasado nada, imprime todas las direcciones crudas 0 a 10 en 255 . Agradecería cualquier ayuda. Dejo el link a la página desde donde me estoy basando, ya que no podría hacerlo desde cero yo mismo. Y Abajo el codigo.

Estoy usando flash eeprom en Samd21. En este codigo lo desactive y active una EEPROM normal. Aclaro que soy muy principiante. Gracias y perdon la molestia.

[https://roboticsbackend.com/arduino-write-string-in-eeprom/]

#include <EEPROM.h>

//#include <FlashAsEEPROM_SAMD.h>

String stringsave;

int button_save = 10;
int button_load_print = 9;


void writeStringToEEPROM(int addrOffset, String &strToWrite)
{
  byte len = strToWrite.length();
  EEPROM.write(addrOffset, len);

  for (int i = 0; i < len; i++)
  {
    EEPROM.write(addrOffset + 1 + i, strToWrite[i]);
  }
}


String readStringFromEEPROM(int addrOffset)
{
  int newStrLen = EEPROM.read(addrOffset);
  char data[newStrLen + 1];

  for (int i = 0; i < newStrLen; i++)
  {
    data[i] = EEPROM.read(addrOffset + 1 + i);
  }
  data[newStrLen] = '\0'; // !!! NOTE !!! Remove the space between the slash "/" and "0" (I've added a space because otherwise there is a display bug)

  return String(data);
}

void setup() {
  Serial.begin(9600);
  //while (!Serial);


  pinMode(button_save, INPUT_PULLUP);
  pinMode(button_load_print, INPUT_PULLUP);

}

void loop() {

// Lee serial y carga la string con los datos
  if (Serial.available()) {
    
    stringsave = Serial.readString();
    
    Serial.print("String recivida ");
    
    Serial.println(stringsave);
  }

//Guarda cadena en EEPROM 
  if (digitalRead(button_save) == LOW ) {
   
    writeStringToEEPROM(0, stringsave);
   
    Serial.println("String guardada");
    delay (2000);
  }


//Lee string desde la EEPROM tanto desde la funcion como las direcciones crudas 0 a 10
  if (digitalRead(button_load_print) == LOW) {

    String retrievedString_string = readStringFromEEPROM(0);

    Serial.print("The String read from SERIAL/RAM: ");
    Serial.println(stringsave);
    Serial.println ("");
    Serial.print("The String we read from EEPROM: ");
    Serial.println(retrievedString_string);
    Serial.print("---");

    //Raw

    Serial.print("String EEPROM Raw 0 to 10: ");
    Serial.print (EEPROM.read(0));
    Serial.print (EEPROM.read(1));
    Serial.print (EEPROM.read(2));
    Serial.print (EEPROM.read(3));
    Serial.print (EEPROM.read(4));
    Serial.print (EEPROM.read(5));
    Serial.print (EEPROM.read(6));
    Serial.print (EEPROM.read(7));
    Serial.print (EEPROM.read(8));
    Serial.print (EEPROM.read(9));
    Serial.println (EEPROM.read(10));
    Serial.println ("---");

  }

  delay (250);
}

Usa EEPROM.get y EEPROM.put para lo que pretendes hacer.
Busca Arduino EEPROM.get y lo mismo con .put y verás como se usan.

Moderador:
Edita el título de acuerdo a las normas. No puede llevar "Ayuda..."
Por favor, lee las Normas del foro

Lo intente muchisimo de esa manera y no dudo de que funcione pero tenia problemas, ahora con mas experiencia podre intentarlo.

Misteriosamente todo se soluciono de una manera sin sentido, ojala alguien pueda explicarme. Se soluciono poniendo un put dentro del condicional de guardado, put que guarda nada en cualquier lado.

if (digitalRead(button_save) == LOW ) {

    writeStringToEEPROM(0, stringsave);

    Serial.print("String guardada: ");
    Serial.println(stringsave);
    Serial.print("Largo: ");
    Serial.println(stringsave.length());
    Serial.println("---");

     // Serial.print("String EEPROM.put ");
      EEPROM.put(10200, ppp);
    
    delay (2000);
  }

Y el codigo sin sentido funcionando;

//#include <EEPROM.h>

#define EEPROM_EMULATION_SIZE     (10 * 1024)
#include <FlashAsEEPROM_SAMD.h>

String stringsave;
String stringsave2;
String ppp = "a";  //para guardar en put, no tiene sentido pero sin esto no anda
String ppp2 = "a";

int button_save = 10;
int button_save2 = 8;
int button_load_print = 9;



void writeStringToEEPROM(int addrOffset, String &strToWrite)
{
  byte len = strToWrite.length();
  EEPROM.write(addrOffset, len);

  for (int i = 0; i < len; i++)
  {
    EEPROM.write(addrOffset + 1 + i, strToWrite[i]);
  }
}


String readStringFromEEPROM(int addrOffset)
{
  int newStrLen = EEPROM.read(addrOffset);
  char data[newStrLen + 1];

  for (int i = 0; i < newStrLen; i++)
  {
    data[i] = EEPROM.read(addrOffset + 1 + i);
  }
  data[newStrLen] = '\0';

  return String(data);
}

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

  pinMode(button_save, INPUT_PULLUP);
  pinMode(button_save2, INPUT_PULLUP);
  pinMode(button_load_print, INPUT_PULLUP);


  while (!Serial);
  Serial.print("EEPROM length: ");
  Serial.println(EEPROM.length());

}

void loop() {


  if (Serial.available()) {

    stringsave = Serial.readString();

    Serial.print("String recivida: ");

    Serial.println(stringsave);
  }


  if (digitalRead(button_save) == LOW ) {

    writeStringToEEPROM(0, stringsave);

    Serial.print("String guardada: ");
    Serial.println(stringsave);
    Serial.print("Largo: ");
    Serial.println(stringsave.length());
    Serial.println("---");

     // Serial.print("String EEPROM.put desde 10");
      EEPROM.put(10200, ppp);
    
    delay (2000);
  }

  if (digitalRead(button_save2) == LOW ) {

    writeStringToEEPROM(25, stringsave);

    Serial.print("String guardada2: ");
    Serial.println(stringsave);
    Serial.print("Largo: ");
    Serial.println(stringsave.length());
    Serial.println("---");

     // Serial.print("String EEPROM.put desde 10");
      EEPROM.put(10100, ppp2);
    
    delay (2000);
  }

  if (digitalRead(button_load_print) == LOW) {

    String retrievedString_string = readStringFromEEPROM(0);

    
    Serial.println ("");
    Serial.print("String 1 read from EEPROM: ");
    Serial.println(retrievedString_string);
    Serial.print("Largo: ");
    Serial.println(retrievedString_string.length());
    Serial.println("");
    Serial.println("String EEPROM Raw 0 to 20: ");

    for (int j = 0; j < 20; j++) {

      Serial.print (EEPROM.read(j));

    }
    Serial.println ("");
  }
    
    
    if (digitalRead(button_load_print) == LOW) {

    String retrievedString_string = readStringFromEEPROM(0);
    String retrievedString_string2 = readStringFromEEPROM(25);

    
    Serial.println ("");
    Serial.print("String 2 read from EEPROM: ");
    Serial.println(retrievedString_string2);
     Serial.print("Largo: ");
    Serial.println(retrievedString_string2.length());
    Serial.println("");
    Serial.println("String2 EEPROM Raw 25 to 45: ");

    for (int j = 25; j < 45; j++) {

      Serial.print (EEPROM.read(j));

    }
  

    Serial.println("");
  }


  delay (350);
}