Es más. write() y read() solo son capaces de trabajar con bytes. Si quieres escribir un unsigned long con esas funciones deberías escribir cuatro bytes.
No veo falla en tu código. Solo se me ocurren dos cosas: una es que interpretas mal la salida; y otra que olvidas que cuando subes el sketch el programador realiza un borrado de memoria, lo que incluye la EEPROM.
He añadido una opción más al puerto serie 'v' para ver el contenido de las dos posiciones de la EEPROM. Mi resultado:
En una pasada, habiendo realizado pruebas antes:
vduración acumulada:21171
numero de pulsos:6
duració actual: 8410
duració acumulada: 29581
num de pulsos: 7
sSense energia
dades guardades a EEPROM
vduración acumulada:29581
numero de pulsos:7
En otra pasada, apagando y volviendo a encender.
vduración acumulada:29581
numero de pulsos:7
duració actual: 7360
duració acumulada: 36941
num de pulsos: 8
duració actual: 199
duració acumulada: 37140
num de pulsos: 9
sSense energia
dades guardades a EEPROM
vduración acumulada:37140
numero de pulsos:9
No noto la falla de que no guarde la duración acumulada. El único pero que veo es que el botón en su primera pulsación tiene un tiempo alto, y quizas se deba a que no ha habido una inicialización antes.
Aquí el código que he usado:
#include <JC_Button.h>
#include <EEPROM.h> //Librería para controlar la EEPROM de la Arduino
//definició pins digitals per comptar pulsacions
Button boton0(5);
unsigned long tiempo1, tiempo2, duracion_actual0, duracion_total0, duracion_acumulada0, numpulsos0;
int eeAddress0 = 0;
int eeAddress4 = 4;
int option;
void setup() {
Serial.begin(9600);
EEPROM.get( eeAddress0, duracion_acumulada0 );
EEPROM.get( eeAddress4, numpulsos0 );
}
void loop() {
//codi per saber numero de pulsacions i temps transcorregut "pulsat"
boton0.read(); // Actualizo el botón.
if ( boton0.wasPressed() ) { // Si ha sido pulsado.
tiempo1 = millis(); //Guardo el tiempo.
}
if ( boton0.wasReleased() ) { // Si ha sido soltado.
numpulsos0++;
tiempo2 = millis(); // cojo el tiempo
duracion_actual0 = tiempo2-tiempo1; // y calculo la duración.
Serial.print("duració actual: ");
Serial.println(duracion_actual0);
duracion_acumulada0 = duracion_actual0 + duracion_acumulada0;
Serial.print("duració acumulada: ");
Serial.println(duracion_acumulada0);
Serial.print("num de pulsos: ");
Serial.println(numpulsos0);
}
//preparació sistema per guardar dades a la eeprom abans que marxi la llum i pulsador per fer reset a la eeprom
if (Serial.available()>0){
//leemos la opcion enviada
option=Serial.read();
if(option=='s') {
Serial.println("Sense energia");
EEPROM.put( eeAddress0, duracion_acumulada0 );
EEPROM.put( eeAddress4, numpulsos0 );
Serial.println("dades guardades a EEPROM");
}
if(option=='r') {
Serial.println("resetejar memoria");
for (int i = 0 ; i < EEPROM.length() ; i++) {
EEPROM.write(i, 0);
}
delay(5000);
Serial.println("memoria borrada");
}
if (option=='v') {
unsigned long a, b;
EEPROM.get(eeAddress0, a);
EEPROM.get(eeAddress4, b);
Serial.print("duración acumulada:"); Serial.println(a);
Serial.print("numero de pulsos:"); Serial.println(b);
}
}
}