ब्लॉक रिमोट सर्विस मल्टीफंक्शनल बीडीएस-एम

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

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

यह कोई गलतफहमी नहीं थी: मैंने इस नियंत्रक के लिए एक विशेष उद्देश्य या आवश्यकता नहीं देखी। यह सिर्फ बनाना दिलचस्प था और एक ही समय पर सर्दियों की लंबी शामें लेने के अलावा कुछ और सोच-समझकर खिड़की से बाहर देखना, कॉफी पीना और शाश्वत के बारे में सोचना, हमेशा एक गर्म प्लेड कंबल के नीचे।

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

शायद क्रम में सब कुछ के बारे में बेहतर।





। और एंटेना एक तरफ: zyrk-zyrk
छवि

प्रयोजन और कार्य

मीडिया कंट्रोलर को एक सेंट्रल कंट्रोलर के साथ मिलकर काम करने के लिए बनाया गया है।

सीमित कार्यक्षमता के साथ, एक रेडियो रिमोट कंट्रोल के साथ स्वायत्त संचालन संभव है, जो प्रत्येक बटन के लिए एक निश्चित कोड के साथ संगत प्रोटोकॉल का उपयोग करके कमांड जारी करने में सक्षम है (एक नियम के रूप में, सरल रेडियो सॉकेट्स, रेडियो रिले, लाइट स्विच से रिमोट करता है)।

कार्यान्वित कार्य (सी - एक केंद्रीय नियंत्रक के साथ; ए - संभवतः ऑफ़लाइन):

1) एलजी टीवी नियंत्रण (सी, ए)
2) जी-मिनी HDR900D मीडिया प्लेयर कंट्रोल (C, A)
3) एयर कंडीशनिंग नियंत्रण LG CS12AQ (C, A)
4) रेडियो रिमोट कंट्रोल कमांड के सिग्नल और वायरलेस सेंसर से सेंट्रल कंट्रोलर (C) के सिग्नल
5) वायुमंडलीय दबाव और कमरे के तापमान (C) के मूल्यों के केंद्रीय नियंत्रक के लिए माप और संचरण

मामले के इतिहास

एक मीडिया नियंत्रक का मूल विचार इस प्रकार था। यह केंद्रीय नियंत्रक से रेडियो कमांड प्राप्त करता है और संबंधित कमांड को प्रसारित करता है, लेकिन पहले से ही आईआर डायोड के माध्यम से। बेशक, इस मामले में, मीडिया नियंत्रक को नियंत्रित उपकरणों के सापेक्ष निकटता में स्थित होना चाहिए, और आईआर डायोड और नियंत्रित उपकरणों के आईआर रिसीवर के बीच प्रत्यक्ष दृश्यता केवल एक शर्त है।

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

यदि कोड को मान्यता नहीं मिली है, तो पल्स ड्यूरेशन का एक "कच्चा" अनुक्रम है जो IRremote नियंत्रण कोड के साथ एक साथ जारी करता है। हालांकि, नकारात्मक पक्ष यह है कि यह विकल्प नियंत्रक संसाधनों के संदर्भ में बहुत अधिक बेकार है। लेकिन अगर यह यहां और अभी आवश्यक है - सामान्य तौर पर, कोई विकल्प नहीं हैं।

दोनों विधियों में आवेदन मिला है। यह सिर्फ इतना हुआ कि टीवी और मीडिया प्लेयर के साथ कोई समस्या नहीं थी, और एयर कंडीशनिंग कैपिटल थी। सहयोगियों की कहानियों को पढ़ने से एक भयानक सच्चाई का पता चला: एयर कंडीशनिंग कमांड के लिए कोड शब्द में सेट ऑपरेटिंग मोड के बारे में पूरी जानकारी है।

एयर कंडीशनर को छेड़ना

औसत एयर कंडीशनर एक मूर्ख और आज्ञाकारी प्राणी है। वह कुछ भी याद नहीं रखता, कुछ भी नहीं जानता, और केवल वही करता है जो पर्दे के पीछे का दुनिया उसे बताती है।

यह समझने के लिए कि यह एक विकल्प है जब आपको "कच्चे" कोड का उपयोग करने की आवश्यकता होती है, काफी सरल है। उदाहरण के लिए, यदि आप टीवी रिमोट कंट्रोल पर असीमित संख्या में एक ही बटन दबाते हैं, तो कमांड हर बार एक ही होगा। और इस कमांड का उपयोग कहीं भी किया जा सकता है।

