Buenos días a tod@s,
Soy nuevo por aquí y en programación
He montado un cronómetro con 2 botones + lcd 20x4, estoy contento con los resultados pero me gustaría mejores resultados.
El tiempo se adelanta en 3,5 segundos cada hora, he comprobado con un cronómetro del móvil y la verdad no tengo ni idea de como solucionar este punto.
Y por otro lado, cuando enciendes el arduino empieza la puesta en marcha del tiempo, tienes un botón para pausar el tiempo y otro botón para poner el contador a cero.
Si se pausa el tiempo, y pulso el botón de restablecer a cero, no funciona, el restablecimiento es para cuando está en ejecución el cronómetro.
Lo ideal y lo que busco es, al encender, el contador esta a cero, al pulsar inicio empieza a contar, si presiono pausa poder restablecer con el botón de restablecimiento.
#include <LiquidCrystal_I2C.h>//Libreria para LCD I2C
#include <Wire.h>//libreria requrida para usar SDA y SCL
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// Variables para los cálculos internos del cronómetro
int horas = 0;
int minutos = 0;
int segundos = 0;
int decimas = 0;
long milisegundos = 0;
int pulsador_inicio = 10; // pulsador_inicio en PIN digital 10
int pulsador_pausa = 9; // pulsador_pausa en PIN digital 9
void setup() {
Serial.begin(9600); // Comienzo de la comunicación serie
pinMode(pulsador_inicio, INPUT); // Pin digital 10 como entrada
pinMode(pulsador_pausa, INPUT); // Pin digital 9 como entrada
lcd.begin(20, 4);//Inicializar la LCD 20x4
lcd.backlight();//Encender la luz de fondo
}
void loop() {
// Si presionamos el pulsador de inicio se pone todo a cero
if(digitalRead(pulsador_inicio) == HIGH)
{
horas = 0;
minutos = 0;
segundos = 0;
decimas = 0;
lcd.clear();
}
// Si presionamos el pulsador de pausa se congela el tiempo hasta que lo volvamos a presionar
if(digitalRead(pulsador_pausa) == HIGH)
{
delay(200);
while(digitalRead(pulsador_pausa) == LOW);
delay(200);
}
// Se cuentan los milisegundos transcurridos
milisegundos = millis();
// Si el tiempo transcurrido es mayor a una décima de segundo
if(milisegundos % 100 == 0)
{
decimas++;
// Si han pasado 10 décimas de segundo se cuenta un segundo
if(decimas == 10)
{
decimas = 0;
segundos++;
}
// Si han pasado 60 segundos se cuenta un minuto
if(segundos == 60)
{
segundos = 0;
minutos++;
}
// Si han pasado 60 minutos se cuenta una hora
if(minutos == 60)
{
minutos = 0;
horas++;
}
// Mostramos el tiempo a través del LCD
lcd.setCursor(1, 0);
lcd.print("------------------");
lcd.setCursor(1, 3);
lcd.print("------------------");
lcd.setCursor(4, 1);
lcd.print("tiempo");
lcd.setCursor(4,2);
if(horas < 10)
{
lcd.print("0");
}
lcd.print(horas);
lcd.print(":");
lcd.setCursor(7,2);
if(minutos < 10)
{
lcd.print("0");
}
lcd.print(minutos);
lcd.print(":");
lcd.setCursor(10,2);
if(segundos < 10)
{
lcd.print("0");
}
lcd.print(segundos);
lcd.print("[");
lcd.setCursor(13,2);
lcd.print(decimas);
lcd.print("]");
}
}
Gracias por todo!