Escribir un contador en direcciones diferentes de la EEPROM

Buenas Tardes a todos,

Estoy elaborando una prueba con la memoria EEPROM de mi arduino uno. La prueba consiste en 2 botones, el Boton1 cada vez que lo pulso me imprime un numero integro, empieza por el 0, y cada vez que lo pulso va sumando 1 y lo guardo en la dirección consecutiva de la memoria EEPROM.
El Boton2 me imprime el total de las veces que he pulsado el Boton1, resetea el contador a 0, y me lo guarda en la EEPROM.

Espero haberme explicado bien, os dejo el código que me funciona bien:

#include <EEPROM.h>

const int boton1 = 8; 
const int boton2 = 9;
bool valorBoton1, valorBotonAnt1 = false;
bool valorBoton2, valorBotonAnt2 = false;
int contador = 0;
byte direccion = 0;

void setup() {
Serial.begin(9600);
pinMode(boton1,INPUT);
pinMode(boton2,INPUT);


}

void loop() {
    valorBoton1 = digitalRead(boton1);
    valorBoton2 = digitalRead(boton2);

  if (valorBoton1 && !valorBotonAnt1){

  Serial.println(contador);

  contador++;

  direccion++;

  EEPROM.update(direccion, contador);
  }
valorBotonAnt1 = valorBoton1;
delay (5);




  if (valorBoton2 && !valorBotonAnt2){

  Serial.println("El total de pulsos es:");
  Serial.println(contador);

  contador = 0;

  direccion++;

  EEPROM.update(direccion, contador);
  }
valorBotonAnt2 = valorBoton2;
delay (5);
}

Mi duda viene ahora, se que la memoria EEPROM del arduino tiene una vida de 100.000 escrituras, el objetivo de esta prueba, es que no quiero reescribir en la misma dirección de la EEPROM, porque solamente me duraría 100.000 pulsos de los botones, y la idea es aprovechar la memoria EEPROM del arduino al máximo posible y que pueda durar mas de 100.000 pulsos del botón.

Debido a mi inexperiencia en Arduino, me gustaría saber si con el código que he elaborado, mi arduino durara mas 100.000 pulsos del botón o no.

Muchisimas gracias de antemano.

Creo que tienes una confusión.

Lo primero es que una misma dirección de memoria EEPROM y en realidad tampoco es así porque al grabarse existe un sector de varis memorias que son afectadas por la misma prueba. Asi que grabar en la posición 0 y las consecutivas arrastra el mismo efecto que hacerlo simultáneamente en la misma.

Entonces.. si usas EEPROM.put(direccion, dato) y lees con EEPROM.get(direccion, dato) podrás comprobar lo que digo.

La EEPROM varía según el Arduino en uso. Asi que debes establecer la capacidad EEPROM de tu arduino.
No me respondas, tengo un UNO para que lo haga yo, búscalo.

Luego con ese dato sabrás que al incrementar la posición de memoria no puedes superar determinada dirección.

Te invito a que hagas 100.000 ensayos y luego me cuentas.

Como dije, el nro 100 mil vale para la misma dirección o el mismo grupo de celdas EEPROM utilizadas por al escritura del microcontrolador.

Efectivamente tengo un fallo, porque al apagar el Arduino en medio de pulsación antes de pulsar el Boton2 para resetear el contador, no me tiene en cuenta el ultimo dato guardado.

surbyte, he podido profundizar mas en las memorias EEPROM de los diferentes arduino, en mi caso (Arduino UNO) tiene una capacidad de 1KB, o lo que es lo mismo 1024 bits, el contador que uso es de tipo INT, y ese valor necesita 2 bits para almacenarse, lo que quiere decir que necesito 2 celdas para almacenarlo, eso me reduce a 512 direcciones de almacenamiento.

He introducido la funcion EEPROM.get:

#include <EEPROM.h>

const int boton1 = 8;
const int boton2 = 9;
bool valorBoton1, valorBotonAnt1 = false;
bool valorBoton2, valorBotonAnt2 = false;
int contador = 0;
byte direccion = 0;