लेकिन अगर हम कहते हैं, एयर कंडीशनर रिमोट कंट्रोल पर तापमान वृद्धि बटन दबाते हैं, तो तापमान सीमा के भीतर कमान हर बार अलग होगी। ऐसा इसलिए है क्योंकि सेट तापमान को कोड वर्ड में प्रसारित किया जाता है, न कि इसके परिवर्तन का संकेत। कोडवर्ड में प्रेषित भी हैं: ऑपरेशन मोड (ठंड / गर्मी / पंखे), पंखे की गति, अंधा की स्थिति आदि। यह स्पष्ट है कि यदि आप IRremote से "डिकोडेड" परिणाम का उपयोग करते हैं, तो यह कुछ भी अच्छा नहीं होगा, क्योंकि इसका वास्तविकता से कोई लेना-देना नहीं है।

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

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

हालाँकि, नायक मौजूद हैं। एक मित्र ने एलजी एयर कंडीशनर के लिए अपनी लाइब्रेरी लिखी है।

खैर, मैंने, इस बारे में थोड़ा विचार करने के बाद कि क्या एयर कंडीशनिंग आदेशों के निर्माण के तर्क की गणना करना आवश्यक है, इस निष्कर्ष पर पहुंचे कि कोई तत्काल आवश्यकता नहीं है। तथ्य यह है कि हम कार्यों के बजाय सीमित सेट का उपयोग करते हैं: एक नियम के रूप में, एक ही हीटिंग तापमान और एक ही ठंडा तापमान। इसलिए, मैंने सब कुछ और सब कुछ के कार्यान्वयन पर समय नहीं बिताने का फैसला किया, लेकिन बस क्रमिक रूप से रिमोट कंट्रोल में स्थापित किया गया और वर्तमान मोड के आदेशों को पढ़ा: ऑन, ऑफ, हीटिंग और कूलिंग।

तो, यह परिमाण का एक क्रम लगता है, लेकिन यह पता चला है कि मैं एक फ़ंक्शन पर एक माइक्रोकंट्रोलर खर्च करता हूं। यह किसी तरह बेकार भी था, इसलिए मैंने थोड़ा सोचा, और फैसला किया कि यदि ऐसा है, तो एक ही समय में वायुमंडलीय दबाव को क्यों न मापें, क्योंकि बाहरी मौसम संवेदक इससे वंचित हैं। तो, नियंत्रक के लिए लोकप्रिय रूप से प्रिय BMP085 सेंसर जोड़ा गया था।

वायुमंडलीय आश्चर्य

BMP085 के साथ एक दिलचस्प कहानी जुड़ी हुई है। सबसे पहले, मैंने 3 वी और 5 वी के वोल्टेज वाले दो संस्करणों के अस्तित्व के बारे में सीखा, न केवल आदेश देने के बाद, बल्कि मेरी प्रति भी प्राप्त की। इसके अलावा, बोर्ड पर, जो कि विशिष्ट है, वे नहीं लिखते कि इस सेंसर को किस तरह के वोल्टेज की जरूरत है। मुझे अलग-अलग सेंसरों की तस्वीरों को देखना था और आखिरकार, मौका मिला।

दूसरे, आदेश देते समय, मुझे पूरा यकीन था कि मैं एक वायुमंडलीय दबाव संवेदक खरीद रहा था। वास्तव में, हर जगह BMP085 को इस तरह से प्रस्तुत किया गया है। इसलिए, मुझे बहुत आश्चर्य हुआ, जब इसे प्राप्त करने के बाद, मैंने सेंसर विनिर्देशों को पढ़ा, और वहां "तापमान माप शामिल" देखा। और फिर विवरण - " -40 से + 85 डिग्री सेल्सियस ऑपरेशनल रेंज, + -2 डिग्री सेल्सियस तापमान सटीकता "।

यह दिखाई दिया कि एक ही समय में दबाव और तापमान दोनों को मापना संभव था। इसके अलावा, सटीकता मेरे साथ काफी ठीक थी, खासकर जब से यह इतना अच्छा बोनस है।

मुझे तुरंत कहना चाहिए - मैंने एक निश्चित मानक थर्मामीटर के साथ रीडिंग की तुलना नहीं की है, इसलिए मैं यह नहीं कह सकता कि सेंसर गलत है और कितनी दिशा में (यदि बिल्कुल)।

। मैंने संवेदी रूप से सेंसर को मामले से बाहर कर दिया, ताकि यह न सोचा जाए कि माइक्रोकंट्रोलर को गर्म करने से किसी तरह तापमान माप प्रभावित होगा। और यह आवश्यक है, वह पहले से कितना धूल भरा है!
छवि

