Arduino पर मौसम स्टेशन। Arduino पर इंडोर वेदर स्टेशन Arduino Uno पर वेदर स्टेशन सर्किट

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

इस कार्रवाई के लिए, मैंने इसके लिए एक Arduino Uno और एक ईथरनेट शील्ड w5100 लिया। यह सब चीन से Aliexpress पर मंगवाया गया था।

मैंने वहां सेंसर का भी आदेश दिया: DHT22, DHT11, DS18B20, BMP280 (गैस, स्मोक सेंसर की भी योजना है ...)

स्मोक्ड फ़ोरम, Google, यैंडेक्स, मुझे स्केच का एक अच्छा संस्करण मिला - https://student-proger.ru/2014/11/meteostanciya-2-1/

वहीं, कमेंट में एक शख्स ने लाइट और गैस सेंसर के साथ पूरा स्केच पोस्ट किया। मैंने उन्हें एक आधार के रूप में लिया।

उन रेखाचित्रों में, 280 वें प्रेशर सेंसर के लिए कोई समर्थन नहीं था, हमने लेखक से बात की, उन्होंने 180 को 280 से बदल दिया। सब कुछ ठीक रहा (इसके लिए बहुत-बहुत धन्यवाद)

नीचे अंतिम स्केच का एक उदाहरण है जो मुझे मिला।

फिलहाल मेरे पास सेंसर जुड़े हुए हैं:
डीएचटी22 - 1 पीसी।
डीएचटी11 - 1 पीसी।
बीएमपी 280 - 1 पीसी।
DS18B20 - 2 पीसी।

