Grabar y leer Eeprom put y get

Hola a todos los entendidos y a los que no, tambien!

Estoy haciendo un cuentakilometros para mi moto con un Arduino Nano y una pantalla lcd de 20*4
Aunque no esta en el codigo, se alimentará por el puerto Vin con 12 voltios

Me estoy metiendo con guardar datos pero tengo problemas en el codigo ya que se me vuelve loco la float Trip1 y Trip2 y me deja de funcionar correctamente cuando. No se mucho de Arduino y me cuesta un poco porque soy autodidacta

Quisiera que almacene las float Trip1 y Trip2 cuando hay un corte de voltaje

Otra cosa que quisiera saber es, que codigo he de poner para que guarde los datos cuando haya ese corte de corriente. Por lo que he encontrado, con un condensador de 4700uF almacenaria voltaje el tiempo suficiente para que guarde los datos pero no se como tengo que hacerlo ni como conectarlo a las patillas de mi arduino Nano

Os paso mi código y a ver si veis que hago mal
Gracias

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

//Trips 1 y 2
int
estadoUltimo  = 0,
estadoUltimo1 = 0,
estadoUltimo2 = 0,
estadoActual1 = 0,
estadoActual2 = 0,
estadoActual3 = 0,
estadoActual4 = 0;


unsigned long 
contador = 0,
contador1 = 0;

float
perimetroRueda = 2.205,
Trip1 = 0,
Trip2 = 0;
char buffer[20] = " ";
char* buffn = " ";

unsigned long
tiempo1 = 0,
tiempo2 = 0,
tiempo3 = 0,
tiempo4 = 0,
tiempo5 = 0,
tiempo6 = 0,
B_reset = 0,
B_mas   = 0,
B_menos = 0;

// EEprom
int
eeAddress1 = 0;

void setup() {
lcd.begin(20, 4);}
void loop() {

  /*EEPROM.put( eeAddress1, Trip1 );  //Grabamos el valor
  eeAddress1 += sizeof(Trip1);  //Obtener la siguiente posicion para escribir
  if(eeAddress1 >= EEPROM.length()) eeAddress1 = 0;  //Comprobar que no hay desbordamiento
  
  EEPROM.get( eeAddress1, Trip1 );
  eeAddress1 += sizeof(Trip1);*/


  //Trip 1
  lcd.setCursor(0, 0);
  dtostrf(Trip1, 10, 2, buffn);
  char* formato = "Trip 1 %s Km";
  sprintf(buffer, formato, buffn);
  lcd.print(buffer);

  //Trip 2
  lcd.setCursor(0, 1);
  dtostrf(Trip2, 10, 2, buffn);
  char* formato1 = "Trip 2 %s Km";
  sprintf(buffer, formato1, buffn);
  lcd.print(buffer);

trip_1();
}
  void trip_1() {
  Trip1 = ((perimetroRueda*contador) / 100);
  estadoActual1 = digitalRead(6);
  if (estadoActual1 != estadoUltimo) {
    if (estadoActual1 == HIGH) {
      contador = contador + 1;
    }
  }
// Si Trip 1 es mayor a 999, Trip 1 volverá a 0
  if (Trip1>=999){
  Trip1 = 0;
  contador = 0;}
  estadoUltimo = estadoActual1;
  trip_2();
}
//------------------------------------------------------------------------------------
void trip_2() {
  // Trip 2
  Trip2 = ((perimetroRueda*contador1) / 100);
  estadoActual1 = digitalRead(6);
  if (estadoActual1 != estadoUltimo1) {
    if (estadoActual1 == HIGH) {
      contador1 = contador1 + 1;
    }
  }
  // Si Trip 2 es mayor a 999, Trip 2 volverá a 0
  if (Trip2>=999){
  Trip2 = 0;
  contador1 = 0;}
  estadoUltimo1 = estadoActual1;
  ajuste();
}
//------------------------------------------------------------------------------------

// Ajuste Trip2
void ajuste(){
//Boton Aumentar Trip 2

//Al pulsar boton de 0 a 2.5 segundos, Trip 2 aumenta de 1 en 1
//Si se mantiene el boton pulsado de 2.5 a 6 segundos, Trip 2 aumenta de 10 en 10
//Si se mantiene el boton pulsado de 6 a 100 segundos, Trip 2 aumenta de 100 en 100

estadoActual2=digitalRead(7);
  if (estadoActual2 == HIGH) {
    tiempo6 = millis();}
  if (estadoActual2 == LOW) {
    tiempo5 = millis();}
  B_mas = (tiempo6 - tiempo5);
  if (estadoActual2 == HIGH);{
    if (B_mas >10 && B_mas < 2499){
      contador1 = contador1 +1;}
else{
    if(B_mas > 2500 && B_mas < 600000){
      contador1 = contador1 +15;}

}
}
//------------------------------------------------------------------------------------
// Boton Dismiunir Trip 2

//Al pulsar boton de 0 a 2.5 segundos, Trip 2 disminuye de 1 en 1
//Si se mantiene el boton pulsado de 2.5 a 6 segundos, Trip 2 disminuye de 10 en 10
//Si se mantiene el boton pulsado de 6 a 100 segundos, Trip 2 disminuye de 100 en 100

estadoActual3=digitalRead(8);{
  if (estadoActual3 == HIGH) {
   tiempo4 = millis();}
  if (estadoActual3 == LOW) {
    tiempo3 = millis();}
  B_menos = (tiempo4 - tiempo3);
  if (estadoActual3 == HIGH);{
    if (B_menos >10 && B_menos < 2499){
      contador1 = contador1 -1;
      if (Trip2<=0){
        Trip2 = Trip2 = 0;
        contador1 = contador1 = 0;}}
else{
    if(B_menos > 2500 && B_menos < 600000){
      contador1 = contador1 -15;
// Si Trip 2 es menor a 0, Trip 2 será 0
      if (Trip2<=0){
        Trip2 = Trip2 = 0;
        contador1 = contador1 = 0;}}
}
}
}
puesta_a_0();
}