अपराधी

तीसरे फ़ंक्शन का विचार किसी तरह अपने आप पैदा हुआ था, जब मुझे इस तथ्य का सामना करना पड़ा था कि केंद्रीय नियंत्रक ने रेडियो बटन को बहुत अच्छी तरह से नहीं सुना था, जो बिल्ली के फीडर को सक्रिय करता है। आम तौर पर यह माना जाता था कि हम रात में अपनी आँखें खोले बिना बटन दबाएंगे, और आदर्श रूप से जागने के बिना। वास्तविकता ने अपने स्वयं के समायोजन किए हैं: आपको अपना हाथ ऊपर उठाना था, विभिन्न पक्षों पर बटन को मोड़ना और कई बार दबाना था।

यह आम तौर पर अजीब है, क्योंकि बटन एक चीनी सुरक्षा अलार्म से था, और उनके पास कठोर ट्रांसमीटर हैं, जो सभ्य रेंज में भिन्न हैं।

और यहां मीडिया नियंत्रक का वर्तमान स्थान बहुत सफल रहा - रेडियो बटन और केंद्रीय नियंत्रक के बीच का आधा हिस्सा, जो वास्तव में, एक संकेत सौंपा गया था। समाधान निम्नानुसार है: मीडिया नियंत्रक रेडियो सुनता है, और यदि यह एक परिचित कमांड का सामना करता है, तो यह इसे फिर से विकीर्ण करता है।

संघर्ष के साथ समस्या काफी सरल रूप से हल हो गई है। सबसे पहले, केंद्रीय नियंत्रक के पास रेडियो बटन कमांड के फ्रेम में पहले शब्द का जवाब देने का समय हो सकता है। और उसके बाद, वह परवाह नहीं करता है कि कौन और क्या फिर से निकल रहा है। इसके अलावा, मीडिया रिले कंट्रोलर, एक नियम के रूप में, रेडियो बटन के बाद कमांड के प्रसारण को पूरा करता है, जिससे एक अविवादित संकेत प्राप्त करना भी संभव हो जाता है।

मैं समझता हूं कि यह संदिग्ध लगता है। हाँ, और कार्यान्वयन भी किसी तरह बहुत नहीं है। लेकिन व्यवहार में, हम रेडियो बटन के साथ समस्याओं के बारे में भूल गए। अब यह हमेशा और बिना किसी हास्यास्पद हथियार के काम करता है।

खैर, सफलता के मद्देनजर, मैंने वायरलेस सेंसर (लीक और धुएं) के रिले को भी जोड़ा - बस मामले में। यह मेरे लिए मुश्किल नहीं है, लेकिन अगर यह मदद करता है, तो क्यों नहीं?

कार्य सिद्धांत

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

इसलिए, मैं केंद्रीय नियंत्रक के साथ बातचीत के बारे में विशेष रूप से बात करूंगा।

आईआर रिले

किसी भी IR नियंत्रण आदेश के लिए, कई शर्तें पूरी होनी चाहिए:

1) नेटवर्क (वेब), नियंत्रण रेडियो और आईआर कमांड के लिए एक पत्राचार तालिका तैयार की जानी चाहिए
2) नेटवर्क (वेब) कमांड और कंट्रोल रेडियो कमांड को सेंट्रल कंट्रोलर में वर्णित किया जाना चाहिए
3) मीडिया कंट्रोलर में, कंट्रोल रेडियो कमांड और संबंधित IR कमांड का वर्णन किया जाना चाहिए

योजना के अनुसार प्रबंधन होता है:

1) एक उपयोगकर्ता प्रकार (एक स्मार्टफोन पर एक बटन दबाता है) एक ब्राउज़र में एक नेटवर्क (वेब) कमांड
2) केंद्रीय नियंत्रक नेटवर्क (वेब) कमांड को प्रोसेस करता है और संबंधित रेडियो कमांड को जारी करता है
3) मीडिया कंट्रोलर रेडियो कमांड प्राप्त करता है और IR डायोड के लिए उपयुक्त IR कमांड जारी करता है

नेटवर्क (वेब) कमांड सामान्य HTTP POST अनुरोध हैं (एक आदिम रूप में - ब्राउज़र लाइन में पता)। उदाहरण के लिए:

192.168.22.185/?TVON

यहाँ " 192.168.22.185 " नियंत्रक का पता है, और "TVON" कमांड है। तदनुसार, हम कल्पना और सामान्य ज्ञान के आधार पर खुद टीमों के साथ आते हैं।