ध्यान! स्केच अपलोड करने से पहले, डिवाइस का मैक एड्रेस बदलना न भूलें ताकि दूसरों के साथ ओवरलैप न हो (उदाहरण के लिए, अपने मोबाइल फोन का मैक एड्रेस लें और उसमें अंतिम अक्षर / नंबर बदलें, जो नहीं होगा " अपने स्थानीय नेटवर्क को परेशान करें!

अनुमानित कनेक्शन आरेख (इस स्केच से इंटरनेट पर ली गई तस्वीर):

तकनीकी कारणों से, मैं स्केच यहाँ पोस्ट नहीं कर सकता। मैंने इसे आर्काइव में रखा है। इसका लिंक ऊपर है।

जैसा कि आप देख सकते हैं, रीडिंग हैं, वे ठीक से काम कर रहे हैं, उदाहरण के लिए, मैं अपने सेंसर से कुछ स्क्रीनशॉट पोस्ट करूंगा:

अपने खाली समय में, और इस बार मैंने एक छोटा मौसम स्टेशन बनाने के निर्देश लिखे। यह तारीख वाली घड़ी की तरह काम करेगा और कमरे के अंदर और बाहर के तापमान को दिखाएगा। हम मुख्य नियंत्रक के रूप में एक Arduino UNO का उपयोग करेंगे, लेकिन बोर्ड पर Atmega328p के साथ एक और बोर्ड करेगा। प्रदर्शन के लिए, हम WG12864B ग्राफिक स्क्रीन का उपयोग करते हैं। हम दो ds18b20 तापमान सेंसर भी कनेक्ट करेंगे। एक घर के अंदर है, दूसरे को बाहर ले जाया जाता है। चलो शुरू करो।

घरेलू उत्पाद बनाने की प्रक्रिया में, हमें चाहिए:

Arduino UNO (या कोई अन्य Arduino संगत बोर्ड)
- WG12864B ग्राफिक स्क्रीन
- ds18b20 तापमान सेंसर, 2 पीसी
- बिजली की आपूर्ति 6 ​​- 12 वी
- प्रतिरोधक 4.7 कोम 0.25 डब्ल्यू, 2 पीसी।
- प्रतिरोधक 100 ओम 0.25 डब्ल्यू
- 4 एएए "छोटी उंगली" बैटरी के लिए बैटरी कम्पार्टमेंट
- SEGA कंसोल कार्ट्रिज से बॉक्स
- विद्युत अवरोधी पट्टी
- तारों को जोड़ना
- सर्किट बोर्ड
- बटन
- स्टेशनरी चाकू
- सोल्डरिंग आयरन
- सोल्डर, रोसिन
- दोतरफा पट्टी

चरण 1 WG12864B3 तैयार करें।
जिन लोगों ने पहले स्क्रीन के साथ काम नहीं किया है, वे समान दिखने वाली स्क्रीन में बड़ी संख्या में संशोधनों से भयभीत हो सकते हैं। मैं थोड़ा समझाता हूँ। इस प्रकार की अधिकांश स्क्रीन ks0107/ks0108 चिप्स पर काम करती हैं। सभी स्क्रीन को 4 प्रकारों में विभाजित किया जा सकता है:

विकल्प A: HDM64GS12L-4, क्रिस्टलफोंट्ज़ CFAG12864B, Sparkfun LCD-00710CM, NKC इलेक्ट्रॉनिक्स LCD-0022, WinStar WG12864B-TML-T

Option B: HDM64GS12L-5, Lumex LCM-S12864GSF, Futurlec BLUE128X64LCD, AZ Displays AGM1264F, Displaytech 64128A BC, Adafruit GLCD, DataVision DG12864-88, Topway LM12864LDW, Digitron SG12864J4, QY-12864F, TM12864J4, QY-12864F, TM12864F

विकल्प सी: शेनझेन जिंहुआ डिस्प्ले कंपनी लिमिटेड जेएम 12864

विकल्प D: विंटेक-कैस्केड्स WD-G1906G, विंटेक - GEN/WD-G1906G/KS0108B, Wintek/WD-G1906G/S6B0108A, TECDIS/Y19061/HD61202, Varitronix/MGLS19264/HD61202

वे लगभग एक जैसे दिखते हैं। लेकिन कनेक्शन पिन अलग हैं। मैंने चुना, और मैं आपको सलाह देता हूं, WG12864B3 V2.0, लेकिन अगर स्क्रीन एक अलग आती है, या आपके पास यह हाथ में नहीं है, तो आप तालिका का उपयोग करके आसानी से इसका पता लगा सकते हैं:

संक्षिप्त विनिर्देश:

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

सीरियल कनेक्शन के लिए, जिसका हम उपयोग करेंगे, योजना इस प्रकार है:

WG12864B - Arduino UNO 1 (GND) - GND 2 (VCC) - +5V 4 (RS) - 10 5 (R/W) - 11 6 (E) - 13 15 (PSB) - GND 19 (BLA) - प्रतिरोधक के माध्यम से 100 ओहम - +5 वी 20 (बीएलके) - जीएनडी

कंट्रास्ट को एडजस्ट करने के लिए, एक पोटेंशियोमीटर स्क्रीन पर होना चाहिए। इसके बिना स्क्रीन हैं, लेकिन यह अब दुर्लभ है:

एक 100 ओम रोकनेवाला की जरूरत है ताकि 5 वोल्ट का वोल्टेज गलती से बैकलाइट डायोड को जला न दे।

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

पारदर्शी फिल्म को बॉक्स के ऊपर से काट दें, ताकि कोई टुकड़े न बचे:

फिर, लिपिक चाकू का उपयोग करके, स्क्रीन के लिए 37x69 विंडो काट लें।

रिवर्स साइड पर, कटआउट के किनारे के साथ, हम दो तरफा टेप को गोंद करते हैं, अधिमानतः काला:

हम चिपकने वाली टेप से सुरक्षात्मक कागज निकालते हैं, और उस पर अपनी स्क्रीन चिपकाते हैं:

बाहर से यह ऐसा दिखना चाहिए:

स्क्रीन के नीचे, दो तरफा टेप पर भी, हम Arduino को माउंट करते हैं, पहले USB पोर्ट और पावर सॉकेट के लिए कटआउट बनाते हैं:

Arduino सॉकेट के लिए कटआउट बॉक्स के दोनों किनारों पर बनाए जाने चाहिए ताकि यह स्वतंत्र रूप से बंद हो सके:

चरण 3 तापमान सेंसर।
हम DS18B20 डिजिटल तापमान सेंसर का उपयोग करेंगे। उनका उपयोग करके, हम -55 ... + 125 डिग्री सेल्सियस की विस्तृत तापमान सीमा में अधिक माप सटीकता, 0.5 डिग्री सेल्सियस से अधिक नहीं की त्रुटि प्राप्त करते हैं। इसके अलावा, सेंसर डिजिटल है और सभी गणना स्वयं करता है, और Arduino केवल तैयार-निर्मित रीडिंग प्राप्त करता है। इस सेंसर को कनेक्ट करते समय, DQ और VDD पिन के बीच 4.7KΩ पुल-अप रोकनेवाला के बारे में मत भूलना। कई कनेक्शन विकल्प भी संभव हैं। बाहरी शक्ति के साथ, मेरी राय में सबसे अच्छा विकल्प, हम इसका उपयोग करेंगे:

किसी भी बिजली आपूर्ति विकल्प के साथ, सेंसर समानांतर में जुड़े हुए हैं:

हम इनडोर तापमान संवेदक को एक छोटे से बोर्ड पर दो बटनों के साथ रखेंगे जिनका उपयोग हम घड़ी का समय और तारीख निर्धारित करने के लिए करेंगे:

हम दोनों बटनों से सामान्य तार को GND से जोड़ते हैं, तार को पहले बटन से A0 से, दूसरे से A1 से जोड़ते हैं।
हम इसे Arduino के बगल में दो तरफा टेप पर ठीक करते हैं:

संवेदक, जिसे कमरे के बाहर रखा जाना चाहिए, धातु, धूल-प्रूफ आवास में चुनना बेहतर होता है:

आवश्यक लंबाई के तार की गणना करें ताकि आप सेंसर को खिड़की के बाहर लटका सकें, मुख्य बात यह है कि यह 5 मीटर से अधिक नहीं होना चाहिए, यदि आपको लंबी लंबाई की आवश्यकता है, तो आपको पुल के मूल्य को कम करने की आवश्यकता होगी- ऊपर रोकनेवाला।

हम Arduino के 5 को पिन करने के लिए दोनों सेंसर के DQ डेटा बस से तार जोड़ते हैं।
Vdd - +5 अरुडिनो।
जीएनडी - जीएनडी अरुडिनो।

चरण 4 पोषण।
बिजली के लिए, आप 6 से 12 वोल्ट के वोल्टेज के साथ बिजली की आपूर्ति का उपयोग कर सकते हैं। पावर फ्लेयर तार के अंत में, एक प्लग मिलाप करें जो Arduino पावर सॉकेट में फिट बैठता है:

या आप मामले में चार "एएए", "छोटी उंगली" बैटरी के लिए बैटरी डिब्बे डाल सकते हैं। और सकारात्मक तार को खाड़ी से विन अरुडिनो और नकारात्मक तार को जीएनडी से कनेक्ट करें।

चरण 5 प्रोग्रामिंग वातावरण तैयार करें।
सबसे पहले आपको आधिकारिक वेबसाइट से Arduino IDE को डाउनलोड और इंस्टॉल करना होगा

और स्केच के लिए आवश्यक दो पुस्तकालयों में भी जोड़ें। वनवायर - ds18b20 सेंसर के साथ संचार के लिए आवश्यक:

U8glib - स्क्रीन पर सूचना प्रदर्शित करने के लिए उपयोग किया जाता है:

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

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

बाइट Addr1 = (0x28, 0xFF, 0x75, 0x4E, 0x87, 0x16, 0x5, 0x63); // आंतरिक बाइट Addr2 का पता = (0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x16, 0x5, 0x97); सेंसर

हम स्थान के अनुरूप सेंसर के पतों को अपने पतों से बदल देते हैं।
हमारी घड़ी RTC मॉड्यूल (रियल टाइम क्लॉक) का उपयोग नहीं करती है, इसलिए घड़ी को सही करना आवश्यक है। सुविधा के लिए, लाइन को अनकमेंट करें (सेकंड स्क्रीन पर दिखाई देंगे):

//u8g.setPrintPos(44, 50); u8g.प्रिंट (सेकंड); // चाल की शुद्धता को नियंत्रित करने के लिए आउटपुट सेकंड

पोर्ट मॉनिटर का उपयोग करके सही समय निर्धारित करें। ऐसा करने के लिए, पोर्ट मॉनिटर खोलें, प्रारंभिक तापमान माप समाप्त होने की प्रतीक्षा करें, और "दिन, महीना, वर्ष, घंटे, मिनट, सेकंड" प्रारूप में वर्तमान दिनांक और समय दर्ज करें। कोई रिक्त स्थान नहीं, संख्याएँ अल्पविराम या डॉट्स द्वारा अलग की जाती हैं।

यदि घड़ी जल्दी में है, तो मान को बड़े मान में बदलें, मैं 100 इकाइयों के एक चरण के साथ प्रयोग करने की सलाह देता हूं। यदि पिछड़ने पर लाइन में मान कम करना चाहिए:

if (micros() - prevmicros >494000) (//इसे समायोजित करने के लिए किसी और चीज़ में परिवर्तन 500000 था

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

किसी तरह, शहर में घूमते हुए, मैंने एक नया रेडियो इलेक्ट्रॉनिक्स स्टोर देखा जो खुल गया था। इसमें जाने पर, मुझे Arduino के लिए बड़ी संख्या में ढालें ​​​​मिलीं। मेरे पास घर पर एक Arduino Uno और एक Arduino Nano था और मुझे तुरंत दूर से सिग्नल ट्रांसमीटर के साथ खेलने का विचार आया। मैंने 433 मेगाहर्ट्ज पर सबसे सस्ता ट्रांसमीटर और रिसीवर खरीदने का फैसला किया:

सिग्नल ट्रांसमीटर।


सिग्नल रिसीवर।

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

ट्रांसमीटर में निम्नलिखित विशेषताएं हैं:
1. मॉडल: एमएक्स-एफएस-03 वी
2. कार्रवाई की त्रिज्या (अवरुद्ध वस्तुओं की उपस्थिति पर निर्भर करती है): 20-200 मीटर
3. वर्किंग वोल्टेज: 3.5 -12 वी
4. मॉड्यूल आयाम: 19 * 19 मिमी
5. सिग्नल मॉड्यूलेशन: एएम
6. ट्रांसमीटर शक्ति: 10mW
7. आवृत्ति: 433 मेगाहर्ट्ज
8. बाहरी एंटीना की आवश्यक लंबाई: 25 सेमी
9. कनेक्ट करने में आसान (केवल तीन तार): डेटा; वीसीसी; धरती।

मॉड्यूल विशेषताओं को प्राप्त करना:
1. वर्किंग वोल्टेज: डीसी 5 वी
2. वर्तमान: 4mA
3. कार्य आवृत्ति: 433.92 मेगाहर्ट्ज
4. संवेदनशीलता :- 105dB
5. मॉड्यूल आयाम: 30*14*7mm
6. बाहरी एंटीना की आवश्यकता: 32 सेमी।

इंटरनेट की विशालता में कहा जाता है कि 2Kb / s पर सूचना प्रसारण की सीमा 150m तक पहुँच सकती है। मैंने खुद इसकी जांच नहीं की, लेकिन दो कमरों के अपार्टमेंट में यह हर जगह स्वीकार करता है।

होम वेदर स्टेशन हार्डवेयर

कई प्रयोगों के बाद, मैंने एक तापमान, आर्द्रता संवेदक और एक ट्रांसमीटर को Arduino नैनो से जोड़ने का निर्णय लिया।


DS18D20 तापमान संवेदक निम्नानुसार Arduino से जुड़ा है:

1) माइक्रोकंट्रोलर के माइनस में GND।
2) जमीन पर और Arduino के D2 पिन के लिए एक पुल-अप रोकनेवाला के माध्यम से DQ
3) Vdd से + 5V।

