Verwalten Sie Beleuchtungsszenarien mit Arduino

Die Gründe für das Erscheinen dieses Projekts sind im Wesentlichen zwei. Eine davon sind die systematisch flackernden Lampen im Flur. Die zweite ist die vorhandene Erfahrung mit Automatisierungssystemen, die auf industriellen programmierbaren Steuerungen basieren (Entwurf von AOV-, AHS-, ASDU-Systemen usw.), und der Wunsch, dieses Wissen zum Nutzen ihrer Haushalte anzuwenden.

Wie Sie wahrscheinlich bereits vermutet haben, werden wir über die automatische Lichtsteuerung sprechen. Da das Einschalten des Lichts eines Bewegungssensors jedoch langweilig und nicht modern ist, führte mich die technische Idee zu der folgenden Option: Automatische Steuerung von Beleuchtungsszenarien (Tag und Nacht) mit der Möglichkeit sowohl manuell als auch ferngesteuert Schaltmodi.

Ich denke, es lohnt sich, mit dem Schema zu beginnen und dann Erklärungen abzugeben.

Schaltplan


Auch der Grundriss wird visuell sein.

Flurplan
image

So wurden im Flur 2 Beleuchtungsszenarien erstellt, Tageslicht mit LED-Streifen an der Decke und Nacht, mit LED-Streifen am Boden. Beide Modi werden von zwei Bewegungssensoren gesteuert, die sich über der Tür und neben dem Spiegel befinden, wie aus dem Plan ersichtlich ist. Anfangs war nur ein Bewegungssensor über der Tür installiert, aber zu meiner Überraschung wurde das Licht regelmäßig ausgeschaltet, wenn sich Personen im Raum befanden. Es stellte sich heraus, dass der Sensor kleine Manipulationen am Spiegel nicht erkennen kann, insbesondere wenn sich das Objekt mit dem Rücken zum Spiegel befindet und eine blinde Zone vor ihm erzeugt. Die zweite Entdeckung für mich war, dass einige Leute mehr als 1-2 Minuten am Spiegel verbringen können (ich habe normalerweise ungefähr 15 Sekunden). Die erste Lösung, die mir in den Sinn kam, bestand darin, einen fortschrittlicheren Belegungssensor wie das Esylux + -Relais einzusetzen.Die Kosten für solche Geräte würden jedoch die Kosten für den Rest des Projekts übersteigen. Daher wurde eine einfachere Option gewählt, um einen zweiten Bewegungssensor für die "toten Winkel" zu installieren.

Der Bewegungssensor wurde aus dem HC-SR501-Modul + Anschlussdose zusammengebaut.
Bewegungssensor
image
image

Der Algorithmus der Sensoren wird im Code dargestellt, aber kurz gesagt, um das Licht einzuschalten, reicht es aus, einen der Sensoren auszulösen, um das Signal von beiden auszuschalten.

Für die Decke wurde ein SMD 5050-Band mit 300 LEDs pro 5 Meter (12 V, 72 W) ausgewählt. Einfach mit einer warmen Gelbtönung. Das Band wird über das Relaismodul eingeschaltet.

Für die Nachtbeleuchtung wurde ein SMD 5050 RGB-Band mit 150 LEDs pro 5 Meter ausgewählt. Es handelt sich nur um eine blaue Farbe (weniger Drähte). Steuerung über das Transistormodul L298N (Achten Sie auf die Inversion des Ausgangssignals in diesem Modul, ein Wert von 255 im Programm schaltet die LEDs aus). Die Helligkeit des Bandes ist auf ein Minimum eingestellt, um Ihre Augen nicht zu blenden.

LED-Band
image
image

Die Wahl des Tag / Nacht-Beleuchtungsmodus erfolgt entweder über einen Druckknopfschalter an der Wand oder über eine Fernbedienung mit derselben Priorität. Software Dies wird nach dem Funktionsprinzip des Durchgangsschalters implementiert.

Ich beschloss, das Gehäuse des Controllers, des Relais und des Transistormoduls selbst aus der Anschlussdose zu nehmen und alle Geräte auf der Leiterplatte zu befestigen. Es stellte sich heraus, dass dies ziemlich zuverlässig war. Die Box selbst ist auf einer DIN-Schiene montiert. Um die Anzahl der Drähte zu verringern, befinden sich auf der Rückseite der Platine Lötverbindungen, und auf der Platine sind Klemmenblöcke für 12-V-Eingangsleistung gelötet, die sowohl den Controller selbst als auch die Bänder versorgen.

Controller
image
image

Unten der Programmcode für 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);
    } 
}

}


Dieses Beleuchtungsschema funktioniert seit sechs Monaten für mich. Im Allgemeinen passt es mir mit seiner Funktionalität. Natürlich gibt es Ideen zur Modernisierung, insbesondere möchte ich die Fernbedienung von Infrarot auf Radio ersetzen. Fügen Sie einige funkgesteuerte Steckdosen hinzu. Fügen Sie außerdem eine Weboberfläche für die Verwaltung von Mobilgeräten hinzu. Dienste von Drittanbietern scheinen mir nicht zuverlässig genug zu sein. Im Moment funktioniert das Einschalten, Ausschalten und Anzeigen der Bewegung bereits, aber dies ist eine andere Geschichte.

Webschnittstelle
image

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


All Articles