Contador de pulsos, tiempo y EEPROM -error-

buenos días, ando con este código que lo que hace es contar las veces que se pulsa un pulsador, y cuenta el tiempo que permanece pulsado. el programa sin las opciones de EEPROM funciona bien, lo que quiero es cuando por ejemplo se pulsa por serial la "s" (guardar en eeprom) y la "r" (para resetear valores de la misma), estas dos opciones para minimizar el impacto en las escrituras de la eeprom.
el registro del contador funciona bien, me guarda correctamente las veces que se ha pulsado, pero el registro del tiempo NO. alguien me puede echar un cable? que estoy haciendo mal?
gracias

#include <JC_Button.h> 
#include <EEPROM.h> //Librería para controlar la EEPROM de la Arduino

//definició pins digitals per comptar pulsacions
Button boton0(34);

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");
    }
  }
             
}

SOLUCIONADO,

Cuando hablamos de

  • flotantes utilizamos la función put() y get()
  • enteros utilizamos la función write() y read()

simplemente he cambiado a int las variables y a correr!

no, necesariamente.
Puedes usar get y put en todos los casos.
Puedes hacerlo asi tmb.

if (option == 'r')     {
      Serial.println("resetear memoria");
      duracion_acumulada0 = 0;
      EEPROM.put(eeAddress0, duracion_acumulada0);
      numpulsos0 = 0;
      EEPROM.put(eeAddress4, numpulsos0);
      delay(5000);
      Serial.println("memoria borrada");
    }

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);
    }
  }
}

Hago el comentario sobre la versión que uso @victorjam pero el error es del OP, no uses vocales acentuadas porque Serial.print no lo permite
En luglar de esto

Serial.print("duració actual: ");

hazlo asi con error de ortografía

Serial.print("duracion actual: ");

muchas gracias cracks!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.