Saltar a contenido

Práctica Especial

Contruye el siguiente circuito

main schematic

Secuencia de luces

#define LED_1 27
#define LED_2 26
#define LED_3 25
#define LED_4 33
#define LED_5 32
#define BUZZER 14

#define BTN_1 34
#define BTN_2 35

#define TIME 500

const int ledPins[] = {LED_1, LED_2, LED_3, LED_4, LED_5};
const int btnPins[] = {BTN_1, BTN_2};
const int numLeds = sizeof(ledPins) / sizeof(ledPins[0]);
const int numBtns = sizeof(btnPins) / sizeof(btnPins[0]);

void apagar_leds();

void apagar_leds(){
  for (int i = 0; i < numLeds; i++)
  {
    digitalWrite(ledPins[i], LOW); // Apagados al inicio
  }
}

void setup()
{
  Serial.begin(115200);
  Serial.println("Iniciando el programa...");

  // Configurar salidas
  for (int i = 0; i < numLeds; i++)
  {
    pinMode(ledPins[i], OUTPUT);
    digitalWrite(ledPins[i], LOW); // Apagados al inicio
  }
  pinMode(BUZZER, OUTPUT);
  digitalWrite(BUZZER, LOW);

  // Configurar entradas (Pines 34 y 35)
  for (int i = 0; i < numBtns; i++)
  {
    pinMode(btnPins[i], INPUT);
  }
}

void loop()
{
  apagar_leds();
  // Leer el estado de los botones
  bool btn1_state = digitalRead(BTN_1);
  bool btn2_state = digitalRead(BTN_2);

  if (btn1_state)
  {
    Serial.println("Boton 1 pulsado, parpadeando todos los LEDs...");
    apagar_leds();
    for (int i = 0; i < numLeds; i++)
    {
      digitalWrite(ledPins[i], HIGH);
      delay(TIME);
    }
    for (int i = 0; i < numLeds; i++)
    {
      digitalWrite(ledPins[i], LOW);
      delay(TIME);
    }
  }
  else if (btn2_state)
  {
    Serial.println("Botón 2 pulsado, encendiendo todos los LEDs...");
    apagar_leds();
    for (int i = 0; i < numLeds; i++)
    {
      digitalWrite(ledPins[i], HIGH);
    }
    delay(TIME);
    for (int i = 0; i < numLeds; i++)
    {
      digitalWrite(ledPins[i], LOW);
    }
    delay(TIME);
  }
  else
  {
    // Estado de espera estático (NO bloqueante)
    // Los LEDs se quedan fijos en un patrón alternado (encendido/apagado/encendido...)
    // hasta que presiones un botón.
    for (int i = 0; i < numLeds; i++)
    {
      Serial.println("Esperando a que se pulse un boton...");
      digitalWrite(ledPins[i], (i % 2 == 0) ? HIGH : LOW);
      delay(250);
    }
    apagar_leds();
     for (int i = 0; i < numLeds; i++)
    {
      Serial.println("Esperando a que se pulse un boton...");
      digitalWrite(ledPins[i], (i % 2 == 1) ? HIGH : LOW);
      delay(250);
    }
  }
}

ejemplo1

Siguiente paso despues de cada cambio de estado, hacer sonar el buzzer. Es decir, agregar la siguiente linea donde sea necesario

Secuencia con sonidos

#define LED_1 27
#define LED_2 26
#define LED_3 25
#define LED_4 33
#define LED_5 32
#define BUZZER 14

#define BTN_1 34
#define BTN_2 35

#define TIME 500

const int ledPins[] = {LED_1, LED_2, LED_3, LED_4, LED_5};
const int btnPins[] = {BTN_1, BTN_2};
const int numLeds = sizeof(ledPins) / sizeof(ledPins[0]);
const int numBtns = sizeof(btnPins) / sizeof(btnPins[0]);

void apagar_leds();
void sonido(int time);

