#include <LiquidCrystal.h> // Incluimos la librería para manejar el LCD
// Definimos los pines para la pantalla LCD (RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
// Variables globales
volatile bool contando = true; // Variable para controlar si el contador está activo
volatile int contador = 0; // Variable para almacenar el valor del contador
volatile unsigned long lastDebounceTime = 0; // Para el debounce de los botones
const unsigned long debounceDelay = 200; // Tiempo de debounce
void setup() {
// Configuración inicial del LCD
lcd.begin(16, 2); // Inicializamos el LCD como 16x2
lcd.setCursor(0, 0);
lcd.print("...."); // Mensaje inicial
lcd.setCursor(0, 1);
lcd.print("Contador/Interr.");
delay(3000); // Esperamos 3 segundos
lcd.clear(); // Limpiamos la pantalla
pinMode(13, OUTPUT); // Pin 13 (LED integrado) como salida
digitalWrite(13, LOW); // Inicialmente el LED está apagado
// Configuramos las interrupciones externas
// Interrupción 0 (pin 2) - Pausar/Reanudar el contador
attachInterrupt(digitalPinToInterrupt(2), botonPausa, RISING);
// Interrupción 1 (pin 3) - Reiniciar el contador
attachInterrupt(digitalPinToInterrupt(3), botonReset, RISING);
}
void loop() {
// Si el contador está activo, incrementamos y actualizamos el LCD
if (contando) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CONTADOR: ");
lcd.print(contador);
contador++; // Incrementamos el contador
digitalWrite(13, HIGH); // Encendemos el LED mientras contamos
} else {
digitalWrite(13, LOW); // Apagamos el LED cuando está pausado
}
delay(1000); // Esperamos un segundo entre incrementos
}
// Función de interrupción para el botón en pin 2
void botonPausa() {
// Verificamos si ha pasado suficiente tiempo desde la última interrupción (debounce)
if ((millis() - lastDebounceTime) > debounceDelay) {
contando = !contando; // Invertimos el estado (pausa/reanuda)
lcd.setCursor(0, 1);
if (!contando) {
lcd.print("INTERRUMPIDO "); // Mostramos mensaje cuando se pausa
} else {
lcd.print("CONTANDO... "); // Mostramos mensaje cuando se reanuda
}
lastDebounceTime = millis(); // Actualizamos el tiempo de la última interrupción
}
}
// Función de interrupción para el botón en pin 3
void botonReset() {
// Verificamos si ha pasado suficiente tiempo desde la última interrupción (debounce)
if ((millis() - lastDebounceTime) > debounceDelay) {
contador = 0; // Reiniciamos el contador a cero
contando = true; // Aseguramos que el contador esté activo
lcd.setCursor(0, 1);
lcd.print("REINICIADO "); // Mostramos mensaje de reinicio
lastDebounceTime = millis(); // Actualizamos el tiempo de la última interrupción
}
}