Gerenciar cenários de iluminação com o Arduino

As razões para a aparência deste projeto são essencialmente duas. Uma são as lâmpadas piscando sistematicamente no corredor. A segunda é a experiência existente com sistemas de automação baseados em controladores programáveis ​​industriais (projetando sistemas AOV, AHS, ASDU etc.) e o desejo de aplicar esse conhecimento em benefício de suas famílias.

Como você provavelmente já adivinhou, falaremos sobre o controle automático de iluminação, mas como apenas ligar a luz de um sensor de movimento é chata e não moderna, a ideia de engenharia me levou à seguinte opção: controle automático de cenários de iluminação (dia e noite) com a possibilidade de manual e remoto modos de comutação.

Eu acho que vale a pena começar com o esquema e depois fazer explicações nele.

Diagrama de fiação


Além disso, a planta será visual.

Plano do corredor
image

Assim, no corredor, foram criados 2 cenários de iluminação, luz do dia com faixa de LED no teto e noite, com faixa de LED no chão. Ambos os modos são controlados por dois sensores de movimento localizados acima da porta e ao lado do espelho, como pode ser visto no plano. Inicialmente, apenas um sensor de movimento foi instalado acima da porta, mas, para minha surpresa, a luz foi desligada periodicamente quando havia pessoas na sala. Verificou-se que o sensor não é capaz de detectar pequenas manipulações realizadas no espelho, especialmente se o objeto estiver de costas para ele e criar uma zona cega à sua frente. A segunda descoberta para mim foi que algumas pessoas podem passar mais de um ou dois minutos no espelho (normalmente eu tenho cerca de 15 segundos). A primeira solução que veio à mente foi colocar um sensor de ocupação mais avançado, como o relé Esylux +,mas o custo desse equipamento excederia o custo do restante do projeto, então uma opção mais simples foi escolhida, para instalar um segundo sensor de movimento para os "pontos cegos".

O sensor de movimento foi montado a partir do módulo HC-SR501 + caixa de junção.
Sensor de movimento
image
image

O algoritmo dos sensores será apresentado no código, mas, em poucas palavras, para acender a luz, basta acionar um dos sensores, é necessário desligar o sinal de ambos.

Para o teto, foi escolhida uma fita SMD 5050, 300 LEDs por 5 metros (12V 72W). Simples com um tom amarelo quente. A fita é ligada através do módulo de relé.

Para iluminação noturna, foi selecionada uma fita SMD 5050 RGB, 150 LEDs por 5 metros. Somente a cor azul está envolvida (menos fios) Controle através do módulo transistor L298N (preste atenção à inversão do sinal de saída neste módulo, um valor de 255 no programa desligará os LEDs). O brilho da fita é ajustado ao mínimo para não cegar os olhos.

Fita Led
image
image

A escolha do modo de iluminação dia / noite é realizada por um botão na parede ou por um controle remoto com a mesma prioridade. Software isso é implementado de acordo com o princípio de operação da chave de passagem.

Decidi fazer o gabinete do módulo controlador, relé e transistor fora da caixa de junção, consertando todo o equipamento na placa de circuito impresso, resultou bastante confiável. A própria caixa é montada em um trilho DIN. Para reduzir o número de fios, há conexões soldadas na parte traseira da placa e blocos de terminais para alimentação de entrada de 12V também são soldados na placa, que alimenta o próprio controlador e as fitas.

Controlador
image
image

Abaixo, o código do programa para o Arduino.

Código
#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);
    } 
}

}


Esse esquema de iluminação está funcionando há seis meses para mim, em geral, me convém com sua funcionalidade. Claro, existem idéias para modernização, em particular, gostaria de substituir o controle remoto do infravermelho para o rádio. Adicione algumas tomadas controladas por rádio. Adicione também uma interface da web para gerenciar a partir de dispositivos móveis. Serviços de terceiros não parecem confiáveis ​​o suficiente para mim. No momento, ligar, desligar e indicar a presença de movimento já está funcionando, mas essa é outra história.

Interface da web
image

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


All Articles