Fabriquer un éclairage automatique d’escalier avec Arduino

Fabriquer un éclairage automatique d’escalier avec Arduino

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
Lire cette vidéo sur YouTube.
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

Cet article a 19 commentaires

  1. Robert

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

    hi, can you share Schéma et PCB ? thanks

    1. Manu

      All files are available in the article 😉

  3. Sybux

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

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

          Ah cool ! Je veux bien voir une photo avant et après soudures si tu veux bien 😉

          1. Sybux

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

            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.

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

      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 !

  5. Flo

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

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

        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.

  6. jose RODRIGUES

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

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

    1. Manu

      C’est génial ! Tu va avoir une version plus « PRO » que moi ! ça fait plaisir de voir ça 😉

  7. sybux

    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)

Laisser un commentaire