P07 - Sistema de alarma luminosa y acústica con pulsador
🚨 P07 - Sistema de alarma luminosa y acústica con pulsador
ℹ️ Empieza aquí:
En esta práctica integrarás varios componentes para crear un sistema de alarma realista, capaz de activarse y desactivarse mediante un pulsador, y que utiliza señales luminosas y acústicas.
Aprenderás a estructurar el programa usando una máquina de estados y a controlar eventos en el tiempo mediantemillis(), una técnica fundamental en sistemas embebidos reales.
🚀 Objetivos
• Integrar LEDs, buzzer y pulsador en un único sistema.
• Implementar una máquina de estados.
• Controlar señales acústicas y luminosas.
• Utilizar temporización no bloqueante con millis().
• Diseñar un sistema interactivo completo.
🧩 Contenidos trabajados
• Máquinas de estados.
• Entradas digitales con INPUT_PULLUP.
• Control de buzzer activo.
• Control de múltiples salidas.
• Temporización con millis().
💻 Materiales y recursos
• Arduino UNO.
• Protoboard.
• 1 buzzer activo.
• 2 LEDs.
• 2 resistencias (220 Ω – 330 Ω).
• 1 pulsador.
• Cables Dupont.
• Ordenador con Arduino IDE.
🔧 Montaje práctico
LEDs
1. Conecta:
- LED verde → pin 8
- LED rojo → pin 9
2. Cada LED con su resistencia a GND.
Buzzer
1. Pin positivo → pin 10
2. Pin negativo → GND
Pulsador
1. Un terminal → GND
2. Otro terminal → pin 2
(Usaremos INPUT_PULLUP)
🧭 Desarrollo de la práctica
Paso 1: Crear el proyecto
1. Abrir Arduino IDE
2. Archivo → Nuevo
3. Guardar como:
P07_Alarma_ApellidoNombre
Paso 2: Declarar variables
const int pinLEDVerde = 8;
const int pinLEDRojo = 9;
const int pinBuzzer = 10;
const int pinPulsador = 2;
bool alarmaActiva = false;
unsigned long tiempoAnterior = 0;
const unsigned long intervalo = 300;
bool estadoSalida = false;
Paso 3: Configurar setup()
void setup() {
pinMode(pinLEDVerde, OUTPUT);
pinMode(pinLEDRojo, OUTPUT);
pinMode(pinBuzzer, OUTPUT);
pinMode(pinPulsador, INPUT_PULLUP);
}
Paso 4: Leer pulsador
Añade al loop():
int lectura = digitalRead(pinPulsador);
if (lectura == LOW) {
alarmaActiva = !alarmaActiva;
delay(200);
}
Paso 5: Máquina de estados
Añade al loop():
if (alarmaActiva == false) {
digitalWrite(pinLEDVerde, HIGH);
digitalWrite(pinLEDRojo, LOW);
digitalWrite(pinBuzzer, LOW);
}
else {
digitalWrite(pinLEDVerde, LOW);
unsigned long tiempoActual = millis();
if (tiempoActual - tiempoAnterior >= intervalo) {
tiempoAnterior = tiempoActual;
estadoSalida = !estadoSalida;
digitalWrite(pinLEDRojo, estadoSalida);
digitalWrite(pinBuzzer, estadoSalida);
}
}
📄 Código completo
const int pinLEDVerde = 8;
const int pinLEDRojo = 9;
const int pinBuzzer = 10;
const int pinPulsador = 2;
bool alarmaActiva = false;
unsigned long tiempoAnterior = 0;
const unsigned long intervalo = 300;
bool estadoSalida = false;
void setup() {
pinMode(pinLEDVerde, OUTPUT);
pinMode(pinLEDRojo, OUTPUT);
pinMode(pinBuzzer, OUTPUT);
pinMode(pinPulsador, INPUT_PULLUP);
}
void loop() {
int lectura = digitalRead(pinPulsador);
if (lectura == LOW) {
alarmaActiva = !alarmaActiva;
delay(200);
}
if (alarmaActiva == false) {
digitalWrite(pinLEDVerde, HIGH);
digitalWrite(pinLEDRojo, LOW);
digitalWrite(pinBuzzer, LOW);
}
else {
digitalWrite(pinLEDVerde, LOW);
unsigned long tiempoActual = millis();
if (tiempoActual - tiempoAnterior >= intervalo) {
tiempoAnterior = tiempoActual;
estadoSalida = !estadoSalida;
digitalWrite(pinLEDRojo, estadoSalida);
digitalWrite(pinBuzzer, estadoSalida);
}
}
}
✅ Comprobación de funcionamiento
Estado reposo:
• LED verde encendido
• LED rojo apagado
• Buzzer apagado
Estado alarma:
• LED rojo parpadea
• Buzzer suena intermitente
📦 Entrega
• Archivo .ino funcional
• Vídeo demostración
• Explicación de la máquina de estados
📊 Rúbrica de evaluación
| Criterio | Excelente | Adecuado | Insuficiente |
|---|---|---|---|
| Montaje | Correcto | Parcial | Incorrecto |
| Funcionamiento | Completo | Parcial | No funciona |
| Máquina estados | Correcta | Parcial | Incorrecta |
| Código | Claro | Mejorable | Incorrecto |
| Comprensión | Alta | Media | Baja |
🎯 Para pensar (opcional)
¿Cómo añadirías un retardo de salida de 10 segundos antes de que la alarma se active?