विषयसूची:

Arduino 3-in-1 समय और मौसम प्रदर्शन: 11 चरण
Arduino 3-in-1 समय और मौसम प्रदर्शन: 11 चरण

वीडियो: Arduino 3-in-1 समय और मौसम प्रदर्शन: 11 चरण

वीडियो: Arduino 3-in-1 समय और मौसम प्रदर्शन: 11 चरण
वीडियो: Arduino DHT11 Sensor - Measuring Temperature and Humidity in Hindi - Tutorial #13 2024, नवंबर
Anonim

लेखक द्वारा Boomer48 का अनुसरण करें:

ATtiny85. का उपयोग करना
ATtiny85. का उपयोग करना
ATtiny85. का उपयोग करना
ATtiny85. का उपयोग करना
पाई संचालित पाई विभाजन और बहुभुज प्रूनिंग टूल
पाई संचालित पाई विभाजन और बहुभुज प्रूनिंग टूल
पाई संचालित पाई विभाजन और बहुभुज प्रूनिंग टूल
पाई संचालित पाई विभाजन और बहुभुज प्रूनिंग टूल
एक मैनुअल ऑडियो amp के लिए डिजिटल नियंत्रण
एक मैनुअल ऑडियो amp के लिए डिजिटल नियंत्रण
एक मैनुअल ऑडियो amp के लिए डिजिटल नियंत्रण
एक मैनुअल ऑडियो amp के लिए डिजिटल नियंत्रण

मुझे PIC माइक्रोकंट्रोलर पसंद हैं और मुझे असेंबली भाषा में प्रोग्रामिंग पसंद है। वास्तव में, पिछले कुछ वर्षों में, मैंने उस संयोजन के आधार पर अपनी वेबसाइट पर लगभग 40 प्रोजेक्ट पोस्ट किए हैं। हाल ही में मैं अपने पसंदीदा अमेरिकी विक्रेताओं में से कुछ भागों का ऑर्डर कर रहा था और मैंने एक प्रोग्रामिंग केबल के साथ एक Arduino नैनो देखा, जो एक नंगे ATMEGA328 प्रोसेसर चिप से केवल $ 1.20 अधिक था। तो मैंने उनमें से कुछ खरीदे। फिर मैंने Arduino IDE डाउनलोड किया और 'C++' प्रोग्रामिंग की अपनी मेमोरी को मिटा दिया।

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

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

चरण 1: मौसम संवेदक

मौसम संवेदक
मौसम संवेदक
मौसम संवेदक
मौसम संवेदक
मौसम संवेदक
मौसम संवेदक

यहां इस्तेमाल किया जाने वाला एक्यूराइट वेदर सेंसर हर 16 सेकंड में तापमान और नमी की जानकारी भेजता है। पीछे की तरफ यह 000592TXR का मॉडल नंबर दिखाता है लेकिन इसे आमतौर पर मॉडल 06002M के रूप में विज्ञापित किया जाता है। इस सेंसर का उपयोग कई अलग-अलग मौसम स्टेशन मॉडल द्वारा किया जाता है, इसलिए इसे ढूंढना आसान है और मैं उन्हें eBay पर $ 20 से कम में प्राप्त करने में सक्षम था। AcuRite अपने कुछ मौसम स्टेशनों के लिए समान दिखने वाले सेंसर बेचता है लेकिन वे समान संचार प्रोटोकॉल का पालन कर सकते हैं या नहीं भी कर सकते हैं। वेब पर कुछ संकेत हैं कि 00606 तापमान-केवल सेंसर एक ही संदेश प्रारूप का उपयोग करता है लेकिन एक अमान्य आर्द्रता बाइट के साथ।

