Fabriquer un éclairage automatique d’escalier avec Arduino

Automatic rainbow staircase lighting

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 !

Fabriquer un éclairage automatique d'escalier avec Arduino
Tuto fabriquer un éclairage automatique d’escalier avec Arduino

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 :

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

Merci de nous suivre et de nous liker :

Publications similaires

36 thoughts on “Fabriquer un éclairage automatique d’escalier avec Arduino

  1. 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

  2. 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.

      1. 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 🙂

          1. 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 ?

          2. 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.

  3. 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

    1. 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 !

  4. 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

    1. 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.

      1. 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.

  5. 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 »’

    1. Merci !
      Oui il manque la bibliothèque Adafruit NeoPixel
      Dans Arduino -> Outils -> Gérer les bibliothèques -> Recherchez « Adafruit NeoPixel » puis Installer.

  6. 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)

    1. 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 !

  7. 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

    1. 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.

  8. 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

    1. 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é.

  9. 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)

  10. 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 🙂

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

YouTube
YouTube
Pinterest
Instagram