अपने "आलसी" हाथों से "अमीर" के लिए एक स्मार्ट लैंप, यह "सरल" और सुविधाजनक है



परिचय


उन्होंने Arduino द्वारा नियंत्रित एलईडी पट्टी के आधार पर एक सिंक, स्टोव और काटने की मेज के लिए रसोई में "आधुनिक" प्रकाश व्यवस्था की (इसे दीपक 1 कहा जाना चाहिए)। इस डिजाइन ने 2 साल तक काम किया, जब तक कि "दिमाग" का पावर भाग खराब नहीं हो गया। यह "तात्कालिक ट्रैश" से पहिया को फिर से मजबूत करने के लिए एक उत्कृष्ट अवसर है (दीपक 2)। सच है, इस बार "कचरा" जेड-लहर स्मार्ट होम के साथ महंगा और संगत होगा। निम्नलिखित ZUNo के साथ arduino की जगह के बारे में एक कहानी है (Z-wave डिवाइस बनाने के लिए एक arduino संगत मॉड्यूल) जिसमें अधिकतम कोड बचत और आवश्यक परिवर्तनों की व्याख्या है।

मेरे वहां आने से पहले क्या हुआ था


एक बार, व्यंजन धोने या खाना पकाने के लिए, सिंक के ऊपर दीपक को चालू करना आवश्यक था। यह एक लाल टेबल लैंप था।

मुझे गीले हाथों से छोटे स्विच को दबाना पसंद नहीं था क्योंकि यह 220 वोल्ट के गरमागरम दीपक पर स्विच करता था।



इसके अलावा, दीपक से प्रकाश मुख्य रूप से सिंक पर गिर गया, लेकिन मैं खाना पकाने की मेज और स्टोव को बेहतर ढंग से रोशन करना चाहता था।

उद्देश्य:

  • रसोई में संपर्क को चालू / बंद करें;
  • समान रूप से सिंक, खाना पकाने की मेज और स्टोव को रोशन करें;
  • एलईडी के साथ गरमागरम बल्बों को बदलकर ऊर्जा बचाएं।

उन्होंने दीपक को इकट्ठा किया 1. इसमें आरजीबी टेप और एक नियंत्रण इकाई के लिए विसारक के साथ 2-मीटर एल्यूमीनियम बॉक्स शामिल था। एक बॉक्स और एक विसारक तैयार किए गए स्टोर पर तैयार किए गए थे, एक टेप था, और नियंत्रण इकाई लंबे समय तक कोने में थी और पंखों में इंतजार कर रही थी।

मामला औद्योगिक (डस्टप्रूफ, वाटरप्रूफ) था। चूंकि टेप 12 वोल्ट है, इसलिए 220 वी से 12 वी तक की बिजली आपूर्ति इकाई, टीएलपी 250 (ऑप्टोकॉप्लर) पर आधारित टेप को नियंत्रित करने के लिए गैल्वेनिक आइसोलेशन बोर्ड की इकाई में स्थित है, इस सभी आर्कडिनो को एक कॉम्पैक्ट डिजाइन में नियंत्रित किया।
मुझे पुरानी परियोजना से गैल्वेनिक अलगाव मिला। एक बार जब मैंने अपने नाइटस्टैंड में मिनीबार के लिए बैकलाइट बनाया। जब दरवाजा खोला गया, तो टच पैड ने क्षमता में बदलाव दर्ज किया और हल्के से झिलमिलाते प्रकाश को चालू कर दिया। यही है, बोर्ड वर्तमान परियोजना के लिए अच्छी तरह से अनुकूल था, जो कुछ भी था वह सब कुछ अनावश्यक को काट देना था। बोर्ड पर एक 5-वोल्ट रैखिक कनवर्टर था, यह ज़ूनो द्वारा संचालित था।

यह अल्ट्रासोनिक दूरी मीटर के लिए एक हाथ ट्रे के साथ दीपक को चालू करने की योजना बनाई गई थी। उसने इसे ढक्कन में घुड़सवार किया, और अन्य सभी भागों को बॉक्स में मिला। सभी "मज़बूती से" गर्म-पिघल चिपकने के साथ तय किए गए। परीक्षण के समय, मैंने बाहरी इकाई के लिए एक लाइट स्विच से नियंत्रण इकाई को बिजली की आपूर्ति करने के लिए पास का बटन बनाया।



रोशनी चालू करना अधिक सुविधाजनक और सुरक्षित हो गया है। यह किचन कैबिनेट के नीचे से उल्टा लगा हुआ था और अंदर से गीले हाथों से पानी निकालना कठिन था।

