ضوء الليل المجدولة

الصورة

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

في البداية ، تم إجراء عينة اختبار للمصباح من قطعة من شريط LED أصفر (12 فولت) ، والذي تم استخدامه لمدة 1.5 عام.


الصورة

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

تجميعها بسرعة النموذج الأولي على أساس اردوينو نانو. تصحيح الوظائف الأساسية.

الصورة

انتهزت هذه الفرصة لتجربة فريتزنج. لم يعجبني ذلك ، لكن الصور واضحة و "مضحكة". على ما يبدو لم يخترع شيء جديد.

الصورة

تم استبدال "nano" بوحدة نمطية غير معروفة ومتوافقة مع اردوينو مع جهاز إرسال واستقبال راديو مضمن (وحدة تحكم 8 بت ، والأداء والحشو مشابه لـ "Nana"). في المنزل ، لدي بالفعل جهاز واحد يعمل على تردد 868 ميغاهيرتز ، وسيكون هذا هو الثاني. مواصفات موجزة من موقع الشركة المصنعة:

خصائص موجزة
الصورة


الصورة

لا أرى مشكلات كبيرة تفعل الشيء نفسه على ESP8266 (هناك أداة تجميع مريحة للبرامج الثابتة عبر الإنترنت للبرامج النصية على LUA). أكثر تعقيدًا على Bluetooth (لفلاش وحدة HM-10 ، فأنت بحاجة إلى مبرمج غير مكلف وبيئة تطوير وفهم البروتوكول). على الرغم من أنه يمكنك استخدام وحدة Bluetooth مع اردوينو. لكنني استخدمت ZUNo ، لأنه كان يكذب وينتظرني لفترة طويلة ، والبنية التحتية بأكملها جاهزة للاتصال وإدارة الأجهزة المماثلة في شبكة واحدة (أتحدث عن وحدة تحكم الشبكة المنزلية الذكية).
لجميع الأرجل المستخدمة في اردوينو ، تم العثور على نظائرها في الوحدة النمطية.

الصورة

للعمل مع الوحدة النمطية من Arduino IDE ، تحتاج إلى تكوينه (وصف الإعدادات موجود على موقع الشركة المصنعة). لم تحدث معجزة. عند محاولة التحويل البرمجي ، حصلت على الخطأ "لا يدعم" لـ "عبارة بأعمدة فارغة أو بدون نص!" لقد استخدمت مكتبة Adafruit_NeoPixel. تسلقت فيه ورأيت عدد الدورات الموجودة فيه وأغلقته. اضطررت للذهاب مرة أخرى إلى موقع الشركة المصنعة والبحث عن أمثلة للعمل مع المصابيح (تم العثور على مثال بسرعة). لذلك أنا لست أول من واجه مشكلة مماثلة.

من أجل التحكم في المصباح عن طريق الراديو في كود Arduino ، تحتاج إلى إضافة ماكرو وتنفيذ العديد من الوظائف:

ZUNO_SETUP_CHANNELS( ZUNO_SWITCH_MULTILEVEL(getRed, setRed), ZUNO_SWITCH_MULTILEVEL(getGreen, setGreen), ZUNO_SWITCH_MULTILEVEL(getBlue, setBlue), ZUNO_SWITCH_BINARY(switch_getter, switch_setter) ); 

يصف هذا الماكرو جهاز Z-Wave بثلاثة مفاتيح متعددة المستويات (تحكم RGB) ومفتاح بسيط واحد (تشغيل / إيقاف بسيط).

لدي أبسط تنفيذ للوظائف (كما في الأمثلة على موقع الشركة المصنعة). يمكنك أن ترى ذلك في القائمة المرفقة.

اختيار القضية


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

الصورة

خرز ملون مرسوم ومكعبات أكريليك ، مليئة بالإيبوكسي الشفاف. الطلاء من الخرز الملون يذوب تحت تأثير الراتنج.

الصورة

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

الصورة

تم تصنيع لوحة الدوائر المطبوعة بطريقة مقاومة للضوء.

الصورة