जैसा कि ऊपर दिखाए गए पहले तरंग में देखा गया है, मौसम के संदेश लगातार संदेशों के बीच 2ms के अंतराल के साथ बर्स्ट में भेजे जाते हैं। ऊपर दिखाया गया दूसरा तरंग बिट अवधि और पैटर्न देखने के लिए एक संदेश के हिस्से का विस्तार करता है। चार सिंक बिट्स हैं जो लगभग ६००us उच्च हैं और इसके बाद ६००us निम्न हैं। डेटा बिट्स को 400us उच्च के बाद 200us निम्न (1) या 200us उच्च के बाद 400us निम्न (0) द्वारा दर्शाया जाता है।

संदेश प्रारूप में 7 बाइट्स डेटा होता है। पहले दो बाइट्स सेंसर आईडी हैं और ये नहीं बदलते हैं (यानी: यह रोलिंग कोड का उपयोग नहीं करता है)। अंतिम बाइट पहले छह बाइट्स का एक साधारण योगात्मक चेकसम है। तीसरा बाइट एक बैटरी स्तर संकेतक है और बैटरी अच्छी होने पर हमेशा 44 हेक्स होना चाहिए। चौथा बाइट आर्द्रता है और यह 0 और 99 के बीच एक गैर-स्केल्ड मान है। यह ध्यान रखना महत्वपूर्ण है कि बाइट्स 4, 5, और 6 का सबसे महत्वपूर्ण बिट एक समता बिट है और माप का हिस्सा नहीं है। मूल्य। बाइट ५ और ६ स्केल किए गए तापमान (सेल्सियस) हैं, बाइट ५ के निचले ४ बिट्स को ११-बिट मान बनाने के लिए बाइट ६ के निचले ७ बिट्स के साथ जोड़ा जाता है। तापमान को हमेशा एक सकारात्मक संख्या के रूप में दर्शाया जाता है और स्केलिंग लागू होने पर ही ऋणात्मक हो जाता है। स्केलिंग (सी / 10) - 100 है। 10 से विभाजित करना आवश्यक है क्योंकि तापमान संकल्प एक डिग्री के दसवें हिस्से में है। घटाव आवश्यक है क्योंकि संचरित मूल्य को सकारात्मक रखने के लिए सेंसर द्वारा 100 जोड़ा जाता है।

चरण 2: आरएफ रिसीवर

आरएफ रिसीवर
आरएफ रिसीवर
आरएफ रिसीवर
आरएफ रिसीवर

इस परियोजना के लिए मैं जिस RF मॉड्यूल का उपयोग करता हूं वह RXB6 है। यह कम वांछनीय सुपर रीजनरेटिव रिसीवर्स के विपरीत एक सुपर हेटेरोडाइन रिसीवर है। यदि आप सस्ते आरएफ मॉड्यूल को देखते हैं तो आप पाएंगे कि ट्रांसमीटर और रिसीवर बोर्ड अक्सर एक साथ बंडल किए जाते हैं। उन बंडल रिसीवरों में से अधिकांश सुपर पुनर्योजी प्रकार हैं, इसलिए उनके पास सुपर हेटरोडाइन रिसीवर की तुलना में बहुत कम प्रदर्शन विशेषताओं (रेंज सहित) हैं। हमें इस परियोजना के लिए केवल रिसीवर मॉड्यूल की आवश्यकता है क्योंकि हमें मौसम सेंसर ट्रांसमीटर से संकेत मिलेंगे।

चरण 3: आरएफ एंटेना

आरएफ एंटेना
आरएफ एंटेना

RXB6 एंटीना के साथ नहीं आता है। आप कुछ पेचदार बहुत सस्ते में खरीद सकते हैं लेकिन अपना खुद का एंटीना बनाना भी आसान है। वास्तव में, एक ब्रेडबोर्ड जम्पर केबल को मॉड्यूल के एंटीना पिन पर खिसकाया जा सकता है यदि आप बहुत अधिक फैंसी नहीं होना चाहते हैं। आदर्श रूप से, एक सीधा तार एंटीना 1/4 तरंग दैर्ध्य होगा जो लगभग 6.8 इंच तक काम करता है। मैंने शुरू में जम्पर वायर का काम किया था और मेरे बाहरी सेंसर को लेने में कोई समस्या नहीं थी, भले ही मेरी इलेक्ट्रॉनिक्स कार्यशाला मेरे तहखाने में हो।