आरसी-स्विच प्रोटोकॉल से रेडियो कमांड का पालन होता है, जो आपको 24-बिट डिजिटल कोड, यानी 0 से 16777216 तक की संख्या को प्रसारित करने की अनुमति देता है। आप कोई भी चुन सकते हैं, बशर्ते कि वे उन कोडों की नकल न करें जिन्हें आप पहले से ही उपयोग कर सकते हैं या जो पास में (उदाहरण के लिए, पड़ोसियों के साथ) "उड़" सकते हैं।

यह पता लगाने के दो तरीके हैं कि आगे क्या हो रहा है: सबसे पहले, अपने उपकरणों के अपर्याप्त व्यवहार से, और दूसरी बात, यदि आप Arduino से एक साधारण प्राप्त स्टैंड को इकट्ठा करते हैं, तो चयनित आवृत्ति पर एक ASK / OOK रिसीवर (315 या 433 मेगाहर्ट्ज) और RC लाइब्रेरी -स्विच (ReceiveDemo_Simple उदाहरण)।

आप IRremote लाइब्रेरी का उपयोग करके अपनी तकनीक के IR कमांड को पहचान सकते हैं।

मीडिया कंट्रोलर द्वारा रेडियो कमांड के रिसेप्शन और निष्पादन की पुष्टि नहीं की जाती है।

वायुमंडलीय दबाव और कमरे के तापमान का संचरण

इन संकेतकों को प्रसारित करने के लिए, मैं उसी आरसी-स्विच पुस्तकालय और मौसम सेंसर में उसी तकनीक का उपयोग करता हूं। यही है, नियंत्रक समय-समय पर (हर आधे घंटे में एक बार) मानों को मापता है और उन्हें संख्यात्मक कोड के रूप में हवा पर केंद्रीय नियंत्रक तक पहुंचाता है।

मौसम सेंसर से अंतर केवल इतना है कि मैं बहुत आलसी था और प्रत्येक संकेतक के लिए एक अलग समूह आवंटित किया गया था।

नतीजतन, दबाव 1210XXXX फॉर्म के एक कोड द्वारा प्रेषित होता है, जहां XXXX mPa में दबाव मान (पूर्णांक मेरे लिए बहुत दिलचस्प नहीं है) का पूर्णांक हिस्सा है। MmHg में पुनर्गणना केंद्रीय नियंत्रक द्वारा की जाती है, यह मत पूछो कि क्यों। मुझे नहीं पता

तापमान 1310YXXX के कोड द्वारा प्रसारित किया जाता है, जहां XXX तापमान मान 10 से गुणा किया जाता है (इसका दसवां भाग प्रसारित होता है), और वाई तापमान संकेत है (0 सकारात्मक है, 1 नकारात्मक है)। यह भी नहीं पूछें कि आपको कमरे के तापमान के लिए संकेत की आवश्यकता क्यों है।

दोनों मूल्यों को एक के बाद एक छोटे अंतराल के साथ प्रसारित किया जाता है।

केंद्रीय नियंत्रक द्वारा आदेशों की प्राप्ति की पुष्टि प्रदान नहीं की जाती है।

रेडियो कमांड रिपीटर

यह सेवा फ़ंक्शन आरसी-स्विच का उपयोग करके प्राथमिक रूप से कार्यान्वित किया जाता है। रिले कोड निर्धारित करने और मीडिया नियंत्रक में उनकी सूची दर्ज करने के लिए यह पर्याप्त है। यह रेडियो सॉकेट या स्विच का कोड हो सकता है, जिसके लिए केंद्रीय नियंत्रक "नहीं पहुंचता है"। या सेंसर जो केंद्रीय नियंत्रक "नहीं सुनता है।"

इस प्रकार, यदि मीडिया नियंत्रक रिले कोड को पहचानता है (बटन दबाया जाता है, सेंसर ट्रिगर हो गया है, कमांड प्रेषित हो गया है), तो यह बस इसे निर्दिष्ट संख्या को दोहराता है।

एकमात्र ख़ासियत यह है कि मेरे कार्यान्वयन में "गैर-स्थिर" सेंसर के संकेत, अर्थात्, रिमोट कंट्रोल, तुरंत रिले होते हैं, और सेंसर के संकेत जो लगातार संकेत देते हैं (उदाहरण के लिए, रिसाव या धुएं) चक्रीय रूप से और कुछ देरी से रिले किए जाते हैं।

