/*
* PROYECTO: Animación de Bienvenida y Secuencia de Intermitente Premium
* CREADO POR: artificialroot
* WEB: artificialroot.es
* * DESCRIPCIÓN:
* Este programa simula la "ceremonia" de iluminación de un coche moderno utilizando
* un ESP32-C3 y 8 LEDs direccionables (WS2812B). Incluye un encendido progresivo,
* un intermitente dinámico que sobreescribe el color blanco y un apagado suave.
*/
#include <Adafruit_NeoPixel.h>
// Definiciones de Hardware
#define PIN 8 // Pin de datos (ajustado para ESP32-C3)
#define NUMPIXELS 8 // Número de LEDs en la tira
// Inicialización de la tira de LEDs
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
// CONFIGURACIÓN DE COLORES TÉCNICOS
// Ambar optimizado para máxima visibilidad
const uint32_t COLOR_AMBAR = pixels.Color(255, 110, 0);
// Blanco cálido equilibrado para evitar el tono azulado de los LEDs baratos
const uint32_t COLOR_BLANCO = pixels.Color(255, 245, 200);
void setup() {
pixels.begin();
pixels.clear();
// Iniciamos con brillo 0 para evitar picos de consumo al conectar
pixels.setBrightness(0);
pixels.show();
// Pausa de seguridad para estabilizar el voltaje en el ESP32-C3
delay(500);
}
void loop() {
// --- 1. ANIMACIÓN DE BIENVENIDA ---
// Los LEDs se iluminan uno a uno en blanco para saludar al conductor
pixels.setBrightness(200);
for(int i=0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, COLOR_BLANCO);
pixels.show();
delay(50);
}
delay(500); // Pausa con la luz diurna (DRL) activa
// --- 2. PRIMER INTERMITENTE (EFECTO SOBREESCRITURA) ---
// El color naranja sustituye al blanco LED por LED sin apagar la tira.
// Este es el detalle que le da el aspecto de coche de alta gama.
for(int i=0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, COLOR_AMBAR);
pixels.show();
delay(40);
}
delay(150);
pixels.clear();
pixels.show();
delay(300);
// --- 3. CICLO DE INTERMITENCIA (4 PARPADEOS RESTANTES) ---
// Completamos la secuencia hasta llegar a los 5 parpadeos
for(int i=0; i<4; i++) {
for(int j=0; j < NUMPIXELS; j++) {
pixels.setPixelColor(j, COLOR_AMBAR);
pixels.show();
delay(40);
}
delay(150);
pixels.clear();
pixels.show();
delay(300);
}
// --- 4. LUZ FIJA BLANCA (MANTENER 5 SEGUNDOS) ---
// El sistema vuelve a la luz de posición antes de apagarse
for(int i=0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, COLOR_BLANCO);
}
pixels.setBrightness(255); // Brillo máximo para modo luz fija
pixels.show();
delay(5000);
// --- 5. FADE-OUT (APAGADO PROGRESIVO) ---
// Transición suave de 1.5 segundos hasta el apagado total
fadeOut(COLOR_BLANCO, 1500);
delay(2000); // Espera antes de reiniciar el bucle
}
/**
* Función auxiliar para realizar una atenuación de brillo fluida
* @param color El color que se está atenuando
* @param duracionMs Tiempo total de la transición
*/
void fadeOut(uint32_t color, int duracionMs) {
int brilloActual = pixels.getBrightness();
// Bajamos de 2 en 2 para que el ojo humano perciba menos "saltos"
for(int b = brilloActual; b >= 0; b -= 2) {
pixels.setBrightness(b);
pixels.show();
// Cálculo dinámico del delay según el brillo restante
delay(duracionMs / (brilloActual / 2));
}
pixels.clear();
pixels.show();
}