void apagar_leds()
{
  for (int i = 0; i < numLeds; i++)
  {
    digitalWrite(ledPins[i], LOW); // Apagados al inicio
  }
}

void sonido(int time, int count)
{
  for (int i = 0; i < count; i++)
  {
    digitalWrite(BUZZER, HIGH);
    delay(time);
    digitalWrite(BUZZER, LOW);
    delay(time);
  }
}

void setup()
{
  Serial.begin(115200);
  Serial.println("Iniciando el programa...");

  // Configurar salidas
  for (int i = 0; i < numLeds; i++)
  {
    pinMode(ledPins[i], OUTPUT);
    digitalWrite(ledPins[i], LOW); // Apagados al inicio
  }
  pinMode(BUZZER, OUTPUT);
  digitalWrite(BUZZER, LOW);

  // Configurar entradas (Pines 34 y 35)
  for (int i = 0; i < numBtns; i++)
  {
    pinMode(btnPins[i], INPUT);
  }
  sonido(200, 3); // Sonido de inicio para confirmar que el programa se ha cargado correctamente
}

void loop()
{
  apagar_leds();
  // Leer el estado de los botones
  bool btn1_state = digitalRead(BTN_1);
  bool btn2_state = digitalRead(BTN_2);

  if (btn1_state)
  {
    Serial.println("Boton 1 pulsado, parpadeando todos los LEDs...");
    sonido(150, 2); // Sonido para indicar que el botón 1 ha sido pulsado
    apagar_leds();
    for (int i = 0; i < numLeds; i++)
    {
      digitalWrite(ledPins[i], HIGH);
      delay(TIME);
    }
    for (int i = 0; i < numLeds; i++)
    {
      digitalWrite(ledPins[i], LOW);
      delay(TIME);
    }
  }
  else if (btn2_state)
  {
    Serial.println("Boton 2 pulsado, encendiendo todos los LEDs...");
    sonido(200, 3); // Sonido para indicar que el botón 2 ha sido pulsado
    apagar_leds();
    for (int i = 0; i < numLeds; i++)
    {
      digitalWrite(ledPins[i], HIGH);
    }
    delay(TIME);
    for (int i = 0; i < numLeds; i++)
    {
      digitalWrite(ledPins[i], LOW);
    }
    delay(TIME);
  }
  else
  {
    // Los LEDs se quedan fijos en un patrón alternado (encendido/apagado/encendido...) hasta que presiones un botón.
    sonido(100, 1); // Sonido suave para indicar que el programa está en modo de espera
    for (int i = 0; i < numLeds; i++)
    {
      Serial.println("Esperando a que se pulse un boton...");
      digitalWrite(ledPins[i], (i % 2 == 0) ? HIGH : LOW);
      delay(250);
    }
    apagar_leds();
    for (int i = 0; i < numLeds; i++)
    {
      Serial.println("Esperando a que se pulse un boton...");
      digitalWrite(ledPins[i], (i % 2 == 1) ? HIGH : LOW);
      delay(250);
    }
  }
}

ejemplo1

Sonidos

Versión 2.x

#define LED_1 27
#define LED_2 26
#define LED_3 25
#define LED_4 33
#define LED_5 32
#define BUZZER 14

#define BTN_1 34
#define BTN_2 35

void led1();

void led1(){
  digitalWrite(LED_1, HIGH);
  delay(250);
  digitalWrite(LED_1, LOW);
  delay(250);
}

const int ledPins[] = {LED_1, LED_2, LED_3, LED_4, LED_5};
const int btnPins[] = {BTN_1, BTN_2};
const int numLeds = sizeof(ledPins) / sizeof(ledPins[0]);
const int numBtns = sizeof(btnPins) / sizeof(btnPins[0]);

// Configuración del canal PWM para el Buzzer en ESP32
const int buzzerChannel = 0;
const int resolution = 8;