void setup() {
Serial.begin(9600);
pinMode(boton1,INPUT);
pinMode(boton2,INPUT);


}

void loop() {

    EEPROM.get(direccion, contador);
    valorBoton1 = digitalRead(boton1);
    valorBoton2 = digitalRead(boton2);

  if (valorBoton1 && !valorBotonAnt1){

  Serial.println(contador);

  contador++;

  direccion++;

  EEPROM.update(direccion, contador);
  }
valorBotonAnt1 = valorBoton1;
delay (5);




  if (valorBoton2 && !valorBotonAnt2){

  Serial.println("El total de pulsos es:");
  Serial.println(contador);

  contador = 0;

  direccion++;

  EEPROM.update(direccion, contador);
  }
valorBotonAnt2 = valorBoton2;
delay (5);
}

y cuando apago y enciendo el arduino, me salen valores totalmente dispares, estilo 365, o 470... sin ser consecutivos.

Si tenéis alguna sugerencia o pista que me pueda orientar, os estaré muy agradecidos.

Get es para leer y put para guardar información en la EEPROM.

Luego los ejemplos que te he indicado con etiquetas explican como se incrementan las direcciones de acuerdo al tipo de variables utilizada.
Si usas int, el incremento será de 2 en 2.

Muchísimas gracias por la pista, investigare para poder realizarlo.

He realizado el siguiente código con tus recomendaciones:

#include <EEPROM.h>
const int boton1 = 8;
const int boton2 = 9;
bool valorBoton1, valorBotonAnt1 = false;
bool valorBoton2, valorBotonAnt2 = false;
int count = 0;  
int eeAddress = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(boton1, INPUT);  
  pinMode(boton2, INPUT); 
}

void loop()
{
  EEPROM.get(eeAddress, count);
  valorBoton1 = digitalRead(boton1);
  valorBoton2 = digitalRead(boton2);

  if (valorBoton1 && !valorBotonAnt1) 
  {
    Serial.println(count);
    count++;
    eeAddress += sizeof(int);  
    EEPROM.put(eeAddress, count);  
  }
  valorBotonAnt1 = valorBoton1;
  delay (5);

  if (valorBoton2 && !valorBotonAnt2)
  {

    Serial.println("El Total es:");
    Serial.println(count);

    count = 0;

    eeAddress += sizeof(int);

    EEPROM.put(eeAddress, count);
  }
  valorBotonAnt2 = valorBoton2;
  delay (5);
}

me funciona siempre y cuando no desconecte de la corriente el Arduino, una vez que lo desconecto y lo reconecto, empieza a imprimir datos diferentes, empieza siempre por el numero 256, en lugar de continuar con la consecución de los números de contador ultimo guardado.

Buenas tardes surbyte, una consulta rápida, cuando se reinicia el Arduino, siempre se ejecuta por defecto la primera dirección de la EEPROM?

me funciona siempre y cuando no desconecte de la corriente el Arduino, una vez que lo desconecto y lo reconecto, empieza a imprimir datos diferentes, empieza siempre por el numero 256, en lugar de continuar con la consecución de los números de contador ultimo guardado.

Imposible que continue con los números porque tu programa se reinicia y count vuelve a comenzar de 0.
Para que eso ocurriera, tendrías que en el arranque (entiéndase setup)hacer un barrido y buscar la ultima posicion grabada y tomarla como tal.

barre desde 0 en pasos de sizeof(int) buscando valores != 0 o FF, revisa porque no recuerdo con que estan x defecto. O crea tu una función que los ponga a 0 x una vez y luego ejecuta esta idea.

Muchísimas gracias surbyte, me estaba volviendo loco, al reiniciar el Arduino siempre se vuelve a dirección 0 de la EEPROM.

Seguiré tu recomendación de crear un barrido para localizar la ultima dirección grabada. Muchísimas gracias de nuevo.