#include // 1. CONFIGURACIÓN DE PINES #define TRIG_PIN D2 #define ECHO_PIN D3 #define CANTIDAD_TIRAS 5 // 2. TUS CONTEOS REALES DE LEDS (De Hombro a Cuello) // Línea 1: 22 | Línea 2: 20 | Línea 3: 16 | Línea 4: 12 | Línea 5: 6 int ledsPorLinea[] = {22, 20, 16, 12, 6}; // Pines correspondientes en el FabriXIAO int pinesTiras[] = {D4, D5, D6, D7, D8}; Adafruit_NeoPixel tiras[CANTIDAD_TIRAS]; void setup() { Serial.begin(9600); pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); // Inicialización precisa de cada tira con su número de LEDs for(int i = 0; i < CANTIDAD_TIRAS; i++) { tiras[i] = Adafruit_NeoPixel(ledsPorLinea[i], pinesTiras[i], NEO_GRB + NEO_KHZ800); tiras[i].begin(); tiras[i].show(); } Serial.println("Sistema Tonalli: Configuración de hombros a cuello cargada."); } void loop() { // LECTURA DEL SENSOR ULTRASÓNICO digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); long duracion = pulseIn(ECHO_PIN, HIGH, 30000); int distancia = duracion * 0.034 / 2; // LÓGICA DE ILUMINACIÓN (Rango de 80cm a 5cm) if (distancia > 0 && distancia < 80) { // El "Latido": Oscila suavemente para simular respiración // Aumentamos la velocidad a 0.003 para un latido más vivo float latido = (sin(millis() * 0.003) + 1.0) / 2.0; for (int i = 0; i < CANTIDAD_TIRAS; i++) { // Escalamos el inicio de cada tira para que sea paulatino int inicioTira = 80 - (i * 12); int finTira = inicioTira - 25; // Calculamos el fading (brillo base) int brilloBase = map(distancia, inicioTira, finTira, 0, 255); brilloBase = constrain(brilloBase, 0, 255); // Efecto Respiración: Solo se activa cuando la luz ya es notable (>100) int brilloFinal = brilloBase; if (brilloBase > 100) { // El latido reduce el brillo máximo en un 20% y lo vuelve a subir brilloFinal = brilloBase - (50 * (1.0 - latido)); } // Color Ámbar (R: Brillo, G: Brillo/3 para tono cálido, B: 0) uint32_t color = tiras[i].Color(brilloFinal, brilloFinal/3, 0); // Aplicar a cada LED de la línea actual for (int j = 0; j < ledsPorLinea[i]; j++) { tiras[i].setPixelColor(j, color); } tiras[i].show(); } } else { // Si no hay detección, apagamos todo suavemente for (int i = 0; i < CANTIDAD_TIRAS; i++) { tiras[i].clear(); tiras[i].show(); } } delay(30); // Estabilidad del sensor }