Gérez des scénarios d'éclairage avec Arduino

Les raisons de l'apparition de ce projet sont essentiellement deux. L'une est les lampes scintillantes systématiquement dans le couloir. La seconde est l'expérience existante avec les systèmes d'automatisation basés sur des automates programmables industriels (conception de systèmes AOV, AHS, ASDU, etc.) et la volonté d'appliquer ces connaissances au profit de leurs ménages.

Comme vous l'avez probablement déjà deviné, nous parlerons du contrôle automatique de l'éclairage, mais comme le simple fait d'allumer la lumière d'un capteur de mouvement est ennuyeux et pas moderne, l'idée d'ingénierie m'a conduit à l'option suivante: contrôle automatique des scénarios d'éclairage (jour et nuit) avec la possibilité à la fois manuelle et à distance modes de commutation.

Je pense que cela vaut la peine de commencer par le schéma, puis de lui donner des explications.

Schéma de câblage


De plus, le plan d'étage sera visuel.

Plan du couloir
image

Ainsi dans le couloir 2 scénarios d'éclairage ont été créés, lumière du jour avec bande LED au plafond et nuit, avec bande LED au sol. Les deux modes sont contrôlés par deux capteurs de mouvement situés au-dessus de la porte et à côté du miroir, comme le montre le plan. Au départ, un seul détecteur de mouvement était installé au-dessus de la porte, mais à ma grande surprise, la lumière était éteinte périodiquement lorsqu'il y avait du monde dans la pièce. Il s'est avéré que le capteur n'est pas en mesure de détecter les petites manipulations effectuées sur le miroir, surtout si l'objet est dos à lui et crée une zone aveugle devant lui. La deuxième découverte pour moi a été que certaines personnes peuvent passer plus de 1 à 2 minutes au miroir (j'ai généralement environ 15 secondes). La première solution qui m'est venue à l’esprit était de mettre un capteur de présence plus avancé comme le relais Esylux +,mais le coût d'un tel équipement dépasserait le coût du reste du projet, donc une option plus simple a été choisie, pour installer un deuxième capteur de mouvement pour les "angles morts".

Le capteur de mouvement a été assemblé à partir du module HC-SR501 + boîte de jonction.
Détecteur de mouvement
image
image

L'algorithme des capteurs sera présenté dans le code, mais en un mot, pour allumer la lumière, il suffit de déclencher l'un des capteurs, pour désactiver le signal des deux est nécessaire.

Pour le plafond, une bande SMD 5050, 300 LED par 5 mètres (12V 72W) a été choisie. Uni avec une teinte jaune chaude. La bande est activée via le module relais.

Pour l'éclairage de nuit, une bande RVB SMD 5050 a été sélectionnée, 150 LED par 5 mètres. Seule la couleur bleue est impliquée (moins de fils) Contrôle via le module transistor L298N (attention à l'inversion du signal de sortie dans ce module, une valeur de 255 dans le programme éteindra les LEDs). La luminosité de la bande est réglée au minimum pour ne pas vous aveugler.

Ruban LED
image
image

Le choix du mode d'éclairage jour / nuit s'effectue soit par un interrupteur à bouton-poussoir au mur, soit par une télécommande de même priorité. Ce logiciel est mis en œuvre selon le principe de fonctionnement de l'interrupteur de passage.

J'ai décidé de sortir le boîtier du contrôleur, du relais et du module transistor de la boîte de jonction, en fixant tout l'équipement sur la carte de circuit imprimé, cela s'est avéré assez fiable. Le boîtier lui-même est monté sur un rail DIN. Pour réduire le nombre de fils, il y a des connexions soudées à l'arrière de la carte, et des borniers pour une alimentation d'entrée 12V sont également soudés à la carte, qui alimentent à la fois le contrôleur lui-même et les bandes.

Contrôleur
image
image

Ci-dessous, le code du programme pour Arduino.