ट्रांसमीटर मॉड्यूल MX -FS - 03V 5 वोल्ट द्वारा संचालित है, डेटा आउटपुट (ADATA) D13 पिन से जुड़ा है।

मैंने एक LCD डिस्प्ले और एक BMP085 बैरोमीटर को Arduino Uno से जोड़ा।


Arduino Uno के लिए वायरिंग आरेख

सिग्नल रिसीवर पिन D10 से जुड़ा है।

BMP085 मॉड्यूल एक डिजिटल वायुमंडलीय दबाव सेंसर है। सेंसर आपको तापमान, दबाव और ऊंचाई को मापने की अनुमति देता है। कनेक्शन इंटरफ़ेस: I2C। सेंसर आपूर्ति वोल्टेज 1.8-3.6 वी

मॉड्यूल अन्य I2C उपकरणों की तरह ही Arduino से जुड़ा है:

  • वीसीसी - वीसीसी (3.3V);
  • GND-GND;
  • एससीएल - एनालॉग पिन 5 के लिए;
  • एसडीए - एनालॉग पिन 4 के लिए।
  • बहुत कम कीमत
  • पावर और आई / ओ 3-5 वी
  • आर्द्रता का निर्धारण 20-80% 5% सटीकता के साथ
  • तापमान का निर्धारण 0-50 डिग्री। 2% सटीकता के साथ
  • मतदान आवृत्ति 1 हर्ट्ज से अधिक नहीं (प्रत्येक 1 सेकंड में एक बार से अधिक नहीं।)
  • आयाम 15.5 मिमी x 12 मिमी x 5.5 मिमी
  • 0.1" लेग स्पेसिंग के साथ 4 पिन

DHT में 4 पिन होते हैं:

  1. वीसीसी (3-5 वी आपूर्ति)
  2. डेटा आउट - डेटा आउटपुट
  3. उपयोग नहीं किया
  4. सामान्य

D8 Arduino से जुड़ता है।

होम वेदर स्टेशन सॉफ्टवेयर

ट्रांसमीटर मॉड्यूल हर 10 मिनट में तापमान को मापता है और प्रसारित करता है।

नीचे कार्यक्रम है:

/* स्केच संस्करण 1.0 हर 10 मिनट में तापमान भेजें। */ #include #include #include #define ONE_WIRE_BUS 2 // डलास सेंसर को जोड़ने के लिए पिन वनवायर वनवायर (ONE_WIRE_BUS); डलास तापमान सेंसर (और एक तार); थर्मामीटर के अंदर डिवाइस का पता; शून्य सेटअप (शून्य) ( //Serial.begin(9600); vw_set_ptt_inverted(true); // DR3100 vw_setup(2000) के लिए आवश्यक; // सेट बॉड दर (bps) sensor.begin(); if (!sensors .getAddress) (इनसाइडथर्मोमीटर, 0)); प्रिंटएड्रेस (इनसाइडथर्मोमीटर); सेंसर.सेट रेसोल्यूशन(इनसाइडथर्मोमीटर, 9); ); //Serial.println (tempC); // इंट नंबर = tempC भेजने के लिए डेटा का गठन; चार प्रतीक = "सी"; // सेवा प्रतीक यह निर्धारित करने के लिए कि यह एक सेंसर है स्ट्रिंग strMsg = "z"; strMsg + = प्रतीक; strMsg + = ""; strMsg + = संख्या; strMsg + = ""; चार संदेश; strMsg.toCharArray (संदेश, 255); vw_send ((uint8_t *) संदेश, strlen (msg)); vw_wait_tx (); // स्थानांतरण के पूरा होने में देरी की प्रतीक्षा करें (200); ) शून्य लूप (शून्य) ( for (int j=0; j<= 6; j++) { sensors.requestTemperatures(); printTemperature(insideThermometer); delay(600000); } } //Определение адреса void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16); //Serial.print("0"); //Serial.print(deviceAddress[i], HEX); } }

प्राप्त करने वाला उपकरण डेटा प्राप्त करता है, कमरे में दबाव और तापमान को मापता है और इसे डिस्प्ले तक पहुंचाता है।

#शामिल #लिक्विड क्रिस्टल एलसीडी (12, 10, 5, 4, 3, 2); # शामिल dht11 सेंसर; #define DHT11PIN 8 #include #include BMP085 dps = BMP085(); लंबा तापमान = 0, दबाव = 0, ऊँचाई = 0; शून्य सेटअप () (Serial.begin (9600); vw_set_ptt_inverted (सच); // DR3100 vw_setup (2000) के लिए आवश्यक; // सेट प्राप्त दर vw_rx_start (); // प्रारंभ वायु निगरानी lcd.begin (16, 2); Wire.begin (); विलंब (1000); dps.init (); // lcd.setCursor (14,0); // lcd.write (बाइट (0)); // lcd.home ();) शून्य लूप () ( uint8_t buf; // संदेश बफर uint8_t buflen = VW_MAX_MESSAGE_LEN; // बफर लंबाई अगर (vw_get_message (buf, &buflen)) // यदि कोई संदेश प्राप्त होता है (//संदेश को पार्स करना प्रारंभ करें; // यदि संदेश है हमें संबोधित नहीं किया गया है, बाहर निकलें अगर (buf! = "z") (वापसी;) char कमांड = buf; // कमांड इंडेक्स 2 पर है // न्यूमेरिक पैरामीटर इंडेक्स 4 i = 4 से शुरू होता है; इंट नंबर = 0; // चूँकि स्थानांतरण वर्ण दर वर्ण है, तो आपको वर्ण सेट को एक संख्या में बदलने की आवश्यकता है, जबकि (buf[i] != " ") ( number *= 10; number += buf[i] - "0"; i++; ) dps.getPressure (&दबाव); सीरियल प्रिंट्लन (संख्या); एलसीडी.प्रिंट ("टी ="); lcd.setCursor (2,0); एलसीडी प्रिंट (संख्या); lcd.setCursor (5,0); एलसीडी.प्रिंट ("पी ="); एलसीडी.प्रिंट (दबाव / 133.3); एलसीडी.प्रिंट ("एमएमएच"); lcd.setCursor (0,1); एलसीडी.प्रिंट ("टी ="); एलसीडी.प्रिंट (तापमान * 0.1); एलसीडी.प्रिंट ("एच ="); एलसीडी.प्रिंट (सेंसर.आर्द्रता); एलसीडी.होम (); // देरी (2000); int chk = sensor.read (DHT11PIN); स्विच (chk) (केस DHTLIB_OK: //Serial.println("OK"); ब्रेक; केस DHTLIB_ERROR_CHECKSUM: //Serial.println("चेकसम एरर"); ब्रेक; केस DHTLIB_ERROR_TIMEOUT: //Serial.println("टाइम आउट त्रुटि"); टूटना; डिफ़ॉल्ट: //Serial.println ("अज्ञात त्रुटि"); टूटना;)))

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

नीचे क्या हुआ की एक तस्वीर है:

रेडियो तत्वों की सूची

पद प्रकार का मज़हब मात्रा टिप्पणीदुकानमेरा नोटपैड
प्रेषण भाग।
अरुडिनो बोर्ड

अरुडिनो नैनो 3.0

1 नोटपैड को
तापमान सेंसर

DS18B20

1 नोटपैड को
अवरोध

220 ओम