एक और संभावना है कि आप अपना खुद का पेचदार एंटीना बनाएं। इसके लिए वेब पर कई तरह की योजनाएं हैं लेकिन ऊपर चित्र में जो दिखाया गया है वह वही है जो मैंने बनाया था। मैंने ईथरनेट केबल के एक स्क्रैप टुकड़े से कुछ ठोस कोर तार का उपयोग किया और इसे 5/32 इंच की ड्रिल बिट के चिकने टांग के चारों ओर घाव कर दिया। आरएफ बोर्ड को बेचने वाले टिप को छोड़कर इन्सुलेशन को छोड़ दें। आपको 20 मोड़ की आवश्यकता होगी। आप 7/32 इंच की ड्रिल बिट का भी उपयोग कर सकते हैं और इसके बजाय 17 मोड़ लपेट सकते हैं। इनमें से कोई भी संभवत: उन श्रेणियों के लिए ठीक काम करेगा जो आपके सेंसर के लिए होने की संभावना है। असली कुंजी के साथ शुरू करने के लिए एक अच्छा आरएफ रिसीवर है। AcuRite सेंसर में काफी मजबूत ट्रांसमीटर भी होते हैं।

चरण 4: आरएफ संचार प्रोटोकॉल

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

चरण 5: समय डेटा

समय डेटा
समय डेटा

मैं सटीक समय डेटा प्राप्त करने के लिए एक सस्ते जीपीएस यूनिट का उपयोग करता हूं जो बिजली आउटेज के बाद स्वचालित रूप से पुनरारंभ हो जाएगा। मेरे पास कई GPS इकाइयाँ हैं (बिना डिस्प्ले के) जो मानक NMEA वाक्यों को आउटपुट करती हैं लेकिन मेरे पास सबसे छोटी और सबसे सस्ती इकाइयाँ NEO-6M हैं। NEO-6M मॉड्यूल Arduino के लिए इंटरफ़ेस करना आसान है क्योंकि यह TTL- स्तर के सीरियल पोर्ट का उपयोग करता है। केवल वास्तविक अंतर यह है कि NMEA मानक 4800 की सीरियल बॉड दर निर्दिष्ट करता है लेकिन NEO-6M डिफ़ॉल्ट रूप से 9600 बॉड है। आप बॉड दर को बदलने के लिए मुफ्त "यू-सेंटर" प्रोग्राम चला सकते हैं लेकिन मैंने इसे फ़ैक्टरी डिफ़ॉल्ट पर छोड़ दिया है। जीपीएसइन्फो (ग्लोबलसैट द्वारा प्रस्तुत) नामक एक मुफ्त उपयोगिता कार्यक्रम भी है जो पीसी पर जीपीएस जानकारी देखने के लिए बहुत आसान है। आप GPS यूनिट को एक मानक USB से TTL केबल से कनेक्ट करके जांच सकते हैं या पीसी का उपयोग करके इसे सेट अप कर सकते हैं। ध्यान रखें कि मॉड्यूल पर जीपीएस चिप वास्तव में 3.3 वोल्ट (एक ऑन-बोर्ड वोल्टेज नियामक के माध्यम से) पर चलता है, इसलिए यदि आप इसके आरएक्सडी पोर्ट से जुड़ना चाहते हैं तो आपको 5 वोल्ट से नीचे की ओर शिफ्ट होना चाहिए। TXD पोर्ट सीधे Arduino या PC से जुड़ सकता है।

चरण 6: समय क्षेत्र

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

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

चरण 7: योजनाबद्ध

ढांच के रूप में
ढांच के रूप में

