مصباح ذكي "للأثرياء" بأيديهم "الكسولة" ، إنه "بسيط" ومريح



المقدمة


قام بإضاءة "حديثة" في المطبخ للحوض والموقد وطاولة القطع على أساس شريط LED الذي يتحكم فيه أردوينو (دعه يطلق عليه المصباح 1). عمل هذا التصميم لمدة عامين ، حتى تدهور جزء القوة في "العقول". هذه مناسبة ممتازة لإعادة اختراع العجلة من "سلة المهملات" مرة أخرى (المصباح 2). صحيح ، هذه المرة ستكون "القمامة" باهظة الثمن ومتوافقة مع المنزل الذكي Z-wave. فيما يلي قصة حول استبدال arduino بـ ZUNo (وحدة متوافقة مع arduino لإنشاء جهاز Z-wave) مع الحد الأقصى من حفظ التعليمات البرمجية وشرح التغييرات الضرورية.

ماذا حدث قبل أن ظهرت هناك


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

لم أكن أحب الضغط على المفتاح الصغير بأيد مبتلة لأنه حول 220 فولت إلى المصباح المتوهج.



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

الأهداف:

  • جعل ضوء تشغيل / إيقاف في المطبخ تماس ؛
  • تضيء الحوض وطاولة الطهي والموقد بالتساوي ؛
  • وفر الطاقة عن طريق استبدال المصابيح المتوهجة بمصابيح LED.

قام بتجميع المصباح 1. ويتكون من صندوق ألومنيوم بطول 2 متر مع ناشر لشريط RGB ووحدة تحكم. تم شراء صندوق وناشر جاهز في المتجر ، وكان هناك شريط ، وكانت وحدة التحكم في الزاوية لفترة طويلة وكانت تنتظر في الأجنحة.

كانت الحالة صناعية (ضد الغبار ومقاوم للماء). نظرًا لأن الشريط هو 12 فولت ، فإن وحدة تزويد الطاقة من 220 فولت إلى 12 فولت تقع في الوحدة ، كما أن لوحة العزل الجلفانية للتحكم في الشريط القائم على TLP250 (optocoupler) تتحكم أيضًا في كل هذا arduino في تصميم مضغوط.
حصلت على العزلة الجلفانية من المشروع القديم. بمجرد أن صنعت إضاءة خلفية لميني بار في منضدة النوم الخاصة بي. عندما تم فتح الباب ، سجلت لوحة اللمس تغيرًا في السعة وشغلت ضوء وميضًا بهدوء. أي أن المجلس كان مناسبًا تمامًا للمشروع الحالي ، وكل ما تبقى هو قطع كل شيء غير ضروري. كان هناك محول خطي 5 فولت على اللوحة ، وكان يعمل بواسطة ZUNo.

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



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

استنتاجات وحدة التحكم السابقة


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

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





على الجدران ، تتحول هذه المادة إلى غارة رهيبة ، لا يتم غسلها فقط.

ما أصبح


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

مواصفات المصنع:
  • 28 kB Flash memory for your sketches
  • 2 kB RAM available
  • Z-Wave RF transmitter at 9.6/40/100 kbps
  • 26 GPIO (overlaps with special hardware controllers)
  • 4 ADC
  • 5 PWM
  • 2 UART
  • 1 USB (serial port)
  • 16 kB EEPROM
  • 1 SPI (master or slave)
  • 4 IR controllers, 1 IR learn capability
  • 1 TRIAC/ZEROX to control dimmer
  • 3 Interrupts
  • 1 Timer 4 MHz
  • I2C (software)
  • 1-Wire (software)
  • 8x6 Keypad Scanner (software)
  • 2 service LED, 1 service button
  • 1 user test LED


تجعل وحدة التوسيع ZUNo لوحة تصحيح كاملة ، والتي ، بعد تصحيح النموذج الأولي ، يمكن استخدامها كجهاز كامل.

بعض المعلومات من الشركة المصنعة:
  • One 0-10 V analog output — control industrial dimmers
  • Up to four PWM or switch outputs (up to 5 A per channel) — control contactors, switches, halogen bulbs or LED strips
  • Up to eight digital 0/3 V inputs or outputs — connect various low voltage digital senors and actors
  • Up to four digital 0/3, 0/5 or 0/12 V digital or analog inputs — connect industrial 10 V sensors or any Arduino-compatible sensor
  • RS485 or UART — for industial meters
  • OneWire — for DS18B20 or other sensors


بالنسبة لمشروعي ، أحتاج إلى 3 ترانزستورات قوية لتحويل 12 فولت إلى شريط LED ومحول من 12 فولت إلى 5 فولت لتشغيل ZUNo. لا يتم لحام أو اختبار بقية أطراف وحدة التوسيع.



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

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



قليلا عن برمجة Arduino و ZUNo