1 नोटपैड को
ट्रांसमीटर मॉड्यूलMX-FS-03V (433 मेगाहर्ट्ज)1 नोटपैड को
रेडियो प्राप्त करने वाला हिस्सा।
अरुडिनो बोर्ड

अरुडिनो यूनो

1 नोटपैड को
ट्रिमर रोकनेवाला 1 नोटपैड को
अवरोध


"तो, चलिए तुरंत मान लेते हैं: आप हॉलीवुड के लिए फिल्म नहीं बनाने जा रहे हैं। वंडरलैंड में भी, सभी लिपियों में से पांच प्रतिशत से अधिक को मंजूरी नहीं दी जाती है, और फिर केवल एक प्रतिशत ही उत्पादन में जाता है ... इसलिए, इन सबके बजाय, आप अपना हॉलीवुड बनाने जा रहे हैं।
एड गस्कल "डिजिटल सिनेमा की शूटिंग, या घर पर हॉलीवुड"

प्रस्तावना

क्या, एक और Arduino मौसम स्टेशन ?! हां, एक और, कुछ मुझे बताता है, इंटरनेट ऑफ थिंग्स में आखिरी नहीं।


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


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


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



यह परियोजना 2016 में वापस लागू की गई थी, लेकिन मुझे उम्मीद है कि यह अभी भी प्रासंगिक है।

प्रौद्योगिकी सेट

हम सरल और जटिल चीजों के साथ अध्ययन और कार्य करेंगे:

  • तापमान और आर्द्रता सेंसर प्रकार DHT22, DHT11
  • बैरोमीटर का प्रेशर सेंसर टाइप BMP180
  • वाईफाई मॉड्यूल ESP8266
  • रेडियो मॉड्यूल प्रकार nRF24 2.4 GHz
  • परिवार Arduino प्रो मिनी, Arduino मेगा
  • सौर पैनल और बैटरी
  • प्रोग्रामिंग भाषा सी/सी++
  • पीएचपी प्रोग्रामिंग भाषा
  • MySQL डेटाबेस प्रबंधन प्रणाली
  • जावा प्रोग्रामिंग लैंग्वेज और एंड्रॉइड फ्रेमवर्क (स्मार्टफोन पर मौसम डेटा प्रदर्शित करने के लिए Adnroid के लिए एक एप्लिकेशन बनाना)।

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


लेकिन हम बिल्कुल शुरुआत से शुरू करेंगेअधिकार। अर्थात्, भविष्य के उपकरण के विवरण और डिजाइन से "कागज पर"ताकि अंत में प्रत्येक ईंट अपने स्थान पर रहे।

प्रोटोटाइप

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


लेकिन यह एक ऐसे उद्योग में है जहां श्रमिकों को पूर्णकालिक नियोजित किया जाता है।


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


एक औद्योगिक उत्पाद एक औद्योगिक तत्व आधार पर बनाया जाता है और फिर बेस्टसेलर बनने से पहले डिबगिंग, परीक्षण और रखरखाव सहित कई और चरणों से गुजरता है।


इसलिए, इस सारी थकान के बजाय, हम अपना खुद का खिलौना बनाएंगे, लेकिन साधारण नहीं। तकनीकी रचनात्मकता के तत्वों के साथ, कई अन्य संबंधित चीजों की प्रोग्रामिंग और ज्ञान (निर्माण की प्रक्रिया में) की शुरुआत।


बेशक, इलेक्ट्रॉनिक्स इंजीनियरों के पास प्रोग्रामिंग चरण में एक कठिन समय होगा, और प्रोग्रामर को सर्किटरी पर पसीना बहाना होगा, लेकिन लेखक हर चीज को यथासंभव सुलभ बताने की कोशिश करेगा और स्पष्ट रूप से वर्णन करेगा कि कुछ समाधानों का उपयोग क्यों किया गया।

आवश्यकताएं

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


तो, हमारे मौसम स्टेशन को चाहिए:

  • बाहर तापमान और आर्द्रता मापें
  • घर में तापमान और आर्द्रता को मापें
  • वायुमंडलीय दबाव को मापें
  • प्रदर्शन पर संकेतित मान प्रदर्शित करें
  • डेटा को इंटरनेट पर एक सर्वर पर स्थानांतरित करें, जहां डेटा को एक डेटाबेस में संग्रहीत किया जाएगा और एक वेब पेज पर प्रदर्शित किया जाएगा, या एक मोबाइल एप्लिकेशन में उपयोग किया जाएगा।

सेंसर का उपयोग सबसे सरल और सस्ता होता है। उदाहरण के लिए, आगे देखते हुए, मैं कहूँगा कि DHT22 तापमान को काफी सटीक रूप से मापता है, लेकिन यह आर्द्रता के साथ थोड़ा गलत है। लेकिन, मैं फिर से दोहराता हूं, इससे कोई फर्क नहीं पड़ता, क्योंकि हमारे सामने एक प्रोटोटाइप है, और 5% आर्द्रता के बिखरने से हमारे जीवन में कुछ भी महत्वपूर्ण नहीं होगा।


सिस्टम आर्किटेक्चर, हार्डवेयर और सॉफ्टवेयर को नए सेंसर और नई क्षमताओं को जोड़ने के लिए सिस्टम को और अधिक विस्तारित करने की अनुमति देनी चाहिए।

लोहा। घटक चयन

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


यहाँ एक अति सूक्ष्म अंतर है। घटकों का चयन करने के लिए, आपको उनकी क्षमताओं को अच्छी तरह से जानने की आवश्यकता है, आपको स्वयं तकनीकों को जानने की आवश्यकता है। यही है, दूसरे शब्दों में, यहां आपको नौसिखिए इलेक्ट्रॉनिक्स इंजीनियर और प्रोग्रामर से दूर रहने की जरूरत है। तो अब क्या संभव उपकरणों की पूरी श्रृंखला का अध्ययन करने में कुछ साल खर्च करना है?


ख़राब घेरा? लेकिन उन्हें तोड़ने के लिए दुष्चक्र मौजूद हैं।


एक निकास है। आप बस किसी के प्रोजेक्ट को ले सकते हैं और दोहरा सकते हैं। मैंने मौसम केंद्रों की पहले से मौजूद परियोजनाओं का अध्ययन किया और मुझे उम्मीद है कि मैंने एक कदम आगे बढ़ाया है।


इसलिए। मौसम केंद्र की वास्तुकला Arduino पर आधारित है। क्योंकि Arduino में प्रवेश की एक छोटी सी सीमा है और मैं इससे पहले ही निपट चुका हूं। फिर चुनना आसान हो जाता है।


यह तुरंत स्पष्ट हो गया कि मौसम स्टेशन में एक रिमोट, आउट-ऑफ-विंडो सेंसर और एक केंद्रीय मॉड्यूल शामिल होगा।


केंद्रीय, मुख्य इकाई घर के अंदर स्थित होगी। प्रारंभिक चरण में इसे निर्धारित करना महत्वपूर्ण है, ऑपरेशन के तापमान शासन और इससे "नृत्य" की शक्ति जैसी महत्वपूर्ण विशेषताएं।


रिमोट सेंसर (या सेंसर) "दिमाग" के बिना होगा, इसका कार्य समय-समय पर माप लेना और डेटा को केंद्रीय होम यूनिट तक पहुंचाना है। केंद्रीय इकाई सभी सेंसर से डेटा प्राप्त करती है, उन्हें स्क्रीन पर प्रदर्शित करती है और उन्हें इंटरनेट पर डेटाबेस में भेजती है। ठीक है, यह पहले से ही बहुत आसान है, जैसे ही डेटा डेटाबेस में होता है, आप इसके साथ जो चाहें कर सकते हैं, यहां तक ​​​​कि ग्राफ़ भी बना सकते हैं।


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