योजनाबद्ध ऊपर दिखाया गया है और इसमें 4-बिट 1602 एलसीडी इंटरफ़ेस के लिए कनेक्शन शामिल हैं। RF रिसीवर से सीरियल डेटा डिजिटल लॉजिक स्तर पर होता है, इसलिए यह सीधे Arduino डेटा इनपुट पिन में से एक से जुड़ा होता है। सॉफ्टवेयर में पिन को एक इंटरप्ट-ऑन-चेंज फ़ंक्शन करने के लिए कॉन्फ़िगर किया गया है ताकि हम पल्स चौड़ाई को माप सकें। GPS TXD आउटपुट सीधे Arduino RX इनपुट से जुड़ा है।

दो स्विच का उपयोग किया जाता है। जैसा कि पहले उल्लेख किया गया है, एक क्षणिक संपर्क स्विच यूटीसी ऑफ़सेट की स्थापना की अनुमति देता है। सेट मोड में प्रवेश करने के लिए स्विच को किसी भी समय दबाया जा सकता है। प्रारंभ में, प्रदर्शन "+77" का एक अमान्य UTC ऑफ़सेट दिखाएगा। UTC ऑफ़सेट सेटिंग निर्देशों के लिए "क्लॉक सॉफ़्टवेयर" अनुभाग देखें।

दूसरा स्विच एक साधारण ऑन/ऑफ स्विच है। "ऑफ" स्थिति में समय 12-घंटे के प्रारूप (AM / PM) में प्रदर्शित किया जाएगा और "चालू" स्थिति में समय 24-घंटे के प्रारूप में प्रदर्शित किया जाएगा। प्रारूपों के बीच टॉगल करने के लिए इस स्विच को किसी भी समय बदला जा सकता है।

यदि केवल घड़ी का कार्य वांछित है, तो आरएफ रिसीवर मॉड्यूल को कनेक्ट करने की आवश्यकता नहीं है। यदि केवल मौसम कार्य वांछित है, तो जीपीएस और दो स्विच को कनेक्ट करने की आवश्यकता नहीं है।

चरण 8: एलसीडी सॉफ्टवेयर

मैं दो प्रकार के एलसीडी इंटरफेस में से एक का उपयोग करता हूं। एक मानक 4-बिट इंटरफ़ेस है और दूसरा 3-वायर इंटरफ़ेस है जो एक शिफ्ट रजिस्टर का उपयोग करता है। मैंने उस इंटरफ़ेस को तब डिज़ाइन किया था जब मैं छोटे PIC माइक्रोकंट्रोलर के साथ काम कर रहा था जिसमें सीमित संख्या में I/O पिन थे। मैंने इस परियोजना के लिए 4-बिट इंटरफ़ेस का उपयोग किया है, लेकिन मेरी अपनी एलसीडी में सामान्य Arduino LCD लाइब्रेरी का उपयोग करने के बजाय फ़ाइल शामिल है। यह स्मृति खपत और कोड जटिलता को कम करता है और मुझे इस तरह की विशिष्ट परियोजनाओं के लिए कोड को ट्विक करने की अनुमति देता है।

चरण 9: घड़ी सॉफ्टवेयर

GPS इकाई मानक NMEA-0183 वाक्यों को आउटपुट करती है जो ASCII स्ट्रिंग हैं जिनमें विभिन्न प्रकार की जानकारी होती है। इस एप्लिकेशन के लिए मैंने समय की जानकारी प्राप्त करने के लिए GGA वाक्य को चुना क्योंकि यही वह वाक्य है जिसका उपयोग मैंने पिछले GPS प्रोजेक्ट के लिए किया था। NMEA वाक्यों में सूचना के क्षेत्रों को अल्पविराम द्वारा अलग किया जाता है, इसलिए GGA वाक्य शीर्षलेख का पता चलने के बाद, सॉफ़्टवेयर सामान्य रूप से अल्पविरामों की गणना करेगा और GPS जानकारी के प्रत्येक वांछित क्षेत्र के लिए उपयुक्त दिनचर्या को कॉल करेगा। यहां केवल समय की जानकारी की जरूरत है और वह क्षेत्र में पहले अल्पविराम के बाद है इसलिए किसी गिनती की आवश्यकता नहीं है।

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

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