पिछले नियंत्रण इकाई से निष्कर्ष


मेरी एलईडी पट्टी के अप्राकृतिक रंग प्रतिपादन के कारण रसोई के कार्य क्षेत्र की रोशनी और भी अधिक और सुखद हो गई, कुछ उत्पादों का रंग बदल गया। उदाहरण के लिए: ब्राइट कलर के कारण गाजर ज्यादा स्वादिष्ट लगती थी। लेकिन इसने बहुत हस्तक्षेप नहीं किया, और मुझे आशा है कि इसने बहुत नुकसान नहीं किया।

संपर्क-रहित / बंद होने से, सब कुछ खराब हो गया। इसने काम कर दिया। लेकिन ऑफ स्टेट में 5 मिनट के बाद, एलईडी पट्टी पर फ्लैश शुरू हुआ। मैंने ऑप्टोकॉपर्स पर सर्किट को फिर से शुरू नहीं किया और सब कुछ छोड़ दिया जैसा कि यह है। केवल चालू और बंद करने के लिए नए स्विच का उपयोग करना शुरू किया। सभी को इसकी लोकेशन और शेप पसंद आई।
दो साल से अधिक उपयोग, वसा और अन्य यौगिकों को शरीर पर और इसके अंदर जमा खाना पकाने के दौरान स्रावित किया जाता है। यह पट्टिका तारों के प्रवेश के लिए छेद के माध्यम से आंशिक रूप से आवास में घुस गई। लेकिन शरीर की चमकदार सतह के कारण, यह पदार्थ एक जिलेटिनस द्रव्यमान में संघनित होता है। यह स्पर्श करने के लिए सुखद, बिना गंध और ... (मैंने इसका स्वाद नहीं लिया)। मैंने मौके की कुछ तस्वीरें ड्रैगन कीटाणु के रूप में लीं।





दीवारों पर, यह पदार्थ एक भयानक छापे में बदल जाता है, जो सिर्फ लांड्रिंग नहीं है।

क्या बन गया है?


डिब्बे में रम जाने के बाद मुझे ज़ूनो के लिए एक अधूरा विस्तार मॉड्यूल मिला। Zuno, Z-Wave स्मार्ट होम के साथ संगत अपने डिवाइस को डिजाइन करने के लिए एक Arduino जैसा बोर्ड है। यह Arduino के वातावरण से क्रमादेशित है।

निर्माता विनिर्देशों:
  • 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


मेरी परियोजना के लिए, मुझे 12 वोल्ट को एक एलईडी पट्टी पर स्विच करने के लिए 3 शक्तिशाली ट्रांजिस्टर की आवश्यकता है और Zuno को पावर करने के लिए 12 वोल्ट से 5 वोल्ट तक के कनवर्टर की आवश्यकता है। विस्तार मॉड्यूल की बाकी परिधि को मिलाप या परीक्षण नहीं किया गया है।



सर्किट के इस हिस्से में, बिजली की आपूर्ति के लिए "पोलरिटी रिवर्सल" के खिलाफ सुरक्षा के लिए पर्याप्त डायोड नहीं है, और पावर फील्ड-प्रभाव ट्रांजिस्टर के फाटकों पर प्रतिरोधों को गेट से जोड़ा जाना था, और सीमित अवरोधक के सामने नहीं। मैं निष्कर्ष में इसके बारे में अधिक लिखूंगा।

यह विस्तार मॉड्यूल Gainta से एक आवास में आपूर्ति की जाती है। मेरी पिछली नियंत्रण इकाई भी इस कंपनी के मामले में थी, लेकिन एक अलग आकार की थी। दुर्भाग्य से, मॉड्यूल पर फास्टनिंग्स पुराने मामले में फिट नहीं थे, और मैं एक नया ड्रिल नहीं करना चाहता था, मैंने पुराने मामले को छोड़ दिया। बोर्ड गर्म पिघल चिपकने पर "लगाया" गया था।



प्रोग्रामिंग Arduino और ZUNo के बारे में थोड़ा


