Construye un Temporizador de Cocina Fiable con Arduino y Pantalla LCD
Componentes y materiales
| Arduino UNO | 1 |
| Pantalla LCD 16x2 Blanco sobre Azul (Adafruit) | 1 |
| Pulsadores 12 mm (SparkFun) | 4 |
| Resistencia 10 kΩ | 4 |
| Resistencia 220 Ω | 2 |
| Potenciómetro mono-vuelta 100 kΩ | 1 |
| Zumbador (buzzer) | 1 |
| Protoboard (genérica) | 1 |
| Cables jumper (genéricos) | 1 |
Sobre el proyecto
Un temporizador de cocina casero, totalmente programable, con cuatro modos de operación y alarma sonora. Ideal para aprender máquinas de estados, manejo de botones con antirrebote y gestión de tiempo con la librería TimeLib.
Lo que necesitas
- Todos los componentes del Kit de Inicio Arduino (incluye protoboard pequeña).
- Fuente de alimentación: puerto USB del PC es suficiente para pruebas.
Funcionamiento: cuatro modos
El temporizador opera en un solo modo a la vez:
- IDLE (espera): muestra el tiempo configurado; modo inicial tras encendido o reset.
- SETUP (configuración): se entra con pulsación larga en S4 (botón reset). S3 (start/stop) selecciona qué valor cambiar (horas/minutos/segundos). S2 (down) y S1 (up) decrementan/incrementan el valor.
- RUNNING (cuenta atrás): se inicia con S3. Sale con S3 o S4 (vuelve a IDLE).
- RINGING (alarma): se activa al llegar a cero. Cualquier botón la silencia y vuelve a IDLE.
El código: estructura principal
Librerías
#include <LiquidCrystal.h>
#include <TimeLib.h> // Paul Stoffregen's Time Library
Inicialización LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Puedes reordenar pines para mejorar el cableado.
Gestión de botones (ejemplo: Start/Stop)
startStopButtonPressed = false;
startStopButtonState = digitalRead(startStopButtonPin);
if (startStopButtonState != startStopButtonPrevState) {
startStopButtonPressed = (startStopButtonState == HIGH);
startStopButtonPrevState = startStopButtonState;
}
Cada botón usa una resistencia pull-down de 10 kΩ; al pulsar, el pin va a HIGH. El botón S4 (reset) tiene lógica extra para detectar pulsación larga (>100 ciclos de loop).
Máquina de estados (switch-case)
switch (currentMode) {
case MODE_IDLE:
if (resetButtonPressed) Reset();
if (resetButtonLongPressed) currentMode = MODE_SETUP;
if (startStopButtonPressed) {
currentMode = (currentMode == MODE_IDLE) ? MODE_RUNNING : MODE_IDLE;
if (currentMode == MODE_RUNNING) startTime = now();
}
break;
case MODE_SETUP:
// navegación y edición de horas/minutos/segundos
break;
case MODE_RUNNING:
if (startStopButtonPressed || resetButtonPressed) currentMode = MODE_IDLE;
break;
case MODE_RINGING:
if (anyButtonPressed) currentMode = MODE_IDLE;
break;
}
Gestión del tiempo
case MODE_RUNNING:
currentTime = setupTime - (now() - startTime);
if (currentTime <= 0) currentMode = MODE_RINGING;
break;
case MODE_RINGING:
analogWrite(buzzerPin, 20); delay(20);
analogWrite(buzzerPin, 0); delay(40); // beep intermitente
break;
Actualización de la pantalla
Cada modo imprime textos y valores en posiciones fijas. En RUNNING se formatea HH:MM:SS con ceros a la izquierda.
Esquema de conexiones
Ver imágenes adjuntas en la sección Schematics. El esquema muestra conexiones de botones (con pull-down), LCD, zumbador y alimentación. Puede usarse cualquier protoboard; el zumbador puede colocarse bajo los cables amarillos.
Código completo
/**************************************************
* Arduino Kitchen Timer v1.0 - 2016/01/27
* By Angelo Fiorillo (Rome, IT) - GPL3+
**************************************************/
#include <LiquidCrystal.h>
#include <TimeLib.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int buzzerPin = 10;
const int resetButtonPin = 6;
const int startStopButtonPin = 7;
const int downButtonPin = 8;
const int upButtonPin = 9;
// Variables de tiempo, estados, modos... (ver código original)
void setup() {
lcd.begin(16, 2);
pinMode(resetButtonPin, INPUT);
pinMode(startStopButtonPin, INPUT);
pinMode(upButtonPin, INPUT);
pinMode(downButtonPin, INPUT);
pinMode(buzzerPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
// 1. Lectura de botones con detección de flanco y pulsación larga (reset)
// 2. Switch-case de modos (IDLE, SETUP, RUNNING, RINGING)
// 3. Cálculo de tiempo restante y disparo de alarma
// 4. Actualización LCD según modo
delay(10); // pequeña pausa para estabilidad
}
void Reset() {
currentMode = MODE_IDLE;
currentHours = setupHours;
currentMinutes = setupMinutes;
currentSeconds = setupSeconds;
}
El código completo con todas las variables y lógica está en el original. Incluye manejo robusto de pulsaciones, antirrebote por software y guardado de configuración en variables globales.
Proceso de manufactura
- Alerta de Sed Inteligente para Plantas: Sensor DIY para Riego Óptimo
- Construya un osciloscopio Arduino de 20 kHz en LCD Nokia 5110: Guía DIY fácil
- Persianas Inteligentes: Control Automático de Luz con Arduino y Energía Solar
- Reloj de Palabras en Italiano con Arduino Nano, NeoPixel, LCD y RTC
- Construye un Temporizador Regresivo Fiable con Arduino y Pantalla de 7 Segmentos SparkFun
- Medidor kWh Sigfox Fiable con Arduino MKR Fox 1200
- Monitor de temperatura con Bluetooth usando Arduino Nano
- Cerradura por Gestos Sin Contacto: Acceso Seguro con APDS-9960 y Arduino
- Kit Compañero Arduino Nano: Componentes y Herramientas Esenciales para Electrónica DIY
- Circuito de entrada analógica aislada para Arduino
- Test de Precisión de Tiempo de Reacción con Arduino UNO