Hola a todos.
Lo que quiero hacer es :
Al mantener pulsado un botón me imprima una sola vez en el serial "Boton pulsado" y empiece un contador.
Al dejar de pulsar el boton imprimir una sola vez "boton no pulsado" e imprimir tambien el tiempo que se mantuvo pulsado.
Este es el codigo que he hecho, pero me sale la impresion en bucle y los tiempos no concuerdan
int boton = 2;
bool estado = true;
tiempo = 0;
void setup() {
pinMode(boton, INPUT);
Serial.begin(9600);
}
void loop() {
if (digitalRead(boton) == HIGH) {
for (int i = 0; i < 1; i++) {
Serial.println("Boton encendido");
}
//empezar a contar el tiempo
tiempo = millis();
}
if (digitalRead(boton) == LOW) {
for (int i = 0; i < 1; i++) {
Serial.println("Boton apagado");
}
//detener el tiempo
tiempo = millis() - tiempo;
Serial.println("boton apagado");
Serial.println(tiempo);
//poner el tiempo en 0
tiempo = 0;
}
Lo que hice fue establecer los flancos cuando cambia de 1 a 0 o sea cuando comienza el LOW y ahi arranco el timer usando millis(). Tomo su valor en una variable.
Luego hago lo mismo pero cuando suelto. Miro el flanco de 0 a 1 y detengo la variable que controla
Sin embargo habrás visto lo que hice.
lo primero es priorizar la medición de tiempo, sin cosas raras, sin Serial, sin LCD sin nada. Luego activé la variable o flag que determina cuando mostrar algo y ahi si, me tomo el tiempo del mundo porque ya medí y leo los sensores, leo y presento todo, hago de cuenta que tengo todo el tiempo del mundo.
En tu caso, y tal como lo has presentado eso es asi posible.
Finalmente la variable presentar la puedo poner en 0 o no. Puede hacer que presentar se ponga en false cuando inicia una nueva medición. Ahora bien, si eso es asi, te aseguro que habrá que esperar los tiempso de los sensores que si son bloqueantes o sea si son lentos, pues sentiras un retraso entre que presionas y que responde.
Por eso lo mas adecuado es poner presentar como flag en false una vez que has mostrado todo.