يجب أن تحتوي أجهزة Z-wave على عدد معين من الفئات. تصف الفئات وظائف الجهاز وواجهات التفاعل. على سبيل المثال ، يتحكم مصباحي في شريط LED يتكون من ثلاثة ألوان (أحمر ، أخضر ، أزرق). يتم تنفيذ هذه الوظائف بواسطة فئة Switch متعددة المستويات. إذا أضفناه إلى الرسم ، يمكننا تغيير سطوع أحد الألوان عن بُعد. للتحكم في ثلاثة ألوان ، تحتاج إلى إنشاء ثلاث حالات من هذه الفئة. لن أتحدث عن هذا بمزيد من التفاصيل والتفاصيل. لأن المعالجة الروتينية للفئة مخفية لمستخدمي ZUNo بفكرة "القناة". على سبيل المثال ، أحتاج إلى ثلاث فئات من Switch متعدد المستويات ، لذلك في الرمز يجب أن تظهر 3 قنوات من التبديل متعدد المستويات والعديد من وظائف رد الاتصال للتحكم اللاسلكي. كيف نفعل ذلك؟ تحتاج أيضًا إلى إضافة فئة Switch الأساسية ،لتشغيل المصباح وإيقافه بلمسة زر (من واجهة وحدة تحكم الشبكة) ، وليس لتكوين 3 قنوات في كل مرة.

تحتاج إلى الذهاب إلى موقع المطورين ، حيث يتم وضع أمثلة على z-uno.z-wave.me/Reference/ZUNO_SWITCH_MULTILEVEL . يحتوي كل فصل مدعوم من ZUNo على وصف ومثال. بعد ذلك ، انسخ والصق الوظائف المقترحة في رسمك. يوجد الآن في الرسم التخطيطي ثلاث قنوات تبديل متعددة المستويات و 6 وظائف رد اتصال للاستجابة للأوامر في الراديو. أنا لست معقدًا جدًا في فئات Z-Wave ، لذلك عمل جهاز شريط LED السابق الخاص بي مع هذه المجموعة من الفئات.

تم إعلان القنوات على النحو التالي:

عنوان المفسد
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-uno.z-wave.me/Reference/ZUNO_SWITCH_COLOR . الآن هناك قناة واحدة فقط ووظيفتان لرد الاتصال في الرسم. في قائمة وحدة التحكم ، يتم تنفيذ إعداد اللون بشكل منفصل لكل لون ، وكذلك كل مرة واحدة ، من خلال التحديد من اللوحة.

ZUNO_SETUP_CHANNELS(ZUNO_SWITCH_COLOR(SWITCH_COLOR_FLAGS_RED|SWITCH_COLOR_FLAGS_GREEN|SWITCH_COLOR_FLAGS_BLUE, getterFunction, setterFunction));

وفي قائمة وحدة التحكم ، يبدو الأمر كما يلي:



الوظيفة التالية تستجيب للطلبات عبر الراديو. قد يأتي طلب لقراءة حالة إحدى قنوات الألوان.

BYTE getterFunction(BYTE component) {
  switch(component)
  {
    case SWITCH_COLOR_COMPONENT_RED:
      return pwmR;
      break;
    case SWITCH_COLOR_COMPONENT_GREEN:
      return pwmG;
      break;
    case SWITCH_COLOR_COMPONENT_BLUE:
      return pwmB;
      break;
  }
  return 3;
}

وهذه وظيفة لتعيين الألوان من واجهة التحكم.

void setterFunction(BYTE component, BYTE newValue) 
{
  switch(component)
  {
    case SWITCH_COLOR_COMPONENT_RED:
      pwmR = newValue;
      break;
    case SWITCH_COLOR_COMPONENT_GREEN:
      pwmG = newValue;
      break;
    case SWITCH_COLOR_COMPONENT_BLUE:
      pwmB = newValue;
      break;
  }
  radio_action = 1;
}

هذا هو كل الرمز الذي تحتاج إلى إضافته لتحويل رسم اردوينو إلى رسم لـ ZUNo.

استنتاج


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

الموجودات


تبسط ZUNo ووحدة التوسع الخاصة بها إلى حد كبير "الإبداع الفني المنزلي". ومع ذلك ، فإنني أعتبر أن هذه المنتجات باهظة الثمن ، وإذا عملت في مكان آخر ولم تكن معدات Z-Wave مستلقية ، فسأفعل كل شيء على ESP8266. أثناء التطوير ، تعلمت "معيارًا" جديدًا لتمييز الأسلاك من مصدر الطاقة.



الآن ، لم يتم تمييز الأرض بشريط أسود فقط ، ولكن كما هو الحال في حالتي السلك "الإيجابي". بالنسبة لوحدة التوسع ، كان هذا مهمًا. فشل محول 5 فولت LM2594 (السعر في Chip و Dip حوالي 200 روبل). آمل أنه في الإصدار التالي من وحدة التوسع سيكون هناك صمام ثنائي للحماية ضد "عكس القطبية". وسوف أتحقق من قطبية أسلاك التوريد. عيب آخر مرتبط بالجسم. تبدو الحالة جيدة ، لكنني لم أستطع توصيل الأسلاك دون الملقط بالكتل الطرفية. آمل أن يكون هناك إصدار مع كتل طرفية أخرى (لتوصيل الأسلاك من الأعلى ، أو بزاوية).

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