void setup()
{
  Serial.begin(115200);
  Serial.println("Sistema de Luces y Sonido Iniciado...");

  // Configurar LEDs como salidas
  for (int i = 0; i < numLeds; i++)
  {
    pinMode(ledPins[i], OUTPUT);
    digitalWrite(ledPins[i], LOW);
  }

  // Configurar botones (Recuerda usar resistencias de pull-down externas en GPIO 34 y 35)
  for (int i = 0; i < numBtns; i++)
  {
    pinMode(btnPins[i], INPUT);
  }

  // Configurar el PWM para el buzzer en el ESP32
  ledcSetup(buzzerChannel, 2000, resolution);
  ledcAttachPin(BUZZER, buzzerChannel);
  ledcWriteTone(buzzerChannel, 0); // Silencio inicial
}

// Función para apagar todos los LEDs rápidamente
void apagarLeds() {
  for (int i = 0; i < numLeds; i++) {
    digitalWrite(ledPins[i], LOW);
  }
}

void loop()
{
  // Leer botones
  bool btn1 = digitalRead(BTN_1);
  bool btn2 = digitalRead(BTN_2);

  if (btn1 && btn2)
  {
    Serial.println("¡AMBOS BOTONES PULSADOS! Modo Caos activado...");

    // Efecto de sonido tipo glitch de computadora/caótico
    for (int i = 0; i < 10; i++) {
      int freqAleatoria = random(800, 3000); // Frecuencias altas aleatorias
      ledcWriteTone(buzzerChannel, freqAleatoria);

      // Encender un LED aleatorio y apagar los demás (Efecto estrobo)
      apagarLeds();
      digitalWrite(ledPins[random(0, numLeds)], HIGH);

      delay(60); // Ritmo muy rápido
    }

    ledcWriteTone(buzzerChannel, 0);
    apagarLeds();
  }else if (btn1)
  {
    Serial.println("Ejecutando: Efecto Sirena...");

    // Ciclo 1: Subiendo tono y encendiendo LEDs uno a uno
    for (int i = 0; i < numLeds; i++)
    {
      digitalWrite(ledPins[i], HIGH);
      ledcWriteTone(buzzerChannel, 600 + (i * 150)); // Tonos de 600Hz a 1200Hz
      delay(150);
      digitalWrite(ledPins[i], LOW);
    }

    // Ciclo 2: Bajando tono y regresando los LEDs
    for (int i = numLeds - 1; i >= 0; i--)
    {
      digitalWrite(ledPins[i], HIGH);
      ledcWriteTone(buzzerChannel, 1200 - ((numLeds - 1 - i) * 150));
      delay(150);
      digitalWrite(ledPins[i], LOW);
    }

    ledcWriteTone(buzzerChannel, 0); // Apagar sonido al terminar
  }
  else if (btn2)
  {
    Serial.println("Ejecutando: Efecto Arpegio Ascendente...");

    // Las frecuencias corresponden a las notas: Do, Mi, Sol, Do (Agudo), Mi (Agudo)
    int notas[] = {262, 330, 392, 523, 659};

    // Van encendiendo y se quedan encendidos acumulativamente
    for (int i = 0; i < numLeds; i++)
    {
      digitalWrite(ledPins[i], HIGH);
      ledcWriteTone(buzzerChannel, notas[i]);
      delay(200);
    }

    // Un destello final con el tono más agudo
    ledcWriteTone(buzzerChannel, 880); // Nota La (Aguda)
    delay(300);

    ledcWriteTone(buzzerChannel, 0); // Apagar sonido
    apagarLeds();                    // Apagar luces
    delay(200);
  }
  else
  {
    // Si no se presiona nada, nos aseguramos de que todo esté apagado y en silencio
    ledcWriteTone(buzzerChannel, 0);
    apagarLeds();
    led1(); // Pequeño destello para indicar que el sistema está activo
    delay(50); // Pequeña pausa para estabilidad
  }
}

Versión 3x

#include <Arduino.h>

// Pines asignados
#define LED_1 33
#define LED_2 15
#define LED_3 18
#define LED_4 2
#define LED_5 4
#define BUZZER 32