जेड-वेव उपकरणों में कुछ निश्चित कक्षाएं होनी चाहिए। कक्षाएं डिवाइस फ़ंक्शन और इंटरैक्शन इंटरफेस का वर्णन करती हैं। उदाहरण के लिए, मेरा दीपक तीन रंगों (लाल, हरा, नीला) से युक्त एक एलईडी पट्टी को नियंत्रित करता है। ये फ़ंक्शन स्विच मल्टीलेवल क्लास द्वारा किए जाते हैं। यदि हम इसे स्केच में जोड़ते हैं, तो हम दूरस्थ रूप से किसी एक रंग की चमक को बदल सकते हैं। तीन रंगों को नियंत्रित करने के लिए, आपको इस वर्ग के तीन उदाहरण बनाने की आवश्यकता है। मैं इस बारे में अधिक विस्तार और विस्तार से बात नहीं करूंगा। क्योंकि "चैनल" की धारणा द्वारा ZUNo उपयोगकर्ताओं के लिए नियमित वर्ग हेरफेर छिपा हुआ है। उदाहरण के लिए, मुझे स्विच मल्टीलेवल के तीन वर्गों की आवश्यकता है, इसलिए कोड में स्विच मल्टीलेवल के 3 चैनल और रेडियो नियंत्रण के लिए कई कॉलबैक फ़ंक्शन दिखाई देने चाहिए। यह कैसे करना है? आपको स्विच बुनियादी वर्ग जोड़ने की भी आवश्यकता है,एक बटन के स्पर्श पर (नेटवर्क नियंत्रक इंटरफ़ेस से) दीपक को चालू करने के लिए, और हर बार 3 चैनलों को कॉन्फ़िगर करने के लिए नहीं।

आपको डेवलपर वेबसाइट पर जाना होगा, जहां z-uno.z-wave.me/Reference/ZUNO_SWITCH_MULTILEVEL के उदाहरण दिए गए हैं ज़ूनो द्वारा समर्थित प्रत्येक वर्ग में एक विवरण और एक उदाहरण है। इसके बाद, प्रस्तावित कार्यों को अपने स्केच में कॉपी और पेस्ट करें। अब स्केच में रेडियो पर कमांड का जवाब देने के लिए तीन स्विच मल्टीलेवल चैनल और 6 कॉलबैक फ़ंक्शन हैं। मैं जेड-वेव कक्षाओं में बहुत परिष्कृत नहीं हूं, इसलिए मेरी पिछली एलईडी स्ट्रिप डिवाइस ने कक्षाओं के इस सेट के साथ काम किया।

चैनल इस तरह घोषित किए गए:

स्पायलर हेडिंग
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 के लिए एक स्केच में एक Arduino स्केच को जोड़ने की आवश्यकता है।

निष्कर्ष


विधानसभा और स्थापना के बाद, सभी घोषित कार्य पूरे हो गए। हालांकि, स्विच के साथ प्रकाश को चालू करने की आदत बनी रही (यह बहुत सुविधाजनक निकला)। संपर्क रहित समावेशन विकल्प भी काम करता है। कमियों के बीच, मैं नियंत्रण इकाई में शक्ति लगाने के बाद एक दूसरे के लिए एलईडी लैंप की झिलमिलाहट को नोट करना चाहता हूं। यह Zuno बाह्य उपकरणों के लंबे आरंभीकरण के कारण है। इस बिंदु पर, पैर अप्रत्याशित हैं। मुझे लगता है कि ट्रांजिस्टर के गेट पर पुल-अप रोकनेवाला स्थिति को सही कर देगा यदि आप इसे सीमित अवरोधक के बाद डालते हैं। यदि इनिशियलाइज़ेशन कोड पैरों को आउटपुट में समायोजित करता है और तर्क स्तर को उद्देश्यपूर्ण रूप से बदलता है, तो आप आरसी फ़िल्टर के साथ प्रयोग कर सकते हैं, जो कि छोटी दालों को पारित नहीं करेगा। मैंने इसे अभी तक नहीं किया है, और शायद मैंने ऐसा कभी नहीं किया है!

जाँच - परिणाम


ज़ूनो और इसके विस्तार मॉड्यूल "घर तकनीकी रचनात्मकता" को सरल करते हैं। हालाँकि, मैं इन उत्पादों को बहुत महंगा मानता हूं और अगर मैंने कहीं और काम किया है और जेड-वेव उपकरण आसपास नहीं पड़े हैं, तो मैं ईएसपी 8266 पर सब कुछ करूंगा। विकास के दौरान मैंने बिजली की आपूर्ति से तारों को चिह्नित करने के लिए एक नया "मानक" सीखा।



अब न केवल पृथ्वी को एक काली पट्टी के साथ चिह्नित किया गया है, लेकिन मेरे मामले में "सकारात्मक" तार की तरह। विस्तार मॉड्यूल के लिए, यह महत्वपूर्ण निकला। 5-वोल्ट LM2594 कनवर्टर विफल हो गया है (चिप और डुबकी की कीमत लगभग 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