UTC को स्थानीय समय में बदलने के लिए, UTC ऑफ़सेट (समय क्षेत्र) लागू किया जाना चाहिए। क्योंकि GPS से UTC समय ASCII स्वरूप में है, सॉफ़्टवेयर ASCII घंटे के वर्णों को दशमलव में परिवर्तित करता है और फिर UTC ऑफ़सेट जोड़ता है। यूटीसी ऑफ़सेट को साइन बिट के साथ एक सकारात्मक बीसीडी मान के रूप में संग्रहीत किया जाता है, इसलिए इसे पहले एक पूर्णांक मान में परिवर्तित किया जाता है और फिर साइन बिट सेट होने पर अस्वीकार कर दिया जाता है। एक बार स्थानीय समय घंटे के मूल्य की गणना करने के बाद, इसे बीसीडी में बदलने के लिए एक लुकअप टेबल का उपयोग किया जाता है, और फिर बीसीडी को प्रदर्शन के लिए वापस एएससीआईआई में परिवर्तित कर दिया जाता है। लुकअप तालिका को 24 घंटे के यूटीसी प्रारूप के साथ-साथ +/- 12 समय क्षेत्रों को संभालने की आवश्यकता है। ऐसा करने के लिए, यूटीसी समय 0000 से 2300 तक तालिका में मध्य 24 प्रविष्टियों पर कब्जा कर लेता है, जिसमें 12 प्रविष्टियाँ पहले और 12 प्रविष्टियाँ समय क्षेत्र के लिए होती हैं। एक तालिका 12-घंटे के प्रारूप में है इसलिए मैंने प्रदर्शन के AM/PM भाग के लिए एक लुकअप तालिका भी जोड़ी। दूसरी तालिका 24 घंटे के प्रारूप में है। जैसा कि पहले उल्लेख किया गया है, एक चालू / बंद स्विच 12-घंटे या 24-घंटे के प्रारूप के चयन की अनुमति देता है।

आरंभीकरण के दौरान समय क्षेत्र को EEPROM से पुनर्प्राप्त किया जाता है और संक्षेप में प्रदर्शित किया जाता है। यदि इसे कम से कम एक बार सेट नहीं किया गया है तो सेटिंग रूटीन कहा जाता है। क्षणिक संपर्क स्विच दबाकर किसी भी समय सेटिंग रूटीन को भी कॉल किया जा सकता है। सेटिंग रूटीन डिस्प्ले को "UTC OFFSET +77" में इनिशियलाइज़ करेगा। स्विच का एक छोटा प्रेस मान को "-00" में बदल देगा। यदि एक सकारात्मक समय क्षेत्र की आवश्यकता है, तो एक और छोटा प्रेस मान को "+00" में बदल देगा। एक लंबा प्रेस (> 1 सेकंड) सेटिंग मोड को अगले चरण में ले जाएगा। इस बिंदु पर प्रत्येक छोटा प्रेस समय मान को अधिकतम 12 तक बढ़ा देगा। वांछित समय क्षेत्र तक पहुंचने के बाद, स्विच को 1 सेकंड से अधिक समय तक दबाकर रखें और फिर इसे छोड़ दें। सॉफ्टवेयर तब EEPROM में UTC मान को सहेजेगा और संक्षेप में "OFFSET SAVED" प्रदर्शित करेगा। यदि आप प्रवेश के दौरान कोई गलती करते हैं, तो बस बाहर निकलें और फिर इसे रीसेट करने के लिए स्विच को फिर से दबाएं।

NEO-6M को समय को आउटपुट करने के लिए एक अच्छी स्थिति तय करने की आवश्यकता नहीं है, इसलिए इसे एक उपग्रह मिलते ही संदेशों को आउटपुट करना चाहिए। तब तक डिस्प्ले "NO DATA" पढ़ेगा।

चरण 10: मौसम सॉफ्टवेयर

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

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

