Voici comment réaliser un éclairage automatique et progressif d’escalier façon arc-en-ciel ! Fini de se lever la nuit en utilisant la lumière de son portable pour éviter d’allumer !
Pour cela j’ai utilisé des goulottes pour câbles où sont installées des LEDs NeoPixel. La détection est assurée en haut et en bas par des détecteurs de présence PIR, installés dans les supports imprimés en 3D. La partie « intelligente » est confiée à un Arduino Nano.
Un capteur de lumière permet de n’activer le système que si il fait assez sombre, et 2 potentiomètres permettent les réglages, l’un pour la sensibilité à la lumière, et l’autre pour la durée d’allumage (0 à 5 minutes)
Matériel :
- 4 moulures blanches 3×1 cm x 2 m (1,3€ x 4)
- 26 LED WS2812B adressable 5050 RGB NeoPixel (lien rémunéré par Amazon, 4,23 € les 100)
- 1 Alimentation 220V – 5V 3A (lien rémunéré par Amazon, 13,28 €)
- 1 Arduino Nano
- 2 capteurs PIR HC-SR501 (lien rémunéré par Amazon, 9,59 € les 5)
- 1 photorésistance
- 2 potentiomètres 10 Kohms
- 2 résistances 470 ohms (1/4 w)
- 1 résistance de 10 Kohms (1/4 w)
- 1 condensateur 1000 µF
Dans cette vidéo, je vous présente aussi un Stater Kit avec tout ce qu’il faut pour débuter avec Arduino.
Ce kit m’a été offert par ELEGOO. Si j’ai accepté c’est parce qu’ils proposent un bon kit de démarrage à un prix tout à fait abordable, et qu’il est bien fait, complet, et en français. Mais sachez que dans tous les cas, je reste maitre des choix, contenus et jugements dans mes vidéos.
Le schéma électronique est dispo ici :
Le support 3D à imprimer :
Galerie photos :
Circuit imprimé et schéma électronique :
Code Arduino :
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define inIR_H 2 // Input PIR top
#define inIR_B 3 // Input PIR bottom
#define PIND 6 // Input Neopixel right
#define PING 5 // Input Neopixel left
#define PHOTOSENS A0 // Input Photoresistor
#define POTARLUM A2 // Input Brightness detection adjustment
#define POTARTPS A4 // Input Light duration adjustment
#define NUMPIXELS 13 // Number of pixel by side
bool IR_H = LOW;
bool IR_B = LOW;
bool MemH = LOW;
bool MemB = LOW;
int PhotoVal;
int AdjLum;
int AdjTps;
long AdjTpsMil;
Adafruit_NeoPixel pixelsD = Adafruit_NeoPixel(NUMPIXELS, PIND, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixelsG = Adafruit_NeoPixel(NUMPIXELS, PING, NEO_GRB + NEO_KHZ800);
void setup() {
pinMode(inIR_H,INPUT);
pinMode(inIR_B,INPUT);
pixelsD.begin();
pixelsG.begin();
pixelsD.clear();
pixelsG.clear();
pixelsD.show();
pixelsG.show();
}
void loop() {
PhotoVal = analogRead(PHOTOSENS);
AdjLum = analogRead(POTARLUM);
AdjTps = analogRead(POTARTPS);
AdjTpsMil = AdjTps / (1024 / 300); // 0 to 300 seconds (5 minutes)
AdjTpsMil *= 1000; // to miliseconds
IR_H = digitalRead(inIR_H);
IR_B = digitalRead(inIR_B);
if (IR_H != MemH){
if (IR_H == HIGH and PhotoVal < AdjLum){
downHigh();
delay(AdjTpsMil);
downLow();
}
MemH = IR_H;
}
if (IR_B != MemB){
if (IR_B == HIGH and PhotoVal < AdjLum){
upHigh();
delay(AdjTpsMil);
upLow();
}
MemB = IR_B;
}
}
void downLow() {
int16_t i, j;
for(i=0; i<=NUMPIXELS; i++) {
long lngRGB = pixelsD.getPixelColor(i); // actual color
uint8_t u8R = (uint8_t)((lngRGB >> 16) & 0xff),
u8G = (uint8_t)((lngRGB >> 8) & 0xff),
u8B = (uint8_t)(lngRGB & 0xff);
for(j=1; j<10; j++) {
pixelsD.setPixelColor(i, u8R / j, u8G / j, u8B / j);
pixelsG.setPixelColor(i, u8R / j, u8G / j, u8B / j);
pixelsD.show();
pixelsG.show();
delay(15);
}
pixelsD.setPixelColor(i, 0, 0, 0);
pixelsG.setPixelColor(i, 0, 0, 0);
pixelsD.show();
pixelsG.show();
delay(500);
}
}
void downHigh() {
int16_t i, j;
int32_t Color[3];
for(i=0; i<NUMPIXELS; i++) {
for(j=20; j>0; j--) {
Rainbow(256 / NUMPIXELS * i, Color);
pixelsD.setPixelColor(i, Color[0] / j, Color[1] / j, Color[2] / j);
pixelsG.setPixelColor(i, Color[0] / j, Color[1] / j, Color[2] / j);
pixelsD.show();
pixelsG.show();
delay(5);
}
delay(200);
}
}
void upLow() {
int16_t i, j;
for(i=NUMPIXELS; i>=0; i--) {
//Serial.println(i);
long lngRGB = pixelsD.getPixelColor(i); // actual color
uint8_t u8R = (uint8_t)((lngRGB >> 16) & 0xff),
u8G = (uint8_t)((lngRGB >> 8) & 0xff),
u8B = (uint8_t)(lngRGB & 0xff);
for(j=1; j<10; j++) {
pixelsD.setPixelColor(i, u8R / j, u8G / j, u8B / j);
pixelsG.setPixelColor(i, u8R / j, u8G / j, u8B / j);
pixelsD.show();
pixelsG.show();
delay(15);
}
pixelsD.setPixelColor(i, 0, 0, 0);
pixelsG.setPixelColor(i, 0, 0, 0);
pixelsD.show();
pixelsG.show();
delay(500);
}
}
void upHigh() {
int16_t i, j;
int32_t Color[3];
for(i=NUMPIXELS; i>=0; i--) {
for(j=20; j>0; j--) {
Rainbow(256 / NUMPIXELS * (i * -1 + NUMPIXELS - 1), Color);
pixelsD.setPixelColor(i, Color[0] / j, Color[1] / j, Color[2] / j);
pixelsG.setPixelColor(i, Color[0] / j, Color[1] / j, Color[2] / j);
pixelsD.show();
pixelsG.show();
delay(5);
}
delay(200);
}
}
void Rainbow(byte WheelPos, int32_t TheColors[3]) {
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
TheColors[0] = 255 - WheelPos * 3;
TheColors[1] = 0;
TheColors[2] = WheelPos * 3;
}
else if(WheelPos < 170) {
WheelPos -= 85;
TheColors[0] = 0;
TheColors[1] = WheelPos * 3;
TheColors[2] = 255 - WheelPos * 3;
}
else {
WheelPos -= 170;
TheColors[0] = WheelPos * 3;
TheColors[1] = 255 - WheelPos * 3;
TheColors[2] = 0;
}
}
Suite à plusieurs demandes voici la version du code Arduino sans photocellule et sans le potentiomètre de réglage de luminosité associé : Stair2.ino
Bonjour,
Penser vous que l’on peut ajouter un module wifi pour pouvoir modifier le programme (couleur ou défilement des led) à distance comme depuis jeedom ect
hi, can you share Schéma et PCB ? thanks
All files are available in the article 😉
Bonjour, super travail, je cherchais à faire la même chose mais incruster dans les plaintes de l’escalier cela me donne beaucoup d’idée. Par contre, même question qu’Antuan, je ne trouve pas le fichier PCB sur votre article uniquement les photos. Ou alors je n’ai pas trouver le bon service pour faire créer la platine à partir des fichiers PNG. Merci d’avance pour votre réponse.
Bonjour et merci,
j’ai exporter ce fichier de EasyEDA mais je n’ai jamais commandé de PCB donc tu me dira si c’est bon 😉
https://www.magicmanu.com/gerber_pcb_magicmanu_stairlight/
Bon ben commande passée sur pcbway. Seul hic, il faut en commander 5 car la taille est petite. Mais bon cela me revient à 11$ transport inclus, y’a un bon de 5$ de réduction pour nouveau client. Y’a plus qu’à attendre la poste chinoise 🙂
Ah cool ! Je veux bien voir une photo avant et après soudures si tu veux bien 😉
Je suis en train de passer commande pour les compos electro, ca fait longtemps que j’ai plus fait. Tu peux indiquer quelle puissance tu as pris pour les résistances ? De plus, il me semble que sur la liste, il te manque une résitance de 10K qui est couplée avec la photorésitance. Même question pour celle-ci quelle caractéristique ?
Bien vu ! J’ai complété la liste.
Ce sont toutes des résistances 1/4 watts (0,25 W). Tu peux utiliser des plus grosses mais elles sont aussi plus grandes et tu risque d’avoir un problème pour l’implantation.
salut Manu, j’ai construit ton projet et c’est parfait. puisque je suis débutant, existe-t-il un moyen d’accélérer le défilement des LED? quelle ligne dois-je changer dans le programme? Je vous remercie beaucoup! Joyeuses Pâques. Domenico
Salut et merci à toi !
Quand on arrive du bas, on déclenche la fonction upHigh(); pour tout allumer, puis upLow(); pour tout éteindre.
Quand on arrive du haut, on déclenche la fonction downHigh(); pour tout allumer, puis downLow(); pour tout éteindre.
Dans ces 4 fonctions tu vas retrouver un delay(15); c’est la luminosité de la led qui varie de 0 à 100% (ou l’inverse) pour faire un effet progressif. Si tu diminue cette valeur, les leds seront plus rapides à s’allumer et s’éteindre.
Dans ces mêmes fonctions tu as un delay(200); (allumage) et un delay(500); (extinction), c’est le temps pour passer d’un led à l’autre en milisecondes. Donc tu peux jouer sur cette valeur aussi que que ça passe plus vite à la LED d’après, et donc que ça défile plus vite.
A toi de faire des essai pour trouver l’effet voulu !
Bonjour Manu, super boulot !
J’ai une petite question sur le temps de passage d’une led à l’autre avec le delay(200 ou 500). Comment cette temporisation est interprété par les led ? Sachant qu’elle sont branché en série à la suite l’une de l’autre. La led 1 ne déclenche la led 2 qu’après 200ms, mais comment elle réalise cela ?
Je reçoit bientôt un kit de débutant pour faire des tests.
Merci d’avance
Merci ! En fait ce sont des LED avec de l’électronique embarquées, elles ne sont pas en série mais toutes indépendantes et adressables individuellement. Donc c’est bien l’Arduino qui contrôle chaque LED.
J’allais ajouter que c’est la commande : pixelsD.setPixelColor(i, Color[0] / j, Color[1] / j, Color[2] / j); qui fait le tout et surtout la variable I qui donne l’index de la LED à contrôler.
Bonjour,
Très sympa le résultat,, mais petite question un message d’erreur sur le code;; une idée pour la solution; En vous remercient par avance
» » compilation terminated.
exit status 1
Adafruit_NeoPixel.h: No such file or directory »’
Merci !
Oui il manque la bibliothèque Adafruit NeoPixel
Dans Arduino -> Outils -> Gérer les bibliothèques -> Recherchez « Adafruit NeoPixel » puis Installer.
Bon j’attend encore les composants AliExpress, mais voici déjà la photo de la carte nue :
https://www.casimages.com/i/210420055639977519.jpg.html
https://www.casimages.com/i/210420055640352520.jpg.html
@bientôt pour la suite
C’est génial ! Tu va avoir une version plus « PRO » que moi ! ça fait plaisir de voir ça 😉
Bonsoir Sybux,
pourriez-vous partager une photo du résultat final du projet avec le PCB imprimé svp?
Merci
c’est grâce à toi ! J’ai 4 cartes en trop car je devais en commander 5 minimum donc si des personnes sont intéressées je peux les « revendre » en gros au prix de l’envoi. (Envoi depuis la Suisse)
bonjour Sybux, tu parles bien de la carte imprimée pré-percée ? dans ce cas s’il t’en reste une je suis intéressé !! tu la vendrais combien ?
Et Merci Manu pour ce super tuto !
hello merci pour le montage et ton échange d’expérience!!!! pourrais tu m explique l’utilité de la photorésistance en A0 alors que les capteurs sr501 on un potentiomètre pour distance de détection et de seul lumineux ????
ps: j essai de réaliser un projet avec « milis » plutot que delay qui est un code bloquant mais si tu as déja compris cette variable, je suis preneur de ton tuto.Salutation le bidouilleur
Merci et désolé pour le délai de réponse !
La photorésistance et son potentiomètre de réglage et là pour permettre d’activer l’éclairage que si il fait sombre, si je passe devant l’escalier en plein jour, il ne s’allume pas.
Oui c’est mieux d’utiliser millis() mais dans ce cas, le blocage ne gêne pas car il n’y a rien d’autre à exécuter pendant le temps d’attente.
Salut Manu
Très sympa ce tuto, ça me donne des idées. Pourrais tu me dire quelle section de fils tu as utilisé. Merci
Merci ! C’est du fil de récup mais je dirai environ 0,2mm²
Merci
Salut Manu comment réagie les Leds si une personne passe devant le capteur du haut et du bas en même temps ?
Merci pour ton travail
Bonjour, le premier qui passe devant un capteur déclenchera l’allumage dans son sens, je n’ai pas prévu un allumage des 2 côtés en même temps 😉
Bonjour, je m’intéresse à cette éclairage d’escalier et je souhaiterais savoir ce qu’il faudrait changer dans le code pour avoir la même séquence d’allumage et d’extinction mais en blanc sur toute la longueur de l’escalier.
Merci par avance pour votre retour
Bonjour,
les bandeaux NeoPixel n’existe pas en blanc, mais on peux faire du blanc avec les RVB bien sûr, il suffit que les 3 couleurs soient identiques.
Par exemple remplacer :
pixelsD.setPixelColor(i, u8R / j, u8G / j, u8B / j);
par
pixelsD.setPixelColor(i, 255 / j, 255 / j, 255 / j);
Et pareil pour les ligne avec Color :
pixelsD.setPixelColor(i, Color[0] / j, Color[1] / j, Color[2] / j);
par
pixelsD.setPixelColor(i, 255 / j, 255 / j, 255 / j);
Et bien sûr même chose pour pixelsG.
Du coup ça sera blanc tout en gardant la variation d’intensité.
Merci beaucoup pour la réponse !! 😉
Bonjour
Tout d abord bravo pour ton tuto par contre je n arrive pas à compiler le code j ai plusieurs erreurs.
/Users/ilona/Documents/Arduino/sketch_jan17f/sketch_jan17f.ino:8:0: warning: « PIND » redefined
#define PIND 6 // Input Neopixel right
In file included
from /Users/ilona/Library/Arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/avr/include/avr/io.h:272:0,
from /Users/ilona/Library/Arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/avr/include/avr/pgmspace.h:90,
from/Users/ilona/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/Arduino.h:28,
from sketch/sketch_jan17f.ino.cpp:1:
/Users/ilona/Library/Arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/avr/include/avr/iom328p.h:111:0: note: this is the location of the previous definition
#define PIND _SFR_IO8(0x09)
bonjour je suis intéresse je vais mas train tenir avec vous si possible
Hello Manu,
Je débute completement et te remercie pour ton site et tutoriel.
Je n’ai pas bien compris la liste de matériel exacte qu’il faut du coup.
Tu aurais des liens (meme rémunéré ca me dérange pas) pour tout ce qu’il faut (arduino nano et tous les composants?)
Dans l’idée je préfererai des bandeaux leds adressables pilotables par alexa par la voix type govee mais bon je ferai avec ce que j’ai 🙂
Salut,
j’ai un peu plus détaillé le matériel sur ce site mais en anglais :
https://www.instructables.com/Automatic-Rainbow-Staircase-Lighting/
Si il y a des composants pour lesquels tu doutes, demande moi 😉