Gestiona escenarios de iluminación con Arduino

Las razones para la aparición de este proyecto son esencialmente dos. Una son las luces parpadeantes sistemáticas en el pasillo. El segundo es la experiencia existente con sistemas de automatización basados ​​en controladores programables industriales (diseño de sistemas AOV, AHS, ASDU, etc.) y el deseo de aplicar este conocimiento en beneficio de sus hogares.

Como probablemente ya haya adivinado, hablaremos sobre el control automático de la iluminación, pero dado que encender la luz de un sensor de movimiento es aburrido y no moderno, la idea de ingeniería me llevó a la siguiente opción: control automático de escenarios de iluminación (día y noche) con la posibilidad tanto manual como remota modos de conmutación

Creo que vale la pena comenzar con el esquema y luego dar explicaciones.

Diagrama de cableado


Además, el plano será visual.

Plan de pasillo
image

Entonces, en el pasillo se crearon 2 escenarios de iluminación, la luz del día con una tira de LED en el techo y la noche, con una tira de LED en el piso. Ambos modos están controlados por dos sensores de movimiento ubicados sobre la puerta y al lado del espejo, como se puede ver en el plano. Inicialmente, solo se instaló un sensor de movimiento sobre la puerta, pero para mi sorpresa, la luz se apagaba periódicamente cuando había personas en la habitación. Resultó que el sensor no puede detectar pequeñas manipulaciones realizadas en el espejo, especialmente si el objeto está de espaldas y crea una zona ciega frente a él. El segundo descubrimiento para mí fue que algunas personas pueden pasar más de 1-2 minutos frente al espejo (generalmente tengo alrededor de 15 segundos). La primera solución que se me ocurrió fue poner un sensor de ocupación más avanzado como el relé Esylux +,pero el costo de dicho equipo excedería el costo del resto del proyecto, por lo que se eligió una opción más simple para instalar un segundo sensor de movimiento para los "puntos ciegos".

El sensor de movimiento se ensambló desde el módulo HC-SR501 + caja de conexiones.
Sensor de movimiento
image
image

El algoritmo de los sensores se presentará en el código, pero en pocas palabras, para encender la luz, es suficiente para activar uno de los sensores, para apagar la señal de ambos se requiere.

Para el techo, se eligió una cinta SMD 5050, 300 LED por 5 metros (12V 72W). Liso con un cálido tinte amarillo. La cinta se enciende a través del módulo de relé.

Para la iluminación nocturna, se seleccionó una cinta SMD 5050 RGB, 150 LED por 5 metros. Solo está involucrado el color azul (menos cables) Control a través del módulo de transistor L298N (preste atención a la inversión de la señal de salida en este módulo, un valor de 255 en el programa apagará los LED). El brillo de la cinta se establece al mínimo para no cegar los ojos.

Cinta led
image
image

La elección del modo de iluminación día / noche se realiza mediante un interruptor de botón en la pared o mediante un control remoto con la misma prioridad. El software se implementa de acuerdo con el principio de funcionamiento del interruptor de paso.

Decidí hacer el caso del módulo controlador, relé y transistor yo mismo fuera de la caja de conexiones, arreglando todo el equipo en la placa de circuito impreso, resultó bastante confiable. La caja en sí está montada en un riel DIN. Para reducir la cantidad de cables, hay conexiones soldadas en la parte posterior de la placa, y los bloques de terminales para alimentación de entrada de 12 V también se sueldan a la placa, que alimentan tanto el controlador como las cintas.

Controlador
image
image

A continuación, el código del programa para 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);
    } 
}

}


Este esquema de iluminación ha estado funcionando para mí durante seis meses, en general, me conviene con su funcionalidad. Por supuesto, hay ideas para la modernización, en particular, me gustaría reemplazar el control remoto de infrarrojos a radio. Agregue algunos puntos de venta controlados por radio. Agregue también una interfaz web para administrar desde dispositivos móviles. Los servicios de terceros no me parecen lo suficientemente confiables. Por el momento, encender, apagar e indicar la presencia de movimiento ya está funcionando, pero esta es otra historia.

Interfaz web
image

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


All Articles