Hola Buenas tardes, mi nombre es Luciano estoy empezando a realizar algunas pruebas con arduino y me surgió un tema que no puedo resolver. Aclaro que no tengo mucha experiencia en programación, recién comienzo.
El tema es el siguiente, necesito "leer" el tiempo que se mantiene presionado un pulsador y que se guarde en la memoria eeprom del modulo. Luego ese tiempo será el de apertura de un relé al presionar otro pulsador.
Con el tema registro de tiempo investigue y la funcion pulseIn() parece ser lo mas adecuado.
Desde ya muchas gracias!!!
No te recomiendo el uso de pulseIn ya que no vas a lograr una medición correcta debido a los rebotes del pulsador. Para que lo entiendas cuando abres/cierras un pulsador este no pasa de abierto a cerrado directamente, si no que la señal "rebota" varias veces entre los estados HIGH y LOW hasta quedarse en su estado (ya sea abierto o cerrado).

En esta imagen ves el efecto de pulsar el botón como es.
Lo mejor es buscar una buena libreria para botones que te permita conocer el estado del botón y que tenga un elimador de "rebotes" o debounce. Por ejemplo esta: JC_Button.
Una vez que tengas la libreria (y mi consejo es que te la leas y la entiendas), el proceso consiste en detectar cuando has pulsado y cuando has soltado el botón, mirando el tiempo con millis.
Más o menos sería algo así:
Button boton(pin);
unsigned long tiempo1, tiempo2, duracion;
void setup() {
}
void loop() {
boton.read(); // Actualizo el botón.
if ( button.wasPressed() ) { // Si ha sido pulsado.
tiempo1 = millis(); //Guardo el tiempo.
}
if ( button.wasReleased() ) { // Si ha sido soltado.
tiempo2 = millis(); // cojo el tiempo
duracion = tiempo2-tiempo1; // y calculo la duración.
}
}
Este código es una orientación, no es perfecto, se puede mejorar y es incompleto. Trato de que entiendas la idea de como hacerlo y ahora lo pongas en práctica tú.

Hola Victor, gracias por tu repuesta.
Entiendo lo del rebote, voy a ir leer esa documentación de la librería para ver como funciona y probar el código que expusiste.
El tiempo que se guardaría seria de unos 5 segundos aprox, si hay un error de hasta medio segundo no habría problema. Opinas que el rebote te genera una lectura muy errónea?
Por otro lado otra forma de resolverlo seria que comience a contar cuando se presiona y que corte cuando se presione otro pulsador y guarde ese tiempo. Crees que así seria mas fácil?
Me faltaría la parte de guardar este registro en la eeprom
saludos y gracias!
El rebote no dura casí nada, del orden de milisegundos, para el ojo humano es imperceptible, pero Arduino es mucho más rápido y la función pulseIn lo detectaría.
Además el rebote va a depender en mayor o menor medida del pulsador, de como lo pulses etc, eso quiere decir que el rebote no va a ser igual siempre.
Por eso las librerias de debounce tienen la opción de ajustar el tiempo de comprobación. La técnica generalmente consiste en observar que durante un tiempo la señal ya esta fija y entonces da por buena la señal.
El error que puedes cometer no llegará a medio segundo si está bien hecho (habría que ver otro código aparte que haya).
El usar otro pulsador depende de como quieras implementarlo y si necesitas pines o no, otro botón implica usar un pin libre. Luego tienes que detectar el pulsado de uno, y luego el del otro.
Por ejemplo:
Button a(2);
Button b(3);
unsigned long t1, t2, d;
void setup() {
}
void loop() {
a.read();
b.read();
if ( a.wasPressed() ) {
t1 = millis();
}
if ( b.wasPressed() ) {
t2 = millis();
d = t2-t1;
EEPROM.update(0, d); // Esto escribe el dato en la EPROM.
}
}
En cuanto al guardado en la memoria (lo puse en el código) una vez que tienes la duración ya solo te falta escribirlo. Recomiendo el uso de update ya que esta función primero comprueba que el valor que quieres escribir es diferente al que hay, alargando la vida útil de la memoria.
Antes de escribir nada en memoria, te aconsejo que hagas pruebas con Serial y asi ves el resultado que te da, y cuando ya lo tengas claro haces el update