Cronometro consulta

Buenas tenia una consulta respecto a un código para un cronometro que se muestra en una pantalla lcd, usando un pulsador como inicio/pausa y otro como reset, y bueno a la hora de simular al oprimir el botón de inicio pues este no inicia de manera inmediata, y tarda bastante en que empiece a trabajar, y una vez que lo hace tarda bastante en pasar los segundos y lo ademas de que cuando pasa el tiempo este no cambia de forma regular, sino que a veces se tarda mas en cambiar, ademas al volver a presionar el pulsador para pausar este no funciona correctamente.

Adjunto el código con el que estoy trabajando por si me pueden ayudarme a consultar y ver el error que estoy cometiendo. Cabe decir que el segundo pulsador de reset funciona correctamente, de antemano gracias por la consulta.

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int k;
unsigned int horas = 0;
unsigned int minutos = 0;
unsigned int segundos = 0;
unsigned int centesimos = 0;
unsigned int milisegundos;
int reset = A2;
int inicio = A1;

void setup() {
  pinMode(reset, INPUT);
  pinMode(inicio, INPUT);
  lcd.begin(16, 2);
  lcd.setCursor(3, 0);
  lcd.print("CRONOMETRO");
}

void loop() {
  if (digitalRead(reset) == LOW) {
    k = 0;
  }

  if (digitalRead(inicio) == LOW) {
    k = 1;
  }

  switch (k) {
    case 0:
      horas = 0;
      minutos = 0;
      segundos = 0;
    case 1:
      delay (10);
    case 2:
      cronometro();
  }
}

void cronometro() {
  milisegundos = millis ();
  if (milisegundos % 10 == 0) {
    centesimos++;
    if (centesimos == 100) {
      centesimos = 0;
      segundos++;
    }
    if (segundos == 60) {
      segundos = 0;
      minutos++;
    }
    if (minutos == 60) {
      minutos = 0;
      horas++;
    }
    lcd.setCursor(4, 1);
    if (horas < 10) {
      lcd.print("0");
    }
    lcd.print(horas);
    lcd.print(":");
    lcd.setCursor(7, 1);
    if (minutos < 10) {
      lcd.print("0");
    }
    lcd.print(minutos);
    lcd.print(":");
    lcd.setCursor(10, 1);
    if (segundos < 10) {
      lcd.print("0");
    }
    lcd.print(segundos);
  }
}

Prueba poniendo al final del loop()

k = -1;

sino en cada vuelta loop va a volver a entrar al switch() con 0 ó 1 según el último botón que hayas pulsado.

Tienes, desde mi punto de vista, varios errores conceptuales pero prueba si así te funciona, lo demás lo vemos luego.

Saludos

PD: Y por favor edita tu código y pon el indentado como corresponde, cuesta bastante leerlo (suerte que es corto). En la IDE de Arduino, click en Herramientas, Autoformato y ya queda hermoso para copiar y pegar aquí. :wink:

Tu cronómetro puede

  • estar corriendo
  • estar en pausa
  • estar reseteando (momentáneamente)

y es un candidato ideal para una máquina de estados (digital state machine).

DSM es un enfoque de programación que simplifica mucho la lógica en casos como éste, que te recomiendo utilizar.

Y siempre usa unsigned long con variables asociadas a millis()

Totalmente de acuerdo.

Esto que escribo a continuación es una cuestión de enfoques.
Para qué usar contadores de centésimas, segundos, minutos, horas si lo único que debes hacer es
Si entiendes como funciona millis() te das cuenta que mucho de lo que has hecho es superfluo.
Con solo tomar en inicio el valor de millis() y restar el valor actual de millis() con dicho valor de inicio tienes en todo momento lo que gustes.
Solo debes escribir del mismo modo que has hecho una rutina que transforme el valor diferencia en hh:mm:ss.00

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