Temporizador cuenta atrás ajustable con Arduino y display 7 segmentos 4 dígitos
Componentes y materiales
| Componente | Cantidad | Notas |
|---|---|---|
| Arduino Mega 2560 (cualquier Arduino sirve) | 1 | |
| Display 7 segmentos 4 dígitos (ánodo común) | 1 | |
| Pulsadores | 4 | Inicio/Parar, Reset, +, - |
| Buzzer | 1 | |
| Cables jumper | ~21 | |
| Protoboard tamaño completo | 1 |
Sobre el proyecto
Temporizador cuenta atrás standalone, ajustable mediante botones físicos (sin reprogramar). Incluye función PrintNumber() reutilizable para mostrar cualquier número (0-9999) en el display multiplexado durante un tiempo dado. Ideal para cocina, laboratorio, juegos, etc.
Funcionamiento
- 4 botones: Btn1 (pin 13) Inicio/Parar, Btn2 (pin 12) Reset, Btn3 (pin 16) Decrementar, Btn4 (pin 17) Incrementar.
- En espera: muestra tiempo actual, pulsando +/- se ajusta (mantener acelera).
- Al pulsar Inicio: cuenta atrás segundo a segundo (aprox 962 ms por tick por calibración).
- Al llegar a 0: suena tono durante 1s y vuelve a espera.
- Si se pulsa Reset durante la cuenta, vuelve a modo ajuste.
Código completo
#include <math.h>
int digit_pin[] = {6, 9, 10, 11}; // Pines PWM dígitos (izq a der)
int speakerPin = 15;
#define DIGIT_ON LOW
#define DIGIT_OFF HIGH
// Pines segmentos A-G
int segA = 2, segB = 3, segC = 4, segD = 5, segE = A0, segF = 7, segG = 8;
int button1=13, button2=12, button3=16, button4=17;
int countdown_time = 60; // Valor inicial (segundos)
struct Digits { int d[4]; };
void setup() {
pinMode(segA, OUTPUT); pinMode(segB, OUTPUT); pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT); pinMode(segE, OUTPUT); pinMode(segF, OUTPUT); pinMode(segG, OUTPUT);
for (int i=0; i<4; i++) pinMode(digit_pin[i], OUTPUT);
pinMode(speakerPin, OUTPUT);
pinMode(button1, INPUT_PULLUP); pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP); pinMode(button4, INPUT_PULLUP);
}
void playTone(int tone, int duration) {
for (long k=0; k < duration*1000L; k += tone*2) {
digitalWrite(speakerPin, HIGH); delayMicroseconds(tone);
digitalWrite(speakerPin, LOW); delayMicroseconds(tone);
}
}
void lightNumber(int n) {
#define SEG_ON HIGH
#define SEG_OFF LOW
switch(n) {
case 0: digitalWrite(segA,SEG_ON); digitalWrite(segB,SEG_ON); digitalWrite(segC,SEG_ON); digitalWrite(segD,SEG_ON); digitalWrite(segE,SEG_ON); digitalWrite(segF,SEG_ON); digitalWrite(segG,SEG_OFF); break;
case 1: digitalWrite(segA,SEG_OFF); digitalWrite(segB,SEG_ON); digitalWrite(segC,SEG_ON); digitalWrite(segD,SEG_OFF); digitalWrite(segE,SEG_OFF); digitalWrite(segF,SEG_OFF); digitalWrite(segG,SEG_OFF); break;
case 2: digitalWrite(segA,SEG_ON); digitalWrite(segB,SEG_ON); digitalWrite(segC,SEG_OFF); digitalWrite(segD,SEG_ON); digitalWrite(segE,SEG_ON); digitalWrite(segF,SEG_OFF); digitalWrite(segG,SEG_ON); break;
case 3: digitalWrite(segA,SEG_ON); digitalWrite(segB,SEG_ON); digitalWrite(segC,SEG_ON); digitalWrite(segD,SEG_ON); digitalWrite(segE,SEG_OFF); digitalWrite(segF,SEG_OFF); digitalWrite(segG,SEG_ON); break;
case 4: digitalWrite(segA,SEG_OFF); digitalWrite(segB,SEG_ON); digitalWrite(segC,SEG_ON); digitalWrite(segD,SEG_OFF); digitalWrite(segE,SEG_OFF); digitalWrite(segF,SEG_ON); digitalWrite(segG,SEG_ON); break;
case 5: digitalWrite(segA,SEG_ON); digitalWrite(segB,SEG_OFF); digitalWrite(segC,SEG_ON); digitalWrite(segD,SEG_ON); digitalWrite(segE,SEG_OFF); digitalWrite(segF,SEG_ON); digitalWrite(segG,SEG_ON); break;
case 6: digitalWrite(segA,SEG_ON); digitalWrite(segB,SEG_OFF); digitalWrite(segC,SEG_ON); digitalWrite(segD,SEG_ON); digitalWrite(segE,SEG_ON); digitalWrite(segF,SEG_ON); digitalWrite(segG,SEG_ON); break;
case 7: digitalWrite(segA,SEG_ON); digitalWrite(segB,SEG_ON); digitalWrite(segC,SEG_ON); digitalWrite(segD,SEG_OFF); digitalWrite(segE,SEG_OFF); digitalWrite(segF,SEG_OFF); digitalWrite(segG,SEG_OFF); break;
case 8: digitalWrite(segA,SEG_ON); digitalWrite(segB,SEG_ON); digitalWrite(segC,SEG_ON); digitalWrite(segD,SEG_ON); digitalWrite(segE,SEG_ON); digitalWrite(segF,SEG_ON); digitalWrite(segG,SEG_ON); break;
case 9: digitalWrite(segA,SEG_ON); digitalWrite(segB,SEG_ON); digitalWrite(segC,SEG_ON); digitalWrite(segD,SEG_ON); digitalWrite(segE,SEG_OFF); digitalWrite(segF,SEG_ON); digitalWrite(segG,SEG_ON); break;
case 10: digitalWrite(segA,SEG_OFF); digitalWrite(segB,SEG_OFF); digitalWrite(segC,SEG_OFF); digitalWrite(segD,SEG_OFF); digitalWrite(segE,SEG_OFF); digitalWrite(segF,SEG_OFF); digitalWrite(segG,SEG_OFF); break;
}
}
void SwitchDigit(int d) {
for (int i=0; i<4; i++) digitalWrite(digit_pin[i], (i==d)?DIGIT_ON:DIGIT_OFF);
}
Digits IntToDigits(int n) {
Digits dig; int zeros=0, d;
for (int i=0; i<4; i++) {
d = n / (int)pow(10, 3-i);
zeros += d;
n -= d * (int)pow(10, 3-i);
dig.d[i] = (zeros!=0 || i==3) ? d : 10; // 10 = apagado (leading zero blank)
}
return dig;
}
void PrintNumber(int n, int timeMs) {
Digits dig = IntToDigits(n);
for (int i=0; i<= timeMs/20; i++) {
if (digitalRead(button2)==LOW) return; // Reset aborta
for (int j=0; j<4; j++) { SwitchDigit(j); lightNumber(dig.d[j]); delay(5); }
}
}
bool Countdown(int n, int tickMs) {
for (int q=n; q>0; q--) {
PrintNumber(q, tickMs);
if (digitalRead(button2)==LOW) return false; // Reset pulsado
}
PrintNumber(0,0);
playTone(1519, 1000); // Tono final
return true;
}
void resetMode() {
int pressed3=0, pressed4=0;
Digits dig = IntToDigits(countdown_time);
while (digitalRead(button1)==HIGH) { // Espera Inicio
for (int j=0; j<4; j++) { SwitchDigit(j); lightNumber(dig.d[j]); delay(5); }
if (digitalRead(button3)==LOW) { // Decrementar
if (pressed3==0 || pressed3>30) { if (countdown_time>0) countdown_time--; dig = IntToDigits(countdown_time); }
pressed3++;
} else if (digitalRead(button4)==LOW) { // Incrementar
if (pressed4==0 || pressed4>30) { if (countdown_time<9999) countdown_time++; dig = IntToDigits(countdown_time); }
pressed4++;
}
if (digitalRead(button3)==HIGH) pressed3=0;
if (digitalRead(button4)==HIGH) pressed4=0;
}
}
void loop() {
resetMode();
while (!Countdown(countdown_time, 962)) { resetMode(); }
while (digitalRead(button2)==HIGH); // Espera soltar Reset
}
Esquemático
Conexiones: segmentos A-G a pines 2-5,7,8,A0; dígitos 1-4 a pines PWM 6,9,10,11; botones con pull-up interno a pines 12,13,16,17; buzzer a pin 15. Ver imagen esquemática adjunta.
Proceso de manufactura
- Pantalla de Cristal Líquido (LCD): Tecnología, Fabricación y Perspectivas Futuras
- Primal Display: construye monitor temperatura LCD con Raspberry Pi
- Cómo Instalar la Pantalla TFT 3.5″ Kuman en RetroPie – Guía Paso a Paso
- Construya el clásico juego Pong en Arduino UNO con pantalla OLED: Tutorial paso a paso
- Entender el Watchdog Timer: Cómo evita bloqueos del microcontrolador
- Kit de máquina tragaperras alienígena ATmega328P
- Proyecto HMI Interactivo con Nextion, Arduino Mega y Múltiples Sensores
- Construye un Temporizador Regresivo Fiable con Arduino y Pantalla de 7 Segmentos SparkFun
- Amortiguadores ajustables: mejorando altura de marcha y rendimiento
- Dominando la Sobrecarga de Métodos en C#: Conceptos, Ejemplos y Buenas Prácticas
- Comprender las Tasks en Verilog: Funciones vs Tasks, sintaxis y uso