एक दिलचस्प सवाल यह था कि बाहरी सेंसर (या सेंसर, सिस्टम एक्सपेंडेबिलिटी की आवश्यकता के बारे में याद रखें?) और केंद्र के बीच संचार कैसे प्रदान किया जाए। 433 मेगाहर्ट्ज रेडियो बीकन निश्चित रूप से उपयुक्त नहीं हैं (वे किसी भी चीज के लिए उपयुक्त नहीं हैं)।


ESP8266 का फिर से उपयोग करें?


इस समाधान के विपक्ष:

    घर के बाहर स्थिर वाईफाई की आवश्यकता है

    संचार का दायरा बहुत अच्छा नहीं होगा

    विश्वसनीयता को नुकसान होगा, अगर इंटरनेट विफल हो जाता है, तो हम अपने रिमोट सेंसर नहीं देख पाएंगे

    अधिक बिजली की खपत।

    बिजली की खपत ESP8266:

    120-170 एमए संचारित करते समय

    50-56 एमए प्राप्त करते समय

    गहरी नींद मोड में 10 µA (µA)

    ऑफ स्टेट 5 µA (µA)।

अंत में, रिमोट सेंसर को मुख्य होम यूनिट से जोड़ने के लिए, nRF24L01 + चिप को 2.4 गीगाहर्ट्ज़ ट्रांसमीटर और एक बोतल में रिसीवर के साथ चुना गया, एक अतिरिक्त बाहरी एंटीना के साथ, निश्चित रूप से दीवारों को "तोड़ने" के लिए।



बिजली की खपत nRF24L01+ 2.4 GHz:

  • 11 एमए प्राप्त करते समय
  • 2 एमबीपीएस - 13 एमए की गति से संचार करते समय
  • स्टैंडबाय-I मोड में - 26 μA (μA)
  • ऑफ स्टेट 900 एनए (एनए)।

ESP8266 और nRF24L01+ दोनों में एक उपयुक्त ऑपरेटिंग तापमान रेंज है: -40°C से +80°C तक।


आप nRF24L01+ को लगभग $1 में, या बाहरी एंटीना के साथ $3 में खरीद सकते हैं। आप ESP8266-01 को लगभग $4 में खरीद सकते हैं। उत्पाद विवरण को ध्यान से पढ़ें! अन्यथा, एक एंटीना खरीदें।


प्रणाली का मूल उभरा। आइए खुद सेंसर पर चलते हैं।


सड़क पर, जैसा कि आप जानते हैं, तापमान नकारात्मक मूल्यों तक पहुंच सकता है, इसलिए DHT11 सेंसर उपयुक्त नहीं है, लेकिन DHT22 बिल्कुल सही है।



DHT22 / AM2302 के निर्दिष्टीकरण:

  • 3.3V से 5V आपूर्ति, 5V की सिफारिश की गई
  • खपत 2.5mA अधिकतम, माप और डेटा स्थानांतरण के समय
  • आर्द्रता माप सीमा 0-100% 2-5% की त्रुटि के साथ
  • तापमान माप -40 से + 125 डिग्री सेल्सियस तक ± 0.5 डिग्री सेल्सियस की त्रुटि के साथ होता है
  • माप के लिए अनुरोध 0.5 हर्ट्ज से अधिक नहीं - हर 2 सेकंड में एक बार।

मुझे उम्मीद है कि घर के अंदर कोई नकारात्मक तापमान नहीं होगा, इसलिए आप DHT11 का उपयोग कर सकते हैं, खासकर जब से मेरे पास पहले से ही था।


डीएचटी11 की विशेषताएं:

  • 3.3V से 5V आपूर्ति
  • खपत 2.5 mA अधिकतम, माप और डेटा स्थानांतरण के समय
  • आर्द्रता माप सीमा 20-80% 5% की त्रुटि के साथ
  • तापमान माप ± 2 डिग्री सेल्सियस की त्रुटि के साथ 0 से +50 डिग्री सेल्सियस तक होता है
  • माप अनुरोध 1 हर्ट्ज से अधिक नहीं - प्रति सेकंड एक बार।

आप DHT22 को लगभग $3 में खरीद सकते हैं। DHT11 की कीमत कम - $1 है, लेकिन यह कम सटीक भी है।


अब वापस Arduino पर वापस। कौन सा बोर्ड चुनना है?


मैंने Arduino UNO पर सिस्टम के अलग-अलग हिस्सों का परीक्षण किया। वे। मैंने ईएसपी मॉड्यूल को यूनो से जोड़ा और इसका अध्ययन किया, इसे बंद कर दिया, फिर एनआरएफ 24 आदि को जोड़ा। विंडो सेंसर के अंतिम कार्यान्वयन के लिए, मैंने Arduino Pro Mini को Uno के निकटतम लघु के रूप में चुना।



बिजली की खपत के मामले में, Arduino Pro Mini भी अच्छा दिखता है:

  • कोई यूएसबी-टीटीएल कनवर्टर नहीं है, जो स्वयं "खाती" है,
  • एलईडी 10k रोकनेवाला के माध्यम से जुड़ा हुआ है।

उन्नत ऊर्जा संरक्षण के लिए, यह योजना बनाई गई थी:

  • Arduino Pro Mini पर LED - पावर इंडिकेटर को हटा दें (मुझे खेद है कि बोर्ड खराब नहीं हुआ)
  • या Atmel ATmega328 माइक्रोप्रोसेसर पर "नंगे" असेंबली का उपयोग करें (इसका उपयोग नहीं किया)
  • लो पावर लाइब्रेरी या जीलिब का उपयोग करें।

पुस्तकालयों से मैंने लो पावर लाइब्रेरी को चुना, यह सरल है और इसमें केवल वही है जो आपको चाहिए।


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


आप Arduino Mega को लगभग $8 में खरीद सकते हैं।

बिजली और बिजली की खपत

अब भोजन और बिजली की खपत के बारे में।


Arduino Pro Mini दो प्रकार के होते हैं:

  • आपूर्ति वोल्टेज 5V और आवृत्ति 16MHz के लिए
  • 3.3V की आपूर्ति वोल्टेज और 8MHz की आवृत्ति के लिए।

चूँकि nRF24L01+ रेडियो मॉड्यूल को बिजली की आपूर्ति के लिए 3.3V की आवश्यकता होती है, और यहाँ गति महत्वपूर्ण नहीं है, 8MHz और 3.3V पर Arduino Pro Mini खरीदें।


इस स्थिति में, Arduino Pro Mini की आपूर्ति वोल्टेज सीमा है:

  • 3.3V मॉडल के लिए 3.35-12V
  • 5V मॉडल के लिए 5-12V।

मेरे पास पहले से ही 5V Arduino Pro Mini था, इसलिए मैंने इसका इस्तेमाल किया। आप Arduino Pro Mini को लगभग $4 में खरीद सकते हैं।


केंद्रीय इकाई की बिजली आपूर्ति 220 V नेटवर्क से एक छोटी बिजली आपूर्ति इकाई के माध्यम से होगी, जो 12V, 450mA, 5W का आउटपुट देगी। $ 5 के लिए ऐसा कुछ। 5V के लिए एक अलग आउटपुट भी है।



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


इसलिए, Arduino Pro Mini और nRF24 रेडियो मॉड्यूल 4 Ni-Mh बैटरी के बंडल द्वारा संचालित होंगे।


और याद रखें एक आधुनिक बैटरी की अधिकतम क्षमता 2500-2700mAh के बारे में, और कुछ भी या तो एक मार्केटिंग नौटंकी (Ansmann 2850) या एक धोखा (UltraFire 3500) है।