इसमें तर्क इस प्रकार है। ऐसा माना जाता है कि सेंट्रल कंट्रोलर (CC) हमेशा मल्टीमीडिया कंट्रोलर (MK) को सुनता है, जो उनकी आपसी व्यवस्था से सुनिश्चित होता है। उसी समय, एमसी के माध्यम से परिधीय संकेत के रिले को सर्जक द्वारा सिगनल ट्रांसफर की तुलना में बाद में पूरा करने की गारंटी है।

इसलिए, एक तरफ, केंद्रीय समिति को एक रिले सिग्नल प्राप्त करने की गारंटी दी जाती है, भले ही यह सर्जक को नहीं सुनता है, और दूसरी ओर, यह एक कमांड प्राप्त करेगा यदि सर्जक और एमके दोनों एक ही समय में प्राप्त करते हैं।

जो कुछ भी रहता है वह निरंतर सिग्नलिंग सेंसर की विशिष्टता है। जैसा कि मैंने कहा, एक लीकेज सेंसर पानी में रहने तक और बैटरी खत्म होने तक हर समय चिल्ला सकता है। यह तभी बंद होगा जब स्थितियां सामान्य हो जाएंगी। इसलिए, एमके, सबसे पहले, 5 सेकंड के ठहराव के बाद अपने सिग्नल को रिलेट करना शुरू कर देता है (यह उस स्थिति में है जब सेंट्रल कमेटी खुद ही सेंसर सुन लेती है) और, दूसरा, सर्जक सिग्नल देते समय इस चक्र को हर समय दोहराता है। यानी एमके मानो "साथ गा रहा हो।"

केंद्रीय नियंत्रक द्वारा आदेशों की प्राप्ति की पुष्टि प्रदान नहीं की जाती है।

लोहा

मैं समझता हूं कि मैं थका हुआ हूं, लेकिन मैं आपको याद दिलाता हूं - वर्तमान कॉन्फ़िगरेशन के लिए एक सेट, उदाहरण के लिए लिंक। तो:

1) अरुडिनो प्रो मिनी (ATmega328p, 16 MHz, 5V)
2) 433 मेगाहर्ट्ज ASK / OOK रिसीवर और ट्रांसमीटर किट
3) आईआर एलईडी IR513B-40 (940 एनएम) (2 पीसी) या इसी तरह की
4) एल ई डी के लिए वर्तमान सीमित रोकनेवाला (आदर्श रूप से 68 ओम)
4) BMP085 सेंसर (5V संस्करण)
5) एलईडी, बिजली, स्विचिंग, कनेक्टर्स और ब्रेडबोर्ड तारों को स्वाद के लिए समायोजित करने के लिए तार
6) केस
7) बिजली की आपूर्ति

यदि आप किसी भी एवी उपकरण का नियंत्रण बनाना चाहते हैं, तो आपको आईआर रिमोट कंट्रोल के संकेतों को पढ़ने के लिए एक फोटोडेटेक्टर की भी आवश्यकता होगी। इस प्रयोजन के लिए मैंने TSOP4836 (सबसे सामान्य मॉडुलन आवृत्ति 36 kHz के साथ रिसीवर- डीमोडुलेटर ) का उपयोग किया। इस अंजीर की ख़ासियत यह है कि यदि आप किसी चीज़ के साथ पीछे की तरफ नहीं आते हैं, तो भारी मात्रा में इंटरचेंज कैच है। ध्यान रखें, या तुरंत कुछ परिरक्षित खरीदें।

स्केच से यहां असेंबली आरेख पूरी तरह से स्पष्ट नहीं है, क्योंकि चार में से तीन घटक "डिफ़ॉल्ट" पिन से जुड़े हैं - ये एलईडी, रिसीवर और बीएमपी 085 सेंसर हैं। लेकिन ट्रांसमीटर पिन, सिद्धांत रूप में, आप अपने लिए चुन सकते हैं - बस कोड में बाद में इसे ठीक करना याद रखें।

1) रिसीवर

डेटा - डिजिटल पिन 2 को
वीसीसी - से पावर + 5 वी
जीएनडी - जमीन के लिए

2) ट्रांसमीटर

डेटा - डिजिटल पिन 6 को
वीसीसी - से पावर + 5 वी
जीएनडी - जमीन के लिए

3) BMP085
Adafruit के निर्देशों के अनुसार:

एससीएल - एनालॉग पिन 5 के लिए
एसडीए - एनालॉग पिन 4 के लिए
वीसीसी - पावर + 5 वी (केवल संस्करण 5 वी के लिए, अन्यथा - 3.3 वी)
जीएनडी - जमीन के लिए

4) आईआर डायोड

