使用Arduino管理照明方案

该项目出现的原因主要有两个。一种是走廊中系统闪烁的灯。第二是基于工业可编程控制器(设计AOV,AHS,ASDU系统等)的自动化系统的现有经验,以及将这些知识应用于家庭利益的愿望。

您可能已经猜到了,我们将讨论自动照明控制,但是由于仅打开运动传感器的照明很烦人,而且不是很现代,因此,工程学思想使我想到了以下选择:自动控制照明场景(白天和黑夜),并可以手动和远程控制切换模式。

我认为值得从该计划开始,然后再进行解释。

接线图


同样,平面图将是可视的。

走廊平面图
image

因此,在走廊中创建了两种照明方案:白天在天花板上使用LED灯带,在夜晚时在地板上使用LED灯带。从计划中可以看出,两种模式都由位于门上方和镜子旁边的两个运动传感器控制。最初,门上方仅安装了一个运动传感器,但令我惊讶的是,当房间里有人时,灯会定期关闭。事实证明,传感器无法检测到在镜子上执行的细微操作,尤其是如果物体背对着镜子并在镜子前创建盲区的情况下。对我来说,第二个发现是有些人可以在镜子上花费1-2分钟以上(我通常大约需要15秒)。我想到的第一个解决方案是安装更高级的占用传感器,例如Esylux +继电器,但是此类设备的成本将超过项目其余部分的成本,因此选择了一个更简单的选择,为“盲点”安装第二个运动传感器。

运动传感器由HC-SR501模块+接线盒组装而成。
运动感应器
image
image

传感器的算法将在代码中显示,但总而言之,要打开灯,就足以触发其中一个传感器,需要关闭两个传感器的信号。

对于天花板,选择了SMD 5050胶带,每5米(12V 72W)300个LED。浅黄色调。磁带通过中继模块打开。

对于夜间照明,选择了SMD 5050 RGB胶带,每5米150个LED。通过L298N晶体管模块仅控制蓝色(导线较少)(请注意此模块中输出信号的反转,程序中的值255将关闭LED)。磁带的亮度设置为最小,以免使您的眼睛蒙蔽。

LED胶带
image
image

日/夜照明模式的选择是通过墙上的按钮开关或具有相同优先级的遥控器进行的。该软件根据通道开关的操作原理来实现。

我决定自己将控制器,继电器和晶体管模块的外壳从接线盒中取出,将所有设备固定在印刷电路板上,结果非常可靠。盒子本身安装在DIN导轨上。为了减少电线数量,电路板背面有焊接连接,并且12V输入电源的接线端子也焊接到了电路板上,为控制器本身和胶带供电。

控制者
image
image

下面是Arduino的程序代码。

代号
#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);
    } 
}

}


现在,这种照明方案已经为我工作了六个月,总的来说,它适合我的功能。当然,有一些现代化的想法,特别是,我想取代从红外线到无线电的遥控器。添加一些无线电控制的插座。还添加用于从移动设备进行管理的Web界面。第三方服务对我来说似乎不够可靠。目前,打开,关闭并指示运动的存在已经在起作用,但这是另一回事了。

网页界面
image

Source: https://habr.com/ru/post/zh-CN396257/


All Articles