CONTENIDO ►
Proyecto de tira de LED ws2812 / ws2811 direccionable para crear iluminación inteligente para una habitación, pasillo o cocina con sensor de movimiento y capacidad de ajuste (color, brillo y efectos de iluminación) mediante control remoto. Todos los ajustes se almacenan en la memoria eeprom no volátil del Arduino. Esta página muestra el diagrama de circuito del conjunto de luz inteligente y un programa de trabajo para la placa Arduino.
Para esta actividad necesitaremos:
- Arduino Uno / Arduino Nano / Arduino Mega
- tira de LED ws2812 y resistencia;
- télécommandée y receptor IR;
- sensor de movimiento (HC-SR501);
- librería IRremote.h, EEPROM.h y Adafruit_NeoPixel.h
El mando a distancia por infrarrojos permite configurar a distancia el color de la tira de direcciones (todos los colores pueden configurarse por separado), el brillo de la luz y la selección de un efecto visual cuando se activa el sensor de movimiento HC-SR501. También es posible ajustar el periodo de tiempo tras el cual las luces se apagan si no hay movimiento, y la velocidad a la que se activan los efectos visuales.
Iluminación inteligente con mando a distancia IR

La disposición del proyecto se muestra en la imagen de arriba, tenga en cuenta que la tira de LED ws2811 requiere una fuente de alimentación de 12 voltios y la tira de LED ws2812 o ws2815 requiere una fuente de alimentación de 5 voltios. El cableado de la cinta a la placa Arduino sigue siendo el mismo. También es necesario tener un número par de LEDs en la tira direccionable para la conmutación simétrica de los efectos de luz.
Programa Arduino para iluminación con mando a distancia
#include "EEPROM.h" #include "IRremote.h" #include "Adafruit_NeoPixel.h" #define IR_PIN 2 #define LED_PIN 7 #define PIR_PIN A1 int PIX = 119; // número de LED de la tira int TIME = 1; // tras cuántos minutos debe apagarse la iluminación #define ENT 16726215 // entrar en modo configuración #define RGT 16734885 // ralentizar el encendido #define LFT 16716015 // acelerar el encendido #define TOP 16718055 // aumentar el brillo #define BOT 16730805 // disminuir el brillo #define EF1 16753245 // efecto primario #define EF2 16736925 // segundo efecto #define EF3 16769565 // tercer efecto #define RED 16769055 // ajuste del color rojo #define GRN 16754775 // ajuste del color verde #define BLU 16748655 // ajuste de color azul #define UPD 16756815 // guardar configuración int pix_l_start = 0; int pix_l_finis = PIX / 2; int pix_r_start = PIX / 2; int pix_r_finis = PIX; int brg, del, p, x, i, j, e, w; byte r, g, b; unsigned long timer; unsigned long t = t * 60 * 1000; IRrecv irrecv(IR_PIN); decode_results results; Adafruit_NeoPixel strip (PIX, LED_PIN, NEO_GRB + NEO_KHZ800); void setup() { r = EEPROM.read(1); g = EEPROM.read(2); b = EEPROM.read(3); brg = EEPROM.read(4); del = EEPROM.read(5); e = EEPROM.read(6); Serial.begin(9600); irrecv.enableIRIn(); strip.begin(); strip.setBrightness(brg); strip.clear(); pinMode(IR_PIN, INPUT); pinMode(PIR_PIN, INPUT); } void loop() { p = digitalRead(A1); delay(100); if (p == HIGH && x == 0) { effect(e); svet(); x = 1; } if (p == LOW && x == 1) { timer = millis(); x = 2; } if (p == LOW && x == 2 && millis() - timer > t) { timer = millis(); vykluchenie(); x = 0; } if (p == HIGH && x == 2) { x = 1; } if (irrecv.decode(&results)) { Serial.println(results.value); if (results.value == ENT) { demo(); w = 1; } irrecv.resume(); } while (w == 1) { // salida de señal del mando a distancia IR al monitor if (irrecv.decode(&results)) { Serial.println(results.value); // ajuste del efecto de luz if (results.value == EF1) {e = 1; effect(e); strip.clear();} if (results.value == EF2) {e = 2; effect(e); strip.clear();} if (results.value == EF3) {e = 3; effect(e); strip.clear();} // ajuste del brillo de la iluminación if (results.value == TOP) {brg=brg+60; if (brg > 240) {brg=240;}} if (results.value == BOT) {brg=brg-60; if (brg < 60) {brg=60;}} // réglage de la vitesse d'éclairage if (results.value == LFT) { del=del-10; if (del < 0) {del=0;} effect(e); strip.clear();} if (results.value == RGT) { del=del+10; if (del > 50) {del=50;} effect(e); strip.clear();} // ajuste del color de la iluminación if (results.value == RED) {r=r+60; if (r > 240 or r < 60) {r=0;}} if (results.value == GRN) {g=g+60; if (g > 240 or g < 60) {g=0;}} if (results.value == BLU) {b=b+60; if (b > 240 or b < 60) {b=0;}} // guardar la configuración en la eeprom if (results.value == UPD) { delay(1); EEPROM.update(1, r); delay(1); EEPROM.update(2, g); delay(1); EEPROM.update(3, b); delay(1); EEPROM.update(4, brg); delay(1); EEPROM.update(5, del); delay(1); EEPROM.update(6, e); delay(1); effect(e); } // salir del modo de ajuste if (results.value == ENT) { effect(e); strip.clear(); w = 0; } demo(); irrecv.resume(); } } } // iluminación encendida en modo ajuste void demo() { strip.clear(); strip.setBrightness(brg); for (i = 0; i < PIX; i = i + 2) { strip.setPixelColor(i, strip.Color(r, g, b)); strip.show(); } } // modo de iluminación básica void svet() { strip.setBrightness(brg); for (i = 0; i < PIX; i++) { strip.setPixelColor(i, strip.Color(r, g, b)); strip.show(); } } // un apagado gradual de la luz void vykluchenie() { for ( j = brg; j >= 0; j = j - 20) { strip.setBrightness(j); for ( i = pix_l_start; i <= pix_r_finis; i++) { strip.setPixelColor(i, strip.Color(r, g, b)); strip.show(); } } } void effect(int e) { strip.clear(); strip.setBrightness(brg); // activación del primer efecto while (e == 1) { j = 0; for (i = pix_r_start; i <= pix_r_finis; i++) { j++; strip.setPixelColor(i, r / 3, g / 3, b / 3); strip.setPixelColor(pix_l_finis - j, r / 3, g / 3, b / 3); strip.show(); delay(del); } j = 0; for ( i = pix_r_finis; i >= pix_r_start; i--) { j++; strip.setPixelColor(i, r / 2, g / 2, b / 2); strip.setPixelColor(i + 1, r / 2, g / 2, b / 2); strip.setPixelColor(i + 2, r / 2, g / 2, b / 2); strip.setPixelColor(i + 3, r / 3, g / 3, b / 3); strip.setPixelColor(pix_l_start + j, r / 2, g / 2, b / 2); strip.setPixelColor(pix_l_start + j - 1, r / 2, g / 2, b / 2); strip.setPixelColor(pix_l_start + j - 2, r / 2, g / 2, b / 2); strip.setPixelColor(pix_l_start + j - 3, r / 3, g / 3, b / 3); strip.show(); delay(del); } j = 0; for (i = pix_r_start; i <= pix_r_finis; i++) { j++; strip.setPixelColor(i, r, g, b); strip.setPixelColor(pix_l_finis - j, r, g, b); strip.show(); delay(del); } break; } // activación del segundo efecto while (e == 2) { pix_l_finis = PIX / 2; while (pix_l_finis > 0) { j = 0; for ( i = pix_l_start; i <= pix_l_finis; i++) { j++; strip.setPixelColor(i, r / 2, g / 2, b / 2); strip.setPixelColor(i - 1, r / 2, g / 2, b / 2); strip.setPixelColor(i - 2, r / 2, g / 2, b / 2); strip.setPixelColor(i - 3, 0, 0, 0); strip.setPixelColor(pix_r_finis - j, r / 2, g / 2, b / 2); strip.setPixelColor(pix_r_finis - j + 1, r / 2, g / 2, b / 2); strip.setPixelColor(pix_r_finis - j + 2, r / 2, g / 2, b / 2); strip.setPixelColor(pix_r_finis - j + 3, 0, 0, 0); strip.show(); delay(del / 10); } pix_l_finis = pix_l_finis - 3; } pix_l_finis = PIX / 2; j = 0; for (i = pix_r_start; i <= pix_r_finis; i++) { j++; strip.setPixelColor(i, r, g, b); strip.setPixelColor(pix_l_finis - j, r, g, b); strip.show(); delay(del / 2); } break; } // activación del tercer efecto while (e == 3) { j = 0; for ( j = 0; j <= brg; j = j + 20) { strip.setBrightness(j); for ( i = pix_l_start; i <= pix_r_finis; i++) { strip.setPixelColor(i, strip.Color(r, g, b)); strip.show(); } } break; } }
Explicación del código para iluminación con mando a distancia:
- después de descargar el programa, es necesario especificar los códigos de los botones del mando a distancia – que se mostrarán en el monitor del puerto Arduino IDE. Consulte aquí para obtener más detalles sobre cómo hacerlo;
- Adafruit_NeoPixel.h biblioteca se utiliza para crear efectos en tira de LED ws2812, IRremote.h biblioteca es necesaria para el control remoto por infrarrojos, y EEPROM.h biblioteca es necesaria para escribir la configuración de la memoria eeprom.
Conclusión. Después de la primera carga del programa, los efectos de luz y el color de la cinta no se mostrarán correctamente porque la información con los ajustes se toma de la EEPROM del Arduino – por defecto el número 250 se almacena en las celdas de memoria no volátil. En consecuencia, todas las variables serán 250 la primera vez que se cargue el programa, así que guarda tus ajustes con el mando a distancia IR para corregir esto.

Deja una respuesta