दोनों श्रृंखला में जुड़े हुए हैं। केवल एक के पास एक छोटा तार है - वह टीवी देख रहा है, और दूसरा अधिक वास्तविक है - उसे एयर कंडीशनर में जाने की आवश्यकता है।

क्षमा करें, मैं हमेशा एनोड और कैथोड को भ्रमित करता हूं। सामान्य तौर पर, एक तरफ - जमीन से (कैथोड?), और दूसरा (एनोड?), एक वर्तमान-सीमित अवरोधक के माध्यम से (मेरे पास 180 ओम की एक जोड़ी है, अर्थात् 90 ओम) से डिजिटल पिन 3 (यह लाइब्रेरी में डिफ़ॉल्ट रूप से सेट है) लेकिन यह मेगा पर काम नहीं करेगा, जिसके लिए लाइब्रेरी कोड - ध्यान में रखना) को संशोधित करना होगा।

सच कहूं तो मेरा प्रतिरोध गलत है। लेकिन हाथ में कोई अन्य नहीं थे, और तीन को समानांतर में रखना डरावना था, क्योंकि रेटेड वर्तमान अरुडिनो की क्षमताओं से अधिक हो सकता है, और मैं जांच नहीं करना चाहता था।

आप वर्तमान-सीमित प्रतिरोध की गणना अपने आप में और सुविधाजनक कैलकुलेटर में डायोड की अपनी संख्या के लिए कर सकते हैं।

मैंने यह सब खुशी (शाब्दिक रूप से) एक छोटे से बॉक्स में भर दी। अरे हाँ, रिसीवर और ट्रांसमीटर के लिए एंटेना मत भूलना, यदि नहीं। यदि हाथ में बिल्कुल कुछ नहीं है, तो आप एक तार को एक चौथाई लहर (173 मिमी या 164 मिमी) में काट सकते हैं।

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

। कनेक्टर्स: बिजली और कनेक्टिंग एल ई डी के लिए। उत्तरार्द्ध के लिए - एक नियमित मोनो 2.5 मिमी जैक
छवि

मुलायम

स्केच के लिए निम्नलिखित गैर-मानक पुस्तकालयों की आवश्यकता होती है:

1) डेटा विनिमय और रिले सिग्नल के लिए RC-Swtich
2) IR रिमोट कंट्रोल के साथ AV उपकरण को नियंत्रित करने के लिए IRremote
3) BMP085 सेंसर से डेटा प्राप्त करने के लिए Adafruit_BMP085
4) समय अंतराल की गिनती के लिए SimpleTimer

काम करने के लिए, आपको आवश्यकता होगी:

1) रिले के लिए अपने रेडियो कमांड के कोड दर्ज करें।
2) प्रबंधित उपकरणों के आईआर कोड दर्ज करें।
3) रेडियो कमांड के कोड दर्ज करें जिसके द्वारा मल्टीमीडिया कंट्रोलर IR कमांड जारी करेगा।
4) केंद्रीय नियंत्रक के कोड में मल्टीमीडिया कंट्रोलर के कमांड सेक्शन को कस्टमाइज़ करना (इंटरनेट के माध्यम से नियंत्रण के लिए)।

यह माना जाता है कि आप पहले से ही रिले के लिए रेडियो कमांड के कोड जानते हैं (ये आपके वायरलेस सेंसर, रीमोट आदि हैं)। यदि आपको पता नहीं है, तो Ariveino, रिसीवर और RC-Switch लाइब्रेरी को ReceiveDemo_Simple उदाहरण के साथ उपयोग करें।

आप इंटरनेट पर सर्फ करने के लिए या रिमोट कंट्रोल से पढ़कर उपयोग की जाने वाली गोलियों से या तो नियंत्रित उपकरणों के आईआर कोड का पता लगा सकते हैं। दूसरे मामले के लिए, आपको फोटोडेटेक्टर को Arduino से कनेक्ट करना होगा और IRremote लाइब्रेरी का उपयोग करना होगा। यदि जल्दी में, तो मुख्य बात याद रखें:

1) यदि, जब आप एक ही बटन दबाते हैं, तो आपको अलग-अलग मान मिलते हैं, इसका मतलब है कि कुछ गलत हो गया है, या आपके पास एयर कंडीशनर से रिमोट कंट्रोल है। इस मामले में, यह उचित प्रबंधन पुस्तकालय के लिए या तो देखने के लिए समझ में आता है। या, यदि यह नहीं है, तो बस "कच्चे" कोड का उपयोग करें, जैसा कि मैंने चर खंड में किया था, सब कुछ PROGMEM में पैक कर दिया।

