Buenas tardes @Surbyte.
Tal y como me comentaste, buscando ejemplos he conseguido hacer gran parte de lo que necesito.
Ya tengo funcionando que se inicie el cronometro y sume una unidad el contador con un sensor y que se pare cuando detecta el otro y mostrarlo todo por el display.
Ahora tengo problema al intentar hacer la resta del contador con un botón y el reset de todo con otro. Al pulsar los botones no hace nada de nada.
El código del programa és el siguiente y el código de los botones está al final del todo:
// Importar librerías
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
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;
int contador = 0;
long milisegundos = 0;
int boton_resta = 7; // restar unidades contador
int boton_reset = 8; // resetear contador y cronometro
int sensor_inicio = 9; // pulsador_inicio en PIN digital 10
int sensor_fin = 10; // pulsador_pausa en PIN digital 9
void setup()
{
Serial.begin(9600); // Comienzo de la comunicación serie
pinMode(sensor_inicio, INPUT_PULLUP); // Pin digital 10 como entrada
pinMode(sensor_fin, INPUT_PULLUP); // Pin digital 9 como entrada
pinMode(boton_reset, INPUT); // Pin digital 8 como entrada
pinMode(boton_resta, INPUT); // Pin digital 7 como entrada
// Inicializamos el LCD
lcd.begin(16,2);
lcd.backlight();
}
void(* resetFunc) (void) = 0;//declare reset function at address 0
void loop()
{
// Si presionamos el pulsador de inicio se pone todo a cero, se reinicia em cronómetro y se suma una unidad al contador
if(digitalRead(sensor_inicio) == HIGH)
{
horas = 0;
minutos = 0;
segundos = 0;
decimas = 0;
lcd.clear();
// Se suma una unidad al contador
contador++;
// Se muestra el contador por el LCD
lcd.setCursor(3,1);
lcd.print("CONTADOR:");
lcd.print( contador);
while(digitalRead(sensor_fin) == LOW)
{
// 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(4,0);
if(horas < 10)
{
lcd.print("0");
}
lcd.print(horas);
lcd.print(":");
lcd.setCursor(7,0);
if(minutos < 10)
{
lcd.print("0");
}
lcd.print(minutos);
lcd.print(":");
lcd.setCursor(10,0);
if(segundos < 10)
{
lcd.print("0");
}
lcd.print(segundos);
}
}
}
// Si se detecta el sensor de fin, se para el tiempo.
if(digitalRead(sensor_fin) == HIGH)
{
delay(200);
while(digitalRead(sensor_inicio) == LOW);
delay(200);
}
if(digitalRead(boton_reset) == LOW)
{
resetFunc();
}
if(digitalRead(boton_resta) == LOW)
{
contador --;
}
}
Cualquier ayuda o aclaración es bien recibida. Gracias.