मैं कई कारणों से ली-आयन बैटरी का उपयोग नहीं करता:

  • बहुत महँगा
  • जब परिवेश का तापमान 0 डिग्री सेल्सियस से नीचे चला जाता है, तो लिथियम-आयन बैटरी की शक्ति 40-50% तक कम हो जाती है
  • जो सस्ते हैं वे बिना सुरक्षा के बने हैं और असुरक्षित हैं (शॉर्ट सर्किट या डिस्चार्ज के दौरान, वे फट सकते हैं और जल सकते हैं, YouTube पर वीडियो का एक गुच्छा देखें)
  • पुराने हो जाते हैं, भले ही उनका उपयोग नहीं किया जाता है (हालांकि, यह सभी रासायनिक तत्वों के बारे में कहा जा सकता है), 2 साल बाद ली-आयन बैटरी अपनी क्षमता का लगभग 20% खो देती है।

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

मौसम स्टेशन की सामान्य योजना

आइए संक्षेप करते हैं। यह कैसे काम करता है इसका एक सामान्य आरेख यहां दिया गया है।



जारी रहती है।

हम अपना मौसम स्टेशन विकसित करना जारी रखते हैं।

अपडेट पर जाने से पहले, मैं थोड़ा स्पष्ट करना चाहता हूं।

हमारे एक सहकर्मी ने मुझे पत्र लिखकर पूछा कि वॉचडॉग टाइमर क्यों पेश किया गया?

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

चलिए अपडेट पर चलते हैं

सबसे महत्वपूर्ण बात यह है कि हम चिप से दूर जा रहे हैं ENC28J60और जाएं W5100. मैंने एक पुरानी चिप पर सब कुछ लागू करने की कोशिश की, लेकिन इसके लिए बहुत बड़ी लाइब्रेरी होने के कारण पर्याप्त माइक्रोकंट्रोलर मेमोरी नहीं है ENC28J60. एक नई चिप का उपयोग करते समय, मानकपुस्तकालयों डेवलपर और किए गए सभी परिवर्तनों से, यह और भी अधिक रहता है 20% माइक्रोकंट्रोलर की मुफ्त मेमोरी ATMega328. और ये नए बन्स हैं!

यह संस्करण (आइए इसे दूसरा कहते हैं) आवृत्ति का उपयोग करके वायरलेस तरीके से सेंसर से रीडिंग प्रसारित करने की क्षमता जोड़ता है 433 मेगाहर्ट्ज. मैंने मॉड्यूल को खुद चीनी से लिया, अंकन किया XY-MK-5V. मैं यह नोट करना चाहता हूं कि ट्रांसमिशन की गुणवत्ता एकदम सही है। सिग्नल हानि, शोर, एक साथ संचरण की संभावना नहीं आदि आदि हो सकते हैं। लेकिन उनकी कीमत ($ 1 प्रति सेट से कम) इन कमियों की भरपाई करती है। मैं आपको एक रहस्य बताता हूँ कि ये (सबसे सस्ते) मॉड्यूल घरेलू उपयोग के लिए कई ब्रांडेड मौसम केंद्रों में हैं। वाह, अप्रत्याशित?

शुरुआत करते हैं बेस स्टेशन से

हम आगे बढ़ रहे हैं अरुडिनो यूएनओऔर ईथरनेट शील्ड(पहला संस्करण) चिप पर आधारित है W5100. यह एक सैंडविच है और इसका वर्णन करने का कोई मतलब नहीं है। मैं मॉड्यूल के लिए केवल अतिरिक्त रूप से शामिल संपर्कों का वर्णन करूंगा XY-MK-5V.

ट्रांसमीटर मॉड्यूल शक्ति का उपयोग करता है 5वी, जीएनडी(जहाँ फिर बिना माँ के) और डी2नियंत्रक पर पिन करें। संपादित संपर्क डी2 (डेटा)आप फ़ंक्शन का उपयोग कर सकते हैं vw_set_tx_pinवीडब्ल्यू पुस्तकालय से।

पिछले स्केच के विपरीत, यह दो अतिरिक्त पुस्तकालयों का उपयोग करता है:

#शामिल करना #शामिल करना

स्केच ही

छिपा हुआ पाठ

#शामिल करना #शामिल करना #शामिल करना #शामिल करना #शामिल करना #शामिल करना #शामिल करना #शामिल करना #define DHTTYPE DHT22 #define DHTPIN 5 DHT dht(DHTPIN, DHTTYPE); बाइट मैक = (0x54, 0x34, 0x31, 0x31, 0x31, 0x31); charserver = "narodmon.ru"; इंट पोर्ट = 8283; आईपीएड्रेस आईपी (192,168,0,201); ईथरनेट क्लाइंट क्लाइंट; बीएमपी085 डीपीएस = बीएमपी085(); लंबा तापमान = 0, दबाव = 0; फ्लोट एच, डीपी, डीपीटी; बूल अंतराल = सत्य; इजी ट्रांसफर वर्चुअल वायर ईटी; संरचना SEND_DATA_STRUCTURE (बाइट आईडी; // डिवाइस आईडी int तापमान; // तापमान फ्लोट दबाव; // दबाव फ्लोट आर्द्रता; // आर्द्रता फ्लोट ड्यूप्वाइंट; // ओस / ठंढ बिंदु); SEND_DATA_STRUCTURE प्रसारण; शून्य सेटअप () (//प्रारंभिक वॉचडॉग टाइमर wdt_disable (); देरी (8000); wdt_enable (WDTO_8S); // प्रारंभिक कंसोल Serial.begin (9600); 433 मेगाहर्ट्ज मॉड्यूल ET.begin(details(broadcast)); vw_set_ptt_inverted(true); vw_set_tx_pin(2); vw_setup(2000); // नेटवर्क शुरू करें, अगर हमने डीएचसीपी सर्वर से डेटा की प्रतीक्षा नहीं की, तो // अगर (Ethernet.begin(mac) == 0) Ethernet.begin(mac, ip); // 1-वायर Wire.begin (); देरी (200); // ऊंचाई समायोजन के साथ BMP180 प्रारंभ करें // dps.init (MODE_STANDARD, 3200, सच); // BMP180 dps.init (); Serial.println (ईथरनेट.लोकलआईपी ()) को प्रारंभ करें; // डिवाइस के चालू होने के तुरंत बाद पहला डेटा भेजें send_info (सच) ); ) // ड्यूपॉइंट फंक्शन एनओएए // संदर्भ (1) : http://wahiduddin.net/calc/density_algorithms.htm // संदर्भ (2) : http://www.colorado.edu/geography/weather_station/Geog_site /about.htm डबल ड्यूपॉइंट (डबल सेल्सियस, डबल ह्यूमिडिटी) (// (1) संतृप्ति वाष्प दबाव = ESGG(T) डबल RATIO = 373.15 / (273.15 + सेल्सियस); डबल आरएचएस = -7.90298 * (अनुपात - 1); आरएचएस + = 5.02808 * लॉग 10 (अनुपात); आरएचएस += -1.3816e-7 * (पाउ(10, (11.344 * (1 - 1/RATIO))) - 1); आरएचएस += 8.1328e-3 * (पाउ(10, (-3.49149 * (अनुपात - 1))) - 1); आरएचएस + = लॉग 10 (1013.246); // कारक -3 इकाइयों को समायोजित करना है - वाष्प दबाव एसवीपी * आर्द्रता डबल वीपी = पाउ (10, आरएचएस - 3) * आर्द्रता; // (2) DEWPOINT = F (वाष्प दाब) डबल T = लॉग (VP/0.61078); // अस्थायी संस्करण वापसी (241.88 * टी) / (17.558 - टी); ) void send_info(bool eth) ( bool fail = true; while(fail) ( // परिणाम प्राप्त होने तक DHT ह्यूमिडिटी सेंसर से डेटा पढ़ने की कोशिश कर रहा है। 90% मामलों में सब कुछ ठीक काम करता है, लेकिन हमें 100 की आवश्यकता है % if((H = dht.readHumidity()) >= 0) ( // BMP180 सेंसर dps.getPressure(&Pressure); dps.getTemperature(&Temperature) से आर्द्रता और तापमान प्राप्त करें; // ओस बिंदु की गणना करें यदि तापमान 0 डिग्री सेल्सियस से ऊपर है // और परिणाम 0 से ऊपर होने की उम्मीद है, अन्यथा आउटपुट 0। यह आवश्यक है//ताकि सर्दी के मौसम में गुमराह न हों। // डीपी = तापमान> 0? ((डीपीटी = ओसप्वाइंट (तापमान * 0.1, एच))<0?0:dPt):0; dP = dewPoint(Temperature*0.1, H); // Отправляем данные в эфир 433 мГц broadcast.ID = 1; broadcast.Temperature = floor(Temperature*0.1); broadcast.Pressure = floor(Pressure/133.3*10)/10; broadcast.Humidity = floor(H*10)/10; broadcast.dewPoint = floor(dP*10)/10; ET.sendData(); delay(250); if(eth) { // Подключаемся к серверу "Народный мониторинг" if(client.connect(server, port)) { // Начинаем передачу данных // адрес_устройства_в_проекте, имя_устройства, GPS широта, GPS долгота client.print(F("#fe-31-31-0e-5a-3b#Arduino Uno#71.344699#27.200014\n")); // Температура client.print(F("#T0#")); client.print(Temperature*0.1); client.print(F("#Температура\n")); // Давление client.print("#P1#"); client.print(Pressure/133.3); client.print(F("#Давление\n")); // Влажность client.print("#H1#"); client.print(H); client.print(F("#Влажность\n")); // Точка росы\инея client.print("#T1#"); client.print(dP); client.print((dP <= 0)? F("#Точка инея\n"):F("#Точка росы\n")); //client.print(F("#Точка росы\n")); // Отправляем конец телеграммы client.print("##"); // Даем время отработать Ethernet модулю и разрываем соединение delay(250); client.stop(); } } // Останавливаем цикл, если передача завершена fail = !fail; break; } delay(250); } } void loop() { // Каждые 4 секунды сбрасываем сторожевой таймер микроконтроллера // Каждые 6 минут отправляем данные на "Народный мониторинг" // Каждые 30 секунд отсылаем данные в эфир 433 if(!(millis()%1000)) wdt_reset(); if(!(millis()%360000)) send_info(true); if(!(millis()%30000)) send_info(false); }