याद रखें कि "कच्चे" कोड में, पहला मूल्य, जो स्पष्ट रूप से एक पंक्ति में दिखाई देता है, को मैन्युअल रूप से त्याग दिया जाना चाहिए।

2) यदि, जब आप एक ही बटन दबाते हैं, तो आपको समान कोड मिलता है - आप इसे सुरक्षित रूप से उपयोग कर सकते हैं। बस यह मत भूलो कि IRremote का अपना ट्रांसमिशन प्रारूप भी है, और कमांड कोड के अलावा, आपको यह भी निर्दिष्ट करना होगा कि ट्रांसमिशन किस कमांड सिस्टम में किया गया है। मेरे पास एनईसी है।

और यहाँ कोड ही है।
// 28.10.2013 -        // 29.11.2013 -        #include <Wire.h> #include <Adafruit_BMP085.h> #include <RCSwitch.h> // http://code.google.com/p/rc-switch/ #include <SimpleTimer.h> // #include <IRremote.h> unsigned long myData; long aL; boolean water1=false; //        boolean water2=false; boolean water3=false; boolean smoke1=false; boolean smoke2=false; boolean smoke3=false; #define txPin 6 //   SimpleTimer checkWeather; //   RCSwitch meteoSwitch = RCSwitch();  RC-Switch IRsend irsend; //  IRRemote //    PROGMEM const prog_uint16_t acON[59] PROGMEM ={9450, 4350, 650, 1600, 600, 500, 550, 550, 550, 500, 600, 1600, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 550, 1650, 600, 500, 600, 1600, 550, 1650, 600, 500, 550, 550, 600, 500, 550, 550, 600, 1600, 600, 450, 600, 1600, 600, 1600, 600}; const prog_uint16_t acOFF[59] PROGMEM ={9550, 4300, 600, 1600, 650, 450, 650, 450, 600, 500, 650, 1550, 600, 500, 600, 500, 600, 500, 600, 1600, 600, 1600, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 500, 600, 600, 500, 600, 500, 600, 450, 650, 450, 600, 1600, 650, 450, 600, 1600, 650, 450, 600, 500, 600, 500, 650, 1550, 600}; const prog_uint16_t acCool[59] PROGMEM ={9500, 4350, 600, 1650, 600, 500, 600, 500, 600, 500, 600, 1550, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 550, 1650, 600, 500, 600, 1600, 600, 1600, 600, 500, 600, 1600, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 1600, 600, 1550, 600, 1600, 600, 1600, 600}; const prog_uint16_t acHeat[59] PROGMEM ={9500, 4350, 600, 1600, 650, 450, 650, 450, 650, 450, 600, 1600, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 1600, 600, 500, 600, 1550, 650, 1550, 600, 1600, 650, 1550, 650, 450, 650, 1550, 600, 500, 600, 500, 600, 500, 650, 450, 650, 1550, 600, 500, 600, 500, 600, 500, 600}; //     PROGMEM const prog_uint16_t *IRRemotePointer[] = { acON, acOFF, acCool, acHeat}; Adafruit_BMP085 bmp; //  BMP085 void setup() { pinMode(13, OUTPUT); //  bmp.begin(); meteoSwitch.enableTransmit(txPin); // meteoSwitch.enableReceive(0); //    2 checkWeather.setInterval(1800000, getClimate); //     delay(2000); //      } void txSwitch(long cmd) { //     RC-Switch,        meteoSwitch.disableReceive(); //  ,    for (byte txC=0; txC<1; txC++) { meteoSwitch.send(cmd, 24); meteoSwitch.enableReceive(0); } } void repeatAlarm() { //   ""      txSwitch(aL); water1=false; water2=false; water3=false; smoke1=false; smoke2=false; smoke3=false; } void enableRx() { meteoSwitch.enableReceive(0); //   } void loop () { checkWeather.run(); if (meteoSwitch.available()) { //      ,   int value = meteoSwitch.getReceivedValue(); if (value != 0) { switch (meteoSwitch.getReceivedValue()) { case 1418288: // Water leak KITCHEN -   ,    5  (   ) if (water1 == false) { aL=1418288; checkWeather.setTimeout(5000, repeatAlarm); water1 = true; } break; case 3470133: // Water leak WASHER if (water2 == false) { aL=3470133; checkWeather.setTimeout(5000, repeatAlarm); water2 = true; } break; case 3592421: // Water leak MAIN if (water3 == false) { aL=3592421; checkWeather.setTimeout(5000, repeatAlarm); water3 = true;} break; case 1084887: // Smoke KITCHEN if (smoke1 == false) { aL=1084887; checkWeather.setTimeout(5000, repeatAlarm); smoke1=true; } break; case 2184536: // Smoke HALL if (smoke2 == false) { aL=2184536; checkWeather.setTimeout(5000, repeatAlarm); smoke2 = true; } break; case 12602757: // Smoke ROOM if (smoke3 == false) { aL=12602757; checkWeather.setTimeout(5000, repeatAlarm); smoke3 = true;} break; case 15741424: //      txSwitch(15741424); break; case 46151: //      txSwitch(46151); break; case 46150: //      txSwitch(46150); break; //  - // tv-on case 88100: irsend.sendNEC(0x20DF10EF,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; //     // tv-back case 88116: irsend.sendNEC(0x20DF14EB,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // tv-volup case 88132: irsend.sendNEC(0x20DF40BF,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // tv-voldown case 88164: irsend.sendNEC(0x20DFC03F,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // tv-chup case 88128: irsend.sendNEC(0x20DF00FF,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // tv-chdown case 88256: irsend.sendNEC(0x20DF807F,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // tv-mute case 88512: irsend.sendNEC(0x20DF906F,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // tv-menu case 89100: irsend.sendNEC(0x20DFC23D,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // tv-ok case 89108: irsend.sendNEC(0x20DF22DD,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // tv-up case 89116: irsend.sendNEC(0x20DF02FD,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // tv-down case 89132: irsend.sendNEC(0x20DF827D,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // tv-left case 89164: irsend.sendNEC(0x20DFE01F,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // tv-right case 89128: irsend.sendNEC(0x20DF609F,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // tv-av case 89256: irsend.sendNEC(0x20DFD02F,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // media-on case 89512: irsend.sendNEC(0xF9EA15,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // media-off case 87108: irsend.sendNEC(0xF9EA15,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // media-play case 87116: irsend.sendNEC(0xF90AF5,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // media-back case 87132: irsend.sendNEC(0xF9F20D,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // media-volup case 87164: irsend.sendNEC(0xF9E817,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // media-voldown case 87128: irsend.sendNEC(0xF92AD5,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // media-ff case 87256: irsend.sendNEC(0xF9C03F,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // media-rew case 87512: irsend.sendNEC(0xF9E01F,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // media-menu case 92108: irsend.sendNEC(0xF96897,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // media-set case 92116: irsend.sendNEC(0xF958A7,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // media-up case 92132: irsend.sendNEC(0xF9C23D,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // media-down case 92164: irsend.sendNEC(0xF950AF,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // media-left case 92128: irsend.sendNEC(0xF9609F,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // media-right case 92256: irsend.sendNEC(0xF9708F,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // media-ok case 92512: irsend.sendNEC(0xF940BF,32); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // ac-cool case 95108: IRTransmit(2, 59); delay(150); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // ac-heat case 95116: IRTransmit(3, 59); delay(150); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // ac-on case 95132: IRTransmit(0, 59); delay(150); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; // ac-off case 95164: IRTransmit(1, 59); delay(150); digitalWrite(13, HIGH); delay(40); digitalWrite(13, LOW); break; } } meteoSwitch.resetAvailable(); } } //   void getClimate() { int Pressure = bmp.readPressure()/100; int Temperature = bmp.readTemperature()*10; myData = 12100000+Pressure; meteoSwitch.send(myData, 24); //   if (Temperature > 0) { myData = 13100000+Temperature; meteoSwitch.send(myData, 24); //    } else { myData = 13101000+abs(Temperature); meteoSwitch.send(myData, 24); //    } } //   "" - void IRTransmit(byte cmd, byte cmdlen) { // prog_uint16_t *currentIRRemotePointer = (prog_uint16_t *)pgm_read_word(&IRRemotePointer[cmd]); //      PROGMEM unsigned int IRRawCodes[cmdlen]; //       for (byte i = 0; i < cmdlen; i = i + 1) { //    IRRawCodes[i] = pgm_read_word(¤tIRRemotePointer[i]); // } irsend.sendRaw(IRRawCodes, cmdlen, 38); //    IRRemote delay(150); } 



खैर, आखिरी। अगर आपने कहीं गलती की है - कहते हैं, हम इसे सुलझा लेंगे। और बाकी, मेरा मानना ​​है कि आप जानते हैं, आप बेहतर कर सकते हैं।

ps। और शीर्षक में उबाऊ संक्षिप्तीकरण की शिकायत किसने की?

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


All Articles