الصورة

بعد التخليل وتصنيع الآلات

الصورة

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

الصورة

الصورة

إليك ما حدث:

الصورة

راديو التحكم


نافذة رئيسية مع قنوات التحكم في المصباح

الصورة

اضبط سطوع قناة واحدة من شريط LED

الصورة

ضبط الاغلاق صباح الليل

الصورة

الخاتمة


الجهاز يعمل. إنه صغير وأنيق. يتم تشغيله عن طريق شحن الهاتف المحمول.
من المشاكل الملحوظة:

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

رسم ضوء الليل
 #include "ZUNO_NeoPixel.h" #define MAX_PIXELS 20 // NB! Z-Uno can not control more than 25 WS2811 without harming RF communications #define PIXEL_SIZE 3 // Three colors per pixel #define BUFF_SIZE (MAX_PIXELS * PIXEL_SIZE) byte pixel_buff[BUFF_SIZE]; NeoPixel pixels(pixel_buff, BUFF_SIZE); #define B_PRESSED 1 #define BUTTON_PIN 1 // Digital IO pin connected to the button. This will be #define DEF_RED 30 #define DEF_GREEN 20 byte red = DEF_RED; byte green = DEF_GREEN; byte blue = 0; #define POWER_ON 1 #define POWER_OFF 0 byte light_power = POWER_ON; byte last_light_power = POWER_OFF; ZUNO_SETUP_CHANNELS( ZUNO_SWITCH_MULTILEVEL(getRed, setRed), ZUNO_SWITCH_MULTILEVEL(getGreen, setGreen), ZUNO_SWITCH_MULTILEVEL(getBlue, setBlue), ZUNO_SWITCH_BINARY(switch_getter, switch_setter) ); void switch_setter(byte value) { Serial.println("switch"); Serial.print("value= "); Serial.println(value); if(value > 1) light_power = POWER_ON; else light_power = POWER_OFF; } byte switch_getter() { return light_power; } int getRed() { return red/2.56; } int getGreen() { return green/2.56; } int getBlue() { return blue/2.56; } void setRed(byte value) { red = value * 2,56; for(uint8_t i = 0; i < MAX_PIXELS; i++) pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); Serial.print("set red = "); Serial.println(value); } void setGreen(byte value) { green = value * 2,56; for(uint8_t i = 0; i < MAX_PIXELS; i++) pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); Serial.print("set red = "); Serial.println(value); } void setBlue(byte value) { blue = value * 2,56; for(uint8_t i = 0; i < MAX_PIXELS; i++) pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); Serial.print("set red = "); Serial.println(value); } void set_LEDS() { for(uint8_t i = 0; i < MAX_PIXELS; i++) pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); } void read_resistors() { red = (analogRead(A0) >> 2) & 0xff; green = (analogRead(A1) >> 2) & 0xff; blue = (analogRead(A3) >> 2) & 0xff; Serial.print(red); Serial.print(" "); Serial.print(green); Serial.print(" "); Serial.print(blue); Serial.print(" "); Serial.println(); set_LEDS(); } #define DEBOUNCE_ACK 10 byte check_button() { static bool oldState = HIGH; byte debounce_cnt = 0; static byte ret = 0; if(digitalRead(BUTTON_PIN) == LOW) { if(ret != B_PRESSED) while(digitalRead(BUTTON_PIN) == LOW) { if(debounce_cnt == DEBOUNCE_ACK) { ret = B_PRESSED; break; } else debounce_cnt++; delay(10); } } else { debounce_cnt = 0; ret = 0; } return ret; } void setup() { Serial.begin(9600); pixels.begin(); pixels.clear(); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { if(check_button() == B_PRESSED) read_resistors(); if(last_light_power != light_power) { Serial.println("set power"); if(light_power == POWER_OFF) { Serial.println("power off"); red = 0; green = 0; blue = 0; } else { Serial.println("power on"); red = DEF_RED; green = DEF_GREEN; blue = 0; } set_LEDS(); last_light_power = light_power; } } 

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


All Articles