एक एंटीना को स्वयं मॉड्यूल में जोड़ा जाना चाहिए। के लिए 433 मेगाहर्ट्जसामान्य तांबे का तार पर्याप्त है 17 सेमी. ऐन्टेना के बिना, आप सामान्य ऑपरेशन के बारे में भूल सकते हैं।

इस अद्यतन के सबसे महत्वपूर्ण भाग पर चलते हैं - स्थानीय वायरलेस स्टेशन

इसे लागू करने के लिए (मेरे घुटने पर), मैंने एक एनालॉग का इस्तेमाल किया अरुडिनो नैनो(आधार पर ATMega328) और टीएफटीएक चिप पर प्रदर्शित करें ST7735Sअनुमति से 128x160

छिपा हुआ पाठ



पिनआउट डिस्प्ले -> कंट्रोलर

============================= एलईडी | 3.3V एससीके | एससीके (13) एसडीए | एमओएसआई (11) ए0 | डीसी (9) रीसेट | आरएसटी (8) सीएस | सीएस (10) जीएनडी | जीएनडी वीसीसी | 5वी ============================

रिसीवर मॉड्यूल केवल ट्रांसमीटर के समान ही जुड़ा हुआ है जानकारीपिन करने के लिए डी7.

यह कैसा दिखता है इसकी कुछ तस्वीरें:

छिपा हुआ पाठ

रिसीवर स्केच

छिपा हुआ पाठ

