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

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

ग्लोबल कैशे से निकलने वाले डायोड मैं केस में डायोड है, जैसा कि नीचे दिए गए चित्र में है।

आसानी से, एमिटर को इंफ्रारेड रिसीवर के क्षेत्र में उपकरण से सीधे चिपकाया जा सकता है और इस तरह गारंटी दी जाती है कि नियंत्रण स्थिर होगा और केवल वह डिवाइस जिसे हम नियंत्रित करना चाहते हैं (यदि एक से अधिक डिवाइस है जो भेजे गए कमांड पर प्रतिक्रिया करता है)।
जब मैंने सर्वर का पक्ष लिखा था, तो मुझे ऐसा महसूस नहीं हुआ कि चारों ओर मूर्खता है, इसलिए डेल्फी पर एक छोटे से और गूंगे वेब सर्वर को एक "पोर्ट मॉनीटर" (एक आभासी पोर्ट पोर्ट के माध्यम से डेटा को आर्दुइनो में स्थानांतरित करने के लिए) के लिए तय किया गया था, इसके लिए Indy idHTTPSever और CPort घटकों का उपयोग किया गया था।
सर्वर साइड पर इसके लिए फाइलों के साथ एक index.html पेज होता है (CSS, JS, ग्राफ़िक्स, इत्यादि) और एक कोड। Txt फ़ाइल जिसमें प्रबंध उपकरण के लिए कोड संग्रहीत होते हैं। कोड्स को दो प्रारूपों HEX और GlobalCache में संग्रहीत किया जा सकता है।
एचईएक्स प्रारूप में, पहचानकर्ता 0000 के साथ एक कमांड शुरू करने का नियम है, हम इसे कोड रिपीट की संख्या और पोर्ट को भेजने के लिए हेरफेर के लिए एक जगह पर विचार करेंगे।
दोहराव की संख्या हेक्साडेसिमल से दशमलव एसएस + 1 में परिवर्तित होने वाले पहले दो वर्ण हैं
यानी 00 = 0 + 1 = 1 या
0A = 10 + 1 = 11 ;
पोर्ट एड्रेस दूसरा दो अक्षर है जिसमें अरडिनो पोर्ट नंबर बस छिपा होता है,
उदाहरण के लिए: 00 = डिजिटल पोर्ट 0 या
0 डी = डिजिटल पोर्ट 13 ;
HEX कोड में शेष डेटा को बदलने के लिए आवश्यक नहीं है, हम इसे वैसे ही छोड़ देते हैं।
GlobalCache प्रारूप में कोड के लिए, यह थोड़ा अधिक जटिल है, प्रारूप स्वयं इस तरह दिखता है:
sendir,{moduleaddress}:{connectoraddress},{ID},{frequency},{count},{offset},{on1},{off1}...
जहां:
- {moduleaddress}: {कनेक्टरड्रेस्रेस} - यह वही है जो Arduino पर डिजिटल पोर्ट की संख्या होना चाहिए, GlobalCahce उपकरणों के साथ संगतता के लिए, इस जोड़ी के मानों को arduino के पोर्ट नंबर में पुनर्गणना करने का निर्णय लिया गया था, यह सूत्र द्वारा किया जा सकता है:
ArduinoPort = ({moduleaddress} * 3) - (3- {कनेक्टरaddress}) - 1;
उदाहरण के लिए: 5: 2 = (5 * 3) - (3-2) -1 = (15) - (1) -1 = डिजिटल पोर्ट 13 ; - {आईडी} - मैं अनदेखा करता हूं;
- {आवृत्ति} - हर्ट्ज में आवृत्ति;
- {गिनती} - दोहराव की संख्या (1-255);
- {ऑफसेट} - फिर से मैं अनदेखा करता हूं;
- {on} और {off} - यह डेटा है।
मैं मुख्य रूप से HEX प्रारूप का उपयोग करता हूं, लेकिन यह ध्यान देने योग्य है कि GlabalCache प्रारूप में कोड लगभग 2 गुना कम हैं और तदनुसार, पार्सिंग में 2 गुना तेज हैं।
प्रत्येक कमांड को एक अलग लाइन पर कड़ाई से होना चाहिए, फ़ाइल में लाइन नंबर एक विशिष्ट कोड के लिए एक संकेतक के रूप में उपयोग किया जाता है, मेरी सुविधा के लिए कोड संख्याओं के साथ शुरू होते हैं, क्योंकि फ़ाइल में लाइनों को स्क्रैच से क्रमांकित किया जाता है, इस तरह लाइन नंबर 0 प्राप्त होता है - यह बटन कोड 0 है।
मैं एक उदाहरण के रूप में अपने फिलिप्स 47PLF4007 के लिए आदेशों के साथ codes.txt फ़ाइल का एक हिस्सा देता हूं: 000D 0073 002A 000D 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0BDE 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0021//digit 0 000D 0073 002A 000D 0061 0021 0010 0020 0010 0010 0010 0010 0010 0020 0020 000F 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 0BED 0061 0021 0010 0020 0010 0010 0010 0010 0010 0020 0020 000F 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 0021//digit 1 000D 0073 0028 000D 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 001F 0010 0BDE 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 001F 0010 0021//digit 2 ... 000D 0073 0024 000D 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 001F 0020 001F 0020 001F 0010 0010 0010 0BDE 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 001F 0020 001F 0020 0020 0010 0010 0010 0021//home sendir,5:2,1,36000,1,1,97,31,16,30,16,16,16,16,16,30,32,14,16,16,16,16,16,16,16,16,16,16,16,16,16,16,32,14,16,30,16,16,32,14,16,30,16,16,16,720//list 000D 0073 002A 0000 0061 0021 0010 0020 0010 0010 0010 0010 0010 0020 0020 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 000F 0010 0010 0010 0010 0010 0BEE 0061 0021 0010 0020 0010 0010 0010 0010 0010 0020 0020 000F 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 0010 0010 0010 0010 0010 0010 0021//info ...
सर्वर (या ऐसा कुछ, नीचे का आंकड़ा देखें) पूरी तरह से जीईटी अनुरोधों पर बनाया गया है और इसे HTML पृष्ठ को विकसित करते समय ध्यान में रखा जाना चाहिए। लब्बोलुआब यह है, मैं एक फाइल के लिए सर्वर से पूछता हूं जिसका नाम एक अंडरस्कोर के साथ शुरू होता है, और फिर कोडों से लाइन नंबर। फ़ाइल जिस पर कमांड स्थित है।

