جهاز تحكم Z-Wave LED مع التشفير. Z-Uno + MOSFET + Encoder



في الغرفة التي يلعب فيها الطفل ، قمت بتثبيت إضاءة إضافية على شكل شريط LED. في البداية ، خططت للتحكم في سطوع الشريط ، وهذا مناسب لإعداد الإضاءة الليلية. لقد كان لدي بالفعل باهتة Z-Wave لـ 220 فولت ، لذلك كان من الأرخص شراء محول عكس الضوء لـ 12 فولت لـ 1000r من وحدة تحكم RGBW خاصة من Fibaro لـ 5500r.

يعمل هذا الحل ، ولكن هناك سلبيات:

  • تأخير يعتم
  • لا يمكنك ضبط مستوى سطوع منخفض جدًا.

بعد عام من الاستخدام ، قررت أن أجعل جهاز التحكم Z-Wave LED الخاص بي ، ولكن مع جهاز تشفير وحالة باهتة ، للتثبيت في مقبس.

مخطط الدائرة للجهاز أساسي ؛ التشفير مع 3 دبابيس متصل مباشرة بـ Z-Uno: دبوس A ، دبوس B وزر. يتصل Mosfet بدبوس PWM.



المواد والأسعار:
لا.الموادصورالسعر
1لوحة Z-Wave Z-Uno3500 ص
2موسفت IRLR872927 ص
3التشفير EC1150 ص

لوحة Z-Wave Z-Uno مبرمجة في بيئة Arduino ، ولا يأخذ رسم معالجة الإشارات من المشفر والتحكم في mosfet سوى 143 سطرًا من التعليمات البرمجية مع التعليقات. يعمل الرسم كما يلي:

كل 128 ثانية ، من خلال الانقطاع عن المؤقت ، نتحقق من الاتجاه الذي تدور فيه العجلة ، نحمي أنفسنا من الارتداد بواسطة فحص حالة 4 أضعاف. في العدسة المكبرة ، تحقق من الضغط على الزر ، في كل مرة تقوم فيها بالضغط ، قم بإيقاف تشغيل الشريط أو تشغيل مستوى السطوع السابق. يمكن ضبط السطوع من جهاز التشفير ومن الهاتف أو من مفتاح Z-Wave الآخر.



كود التحكم في الصمامات الدوارة
#define PUSH_BUTTON 23 #define ENCODER_CHA_PIN 19 #define ENCODER_CHB_PIN 20 #define LEV_SHIFT 8 #define ENCODER_DEBONCE 4 #define STATE_IDLE 0xFF #define STATE_SKIP 0xFE ZUNO_SETUP_ISR_GPTIMER(gpt_handler); ZUNO_SETUP_CHANNELS(ZUNO_SWITCH_MULTILEVEL(getter, setter)); byte level = 0; byte last_reported_level = 0; byte g_state = STATE_IDLE; byte g_pins = 0; byte g_debounce_time = 0; byte last_push_button_state = HIGH; byte stored_level = 0; dword last_level_changed_time = 0; // Runs every 128 μs void gpt_handler() { byte pins = 0; pins = !digitalRead(ENCODER_CHA_PIN); if(!digitalRead(ENCODER_CHB_PIN)) pins |= 2; if(g_pins == pins) { // Is the state stable? g_debounce_time++; if(g_debounce_time>ENCODER_DEBONCE) { if(g_state == STATE_IDLE) { g_state = pins; } else if(g_state == STATE_SKIP) { if(pins == 0) g_state = 0; } else { if((g_state == 0 && pins == 1) || (g_state == 1 && pins == 3) || (g_state == 3 && pins == 2) || (g_state == 2 && pins == 0) ) { if (level < 39) { level++; } else if ((level + LEV_SHIFT) <= 255) { level += LEV_SHIFT; } else if ((level + LEV_SHIFT) > 255){ level = 255; } } else if((g_state == 0 && pins == 2) || (g_state == 2 && pins == 3) || (g_state == 3 && pins == 1) || (g_state == 1 && pins == 0) ) { if (level <= 39 && level !=0) { level--; } else if (level >= LEV_SHIFT) { level -= LEV_SHIFT; } else if (level < 0) { level = 0; } } if(g_state != pins) g_state = STATE_SKIP; } g_debounce_time = 0; } } else { g_debounce_time = 0; } g_pins = pins; } void setup() { Serial.begin(); pinMode(PUSH_BUTTON, INPUT_PULLUP); pinMode(ENCODER_CHA_PIN, INPUT); pinMode(ENCODER_CHB_PIN, INPUT_PULLUP); zunoGPTInit(ZUNO_GPT_SCALE1024|ZUNO_GPT_CYCLIC); // 32 MHz/1024 = 31.25 kHz (tick is 32 μs) zunoGPTSet(4); // 32 μs * 4 = 128 μs zunoGPTEnable(1); } void loop() { // Do we need to report the level? if(last_reported_level != level) { if (level > 0) { stored_level = level; } last_reported_level = level; analogWrite(PWM1, level); last_level_changed_time = millis(); Serial.print("Level: "); Serial.println(level); } // Button handler byte current_push_button_state = digitalRead(PUSH_BUTTON); if (current_push_button_state != last_push_button_state) { last_push_button_state = current_push_button_state; // if button pressed if (last_push_button_state == LOW) { // if LED turned ON, turn OFF if (level > 0) { analogWrite(PWM1, 0); level = 0; } // Restore last level else { analogWrite(PWM1, stored_level); level = stored_level; } } } // Send report if 2 seconds level not changed if (last_level_changed_time && millis() > last_level_changed_time + 2000) { last_level_changed_time = 0; zunoSendReport(1); } } void setter(byte value) { if (value > 99) { value = 99; } level = (long)value * 255 / 99; analogWrite(PWM1, level); } byte getter(void) { return last_reported_level * 99 / 255; } 


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