इंटरप्ट हैंडलर यह निर्धारित करता है कि कैप्चर की गई गिनती स्टार्ट पल्स होने के लिए काफी लंबी है या नहीं। जैसा कि पहले उल्लेख किया गया है, कई संदेशों के बीच का अंतर 2ms है, इसलिए सॉफ्टवेयर यही देखता है। सभी 433-मेगाहर्ट्ज ट्रैफ़िक के कारण, सॉफ़्टवेयर में प्रारंभिक स्क्रीनिंग यह सुनिश्चित करती है कि मापा गया समय कम से कम 1.8ms है लेकिन 2.4ms से अधिक नहीं है। शुरुआत का पता चलने के बाद सॉफ्टवेयर सिंक बिट्स (600us) की तलाश करता है और यह सुनिश्चित करने के लिए गिना जाता है कि उनमें से चार प्राप्त हो गए हैं। एक बार ये परीक्षण पास हो जाने के बाद, सॉफ्टवेयर 200us और 400us के उचित बिट समय की तलाश करता है।

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

आरएफ संदेश में सेंटीग्रेड डेटा के दो बाइट्स को 11-बिट मान बनाने के लिए एक साथ मैश किया जाता है। समता बिट को खत्म करने और ऊपरी हिस्से में बिट्स के साथ संरेखित करने के लिए निचले हिस्से को एक बिट बाईं ओर स्थानांतरित किया जाता है। दो बाइट्स एक 16-बिट शब्द चर में बनते हैं और फिर अंतिम बिट संरेखण प्राप्त करने के लिए पूरी चीज़ को एक बिट में स्थानांतरित कर दिया जाता है। फिर वेरिएबल शब्द को गणित की गणना के लिए फ्लोटिंग पॉइंट वेरिएबल में बदल दिया जाता है।

PIC पर Arduino बनाम असेंबली भाषा पर C++ का उपयोग करने का एक बड़ा फायदा यह है कि यह गणित की गणना को सरल करता है। जैसा कि पहले उल्लेख किया गया है कि सेंटीग्रेड रूपांतरण (C/10) -100 है। परिणाम को एक स्ट्रिंग में बदल दिया जाता है और प्रदर्शन के लिए एलसीडी को भेजा जाता है। फारेनहाइट गणना (सी * 1.8) + 32 है। परिणाम फिर से एक स्ट्रिंग में परिवर्तित हो जाता है और प्रदर्शन के लिए एलसीडी को भेजा जाता है। दोनों ही मामलों में, स्ट्रिंग रूपांतरण में ऋणात्मक चिह्न (यदि उपयुक्त हो) और दशमलव बिंदु शामिल हैं। यह सुनिश्चित करने के लिए कि दशमलव के बाद केवल एक वर्ण प्रदर्शन पर भेजा जाता है, दशमलव बिंदु के लिए एक जाँच की जाती है। उस जाँच की आवश्यकता है क्योंकि स्ट्रिंग की लंबाई 3 से 5 वर्णों तक हो सकती है।

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

सॉफ्टवेयर बैटरी की स्थिति (बाइट3) की निगरानी करता है और यदि यह कम बैटरी का संकेत देता है तो एक संदेश प्रदर्शित करता है। यह संदेश उस सेंसर के अन्य सभी डेटा को अधिलेखित कर देता है।

चरण 11: प्रदर्शित करता है

प्रदर्शित करता है
प्रदर्शित करता है
प्रदर्शित करता है
प्रदर्शित करता है
प्रदर्शित करता है
प्रदर्शित करता है

विभिन्न कार्यों के लिए यहां कुछ उदाहरण प्रदर्शित किए गए हैं। मेरे पास कुछ अन्य अनुदेशक हैं, लेकिन मेरी अधिकांश PIC माइक्रोकंट्रोलर परियोजनाएं मेरी वेबसाइट www.boomerrules.wordpress.com पर देखी जा सकती हैं।

सिफारिश की: