Contar tiempo de boton pulsado cuando se deje de pulsar

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

Alguna idea?

Aunque en algun sentido lo encaras abien hay cosas que no corresponden.
Esto por ejemplo. Si vas a medir tiempos no puedes perder tiempo haciendo algo

for (int i = 0; i < 1; i++) {
            Serial.println("Boton encendido");
        }

o esto

        for (int i = 0; i < 1; i++) {
            Serial.println("Boton apagado");
        }

Acá te dejo una versión de lo que quieres

Muchas gracias, ya me hago una idea de por donde van los tiros.

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.

 if (startButton && !startButtonAnt) {
     endTime = millis() - startTime;
     presentar = true;
  }

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.

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