#शामिल करना #शामिल करना #शामिल करना #शामिल करना इंट एक्स, वाई; इंट डब्ल्यू = 128, एच = 160; आकार; // 433 ईजीट्रांसफरवर्चुअलवायर ईटी; संरचना SEND_DATA_STRUCTURE (बाइट आईडी; // डिवाइस आईडी int तापमान; // तापमान फ्लोट दबाव; // दबाव फ्लोट आर्द्रता; // आर्द्रता फ्लोट ड्यूप्वाइंट; // ओस / ठंढ बिंदु); SEND_DATA_STRUCTURE प्रसारण; int लॉग_तापमान = -1; फ्लोट लॉग_प्रेस = -1; फ्लोट लॉग_आर्द्रता = -1; फ्लोट Log_dewPoint = -1; // TFT #define cs 10 #define dc 9 #define rst 8 char तापमान, दबाव, आर्द्रता, ओस बिंदु; स्ट्रिंगइन्फो; टीएफटी टीएफटी स्क्रीन = टीएफटी (सीएस, डीसी, आरएसटी); शून्य सेटअप () (सीरियल.बेगिन (9600); // 433 मेगाहर्ट्ज मॉड्यूल ET.begin (विवरण (प्रसारण)); आरंभिक प्रदर्शन सेटअप TFTscreen.begin();TFTscreen.setRotation(2);TFTscreen.background(0, 0, 0);// स्थिर तत्वों को ड्रा करें//1. हमें देखें TFTस्क्रीन.स्ट्रोक (255, 255, 255); TFTस्क्रीन .setTextSize(1); TFTscreen.text(" ", 10, 10); // 2. सेंसर से रीडिंग का विवरण TFTscreen.text("mmHg", w/2+5, 80); TFTscreen.text ("% ", w/2+5, 100); TFTscreen.text("C", w/2+5, 120); प्रसारण.तापमान = 0; प्रसारण.दबाव = 0; प्रसारण.आर्द्रता = 0; प्रसारण .dewPoint = 0; TFTPrint (); ) शून्य लूप () (अगर (ET.receiveData ()) (अगर (ब्रॉडकास्ट। आईडी == 1) TFTPrint (); / * सीरियल.प्रिंट्लन (प्रसारण। तापमान); सीरियल। प्रिंट्लन (प्रसारण) .दबाव); सीरियल.प्रिंट्लन (प्रसारण.आर्द्रता); सीरियल.प्रिंट्लन(ब्रॉडकास्ट.ड्यूप्वाइंट); सीरियल.प्रिंट्लन(); */ ) शून्य परिवर्तन (इंट आकार, इंट एक्स , int y, bool up, bool clear = false) ( if(clear) TFTscreen.stroke(0, 0, 0); और (परिवर्तन (आकार, एक्स, वाई,! ऊपर, सच); ) आकार++; जबकि(आकार > 0) (TFTस्क्रीन.लाइन(x, y, x+(आकार--), y); ++x, (ऊपर)?--y:++y, --size; ) /* जबकि( आकार > 0) ( TFTस्क्रीन.लाइन(x, y, (ऊपर)?x+आकार-1:x, (ऊपर)?y:y+आकार-1); ++x, ++y, --साइज़; ) */ ) int x_center(int w, int लंबाई, int आकार) (रिटर्न फ्लोर((w-लंबाई*(आकार*5)+आकार*2)/2); ) int x_alignment_right(int w, int लंबाई, int आकार) (वापसी छत (डब्ल्यू-लंबाई * (आकार * 5) + आकार * 2);) शून्य टीएफटीप्रिंट () (आकार = 3; // ================= ============================================== = ============== // तापमान रीडिंग प्रदर्शित करें // ============================ = ============================================= == == if(broadcast.Temperature != Log_Temperature) ( TFTscreen.setTextSize(size); // पुराने डेटा को ओवरराइट करें स्ट्रिंग जानकारी = स्ट्रिंग(Log_Temperature); info.concat(" C"); if(Log_Temperature > 0) info = " +"+जानकारी; info.toCharArray(तापमान, जानकारी.लंबाई()+1); TFTस्क्रीन.स्ट्रोक(0, 0, 0); TFTस्क्रीन.पाठ(तापमान, x_center(w, info.length()+1 , आकार ), 35); // नई रीडिंग आउटपुट करें मैं जानकारी = स्ट्रिंग (प्रसारण। तापमान); info.concat ("सी"); अगर (प्रसारण। तापमान> 0) जानकारी = "+" + जानकारी; info.toCharArray (तापमान, जानकारी.लंबाई () + 1); // तापमान के आधार पर तापमान मान का रंग बदलें int r, g = 0, b; if(broadcast.Temperature > 0) (r = map(broadcast.Temperature, 0, 40, 255, 150); // Red b = map(broadcast.Temperature, 0, 40, 30, 0); // रंग बदलें अधिक विज़ुअल ज़ीरो क्रॉसिंग के लिए) और (r = मैप (ब्रॉडकास्ट। तापमान, -40, 0, 0, 30); , 255); // नीला) टीएफटीस्क्रीन.स्ट्रोक (बी, जी, आर); // ध्यान: पुस्तकालय में रंग की स्थिति उलट जाती है, आरजीबी स्थान का उपयोग बीजीआर द्वारा किया जाता है! TFTscreen.text(तापमान, x_center(w, info.length()+1, आकार), 35); ) आकार = 1; // =========================================== = =================================== // दबाव रीडिंग प्रदर्शित करना // ======== = ================================================= ======================= if(broadcast.Pressure!= Log_Pressure) (TFTscreen.setTextSize(size); // पुराने डेटा की जानकारी को ओवरराइट करें = स्ट्रिंग(Log_Pressure) ); info.toCharArray (दबाव, जानकारी.लंबाई ()); // आउटपुट नई रीडिंग जानकारी = स्ट्रिंग (ब्रॉडकास्ट.प्रेशर); info.toCharArray (दबाव, जानकारी.लंबाई ()); TFTस्क्रीन.स्ट्रोक (255, 255, 255); 2-5, जानकारी.लंबाई (), आकार), 80); परिवर्तन (10, 106, 85, (प्रसारण। दबाव> लॉग_प्रेशर)? सत्य: असत्य); ) अन्य (परिवर्तन (10, 106, 85, सत्य, सत्य); परिवर्तन (10, 106, 85, असत्य, सत्य); ) // ============================== = ============================================= = / / आउटपुट ह्यूमिडिटी रीडिंग // ================== ============================================== = ============= if(broadcast.Humidity != Log_Humidity) (TFTscreen.setTextSize(size); // बासी डेटा जानकारी को अधिलेखित करें = स्ट्रिंग (लॉग_ह्यूमिडिटी); info.toCharArray (आर्द्रता, जानकारी.लंबाई ()); टीएफटीस्क्रीन.स्ट्रोक (0, 0, 0); TFTscreen.text(आर्द्रता, x_alignment_right(w/2-5, info.length(), size), 100); // आउटपुट नई रीडिंग जानकारी = स्ट्रिंग (प्रसारण। आर्द्रता); info.toCharArray (आर्द्रता, जानकारी.लंबाई ()); टीएफटीस्क्रीन.स्ट्रोक (255, 255, 255); TFTscreen.text(आर्द्रता, x_alignment_right(w/2-5, info.length(), size), 100); परिवर्तन (10, 106, 105, (प्रसारण। आर्द्रता> लॉग_आर्द्रता)? सत्य: असत्य); ) और (परिवर्तन (10, 106, 105, सत्य, सत्य); परिवर्तन (10, 106, 105, असत्य, सत्य);) // ================== ============================================== = ============= // ओस बिंदु\frost प्रदर्शित करें // ======================= == =============================================== === === अगर (ब्रॉडकास्ट.ड्यूपॉइंट! = Log_dewPoint) ( TFTscreen.setTextSize(size); // बासी डेटा जानकारी को ओवरराइट करें = स्ट्रिंग(Log_dewPoint); info.toCharArray(dewPoint, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text (dewPoint, x_alignment_right(w/2-5, info.length(), size), 120); TFTस्क्रीन.स्ट्रोक (255, 255, 255); Log_dewPoint)?true:false); ) और (परिवर्तन(10, 106, 125, सत्य, सत्य); परिवर्तन (10, 106, 125, असत्य, सत्य); ) // बाद के लिए लॉग में मान अपडेट करें तुलना Log_Temperature = प्रसारण। तापमान; Log_Pressure = प्रसारण। दबाव; Log_Humidity = प्रसारण। आर्द्रता; log_dewPoint = प्रसारण.dewPoint; )

रीडिंग काफी कॉम्पैक्ट रूप से प्रदर्शित की जाती हैं, लेकिन जैसा कि अभ्यास से पता चलता है (और मेरे साथियों की सलाह) - "स्वाद और रंग, यहां तक ​​\u200b\u200bकि पत्नी भी दोस्त नहीं है।" मैंने सलाह और सुझावों का एक समूह सुना, लेकिन वे एक-दूसरे का खंडन करते हैं। तो इसे अपनी पसंद से करें।

मुझे ऐसा लगा कि डिज़ाइन उस प्रोजेक्ट का हिस्सा है जिसमें ज़्यादातर समय लगता है!

छिपा हुआ पाठ

कुछ डिज़ाइन तत्वों को प्रदर्शित करने के लिए डेटा का एक भाग गढ़ा गया है।

प्रदर्शन पर कलाकृतियाँ धूल और अन्य गंदगी हैं जो लंबे समय से जमा हुई हैं ... कहीं वहाँ ... ठीक है, मुझे याद नहीं है कि मुझे यह कहाँ से मिला! मुझे अकेला छोड़ दो!

स्केच में पोजिशनिंग फ़ंक्शन हैं। वे काफी आदिम हैं, लेकिन वे आपको कुछ प्रभाव प्राप्त करने की अनुमति देते हैं।

  1. x_center
  2. x_alignment_right

पहला पाठ को केंद्र में रखता है, और दूसरा इसे निर्दिष्ट क्षेत्र के दाईं ओर संरेखित करता है। अभिव्यक्ति के आधार पर दिए गए पाठ के आकार के सापेक्ष सभी गणनाएँ की जाती हैं 1 आकार = 1PX x 1PXफ़ॉन्ट खंड।

डिस्प्ले एक या दूसरे रीडिंग वैल्यू में वृद्धि या कमी के अनुरूप तत्वों को भी दिखाता है। उन्हें त्रिकोण के रूप में प्रदर्शित किया जाता है। लेकिन फंक्शन कोड में परिवर्तन 45 डिग्री घुमाए गए त्रिभुजों के रूप में एक वैकल्पिक प्रदर्शन है। यदि पाठ्यांक ऊपर जाता है तो तत्व लाल है, अन्यथा नीला है।

वैसे, मुख्य तापमान का रंग और छाया तापमान के आधार पर ही बदलता है। काफी विवादास्पद निर्णय, लेकिन मेरी राय में, दृष्टिगत रूप से आरामदायक। मैं इसके साथ कुछ समय के लिए संघर्ष किया, और महसूस किया कि समारोह में मूल्य आघात, TFT डिस्प्ले ऑब्जेक्ट, गलत क्रम में सूचीबद्ध हैं। बीजीआरजगह आरजीबी. यह एक डेवलपर त्रुटि है, ठीक है, या मुझे कुछ समझ नहीं आ रहा है।

पी.एस.: सब कुछ काफी दिलचस्प है, लेकिन मेरी राय में यह और विकास का हकदार है। जो हम थोड़ी देर में करेंगे।



शेयर करना