//------------------------------------------------------------------------------------
void puesta_a_0(){
//Puesta a 0 contadores
//Al pulsar boton reset de 0 a 3 segundos , Trip1 1 se pone a 0
//Al pulsar boton reset de 3 a 5 segundos , Trip1 2 se pone a 0

//Boton Reset Trips
  estadoActual4=digitalRead(9);{
  if (estadoActual4 == HIGH) {
   if(B_reset > 10 && B_reset < 3000){
      contador = 0;}}
      
  estadoActual4=digitalRead(9);{
  if (estadoActual4 == HIGH) {
   tiempo2 = millis();}
  if (estadoActual4 == LOW) {
    tiempo1 = millis();}
  B_reset = (tiempo2 - tiempo1);
  if (estadoActual4 == HIGH);{
    if(B_reset > 3000 && B_reset < 5000){
      contador1 = 0;}
Serial.print("Trip1 ");
}}}}

No entiendo para que pones un código tan largo si tu problema solo esta en el uso de get y put

  /*EEPROM.put( eeAddress1, Trip1 );  //Grabamos el valor
  eeAddress1 += sizeof(Trip1);  //Obtener la siguiente posicion para escribir
  if(eeAddress1 >= EEPROM.length()) eeAddress1 = 0;  //Comprobar que no hay desbordamiento
  
  EEPROM.get( eeAddress1, Trip1 );
  eeAddress1 += sizeof(Trip1);*/

Eso es suficiente, cual es el problema? NO veo en el codigo algo que detecte que te quedas sin energía, digamos para habilitar el uso de EEPROM.put()

Luego en tu setup, tendrias que hacer lo mismo con EEPROM.get. No se cuantos valores necesitas guardar y cuantos recuperar?

surbyte: Eso es suficiente, cual es el problema? NO veo en el codigo algo que detecte que te quedas sin energía, digamos para habilitar el uso de EEPROM.put() Luego en tu setup, tendrias que hacer lo mismo con EEPROM.get.

He probado a poner en setup el código y el valor de Trip1, que es con el que estoy probando, siempre es 0 al volver a enchufar la alimentación. No se si hago algo mal o hay error en el código

void setup() {
lcd.begin(20, 4);
EEPROM.get( eeAddress1, Trip1);
eeAddress1 += sizeof(Trip1);}
void loop() {

EEPROM.put( eeAddress1, Trip1);  //Grabamos el valor
eeAddress1 += sizeof(Trip1);  //Obtener la siguiente posicion para escribir
if(eeAddress1 >= EEPROM.length()) eeAddress1 = 0;  //Comprobar que no hay desbordamiento}

surbyte: No se cuantos valores necesitas guardar y cuantos recuperar?

Como dije en el primer post, quiero guardar las variables Trip1 y Trip2 y por su puesto, leerlas al iniciar.

surbyte: NO veo en el codigo algo que detecte que te quedas sin energía, digamos para habilitar el uso de EEPROM.put()

Te respondo con parte de mi primer post

esoj: Otra cosa que quisiera saber es, que codigo he de poner para que guarde los datos cuando haya ese corte de corriente. Por lo que he encontrado, con un condensador de 4700uF almacenaria voltaje el tiempo suficiente para que guarde los datos pero no sé como tengo que hacerlo ni como conectarlo a las patillas de mi arduino Nano

Aquí encontré lo del condensador en el post 12, pero nadie hace referencia a cuando hay un corte de alimentación

https://forum.arduino.cc/index.php?topic=128736.0

No se si me puedeis ayudar con este tema y pregunto porque no se como lo puedo hacer

Por favor vuelve a leer las normas del foro, los enlaces van con etiquetas no simple texto plano.

Tienes que tener una detección de que te quedas sin energía y debe ser veloz, mas veloz que el tiempo que te de ese capacitor de 4700uF.

Asi que trabaja con eso primero

Respecto de leer las variables, ahora no me respondiste a mi. Cuantas variables vas a guardar, supongo que una sola no?

Si es una sola (es lo que yo supongo) para que incrementas la dirección?

no puedo guiarte sin entender bien eso.

ADVERTENCIA: Ten cuidado con eluso de la EEPROM. El Arduino tiene un limite en su uso de 100.000 ciclos de escritura. Si lo superas es posible que ese grupo de direcciones quede inservible o inaccesible.

Asi que no abuses en el LOOP con grabaciones sin control.