بالنسبة لوحدة تحكم Z-Wave LED الجديدة ، قمت بتعديل علبة التعتيم - لقد قمت بحفر فتحة لجهاز التشفير وقمت بتغيير تركيب الإطار قليلاً لاستخدام الإطار من مفتاح آخر. لا تطلق للتصميم ، مصنوعة من مواد مرتجلة. يمكنك استخدام السكن النهائي من باهتة تقليدية لتبدو جميلة من الناحية الجمالية.



يقرر LUT! لتصنيع نسخة واحدة من اللوحة ، فهي أفضل من LUTA لا أعرف التكنولوجيا ، لذلك صنعت لوحين يتناسبان تمامًا في حالة باهتة قديمة. يوجد في الجزء السفلي Z-Uno ، وهو mosfet وكتلة لتوصيل الطاقة والشريط ، بالمناسبة تم تصميم mosfet للجهود حتى 30 فولت ، لذلك يمكن استخدام الشريط على شكل 12V أو 24V ، بدون مشعاع ، يجب ألا يتجاوز التيار أكثر من 5A.



يقع التشفير فقط في الأعلى.



بعد توصيل شطيرة من الألواح ووضعها في العلبة ، نحصل على وحدة تحكم Z-Wave LED.



في الوقت الحالي ، وحدة التحكم Z-Wave LED غير مثبتة في المقبس وتقع على حامل تلفزيون. لبعض الوقت سأختبر العمل.



ولكن الآن زادت راحة التحكم في شريط LED بشكل كبير ، عند التحكم من عجلة أو مفتاح بجانب السرير ، يتغير السطوع على الفور. في Z-Wave ، يكون مقياس التعتيم في النطاق من 0 إلى 99 ، باستخدام العجلة ، يمكنك تحديد مستوى السطوع من 0 إلى 255. عند تدوير قسم واحد بعد 0 ، تضيء مؤشرات LED قليلاً ، ولن توقظ أي شخص في الليل ، ولكنها ستساعد على عدم النسيان مكعب LEGO على الأرض.

استغرق الأمر 3 مساءًا لجعل الجهاز ، 1 برنامج كتابة مسائي ، 1 مساء LUT ، 1 مساء العمل مع ملف.

تم التحديث في 01/21/2018
هناك عدة أفكار لوضع اللمسات الأخيرة على التصميم ، وأود أن أتلقى التعليقات.
فكرة 1. على alik سأطلب باهتة جميلة منتهية بلوحة زجاجية واستبدال الحشوة ، يمكنني التعامل مع هذا.
فكرة 2. استخدم لمسة مع شاشة مشابهة للتحكم في المناخ في السيارة ؛ سيتم عرض مستوى السطوع الحالي. المشكلة هي أنني لا أستطيع العثور على تطور مع عرض منفصل عن التحكم في المناخ.

تم التحديث في 01/23/2018
في لوحة التركيب ، قام Schneider Electric Odace (80 r في التركيبات الكهربائية) بتجميع دائرة تحكم LED.



إطار Odace 90 p هو (وهو ليس في الصورة) ، ولكن لا يتم بيع اللفة بشكل منفصل ، ولكن كان لدي في المخزون. لم يتم التخطيط لإسكان إضافي ؛ الجهاز جاهز تمامًا.

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


All Articles