SOMMAIRE ►
Projet de bande LED adressable permettant de créer un éclairage intelligent pour une pièce, un couloir ou une cuisine, avec détecteur de mouvement et possibilité de réglage (couleur, luminosité et effets lumineux) par télécommande. Tous les paramètres sont stockés dans la mémoire eeprom non-volatile de l’Arduino. Cette page présente le schéma du circuit de l’assemblage de la lumière intelligente et le programme de travail pour la carte Arduino.
Ce dont vous aurez besoin
- Arduino Uno / Arduino Nano / Arduino Mega
- ruban adressable ws2812 / ws2811
- capteur de mouvement PIR
- récepteur IR et télécommande
- résistance de 100 à 500 ohms
- librairies IRremote.h, EEPROM.h et Adafruit_NeoPixel.h
Matériel supplémentaire sur ce sujet:
Éclairage intelligent avec ws2811 Arduino
Grâce à la télécommande IR, le logiciel permet de régler à distance la couleur de la bande adressable (toutes les couleurs peuvent être réglées séparément), la luminosité de système intelligent Light Room et la sélection de l’effet lorsque le détecteur de mouvement est déclenché. Dans le code lui-même, il est possible de régler le délai après lequel la bande s’éteint en l’absence de mouvement et la vitesse à laquelle les effets visuels sont activés.
Le schéma de circuit de ce projet est présenté dans l’image ci-dessous. Veuillez noter que la bande ws2811 nécessite une alimentation de 12 volts et que la bande ws2812 ou ws2815 nécessite une alimentation de 5 volts. Le câblage du ruban adressable et de l’Arduino reste le même. Il est également nécessaire que la bande adressable comporte un nombre pair de LED afin que les effets lumineux puissent être allumés de manière symétrique.
Schéma de câblage éclairage intelligent avec ws2811

La bibliothèque Adafruit_NeoPixel.h est utilisée pour créer les effets sur le ws2811, la bibliothèque IRremote.h est nécessaire pour la télécommande IR et la bibliothèque EEPROM.h est nécessaire pour écrire les paramètres dans la mémoire eeprom. Après avoir assemblé le schéma de câblage de l’éclairage intelligent de la pièce sur l’Arduino et le ws2812, installez les bibliothèques requises et chargez le programme suivant dans la carte Arduino Nano.
Programme Arduino pour éclairage de la pièce / cuisine
#include "EEPROM.h" #include "IRremote.h" #include "Adafruit_NeoPixel.h" // broches pour le récepteur IR, la bande d'adresse, le détecteur pir #define IR_PIN 2 #define LED_PIN 7 #define PIR_PIN A1 int PIX = 119; // nombre de LED dans la bande int TIME = 1; // après combien de minutes l'éclairage doit être éteint #define ENT 16726215 // entrer en mode configuration #define RGT 16734885 // ralentir l'allumage #define LFT 16716015 // accélérer l'allumage #define TOP 16718055 // augmenter la luminosité #define BOT 16730805 // diminuer la luminosité #define EF1 16753245 // premier effet #define EF2 16736925 // deuxième effet #define EF3 16769565 // troisième effet #define RED 16769055 // réglage de la couleur rouge #define GRN 16754775 // réglage de la couleur vert #define BLU 16748655 // réglage de la couleur bleu #define UPD 16756815 // enregistrer les paramètres 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) { // sortir le signal de la télécommande IR vers le moniteur du port if (irrecv.decode(&results)) { Serial.println(results.value); // réglage de l'effet de lumière 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(); } // réglage de la luminosité de l'éclairage 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(); } // réglage de la couleur de l'éclairage if (results.value == RED) { r=r+60; if (r > 240 || r < 60) { r=0; } } if (results.value == GRN) { g=g+60; if (g > 240 || g < 60) { g=0; } } if (results.value == BLU) { b=b+60; if (b > 240 || b < 60) { b=0; } } // UPD - enregistrez les paramètres dans l'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); } // quitter le mode de réglage if (results.value == ENT) { effect(e); strip.clear(); w = 0; } demo(); irrecv.resume(); } } } // éclairage allumé en mode réglage 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(); } } // mode d'éclairage de base void svet() { strip.setBrightness(brg); for (i = 0; i < PIX; i++) { strip.setPixelColor(i, strip.Color(r, g, b)); strip.show(); } } // arrêt progressif 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); // mise en marche de la bande d'adresse avec premier effet 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; } // la mise en marche de la bande d'adresses avec un deuxième effet 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; } // la mise en marche de la bande d'adresse avec un troisième effet 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; } }
Explication du code pour éclairage Arduino:
- après avoir téléchargé le logiciel, vous devez spécifier les codes des boutons de la télécommande – ceux-ci seront affichés sur le moniteur du port Arduino IDE;
- spécifier également dans le logiciel le nombre de LED dans la bande (de préférence un nombre pair de LED dans le rétroéclairage).
Conclusion. Après le premier chargement du programme, les effets de lumière et la couleur du ruban ne s’afficheront pas correctement car les informations avec les paramètres sont prises dans EEPROM Arduino – par défaut, le nombre 250 est stocké dans les cellules de la mémoire non volatile. Toutes les variables seront de 250 la première fois que le programme est chargé, pour corriger cela, sauvegardez vos paramètres avec la télécommande IR.








Laisser un commentaire