#include <Servo.h> // Incluir la librería para controlar el servo
// Pines de los botones, LEDs, buzzer y servo
int botonEncendido = 24; // Pin del botón de encendido
int botonApagado = 25; // Pin del botón de apagado
int pinLeds = 3; // Pin de los LEDs
int buzzer = 23; // Pin del buzzer
int pinServo = 2; // Pin del servo
// Variables de control
bool encendido = false; // Estado del sistema (encendido/apagado)
bool servoPosicion180 = true; // Estado del servo (180 grados = true, 90 grados = false)
// Servo
Servo servoMotor; // Objeto servo
// Variables de debounce
unsigned long tiempoUltimoCambioEncendido = 0;
unsigned long tiempoUltimoCambioApagado = 0;
const unsigned long debounceDelay = 50; // Tiempo de debounce para los botones
// Melodía básica para el buzzer
int melodia[] = { 262, 294, 330, 349, 392, 440, 494, 523 }; // Notas musicales
int duracionNotas[] = { 500, 500, 500, 500, 500, 500, 500, 500 }; // Duración de las notas
int cantidadNotas = sizeof(melodia) / sizeof(melodia[0]); // Número de notas en la melodía
void setup() {
// Configuración de los pines
pinMode(botonEncendido, INPUT_PULLUP); // Usar resistencia pull-up interna para el botón de encendido
pinMode(botonApagado, INPUT_PULLUP); // Usar resistencia pull-up interna para el botón de apagado
pinMode(pinLeds, OUTPUT); // Configurar el pin de LEDs como salida
pinMode(buzzer, OUTPUT); // Configurar el buzzer como salida
digitalWrite(pinLeds, LOW); // Asegurarse de que los LEDs estén apagados al inicio
// Conectar el servo al pin definido y colocarlo inicialmente en 180 grados
servoMotor.attach(pinServo);
servoMotor.write(180);
}
void loop() {
// Leer el estado de los botones
int estadoEncendido = digitalRead(botonEncendido);
int estadoApagado = digitalRead(botonApagado);
// Obtener el tiempo actual para el debounce
unsigned long tiempoActual = millis();
// Verificar si se presiona el botón de encendido y evitar rebotes
if (estadoEncendido == LOW && (tiempoActual - tiempoUltimoCambioEncendido > debounceDelay)) {
tiempoUltimoCambioEncendido = tiempoActual;
manejarEncendido(); // Llama a la función para manejar el encendido
}
// Verificar si se presiona el botón de apagado y evitar rebotes
if (estadoApagado == LOW && (tiempoActual - tiempoUltimoCambioApagado > debounceDelay)) {
tiempoUltimoCambioApagado = tiempoActual;
manejarApagado(); // Llama a la función para manejar el apagado
}
// Si el sistema está encendido, reproducir la melodía
if (encendido) {
reproducirMelodia();
}
// Pequeña pausa para estabilizar la lectura de los botones
delay(20);
}
// Función para manejar el encendido del sistema
void manejarEncendido() {
if (!encendido) {
encendido = true; // Cambiar el estado a encendido
encenderLeds(); // Encender los LEDs
moverServo(90); // Mover el servo a 90 grados
}
}
// Función para manejar el apagado del sistema
void manejarApagado() {
if (encendido) {
encendido = false; // Cambiar el estado a apagado
apagarLeds(); // Apagar los LEDs
moverServo(180); // Mover el servo de vuelta a 180 grados
noTone(buzzer); // Apagar el buzzer
}
}
// Función para encender los LEDs
void encenderLeds() {
digitalWrite(pinLeds, HIGH); // Encender los LEDs conectados al pin
}
// Función para apagar los LEDs
void apagarLeds() {
digitalWrite(pinLeds, LOW); // Apagar los LEDs conectados al pin
}
// Función para mover el servo a una posición deseada (90 o 180 grados)
void moverServo(int posicion) {
servoMotor.write(posicion); // Mover el servo a la posición indicada
delay(1000); // Esperar 1 segundo para que complete el movimiento
}
// Función para reproducir una melodía con el buzzer
void reproducirMelodia() {
for (int i = 0; i < cantidadNotas; i++) {
tone(buzzer, melodia[i]); // Reproducir cada nota en el buzzer
delay(duracionNotas[i]); // Esperar el tiempo correspondiente a cada nota
noTone(buzzer); // Detener el buzzer antes de la siguiente nota
// Si el sistema se apaga durante la melodía, detener la reproducción
if (!encendido) {
noTone(buzzer); // Apagar el buzzer
return; // Salir de la función
}
}
}