Arduino MEGA grabar en la epromm

Estimados tengo este código, y es como que queda en un loop el setup, la idea es guardar algunos datos en la memoria.

char cbuff[3];

struct DATOS{
   char salida[];
   int  dia;
   char   inicio[];
   char   fin[];
   boolean usable;
};

union MEMORIA{
   DATOS dato;
   byte  b[sizeof(DATOS)];
}
miMemoria;


#include <EEPROM.h>
#define address 0

String aux;

void setup()
{
  Serial.begin(9600);
  Serial.print("setup");
   // Se recuperan los datos de la memoria EEPROM:
   for( int i=0 ; i<sizeof(DATOS) ; i++  )
      miMemoria.b[i] = EEPROM.read( address+i );


   // Se comprueba que se hayan podido leer los datos (que no se haya leido basura)
   // No es la forma mas elegante de hacerlo pero funciona:
   if( miMemoria.dato.usable == true )
   {
      aux = "IA1";
      aux.toCharArray(miMemoria.dato.salida,3);
      aux = "0800";
      aux.toCharArray(miMemoria.dato.inicio,4);
      aux = "0930";
      aux.toCharArray(miMemoria.dato.fin,4);
      miMemoria.dato.dia = 0;
      
   }
   // Si nunca se habian usado se inicializan todos los datos:
   else
   {
      aux = ""; 
      aux.toCharArray(miMemoria.dato.salida,3);   
      
      aux = "0000";
      aux.toCharArray(miMemoria.dato.inicio,4); 
      
      aux = "0000";
      aux.toCharArray(miMemoria.dato.fin,4); 
      
      miMemoria.dato.dia = 0;
      miMemoria.dato.usable = true;
  }


   // Se guardan los datos en la memoria EEPROM:
   for( int i=0 ; i<sizeof(DATOS) ; i++  )
      EEPROM.write( address+i , miMemoria.b[i] );


   // Se imprime por pantalla los datos:
   delay(1000);
   
   Serial.print("Imprimiendo en Pantalla"); 
   Serial.print("Salida = "); Serial.println(miMemoria.dato.salida);
   Serial.print("Dia     = "); Serial.println(miMemoria.dato.dia);
   Serial.print("Inicio         = "); Serial.println(miMemoria.dato.inicio);
   Serial.print("Fin         = "); Serial.println(miMemoria.dato.fin);
   pinMode(13, OUTPUT);
   digitalWrite(13, HIGH);
}

void loop()
{
   // Una vez cargamos los datos en el SETUP ya podemos hacer uso de ellos desde nuestro programa.
   // ...
}

Alguna Sugerencia??? Gracias,

Hola. Apostaría que "EEPROM.write( address+i , miMemoria.b );" no es el proceso correcto para guardar una estructura de datos.

No tengo mucha experiencia guardando datos en la eeprom, hasta ahora solo byte e int usando byteLow y BiteHigh, pero creo que si quieres grabar en la memoria eeprom un dato que no es byte debes usar EEPROM.put e ir actualizando (en tu caso) address con address+= sizeof(float) si anteriormente grabaste un dato del tipo float.

En este link hay unos ejemplos

Saludos

Estimado gracias por tu respuesta, te comento lo que estoy haciendo:

adreess = se lo paso por parámetro una en especial.

void grabaHorariosEpromm(int address,int diaG,String salidaG,int inicioH,int inicioM,int finH,int finM,String diaF){ 
  //graba horarios
  //para levantar luego de un corte de energia
  //grabaHorariosEpromm(1,"IA1",0,hora,minuto,horaApagado1,minutoApagado,0);
  Serial.println("salidaG-----------");
  Serial.println(salidaG);
  Serial.println(address);
  Serial.println("--------salidaG----------");
  var = {
    salidaG,
    diaG,
    inicioH,
    inicioM,
    finH,
    finM,
    diaF,
    1
  };

  //var.salida = "uuu";
  Serial.println("var.salida");
  Serial.println(var.salida);
  Serial.println("---------------");
  
  EEPROM.put( address, var);
  address += sizeof(float);  //Obtener la siguiente posicion para escribir
  if(address >= EEPROM.length()) address = 0;  //Comprobar que no hay desbordamiento
  Alarm.delay(5000); //espera 5 segundos

}

luego en el setup reviso que hay dentro:

EEPROM.get(11,var);

  /*
   * 
   *  String salida;
  int dia;
  int inicioH;
  int inicioM;
  int finH;
  int finM;
  String diaLetra;
  int activa;  
   * 
   * 
   */
  String auxAlgo = String(var.salida); 
  Serial.println(var.salida);  
  //Serial.println(var.dia);  
  //Serial.println(var.inicioH);

Y no hay nada!!!!, alguna sugerencia, gracias

Para guardar cualquier cosa en eemprom desde hace un buen tiempo que contamos con estos comandos

EEPROM.put y EEPROM.get.

Este es el ejemplo para EEPROM.get para put es similar y esta en el link.

#include <EEPROM.h>

struct MyObject{
  float field1;
  byte field2;
  char name[10];
};

void setup(){

  float f = 0.00f;   //Variable to store data read from EEPROM.
  int eeAddress = 0; //EEPROM address to start reading from

  Serial.begin( 9600 );
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Serial.print( "Read float from EEPROM: " );

  //Get the float data from the EEPROM at position 'eeAddress'
  EEPROM.get( eeAddress, f );
  Serial.println( f, 3 );  //This may print 'ovf, nan' if the data inside the EEPROM is not a valid float.

  // get() can be used with custom structures too. 
  eeAddress = sizeof(float); //Move address to the next byte after float 'f'.
  MyObject customVar; //Variable to store custom object read from EEPROM.
  EEPROM.get( eeAddress, customVar );

  Serial.println( "Read custom object from EEPROM: " );
  Serial.println( customVar.field1 );
  Serial.println( customVar.field2 );
  Serial.println( customVar.name );
}

void loop(){ /* Empty loop */ }

Suficientemente claro no?