هذا هو كل ما تبقى من عملية التجميع والتصحيح.

ويبدو أن الإضاءة الخلفية قيد التشغيل ، إذا انحني قليلاً. إذا قمت بالتصويب ، فلن يظهر المربع والمفتاح.



رسم ل ZUNo. أرفق ، فقط لتأكيد أن كل شيء أساسي
#include "EEPROM.h"
#include "EEPR.h"

int readPin = 9;
int triggerPin = 10;
byte controlState = 0;
word lastValue;
#define REDPIN   PWM1     // pin connection R 
#define GREENPIN PWM2     // pin connection G
#define BLUEPIN  PWM3     // pin connection B

ZUNO_SETUP_CHANNELS(ZUNO_SWITCH_COLOR(SWITCH_COLOR_FLAGS_RED|SWITCH_COLOR_FLAGS_GREEN|SWITCH_COLOR_FLAGS_BLUE, getterFunction, setterFunction));

#define ON 1
#define OFF 0
uint8_t switch_=OFF;

uint8_t pwmR=0;
uint8_t pwmG=0;
uint8_t pwmB=0;
uint8_t b_pwmR=0;
uint8_t b_pwmG=0;
uint8_t b_pwmB=0;

enum
{
  DEF_R = 255,
  DEF_G = 255,
  DEF_B = 255
};
uint8_t radio_action = 0;

void setup() 
{ 
  init_EEPROM();
  Serial.begin();
  pinMode(readPin, INPUT);
  pinMode(triggerPin, OUTPUT);
  digitalWrite(triggerPin, LOW);
  pinMode(REDPIN, OUTPUT);
  pinMode(GREENPIN, OUTPUT);
  pinMode(BLUEPIN, OUTPUT);
  analogWrite(REDPIN, pwmR & 0xff);
  analogWrite(GREENPIN, pwmG & 0xff);
  analogWrite(BLUEPIN, pwmB & 0xff);
  
} 
int act=1;
int actf = 0;
int cnt=57; 

void loop()
{
  int tmp;
  // trigger measurement
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(10);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  // read pulse width
  tmp = pulseIn(readPin, HIGH, 100000);
  lastValue = tmp / 58;
  Serial.print(" cm= ");
  Serial.println(lastValue);
  if (lastValue < 30)
  {
    cnt++;
  }
  else
  {
    cnt--;
  }
  if (cnt > 55)
  { 
    act=1;
  }
  if (cnt > 60)
    cnt= 60;
  if (cnt < 50)
  {
    act=0;
    actf=0;
  }
  if (cnt < 45 )
    cnt = 45;
  
  if ((act == 1) && (actf == 0))
  {  
    actf = 1;
    if (switch_ == OFF)
    {
      switch_=ON;
      b_pwmG = pwmG;
      b_pwmB = pwmB;
      b_pwmR = pwmR;
    }
    else
    {
      switch_=OFF;
      b_pwmR=0;
      b_pwmG=0;
      b_pwmB=0;
    }
    analogWrite(REDPIN, b_pwmR & 0xff);
    analogWrite(GREENPIN, b_pwmG & 0xff);
    analogWrite(BLUEPIN, b_pwmB & 0xff); 
  } 
  
  Serial.print("cnt = ");    
  Serial.print(cnt);  
  Serial.print(" || ");    
  Serial.print(pwmR);  
  Serial.print(" ");      
  Serial.print(pwmG);  
  Serial.print(" ");
  Serial.print(pwmB);  
  Serial.print(" ");
  Serial.println("");
 // delay(10);

 if(radio_action)
 {
    radio_action = 0;
    eepr_save_col();
    analogWrite(REDPIN, pwmR & 0xff);
    analogWrite(GREENPIN, pwmG & 0xff);
    analogWrite(BLUEPIN, pwmB & 0xff);
 }
}

BYTE getterFunction(BYTE component) {
  switch(component)
  {
    case SWITCH_COLOR_COMPONENT_RED:
      return pwmR;
      break;
    case SWITCH_COLOR_COMPONENT_GREEN:
      return pwmG;
      break;
    case SWITCH_COLOR_COMPONENT_BLUE:
      return pwmB;
      break;
  }
  return 3;
}

void setterFunction(BYTE component, BYTE newValue) 
{
  switch(component)
  {
    case SWITCH_COLOR_COMPONENT_RED:
      pwmR = newValue;
      break;
    case SWITCH_COLOR_COMPONENT_GREEN:
      pwmG = newValue;
      break;
    case SWITCH_COLOR_COMPONENT_BLUE:
      pwmB = newValue;
      break;
  }
  radio_action = 1;
}


All Articles