Code
#include "IRremote.h"
int calibrationTime = 10; 
byte CellingLed = 9; /*   */ 
byte ledB = 6;  //  
byte pirDoor = 5; //  
byte pirMirror = 4; //   
IRrecv irrecv(2); //  IR  
byte dayNight = 7; //  ,  - / 
decode_results results;
byte irSignal = 0;
byte buttonstate; 
long unsigned int moveTime; //       
long unsigned int pause = 30000; // ,     
boolean movementDetected = true; // true -  
boolean moveFlag; //        
void setup ()
{
  irrecv.enableIRIn();
  Serial.begin(9600);
  pinMode(CellingLed,OUTPUT);
  pinMode(ledB,OUTPUT);
  digitalWrite(dayNight, HIGH); //      7
  pinMode(pirDoor,INPUT);
  pinMode(pirMirror,INPUT);
  digitalWrite(pirDoor, LOW);
  digitalWrite(pirMirror, LOW);
//   
  Serial.print("Calibrating");
  for(int i = 0; i < calibrationTime; i++)
    {
    Serial.print(".");
    delay(1000);
  }
  Serial.println(" done");
  Serial.println("SENSOR ACTIVE");
  delay(50);
}

void loop()
{
if ( irrecv.decode( &results)){
  delay(300);
  if (results.value == 0xFF3AC5) {irSignal = 0;}  /*       */
  if (results.value == 0xFFBA45) {irSignal = 1;}

  irrecv.resume();  
}
//    (/, IR /)
  byte DayNightSwitch = !digitalRead(dayNight);
  byte a;
  byte b;
    if (DayNightSwitch == LOW) {a=1;} else {a=0;}
    if (irSignal == 1)         {b=1;} else {b=0;}
    if (a==b) {buttonstate = 1;} 
    else      {buttonstate = 0;}
  byte pirstate;
    if (digitalRead(pirDoor) == HIGH || digitalRead(pirMirror) == HIGH)
        { pirstate = HIGH;}
    if (digitalRead(pirDoor) == LOW && digitalRead(pirMirror) == LOW)
        { pirstate = LOW;}


//  
if(pirstate == HIGH && buttonstate == 0 )
{
 if(movementDetected)
 {
  movementDetected = false;
  Serial.println("Motion detected");
  delay(50); 
  }
  moveFlag = true;
  analogWrite(ledB,240);//   
  digitalWrite(CellingLed, LOW);
}
if(pirstate == LOW & buttonstate == 0 )
{
  if(moveFlag)
  {
    moveTime = millis();
    moveFlag = false;
    }
  if(!movementDetected && millis() - moveTime > pause )
  {
    movementDetected = true;
    Serial.println("Motion finished");
    delay(50);    
    analogWrite(ledB,255);
    }  
}
//   
if (pirstate == HIGH && buttonstate == 1 )
{
 
 if(movementDetected)
 {
   movementDetected = false;
   Serial.println("Motion detected");
   delay(50); 
  }
  moveFlag = true;
  digitalWrite(CellingLed,HIGH);
  analogWrite(ledB,255);
}
if (pirstate == LOW && buttonstate == 1 )
{
  if(moveFlag)
  {
    moveTime = millis();
    moveFlag = false;
    }
  if(!movementDetected && millis() - moveTime > pause )
  {
    movementDetected = true;
    Serial.println("Motion finished");
    delay(50);    
    digitalWrite(CellingLed,LOW);
    } 
}

}


Ce système d'éclairage fonctionne pour moi depuis six mois maintenant, en général, il me convient avec sa fonctionnalité. Bien sûr, il y a des idées de modernisation, en particulier, je voudrais remplacer la télécommande de l'infrarouge à la radio. Ajoutez quelques prises radiocommandées. Ajoutez également une interface Web pour la gestion à partir d'appareils mobiles. Les services tiers ne me semblent pas assez fiables. Pour le moment, allumer, éteindre et indiquer la présence de mouvement fonctionne déjà, mais c'est une autre histoire.

Interface Web
image

Source: https://habr.com/ru/post/fr396257/


All Articles