إدارة سيناريوهات الإضاءة مع Arduino

أسباب ظهور هذا المشروع هي في الأساس اثنان. إحداها المصابيح الوامضة المنتظمة في الردهة. والثاني هو التجربة الحالية مع أنظمة الأتمتة القائمة على وحدات التحكم القابلة للبرمجة الصناعية (تصميم أنظمة AOV و AHS و ASDU وما إلى ذلك) والرغبة في تطبيق هذه المعرفة لصالح أسرهم.

كما توقعت بالفعل ، سنتحدث عن التحكم التلقائي في الإضاءة ، ولكن نظرًا لأن مجرد تشغيل الضوء من مستشعر الحركة ممل وليس حديثًا ، فقد دفعتني الفكرة الهندسية إلى الخيار التالي: التحكم التلقائي في سيناريوهات الإضاءة (ليلًا ونهارًا) مع إمكانية كل من اليدوي والبعيد طرق التبديل.

أعتقد أن الأمر يستحق البدء بالمخطط ، ثم تقديم تفسيرات فيه.

مخطط الأسلاك


أيضا ، ستكون خطة الطابق مرئية.

خطة المدخل
image

لذلك في الردهة تم إنشاء سيناريوهين للإضاءة ، ضوء النهار مع شريط LED على السقف والليل ، مع شريط LED على الأرض. يتم التحكم في كلا الوضعين بواسطة مستشعرين للحركة يقعان فوق الباب وبجانب المرآة ، كما يمكن رؤيته من الخطة. في البداية ، تم تثبيت مستشعر حركة واحد فقط فوق الباب ، ولكن لدهشتي ، تم إيقاف تشغيل الضوء بشكل دوري عندما كان هناك أشخاص في الغرفة. اتضح أن جهاز الاستشعار غير قادر على الكشف عن التلاعبات الصغيرة التي تتم في المرآة ، خاصة إذا كان الجسم مع ظهره إليه ويخلق منطقة عمياء أمامه. الاكتشاف الثاني بالنسبة لي هو أن بعض الناس يمكن أن يقضوا أكثر من 1-2 دقيقة في المرآة (عادة ما يكون لدي حوالي 15 ثانية). كان الحل الأول الذي تم التفكير فيه هو وضع جهاز استشعار إشغال أكثر تقدمًا مثل Esylux + relay ،لكن تكلفة هذه المعدات ستتجاوز تكلفة باقي المشروع ، لذلك تم اختيار خيار أبسط لتركيب مستشعر حركة ثانٍ لـ "النقاط العمياء".

تم تجميع مستشعر الحركة من وحدة HC-SR501 + صندوق التوصيل.
مستشعر الحركة
image
image

سيتم تقديم خوارزمية المستشعرات في الرمز ، ولكن باختصار ، لتشغيل الضوء ، يكفي تشغيل أحد المستشعرات ، لإيقاف الإشارة من كليهما مطلوب.

بالنسبة للسقف ، تم اختيار شريط SMD 5050 ، 300 LEDs لكل 5 أمتار (12V 72W). سهل مع لون أصفر دافئ. يتم تشغيل الشريط عبر وحدة الترحيل.

للإضاءة الليلية ، تم اختيار شريط SMD 5050 RGB ، 150 LED لكل 5 أمتار. يتم تضمين اللون الأزرق فقط (عدد أقل من الأسلاك) عن طريق وحدة الترانزستور L298N (انتبه إلى انعكاس إشارة الخرج في هذه الوحدة ، وستؤدي القيمة 255 في البرنامج إلى إيقاف مصابيح LED). يتم ضبط سطوع الشريط على الحد الأدنى حتى لا تعمى عينيك.

شريط LED
image
image

يتم اختيار وضع الإضاءة ليلا ونهارا إما عن طريق مفتاح ضغط على الحائط ، أو عن طريق جهاز تحكم عن بعد بنفس الأولوية. برنامج يتم تنفيذه وفقًا لمبدأ تشغيل مفتاح المرور.

قررت أن أجعل حالة وحدة التحكم والتتابع والترانزستور نفسي خارج صندوق التوصيل ، وأصلح جميع المعدات على لوحة الدوائر المطبوعة ، اتضح أنها موثوقة تمامًا. الصندوق نفسه مُثبت على سكة DIN. لتقليل عدد الأسلاك ، هناك اتصالات ملحومة على الجزء الخلفي من اللوحة ، كما يتم لحام كتل طرفية لطاقة الإدخال 12V إلى اللوحة ، والتي تغذي كل من وحدة التحكم نفسها والأشرطة.

تحكم
image
image

أدناه ، رمز البرنامج لاردوينو.

كود
#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);
    } 
}

}


يعمل نظام الإضاءة هذا لي منذ ستة أشهر ، بشكل عام ، يناسبني مع وظائفه. بالطبع ، هناك أفكار للتحديث ، على وجه الخصوص ، أود استبدال جهاز التحكم عن بعد من الأشعة تحت الحمراء إلى الراديو. أضف بعض المنافذ التي يتم التحكم فيها عن طريق الراديو. أضف أيضًا واجهة ويب للإدارة من الأجهزة المحمولة. لا تبدو خدمات الطرف الثالث موثوقة بما يكفي بالنسبة لي. في الوقت الحالي ، يعمل تشغيل الحركة وإيقافها والإشارة إلى وجود الحركة بالفعل ، ولكن هذه قصة أخرى.

واجهة الويب
image

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


All Articles