सर्वर देखता है कि अनुरोधित फ़ाइल "_" से शुरू होती है, नाम से पहला वर्ण हटाता है और शेष संख्या को पढ़ता है, फिर डिवाइस को इस नंबर की संख्या के साथ लाइन पर एक कोड भेजता है।
procedure TForm1.srvCommandGet(AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); var S,codeStr:String; i:Cardinal; begin S:=ARequestInfo.Document; Delete(S,1,1); if S='' then S:=ExtractFilePath(ParamStr(0))+'webdata\index.html' else begin if (S[1]='_') then begin Delete(S,1,1); codeStr:=SL.Strings[StrToInt(S)]; Delete(codeStr,pos('/',codeStr),255); if ComPort1.Connected then ComPort1.WriteStr(codeStr+#13); S:='ok.js'; end; S:=StringReplace(S,'/','\',[rfReplaceAll]); S:=ExtractFilePath(ParamStr(0))+'webdata\'+S; end; try AResponseInfo.ContentType:=ARequestInfo.ContentType; AResponseInfo.ContentStream:=TFileStream.Create(S,0); except end; end;
क्लाइंट के लिए, मैंने सर्वर के साथ डेटा के आदान-प्रदान के लिए जिम्मेदार कई कार्य लिखे। सर्वर को एक कमांड निष्पादित करने के लिए अनुरोध करने के लिए, पृष्ठ पर स्क्रैच विशेषता के साथ एक नया टैग जोड़ें, इसलिए हम करेंगे:
var boolSendRepeat = false; function addScript(src){ var element = document.createElement('script'); element.type = 'text/javascript'; element.src = src; element.className = 'bufferresponsescript'; document.getElementsByTagName('head')[0].appendChild(element); } function delScripts(){ var z = document.getElementsByClassName('bufferresponsescript'); for(var i=z.length;i>0;i--){ z[i-1].parentNode.removeChild(z[i-1]); } } function sendCommand(cmdNumber){ addScript('_'+cmdNumber); } function sendMacro(arrCmdNumber,arrDelays){ var s=''; for(var i=0;i<arrCmdNumber.length;i++){ s = 'sendCommand('+arrCmdNumber[i]+')'; setTimeout(s,arrDelays[i]); } } function repeatFunc(cmdNumber,repeatTime){ var s = 'repeatFunc('+cmdNumber+','+repeatTime+')'; if(boolSendRepeat==true){ sendCommand(cmdNumber); setTimeout(s,repeatTime); } } function repeatStop(){ boolSendRepeat=false; } function sendRepeat(cmdNumber,repeatTime){ boolSendRepeat=true; repeatFunc(cmdNumber,repeatTime); }
आप इसे इस तरह से इंटरफ़ेस में लागू कर सकते हैं:
<td onclick="sendCommand(32)">List</td> <td onclick="sendMacro([46,43],[10,550])"></td> <td onmousedown="sendRepeat(12,800)" onmouseup="repeatStop()">Vol+</td>
उपरोक्त सभी का परिणाम निम्न छवियों में दिखाया गया है:

कल ही, मैंने ग्राहक इंटरफ़ेस में ऑन-एयर टेलीविज़न के चैनलों में एक सीधा स्विच जोड़ा, यह बहुत सुंदर निकला:

मुझे उम्मीद है कि इस पोस्ट में मैंने उन सवालों के जवाब देने में कामयाबी हासिल की और खुलासा किया कि पिछले लेख में पर्दे के पीछे क्या था।
संदर्भ:CPort घटकप्रोजेक्ट फाइलेंग्लोबल कैश डिवाइस एपीआई पीडीएफ