#define BTN_1 36
#define BTN_2 39

void led1();

void led1(){
  digitalWrite(LED_1, HIGH);
  delay(250);
  digitalWrite(LED_1, LOW);
  delay(250);
}

const int ledPins[] = {LED_1, LED_2, LED_3, LED_4, LED_5};
const int btnPins[] = {BTN_1, BTN_2};
const int numLeds = sizeof(ledPins) / sizeof(ledPins[0]);
const int numBtns = sizeof(btnPins) / sizeof(btnPins[0]);

// Configuración para la API v3.x de ESP32 (Ya no se necesita definir un canal manual)
const int resolution = 8;

void setup()
{
  Serial.begin(115200);
  Serial.println("Sistema v3.x Iniciado...");

  // Configurar LEDs como salidas
  for (int i = 0; i < numLeds; i++)
  {
    pinMode(ledPins[i], OUTPUT);
    digitalWrite(ledPins[i], LOW);
  }

  // Configurar botones (Pines 36 y 39 requieren pull-down externo)
  for (int i = 0; i < numBtns; i++)
  {
    pinMode(btnPins[i], INPUT);
  }

  // --- NUEVA API ESP32 v3.x ---
  // Vincula el pin directamente a una frecuencia y resolución.
  // El core gestiona el canal PWM automáticamente en el fondo.
  ledcAttach(BUZZER, 2000, resolution);
  ledcWriteTone(BUZZER, 0); // Silencio inicial (frecuencia 0)
}

// Función para apagar todos los LEDs rápidamente
void apagarLeds() {
  for (int i = 0; i < numLeds; i++) {
    digitalWrite(ledPins[i], LOW);
  }
}

void loop()
{
  // Leer botones
  bool btn1 = digitalRead(BTN_1);
  bool btn2 = digitalRead(BTN_2);

  // Ambos botones presionados (Modo Caos)
  if (btn1 && btn2)
  {
    Serial.println("¡AMBOS BOTONES PULSADOS! Modo Caos activado...");

    for (int i = 0; i < 10; i++) {
      int freqAleatoria = random(800, 3000);
      ledcWriteTone(BUZZER, freqAleatoria); // Usamos directamente el pin en lugar del canal

      apagarLeds();
      digitalWrite(ledPins[random(0, numLeds)], HIGH);

      delay(60);
    }

    ledcWriteTone(BUZZER, 0);
    apagarLeds();
  }
  // Botón 1 (Efecto Sirena)
  else if (btn1)
  {
    Serial.println("Ejecutando: Efecto Sirena...");

    for (int i = 0; i < numLeds; i++)
    {
      digitalWrite(ledPins[i], HIGH);
      ledcWriteTone(BUZZER, 600 + (i * 150));
      delay(150);
      digitalWrite(ledPins[i], LOW);
    }

    for (int i = numLeds - 1; i >= 0; i--)
    {
      digitalWrite(ledPins[i], HIGH);
      ledcWriteTone(BUZZER, 1200 - ((numLeds - 1 - i) * 150));
      delay(150);
      digitalWrite(ledPins[i], LOW);
    }

    ledcWriteTone(BUZZER, 0);
  }
  // Botón 2 (Efecto Arpegio)
  else if (btn2)
  {
    Serial.println("Ejecutando: Efecto Arpegio Ascendente...");

    int notas[] = {262, 330, 392, 523, 659};

    for (int i = 0; i < numLeds; i++)
    {
      digitalWrite(ledPins[i], HIGH);
      ledcWriteTone(BUZZER, notas[i]);
      delay(200);
    }

    ledcWriteTone(BUZZER, 880);
    delay(300);

    ledcWriteTone(BUZZER, 0);
    apagarLeds();
    delay(200);
  }
  // Ningún botón presionado
  else
  {
    ledcWriteTone(BUZZER, 0);
    apagarLeds();
    led1();
    delay(50);
  }
}