एक स्थानीय सर्वर के साथ arduino पर एक मौसम स्टेशन बनाना। वायरलेस मौसम स्टेशन

डू-इट-खुद मौसम स्टेशन।

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

(कट के नीचे बहुत सारी तस्वीरें!)

सबसे पहले, मैं घटकों पर जाऊंगा, मैं लिंक नहीं दूंगा, क्योंकि ईबे पर सामान (मेरे खाते में) संग्रह में चला गया है। मैंने eBay पर इत्मीनान से कई घटक खरीदे। पहली बार नीलामी की कोशिश की, हमेशा "इसे अभी खरीदें" खरीदते थे। मैं क्या कह सकता हूं, यदि आप खरीदने के लिए जल्दी नहीं करते हैं, तो कुछ घटकों को सस्ता खरीदा जा सकता है (कभी-कभी अंतर दो बार होता है)।

प्रेशर सेंसर BMP085
यह मुख्य सेंसर है। जब मैंने इसे eBay पर देखा, तो मुझे एहसास हुआ कि मैं एक होम वेदर स्टेशन बनाना चाहता हूं।
सेंसर एक साधारण लिफाफे में आया, जिसे अंदर थोड़ा बुलबुला लपेटकर चिपकाया गया था।

लिफाफे के अंदर विक्रेता का व्यवसाय कार्ड और सेंसर था, जिसे एक एंटीस्टेटिक बैग में पैक किया गया था और बबल रैप की दूसरी परत में लपेटा गया था

एंटी-स्टेटिक बैग को सील कर दिया गया ताकि उड़ान के दौरान नमी सेंसर को खतरा न हो

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




सब कुछ ठीक रहेगा, लेकिन कॉन्टैक्ट्स की मार्किंग मिरर इमेज में की जाती है।
सेंसर I2C बस के माध्यम से जुड़ा हुआ है और 3.3 V द्वारा संचालित है। यानी सामान्य ऑपरेशन के लिए 4 तारों की आवश्यकता होती है (+, -, SDA, SCL)
आप सेंसर से 2 तरीकों से पूछताछ कर सकते हैं: या तो पुस्तकालय के माध्यम से, या सीधे स्केच में कार्यों का उपयोग करके।
कार्यक्रम का उदाहरण:

#शामिल

#define BMP085_ADDRESS 0x77 // BMP085 का I2C पता

कास्ट अहस्ताक्षरित चार ओएसएस = 0; // ओवरसैंपलिंग सेटिंग

// अंशांकन मान
इंट एसी1;
intac2;
इंटैक3;
अहस्ताक्षरित int ac4;
अहस्ताक्षरित int ac5;
अहस्ताक्षरित int ac6;
इंट बी1;
intb2;
इंटम्ब;
इंट एमसी;
इंटएमडी;

कम तापमान;
लंबा दबाव;

व्यर्थ व्यवस्था()
{
सीरियल.बेगिन (9600);
वायर.बेगिन ();
bmp085अंशांकन ();
}

शून्य लूप ()
{
तापमान = bmp085GetTemperature (bmp085ReadUT ());
दबाव = bmp085GetPressure (bmp085ReadUP ());
सीरियल.प्रिंट ("तापमान:");
सीरियल.प्रिंट (तापमान / 10.0, डीईसी);
सीरियल.प्रिंट्लन ("सी");
सीरियल.प्रिंट ("दबाव:");
सीरियल.प्रिंट (दबाव / 133.322, डीईसी);
Serial.println ("मिमी एचजी");
सीरियल प्रिंट्लन ();
देरी (1000);
}

शून्य bmp085अंशांकन ()
{
ac1 = bmp085ReadInt (0xAA);
ac2 = bmp085ReadInt (0xAC);
ac3 = bmp085ReadInt (0xAE);
ac4 = bmp085ReadInt (0xB0);
ac5 = bmp085ReadInt (0xB2);
ac6 = bmp085ReadInt (0xB4);
b1 = bmp085ReadInt (0xB6);
b2 = bmp085ReadInt (0xB8);
एमबी = बीएमपी085रीडइंट (0xBA);
एमसी = बीएमपी085रीडइंट (0xBC);
एमडी = बीएमपी085रीडइंट (0xBE);
}

लघु bmp085GetTemperature (अहस्ताक्षरित int ut)
{
लंबा x1, x2;
x1 = (((लंबा) यूटी - (लंबा) एसी 6) * (लंबा) एसी 5) >> 15;
x2 = ((लंबी) एमसी<< 11)/(x1 + md);
b5 = x1 + x2;

वापसी ((बी5 + 8)>>4);
}

लॉन्ग bmp085GetPressure (अहस्ताक्षरित लॉन्ग अप)
{
लंबा x1, x2, x3, b3, b6, p;
अहस्ताक्षरित लंबा बी 4, बी 7;
बी 6 = बी 5 - 4000;
// बी 3 की गणना करें
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (एसी2 * बी6)>>11;
x3 = x1 + x2;
b3 = ((((((लंबा) ac1) * 4 + x3)<>2;
// बी 4 की गणना करें
x1 = (एसी3 * बी6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (अहस्ताक्षरित लंबा) (x3 + 32768))>>15;
b7 = ((अहस्ताक्षरित लंबा) (ऊपर - b3) * (50000>> OSS));
अगर (बी7< 0x80000000)
पी = (बी7<<1)/b4;
वरना
पी = (बी7/बी4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
पी += (एक्स1 + एक्स2 + 3791)>>4;
वापसी पी;
}

// "पते" पर BMP085 से 1 बाइट पढ़ें
चार bmp085पढ़ें (अहस्ताक्षरित चार पता)
{
अहस्ताक्षरित चार डेटा;

वायर.राइट (पता);
वायर.एंडट्रांसमिशन ();
Wire.requestFrom(BMP085_ADDRESS, 1);
जबकि (! वायर। उपलब्ध ())
;
वापसी वायर.रीड ();
}

इंट bmp085ReadInt (अहस्ताक्षरित चार पता)
{
अहस्ताक्षरित चार एमएसबी, एलएसबी;
Wire.beginTransmission (BMP085_ADDRESS);
वायर.राइट (पता);
वायर.एंडट्रांसमिशन ();
Wire.requestFrom(BMP085_ADDRESS, 2);
जबकि (वायर। उपलब्ध ()<2)
;
एमएसबी = वायर.रीड ();
एलएसबी = वायर.रीड ();
वापसी (int) msb<<8 | lsb;
}

// असंबद्ध तापमान मूल्य पढ़ें
अहस्ताक्षरित int bmp085ReadUT ()
{
अहस्ताक्षरित इंट यूटी;
// 0x2E को रजिस्टर 0xF4 में लिखें
// यह एक तापमान पढ़ने का अनुरोध करता है
Wire.beginTransmission (BMP085_ADDRESS);
वायर.राइट (0xF4);
वायर.राइट (0x2E);
वायर.एंडट्रांसमिशन ();
// कम से कम 4.5ms . प्रतीक्षा करें
देरी(5);
// रजिस्टरों से दो बाइट्स पढ़ें 0xF6 और 0xF7
यूटी = बीएमपी085रीडइंट (0xF6);
वापसी;
}

// असम्पीडित दबाव मूल्य पढ़ें
अहस्ताक्षरित लंबा bmp085ReadUP ()
{
अहस्ताक्षरित चार एमएसबी, एलएसबी, एक्सएलएसबी;
अहस्ताक्षरित लंबे समय तक = 0;
// 0x34+ लिखें (ओएसएस<<6) into register 0xF4
// दबाव रीडिंग w/ ओवरसैंपलिंग सेटिंग का अनुरोध करें
Wire.beginTransmission (BMP085_ADDRESS);
वायर.राइट (0xF4);
वायर.लिखें(0x34 + (ओएसएस .)<<6));
वायर.एंडट्रांसमिशन ();
// रूपांतरण की प्रतीक्षा करें, OSS पर निर्भर विलंब समय
देरी(2 + (3 .)<// पढ़ें रजिस्टर 0xF6 (MSB), 0xF7 (LSB), और 0xF8 (XLSB)
Wire.beginTransmission (BMP085_ADDRESS);
वायर.राइट (0xF6);
वायर.एंडट्रांसमिशन ();
Wire.requestFrom(BMP085_ADDRESS, 3);
// डेटा उपलब्ध होने की प्रतीक्षा करें
जबकि (वायर। उपलब्ध ()< 3)
;
एमएसबी = वायर.रीड ();
एलएसबी = वायर.रीड ();
xlsb = वायर.रीड ();
ऊपर = (((अहस्ताक्षरित लंबा) msb<< 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-ओएसएस);
वापस आना;
}


इसके अलावा, दबाव क्षतिपूर्ति और एक altimeter के लिए सेंसर का अपना थर्मल सेंसर होता है।

अरुडिनो नैनो v3.0
यह पूरे मौसम केंद्र का दिल है। सरल शब्दों में, नियंत्रक लघु आकार में है।
खरीदा
मैं नियंत्रक के बारे में विस्तार से बात नहीं करूंगा, क्योंकि यह मेरे सामने पहले ही किया जा चुका है:


लाइटकेक के साथ पैकेज पूर्वनिर्मित था, नियंत्रक एक यूएसबी केबल के साथ एक पैकेज में आया था और एक सीलबंद एंटीस्टेटिक बैग में एक Arduino।

आकार का अनुमान लगाने के लिए, Arduino के बगल में 1 रूबल के अंकित मूल्य के साथ एक सिक्का रखें।

कंट्रोलर बोर्ड क्लोज अप



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

एलसीडी चित्रपट
डिब्बे में काम करते समय मुझे एक संगत LCD 1602 स्क्रीन मिली। मुझे कनेक्शन के साथ छेड़छाड़ करनी पड़ी, क्योंकि मुझे इसके लिए कोई डेटाशीट नहीं मिली। नतीजतन, एलसीडी अर्जित किया।

लेकिन एक छोटे से ऑपरेशन के बाद, मैंने देखा कि यह स्क्रीन मेरे लिए पर्याप्त नहीं है और मैं अधिक डेटा प्रदर्शित नहीं कर पाऊंगा, क्योंकि इसमें प्रत्येक में 16 वर्णों की केवल 2 पंक्तियाँ हैं। सबसे पहले ऐसा लगता है कि ये पैरामीटर पर्याप्त हैं, लेकिन जब आप प्रोग्रामिंग शुरू करते हैं, तो आप समझते हैं कि आप अधिकतम 3-4 पैरामीटर रट सकते हैं। और यदि आप एक मेनू बनाते हैं (मैं इस स्क्रीन पर एक मेनू बनाने के बारे में सोच रहा था), तो मापदंडों के लिए 1-2 खाली जगह बची है।
नतीजतन, मैंने दूसरी स्क्रीन की तलाश शुरू कर दी। सबसे पहले मैंने नोकिया 3310 की ग्राफिक स्क्रीन को देखा और इसे खरीदने के लिए ईबे नीलामी में भी भाग लिया, लेकिन यह कारगर नहीं हुआ (जिससे मैं बहुत खुश हूं), इसलिए मुझे यह स्क्रीन छोड़नी पड़ी। अब मैं समझता हूं कि यह मेरे उद्देश्यों के लिए बहुत छोटा होगा, क्योंकि इसमें तुलना करने के लिए कुछ है।
संयोग से Arduino पर ढाल ब्राउज़ करते समय, मैं ST7920 नियंत्रक पर 12864 ग्राफिक्स स्क्रीन पर आया। मेरी आवश्यकताओं के लिए इस स्क्रीन का सही आकार और अच्छा रिज़ॉल्यूशन है (128x64)। यानी, आप सामान्य रूप से पढ़ने योग्य फ़ॉन्ट में 20 वर्णों की 6-7 पंक्तियों को सुरक्षित रूप से रख सकते हैं। चूंकि स्क्रीन ग्राफिक है, इसलिए अलग-अलग फॉन्ट में टेक्स्ट के अलावा ग्राफिक्स भी लगाए जा सकते हैं। संक्षेप में, यह वही है जो मुझे चाहिए था, इस स्क्रीन में सब कुछ मौजूद था, इसलिए मैं इसे बर्दाश्त नहीं कर सका और आदेश दिया।
पार्सल जल्दी से आ गया और एक मानक तरीके से पैक किया गया था: एक बुलबुला लपेटो, अंदर बुलबुला लपेट की एक और परत और एक एंटीस्टेटिक बैग में एक स्क्रीन थी:






आकार का अनुमान लगाने के लिए, एलसीडी के बगल में 1 रूबल के अंकित मूल्य के साथ एक सिक्का रखें।




स्क्रीन को Arduino से जल्दी से कनेक्ट करने के लिए, मैंने LCD पिनों के लिए संपर्कों की एक पंक्ति को मिलाया। एलसीडी को सीरियल बस और समानांतर के माध्यम से जोड़ा जा सकता है। मैंने पहला विकल्प चुना, क्योंकि बहुत कम मुफ्त Arduino संपर्क हैं।
कनेक्शन (वेब ​​से लिया गया):

- पिन 1 (जीएनडी) आम बस से जुड़ा है
- पिन 2 (VCC) +5V पावर रेल से जुड़ा है, और वर्तमान खपत अपेक्षाकृत कम है और डिस्प्ले को बिल्ट-इन Arduino रेगुलेटर से संचालित किया जा सकता है।
- पिन 4, 5 और 6 Arduino डिजिटल आउटपुट से जुड़े हैं, जो SPI सीरियल इंटरफ़ेस बनाते हैं:
पिन 4 - (आरएस) - सीएस लाइन से मेल खाती है (उदाहरण के लिए 7)
पिन 5 - (आरडब्ल्यू) - एमओएसआई लाइन से मेल खाती है (उदाहरण के लिए 8)
पिन 6 - (ई) - एससीके लाइन से मेल खाती है (उदाहरण के लिए 3)
Arduino पिन नंबर कुछ भी हो सकते हैं, मुख्य बात यह है कि डिस्प्ले को इनिशियलाइज़ करते समय प्रोग्राम टेक्स्ट में बाद में उन्हें सही ढंग से इंगित करना न भूलें।
- पिन 15 (PSB) आम बस से जुड़ा है।
- पिन 19 (ए) और 20 (के) बैकलाइट पावर (क्रमशः +5वी और जीएनडी) हैं। बैकलाइट की चमक को समायोजित करने के लिए, आप पावर रेल और जीएनडी के बीच जुड़े 10kΩ परिवर्तनीय प्रतिरोधी का उपयोग कर सकते हैं। इसके इंजन के वोल्टेज को डिस्प्ले के 19 पिन करने के लिए लगाया जाता है।
इस निर्देश के अनुसार, मैंने बैकलाइट को छोड़कर सब कुछ जोड़ा। मैंने Arduino PWM को बैकलाइट पावर के रूप में इस्तेमाल किया।
एलसीडी को Arduino से प्रोग्रामेटिक रूप से कनेक्ट करने के लिए, u8glib लाइब्रेरी का उपयोग किया जाता है। आप डाउनलोड कर सकते हैं। यदि डाउनलोड की समस्या है, तो मैं पुस्तकालय को narod.ru पर अपलोड कर सकता हूं।
पुस्तकालय स्वयं जटिल नहीं है और आपको विभिन्न फोंट में पाठ प्रदर्शित करने, एक रेखा खींचने, सबसे सरल ज्यामितीय आकार (आयत, वृत्त) खींचने की अनुमति देता है, एक विशेष तरीके से तैयार की गई अपनी छवियों को प्रदर्शित करता है। सिद्धांत रूप में, यह उपकरण अधिकांश कार्यों के लिए पर्याप्त है।
यहाँ एक साधारण कार्यक्रम का परिणाम है:

कार्यक्रम ही:

#शामिल "U8glib.h"

U8GLIB_ST7920_128X64 u8g(3, 9, 8, U8G_PIN_NONE); // एसपीआई ई = 3, आरडब्ल्यू = 9, आरएस = 8

// फ्री मेमोरी निर्धारित करने के लिए सबरूटीन
इंट फ्रीराम () (
बाहरी इंट __heap_start, *__brkval;
टी वी में;
वापसी (int) और v - (__brkval == 0? (int) और__heap_start: (int) __brkval);
}

शून्य सेटअप (शून्य) (
u8g.setFont (u8g_font_6x10); // फ़ॉन्ट
u8g.setRot180 (); // स्क्रीन को पलटें
एनालॉगराइट (6, 115); // स्क्रीन की चमक सेट करें (6 पिन पर बैकलाइट एनोड)
}

शून्य लूप (शून्य) (
u8g.firstPage ();
करना(

u8g.setPrintPos(1, 12); // स्थान
u8g.print ("हैलो!!!"); // टेक्स्ट आउटपुट
u8g.drawBox(0,22,128,9); // आयत को सफेद रंग से भरें
u8g.setColorIndex(0); // सफेद स्याही, काली पृष्ठभूमि
u8g.setPrintPos(1, 30); // स्थान
u8g.print ("वर्ड ..."); // टेक्स्ट आउटपुट

U8g.setColorIndex(1); // सफेद स्याही, काली पृष्ठभूमि
u8g.setPrintPos(1, 50); // स्थान
u8g.print ("शुरुआत के बाद ="); // टेक्स्ट आउटपुट
u8g.setPrintPos(85, 50); // स्थान
u8g.प्रिंट (मिली () / 1000); // शुरू होने के बाद सेकंड की संख्या प्रिंट करें
u8g.setPrintPos(1, 64); // स्थान
u8g.प्रिंट (फ्रीराम ()); // आउटपुट कितनी मेमोरी का उपयोग किया जाता है
) जबकि (u8g.nextPage ());

देरी (200);
}

वास्तविक समय घड़ी DS1307
मेरे मौसम केंद्र के लिए एक अन्य घटक। इस शील्ड में रियल टाइम क्लॉक होती है। मैंने उन्हें eBay पर ऑर्डर किया। विक्रेता ने एक अवास्तविक रूप से बड़े बॉक्स में एक घड़ी रूमाल भेजा


बॉक्स के अंदर विज्ञापन के साथ A4 की दो शीट और सिलोफ़न में लिपटे एक घड़ी का रूमाल था


मैं यह नोट करना चाहता हूं कि शुल्क 2 रूबल के आकार से अधिक नहीं है। सिक्का, और बॉक्स आकार में 13x15x5 सेमी था।
बोर्ड एक एंटीस्टेटिक बैग में पैक किया गया था

शॉल अप क्लोज



मुझे इस मॉड्यूल के साथ छेड़छाड़ करनी पड़ी। पहले, कनेक्शन की कठिनाइयाँ थीं। और दूसरी बात, इस बोर्ड पर कोई क्वार्ट्ज नहीं है। अगर मुझे पता था कि मैं मॉड्यूल पर इतना समय बिताऊंगा, तो सबसे अधिक संभावना है कि मैंने इसे खुद इकट्ठा किया होगा, क्योंकि नेटवर्क योजनाओं से भरा है। सबसे सरल सर्किट में 4-5 घटक होते हैं।
कनेक्शन बाबत। मुझे एक पुस्तकालय मिला जिसमें कहा गया था कि I2C इंटरफ़ेस को सामान्य Arduino एनालॉग इनपुट (A4 और A5) से नहीं, बल्कि किसी भी असतत से जोड़ा जा सकता है। जैसा लिखा है वैसा ही किया। सबसे पहले, कुछ भी काम नहीं किया, एक डफ के साथ एक लंबे नृत्य के बाद, घड़ी बंद हो गई। ठीक है, मैंने सोचा, बस, समस्याएं खत्म हो गई हैं, लेकिन जब मैंने उसी मॉड्यूल को दूसरे Arduino से जोड़ने की कोशिश की, तो डफ के साथ नृत्य जारी रहा। मैंने इस समस्या के समाधान की तलाश में बहुत समय बिताया, और लगभग हर जगह यह या तो गलत कनेक्शन या SCL और SDA पिन पर पुल-अप प्रतिरोधों की अनुपस्थिति का संकेत दिया गया था। मैं पहले से ही टांका लगाने वाले लोहे के साथ बोर्ड में चढ़ना चाहता था, लेकिन एक मंच पर मैं गलती से एक कोड पर ठोकर खा गया, जहां कहा गया था कि SCL और SDA को Arduino पर मानक I2C पोर्ट से जोड़ा जाना चाहिए। मानक कनेक्शन के बाद, सब कुछ तुरंत काम कर गया।
अब क्वार्ट्ज के बारे में। मुझे नहीं पता कि चीनी वहां किस तरह के क्वार्ट्ज डालते हैं, लेकिन ऐसे क्वार्ट्ज वाली घड़ियां दिन में 10-11 सेकंड चलती हैं। यह त्रुटि प्रति माह 5 मिनट और प्रति वर्ष 1 घंटा है। आपको ऐसी घड़ी की जरूरत नहीं है। मुझे फिर से ऑनलाइन जाना पड़ा और यह देखना पड़ा कि इस बग को कैसे ठीक किया जाए। पहला समाधान जो सामने आया वह कहता है कि आपको क्वार्ट्ज को जमीन पर उतारने की जरूरत है। किया - शून्य परिणाम। मैंने कहीं और पाया कि मुझे वहां से एक पुराना मदरबोर्ड और अनसोल्डर वॉच क्वार्ट्ज खोजने की जरूरत थी। हो गया - परिणाम है। अब घड़ी 10-11 सेकेंड से नहीं, बल्कि प्रतिदिन 1.5 सेकेंड से भागती है। मान लीजिए कि यह बेहतर हो गया है, लेकिन आदर्श से बहुत दूर है। चूंकि यह टांका लगाने वाले लोहे के साथ बेला करने के लिए अधिक अनिच्छुक है, इसलिए घड़ी को प्रोग्रामेटिक रूप से समायोजित करने का निर्णय लिया गया, अर्थात, दिन में एक बार, घड़ी को वांछित मूल्य पर समायोजित करें। 10 दिनों के बाद, घड़ी एक सेकंड से अधिक नहीं चली। विधि अच्छी है, लेकिन केवल तभी जब Arduino टाइमिंग डिवाइस बिजली से जुड़ा हो, अन्यथा घड़ी बैटरी से चलती है और फिर भी भाग जाती है।
लघु परीक्षण कार्यक्रम:

#शामिल "वायर.एच"
#परिभाषित DS1307_I2C_ADDRESS 0x68 // SDA A4, SCL A5

बाइट decToBcd (बाइट वैल)
{
वापसी ((वैल/10*16) + (वैल% 10));
}

बाइट bcdToDec(बाइट मान)
{
वापसी ((वैल/16*10) + (वैल%16));
}

शून्य setDateDs1307(बाइट सेकंड, // 0-59
बाइट मिनट, // 0-59
बाइट घंटा) // 0-99
{

वायर.राइट (0);
वायर.राइट (decToBcd (सेकंड));
वायर.राइट (decToBcd (मिनट));
वायर.राइट (decToBcd (घंटा));
वायर.एंडट्रांसमिशन ();
}

शून्य getDateDs1307(बाइट *सेकंड,
बाइट*मिनट,
बाइट * घंटा)
{

Wire.beginTransmission (DS1307_I2C_ADDRESS);
वायर.राइट (0);
वायर.एंडट्रांसमिशन ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 3);

*दूसरा = bcdToDec (वायर.रीड ());
*मिनट = bcdToDec(वायर.रीड ());
* घंटा = bcdToDec (वायर.रीड ());
}

व्यर्थ व्यवस्था()
{
बाइट सेकंड, मिनट, घंटा;
वायर.बेगिन ();
सीरियल.बेगिन (9600);

दूसरा = 45;
मिनट = 5;
घंटे = 16;

SetDateDs1307 (दूसरा, मिनट, घंटा);
}

शून्य लूप ()
{
बाइट सेकंड, मिनट, घंटा;

GetDateDs1307(&सेकंड, औरमिनट, औरघंटा);
सीरियल.प्रिंट (घंटा, डीईसी);
सीरियल प्रिंट (":");
सीरियल.प्रिंट (मिनट, डीईसी);
सीरियल प्रिंट (":");
Serial.println (दूसरा, DEC);

देरी (1000);
}


यहां पुस्तकालय का उपयोग नहीं किया जाता है, और पढ़ने और लिखने के समय के लिए कार्यों को छोटा कर दिया जाता है।

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

// लाइब्रेरी कोड शामिल करें:
#शामिल
#शामिल

// वस्तुओं की घोषणा करें
डीएचटी11 डीएचटी11;
लिक्विड क्रिस्टल एलसीडी(12, 11, 6, 5, 4, 3);

#DHT11PIN 7 परिभाषित करें
इंट आई;

व्यर्थ व्यवस्था()
{
LCD.begin (16, 2);
LCD.print ("स्थिति:");
मैं = 0;
}

शून्य लूप ()
{
int chk = DHT11.read (DHT11PIN);
LCD.setCursor(8, 0);
स्विच (chk)
{
केस 0: LCD.print ("ओके"); ब्रेक;//lcd.setCursor(11, 0); एलसीडी.प्रिंट (मिली ()/2000); टूटना;
केस -1: LCD.print ("चेकसम एरर"); मेर (); टूटना;
केस -2: LCD.print ("टाइम आउट एरर"); मेर (); टूटना;
डिफ़ॉल्ट: LCD.print ("अज्ञात त्रुटि"); मेर (); टूटना;
}
देरी (500);
LCD.setCursor(15, 0);
स्विच (i)
{
केस 0: LCD.print ("^"); LCD.setCursor(15, 1); LCD.print("");ब्रेक;
केस 1: एलसीडी.प्रिंट ("वी"); LCD.setCursor(15, 1); LCD.print("");ब्रेक;
डिफ़ॉल्ट: LCD.setCursor(15, 1); एलसीडी.प्रिंट ("ई"); टूटना;
}
मैं = मैं+1;
अगर (i>1) मैं = 0;
LCD.setCursor(0, 1);
एलसीडी.प्रिंट ("एच =");
LCD.setCursor(2, 1);
LCD.प्रिंट ((फ्लोट) DHT11.humidity, 0);
LCD.setCursor(4, 1);
एलसीडी प्रिंट ("%");
LCD.setCursor (8, 1);
एलसीडी.प्रिंट ("टी =");
LCD.setCursor(10, 1);
LCD.प्रिंट ((फ्लोट) DHT11.temperature, 0);
LCD.setCursor(12, 1);
एलसीडी.प्रिंट ("सी");

शून्य एमईआरआर ()
{
LCD.setCursor(2, 1);
एलसीडी.प्रिंट ("**");
LCD.setCursor(10, 1);
एलसीडी.प्रिंट ("**");
मैं = 5;
}


सेंसर के नुकसान हैं - सेंसर से डेटा केवल पूर्णांक में है, और सीमा कमजोर है।

ऐसा लगता है कि उन्होंने सभी घटकों के बारे में लिखा था। यह सब कुछ एक पूरे में इकट्ठा करने के लिए बनी हुई है।
उफ़, लगभग भूल गया! डिवाइस को इकट्ठा करने के लिए, आपको एक केस की आवश्यकता है। मामले ने eBay पर भी आदेश दिया। विक्रेता इंग्लैंड का था। पार्सल जल्दी आ गया, लेकिन मैंने उसकी तस्वीर नहीं ली। शरीर की सभी तस्वीरें नीचे हैं।

सबसे पहले, मैंने विशेष तारों की मदद से मेज पर सब कुछ इकट्ठा किया। मैंने एक परीक्षण कार्यक्रम लिखा और इसे नियंत्रक पर अपलोड किया।



दरअसल, बैकलाइट का नीला रंग ज्यादा चमकीला होता है। न्यूनतम चमक (उज्ज्वल = 5) पर भी फ्रेम उजागर होता है।

तारों के बिना सब कुछ इकट्ठा करने के लिए, एक मिनी मदरबोर्ड बनाने का निर्णय लिया गया, और कनेक्टर्स पर Arduino बोर्ड और ढाल लगाए गए। ऐसे में इन्हें आसानी से जल्दी से हटाया जा सकता है। मैंने कनेक्टर्स पर एलसीडी स्क्रीन और कंट्रोल बटन को हुक करने का भी फैसला किया, केवल तारों पर तापमान सेंसर को मिलाप किया।
ऐसे निकला दुपट्टा



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

शील्ड और Arduino बोर्ड के साथ मदरबोर्ड स्थापित।

यह मदरबोर्ड का पूरा कनेक्शन कैसा दिखता है


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

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

यह बाहर से तेज रोशनी में ऐसा दिखता है (मैं उंगलियों के निशान के लिए क्षमा चाहता हूं, मैंने उन्हें तब देखा जब मैं तस्वीरों को छांट रहा था)।

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

बटन पैच इस तरह दिखता है:



बोर्ड इस तरह दिखता है:


यहां आप उन गाइडों को देख सकते हैं जिनमें बटन के साथ बोर्ड डाला गया है। मैंने बोर्ड को सख्त करने के लिए कुछ तत्वों को मिलाया।

अब हम सब कुछ शरीर में डाल देते हैं
बटन कनेक्ट किए बिना:


बटन कनेक्शन के साथ:

बॉक्स को बंद करें और इसे चालू करें। सब कुछ ठीक काम करता है, बटन उसी तरह काम करते हैं जैसे उन्हें करना चाहिए।

अंत में मैं अलग-अलग मोड में डिवाइस का एक छोटा वीडियो पोस्ट करता हूं:
http://www.youtube.com/watch?v=KsiVaUWkXNA&feature=youtu.be
जो लोग यहां वीडियो नहीं देखते हैं, उनके लिए यहां लिंक है

समीक्षा समाप्त करने का समय आ गया है।
मैं कार्यक्रम के बारे में थोड़ा लिखूंगा, और फिर संक्षिप्त निष्कर्ष निकालूंगा। जब मैंने प्रोग्राम लिखा था, तो मैंने नहीं सोचा था कि मैं बहुत जल्दी 30720 बाइट्स की सीमा में चला जाऊंगा।


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

अब कुछ निष्कर्ष
माइनस
1) कीमत। इस माइनस का बहाना यह है कि शौक कभी सस्ते नहीं होते।

पेशेवरों
1) डिवाइस की शानदार कार्यक्षमता
2) फ़ंक्शन विस्तार केवल उपयोग किए गए नियंत्रक और आपकी अपनी इच्छा द्वारा सीमित है
3) चिंतन और नैतिक संतुष्टि से सौंदर्य आनंद इस तथ्य से है कि मैंने फिर भी इस उपकरण को इकट्ठा किया और पूरा किया

मेरी योजना +86 . खरीदने की है पसंदीदा में जोड़े समीक्षा पसंद आई +137 +304

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

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


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

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

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

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

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

गृह मौसम स्टेशन हार्डवेयर

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


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

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

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

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


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

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

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

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

  • वीसीसी - वीसीसी (3.3 वी);
  • जीएनडी-जीएनडी;
  • एससीएल - एनालॉग पिन 5 के लिए;
  • एसडीए - एनालॉग पिन 4.
  • बहुत कम लागत
  • पावर और I/O 3-5V
  • 5% सटीकता के साथ 20-80% आर्द्रता का निर्धारण
  • तापमान का निर्धारण 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) के लिए आवश्यक); // बॉड दर (बीपीएस) सेंसर सेट करें। शुरू (); अगर (! सेंसर .getAddress (अंदर थर्मामीटर, 0)); PrintAddress (अंदर थर्मामीटर); sensor.setResolution (अंदर थर्मामीटर, 9); ) शून्य प्रिंट तापमान (DeviceAddress deviceAddress) (फ्लोट tempC = sensor.getTempC(deviceAddress); // Serial.print("Temp C:" ); //Serial.println(tempC); // int number = tempC भेजने के लिए डेटा का निर्माण; चार प्रतीक = "c"; // यह निर्धारित करने के लिए सेवा प्रतीक कि यह एक सेंसर है String strMsg = "z"; strMsg + = प्रतीक; strMsg += " "; strMsg += संख्या; strMsg += " "; चार संदेश; strMsg.toCharArray(msg, 255); vw_send ((uint8_t *) msg, strlen (msg)); vw_wait_tx (); // देरी को पूरा करने के लिए स्थानांतरण की प्रतीक्षा करें (200); ) शून्य लूप (शून्य) ( के लिए (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); } }

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

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

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

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

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

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

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

1 नोटपैड के लिए
तापमान संवेदक

DS18B20

1 नोटपैड के लिए
अवरोध

220 ओम

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

Arduino Uno

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

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

संग्रह में फ़ोल्डर की सामग्री

  • पुस्तकालयों- परियोजना पुस्तकालय। मौजूदा संस्करणों को बदलें
  • फर्मवेयर- Arduino के लिए फर्मवेयर
  • योजनाओं- घटक कनेक्शन आरेख

इसके साथ ही

  • जैसा कि प्रयोग से पता चला, मामले के बाहर तापमान संवेदक अंदर से 0.5 डिग्री कम दिखाता है! इलेक्ट्रॉनिक्स को अधिक सफलतापूर्वक व्यवस्थित करना, हीटिंग तत्वों से गर्मी को हटाना और ढालना आवश्यक है ...

  • यदि डिस्प्ले बहुत मंद/सफ़ेद है
    डिस्प्ले ड्राइवर बोर्ड पर (जिससे तार जुड़े हुए हैं) एक कंट्रास्ट नॉब है, जिसकी मदद से आप कंट्रास्ट को वांछित के साथ समायोजित कर सकते हैं। इसके अलावा, कंट्रास्ट डिस्प्ले के देखने के कोण पर निर्भर करता है (यह एलसीडी है) और आप एक स्पष्ट डिस्प्ले के लिए डिस्प्ले को एक कोण पर भी समायोजित कर सकते हैं "डिस्प्ले नाभि के स्तर पर है, हम ऊपर से देखते हैं"। और इसके विपरीत बिजली की आपूर्ति पर दृढ़ता से निर्भर करता है: 5V से, डिस्प्ले यथासंभव स्पष्ट और उज्ज्वल रूप से दिखाता है, जबकि जब Arduino के माध्यम से USB से संचालित होता है, तो वोल्टेज लगभग 4.5V होगा (इसका एक हिस्सा USB के साथ सुरक्षात्मक डायोड पर गिरता है) लाइन), और प्रदर्शन इतना उज्ज्वल नहीं दिखाता है। 5V से बाहरी बिजली की आपूर्ति के साथ एक नॉब के साथ आउटपुट को समायोजित करें!

  • यदि CO2 सेंसर सही ढंग से काम नहीं करता है (Evgeny Ivanov से infa)
    खैर, उदाहरणों में सेंसर लाइब्रेरी फ़ोल्डर में अंशांकन के लिए रेखाचित्र हैं। इसे "HD" कनेक्टर को 7+ सेकंड के लिए जमीन पर छोटा करके गूंगा भी शुरू किया जा सकता है।
    बेशक, ठंड में सड़क पर, आपको ऐसा करने की ज़रूरत नहीं है ... आप बस बोतल को एक सेंसर के साथ ताजी हवा से भर सकते हैं और इसे सील कर सकते हैं। अंशांकन में कम से कम 20 मिनट लगते हैं।
    डिफ़ॉल्ट रूप से, सेंसर को ऑटो-कैलिब्रेशन सक्षम के साथ आपूर्ति की जाती है, जो हर दिन होता है, और यदि सेंसर का उपयोग एक बिना हवादार कमरे में किया जाता है, तो यह अंशांकन जल्दी से क्षितिज से परे मान लेता है, इसलिए इसे अक्षम किया जाना चाहिए .
    दस्तावेज़ीकरण।

  • सेंसर ऑटो-अंशांकनस्केच में CO2 अक्षम है!

  • यदि आपके पास है BME280 सेंसर काम नहीं कर रहा, सबसे अधिक संभावना है कि इसका एक अलग पता है। प्रोजेक्ट Adafruit_BME280 लाइब्रेरी का उपयोग करता है, जिसमें एक अलग पता परिवर्तन फ़ंक्शन नहीं है, इसलिए पता मैन्युअल रूप से Adafruit_BME280.h लाइब्रेरी फ़ाइल में फ़ाइल की शुरुआत में लगभग सेट किया गया है ( आपके पुस्तकालय फ़ोल्डर में Adafruit_BME280 फ़ोल्डर में है, आपको इसे वहां स्थापित करना चाहिए था), मेरे मॉड्यूल का पता 0x76 था। मैं अपने BME280 मॉड्यूल के पते का पता कैसे लगा सकता हूँ? एक विशेष स्केच है जिसे i2c स्कैनर कहा जाता है। आप इसे गूगल कर सकते हैं, आप कर सकते हैं। इस स्केच को फ्लैश करें, पोर्ट खोलें और i2c बस से जुड़े उपकरणों के पते की एक सूची प्राप्त करें। ताकि अन्य मॉड्यूल आपको परेशान न करें, आप उन्हें बंद कर सकते हैं और केवल BME280 छोड़ सकते हैं। हम पुस्तकालय में प्राप्त पते को निर्दिष्ट करते हैं, फ़ाइल को सहेजते हैं और मौसम घड़ी फर्मवेयर लोड करते हैं। हर चीज़!

  • अगर घड़ी पीछे है, पावर सर्किट में समस्या सबसे अधिक होने की संभावना है। यदि बिजली की आपूर्ति को बेहतर में बदलते समय समस्या बनी रहती है, तो आरटीसी मॉड्यूल को बिजली देने के लिए एक संधारित्र लटकाएं (बोर्ड पर सीधे वीसीसी और जीएनडी को मिलाप): आवश्यक रूप से सिरेमिक, 0.1-1 यूएफ (103 या 104 अंकन, अंकन तालिका देखें) ) आप इलेक्ट्रोलाइट भी डाल सकते हैं (6.3V, 47-100 uF)

फर्मवेयर सेटिंग्स

#define RESET_CLOCK 0 // फर्मवेयर लोड होने के दौरान घड़ी को रीसेट करें (नॉन-रिमूवेबल बैटरी वाले मॉड्यूल के लिए)। 0 डालना और फिर से फ्लैश करना न भूलें! #define SENS_TIME 30000 // स्क्रीन पर सेंसर रीडिंग का रिफ्रेश टाइम, मिलीसेकंड #define LED_MODE 0 // RGB LED टाइप: 0 - मेन कैथोड, 1 - मेन एनोड #define LED_BRIGHT 255 // CO2 LED ब्राइटनेस (0 - 255) # परिभाषित करें BLUE_YELLOW 1 // नीले के बजाय पीला रंग (1 हाँ, 0 नहीं) लेकिन कनेक्शन सुविधाओं के कारण पीला इतना चमकीला नहीं है #define DISP_MODE 1 // ऊपरी दाएं कोने में प्रदर्शित करें: 0 - वर्ष, सप्ताह का 1 - दिन , 2 - सेकंड #define WEEK_LANG 1 // सप्ताह के दिन की भाषा: 0 - अंग्रेजी, 1 - रूसी (लिप्यंतरित) #define DEBUG 0 // स्टार्टअप पर सेंसर इनिशियलाइज़ेशन लॉग प्रदर्शित करें #define PRESSURE 1 // 0 - दबाव ग्राफ, 1 - वर्षा पूर्वानुमान ग्राफ (दबाव के बजाय)। चार्ट की सीमाएं निर्धारित करना न भूलें // ग्राफ़ के लिए प्रदर्शन सीमाएं # TEMP_MIN 15 को परिभाषित करें #TEMP_MAX 35 को परिभाषित करें #HUM_MIN 0 को परिभाषित करें #HUM_MAX 100 को परिभाषित करें #PRESS_MIN -100 को परिभाषित करें #PRESS_MAX 100 को परिभाषित करें #CO2_MIN 300 को परिभाषित करें #CO2_MAX 2000 को परिभाषित करें

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



चूंकि यहां मौसम की स्थिति काफी परिवर्तनशील है, और तापमान 30-40 डिग्री सेल्सियस की सीमा में उतार-चढ़ाव करता है, इसलिए मैंने एक घरेलू मौसम स्टेशन बनाने का फैसला किया।

होम वेदर स्टेशन के क्या कार्य हैं?
डिस्प्ले के साथ एक Arduino वेदर स्टेशन एक ऐसा उपकरण है जो विभिन्न प्रकार के सेंसर का उपयोग करके मौसम और पर्यावरण की स्थिति पर डेटा एकत्र करता है।

आमतौर पर ये निम्नलिखित सेंसर होते हैं:

  • हवा
  • नमी
  • वर्षा
  • तापमान
  • दबाव
  • ऊंचाइयों

मेरा लक्ष्य अपने हाथों से पोर्टेबल डेस्कटॉप मौसम स्टेशन बनाना है।

यह निम्नलिखित मापदंडों को परिभाषित करने में सक्षम होना चाहिए:

  • तापमान
  • नमी
  • दबाव
  • कद

चरण 1: सही घटक खरीदें







  • DHT22, तापमान और आर्द्रता सेंसर।
  • BMP180, प्रेशर सेंसर।
  • मिलाप
  • सिंगल रो कनेक्टर 40 आउटपुट

उपकरण से आपको आवश्यकता होगी:

  • सोल्डरिंग आयरन
  • नाक पैड सरौता
  • तारों

चरण 2: DHT22 तापमान और आर्द्रता सेंसर







तापमान मापने के लिए विभिन्न सेंसर का उपयोग किया जाता है। DHT22, DHT11, SHT1x लोकप्रिय हैं

मैं समझाऊंगा कि वे एक दूसरे से कैसे भिन्न हैं, और मैंने DHT22 का उपयोग क्यों किया।

AM2302 सेंसर एक डिजिटल सिग्नल का उपयोग करता है। यह सेंसर यूनिक कोडिंग सिस्टम और सेंसर टेक्नोलॉजी पर काम करता है, इसलिए इसका डेटा विश्वसनीय होता है। इसका सेंसर तत्व 8-बिट सिंगल-चिप कंप्यूटर से जुड़ा है।

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

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

आइए तीन सेंसर मॉडल के पेशेवरों और विपक्षों को देखें।

DHT11

पेशेवरों: सोल्डरिंग की आवश्यकता नहीं है, तीन मॉडलों में सबसे सस्ता, तेज स्थिर सिग्नल, 20 मीटर से अधिक की सीमा, मजबूत हस्तक्षेप।
विपक्ष: पुस्तकालय! कोई रिज़ॉल्यूशन विकल्प नहीं, तापमान माप त्रुटि +/- 2°С, सापेक्ष आर्द्रता स्तर माप त्रुटि +/- 5%, मापा तापमान की अपर्याप्त सीमा (0-50°С)।
अनुप्रयोग: बागवानी, कृषि।

DHT22

पेशेवरों: सोल्डरिंग, कम लागत, चिकनी वक्र, छोटी माप त्रुटियों, बड़ी माप सीमा, 20 मीटर से अधिक की सीमा, मजबूत हस्तक्षेप की आवश्यकता नहीं है।
विपक्ष: संवेदनशीलता अधिक हो सकती है, तापमान परिवर्तन की धीमी ट्रैकिंग, पुस्तकालय की आवश्यकता है।
अनुप्रयोग: पर्यावरण अध्ययन।

SHT1x

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

मिश्रण

  • वीसीसी - 5वी या 3.3वी
  • Gnd - Gnd . के साथ
  • डेटा - दूसरे Arduino पिन के लिए

चरण 3: BMP180 प्रेशर सेंसर



BMP180 I2C इंटरफेस के साथ एक बैरोमीटर का वायुमंडलीय दबाव सेंसर है।
बैरोमेट्रिक प्रेशर सेंसर परिवेशी वायु के निरपेक्ष मान को मापते हैं। यह संकेतक विशिष्ट मौसम की स्थिति और समुद्र तल से ऊंचाई पर निर्भर करता है।

BMP180 मॉड्यूल में 3.3V 662k ओम रेगुलेटर था, जिसे मैंने अपनी मूर्खता से गलती से उड़ा दिया। मुझे सीधे चिप पर पावर स्ट्रोक करना था।

स्टेबलाइजर की कमी के कारण, मैं एक शक्ति स्रोत चुनने में सीमित हूं - 3.3V से ऊपर के वोल्टेज सेंसर को नष्ट कर देंगे।
अन्य मॉडलों में स्टेबलाइजर नहीं हो सकता है, इसकी जांच अवश्य करें।

Arduino (नैनो या uno) के साथ सेंसर और I2C बस का कनेक्शन आरेख

  • एसडीए-ए4
  • एससीएल-ए5
  • वीसीसी - 3.3V
  • जीएनडी-जीएनडी

आइए दबाव के बारे में थोड़ी बात करें, और यह तापमान और ऊंचाई से कैसे संबंधित है।

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

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

ऊंचाई के साथ वायुमंडलीय दबाव भी बदलता है। एवरेस्ट के आधार शिविर (समुद्र तल से 5400 मीटर ऊपर) पर पूर्ण दबाव दिल्ली के पूर्ण दबाव (समुद्र तल से 216 मीटर) से कम है।

चूंकि प्रत्येक स्थान पर पूर्ण दबाव रीडिंग अलग-अलग होती है, इसलिए हम सापेक्ष दबाव, या समुद्र स्तर के दबाव का उल्लेख करेंगे।

ऊंचाई माप

समुद्र तल पर औसत दबाव 1013.25 GPa (या मिलीबार) है। यदि आप वायुमंडल से ऊपर उठते हैं, तो यह मान गिरकर शून्य हो जाएगा। इस गिरावट का वक्र काफी समझ में आता है, इसलिए आप निम्न समीकरण का उपयोग करके स्वयं ऊंचाई की गणना कर सकते हैं: alti=44330*

यदि आप 1013.25 GPa के समुद्र तल के दबाव को p0 के रूप में लेते हैं, तो समीकरण का समाधान आपकी वर्तमान ऊंचाई है।

एहतियाती उपाय

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

गर्मी से बचाएं। दबाव मापने के लिए सटीक तापमान रीडिंग की आवश्यकता होती है। सेंसर को तापमान के उतार-चढ़ाव से बचाने की कोशिश करें और इसे उच्च तापमान के स्रोतों के पास न छोड़ें।

नमी से बचाएं। BMP180 सेंसर नमी के स्तर के प्रति संवेदनशील है, सेंसर पर पानी की संभावित घुसपैठ को रोकने की कोशिश करें।

सेंसर को अंधा मत करो। आश्चर्य की बात यह थी कि सेंसर में प्रकाश के प्रति सिलिकॉन की संवेदनशीलता थी, जो चिप कवर में एक छेद के माध्यम से उस पर गिर सकता है। सबसे सटीक माप के लिए, सेंसर को परिवेशी प्रकाश से बचाने का प्रयास करें।

चरण 4: डिवाइस को असेंबल करना







Arduino नैनो के लिए एकल-पंक्ति कनेक्टर स्थापित करना। मूल रूप से, हमने उन्हें आकार में काट दिया और उन्हें थोड़ा सा रेत दिया ताकि वे ऐसे दिखें जैसे वे थे। फिर हम उन्हें मिलाप करते हैं। इसके बाद, हम DHT22 सेंसर के लिए सिंगल-पंक्ति कनेक्टर स्थापित करते हैं।

डेटा आउटपुट से ग्राउंड (Gnd) तक 10kΩ रेसिस्टर स्थापित करें। हम सब कुछ मिलाप करते हैं।
फिर, उसी तरह, हम BMP180 सेंसर के लिए सिंगल-पंक्ति कनेक्टर स्थापित करते हैं, हम बिजली की आपूर्ति 3.3V करते हैं। हम सब कुछ I2C बस से जोड़ते हैं।

अंत में, हम LCD डिस्प्ले को BMP180 सेंसर के समान I2C बस से कनेक्ट करते हैं।
(मैं बाद में एक आरटीसी मॉड्यूल (रीयल टाइम क्लॉक) को चौथे कनेक्टर से जोड़ने की योजना बना रहा हूं ताकि डिवाइस भी समय दिखाए)।

चरण 5: कोडिंग




पुस्तकालय डाउनलोड करें

Arduino पर लाइब्रेरी स्थापित करने के लिए, लिंक का अनुसरण करें

#शामिल
#शामिल करें #शामिल करें #शामिल करें "डीएचटी.एच" #शामिल करें

SFE_BMP180 दबाव;

#define ALTITUDE 20.56 #define I2C_ADDR 0x27 //<<- Add your address here. #define Rs_pin 0 #define Rw_pin 1 #define En_pin 2 #define BACKLIGHT_PIN 3 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7

#define DHTPIN 2 // हम किस डिजिटल पिन से "कनेक्टेड हैं

// आप जिस भी प्रकार का उपयोग कर रहे हैं, उसे रद्द करें! //# DHTTYPE DHT11 // DHT 11 को परिभाषित करें, DHTTYPE DHT22 को परिभाषित करें // DHT 22 (AM2302), AM2321 DHT dht (DHTPIN, DHTTYPE); लिक्विड क्रिस्टल_I2C एलसीडी (I2C_ADDR, En_pin, Rw_pin, रुपये_पिन,डी4_पिन,डी5_पिन,डी6_पिन,डी7_पिन);फ्लोट टी1,टी2;

शून्य सेटअप () (सीरियल.बेगिन (9600); LCD.begin (16,2); //<<-- our LCD is a 20x4, change for your LCD if needed // LCD Backlight ON lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home on LCD lcd.print("Weather Station"); delay(5000); dht.begin(); pressure.begin(); } void loop() { char status; double T,P,p0,a; status = pressure.startTemperature(); if (status != 0) { delay(status);

स्थिति = दबाव। प्राप्त तापमान (टी); अगर (स्थिति! = 0) ( सीरियल.प्रिंट ("1"); LCD.clear (); LCD.setCursor (0,0); LCD.प्रिंट ("बारो तापमान:"); LCD.setCursor (0,1 ); एलसीडी.प्रिंट (टी, 2); एलसीडी.प्रिंट ("डिग्री सी"); टी 1 = टी; देरी (3000);

स्थिति = दबाव। स्टार्टप्रेशर (3); अगर (स्थिति! = 0) (// माप पूरा होने की प्रतीक्षा करें: देरी (स्थिति);

स्थिति = दबाव। दबाव प्राप्त करें (पी, टी); अगर (स्थिति! = 0) (lcd.clear (); LCD.setCursor (0,0); LCD.print ("abslt दबाव:"); LCD.setCursor (0,1); LCD.प्रिंट (P, 2 ); एलसीडी.प्रिंट ("एमबी"); देरी (3000);

p0 = दबाव। समुद्री स्तर (P, ALTITUDE); // हम "1655 मीटर (बोल्डर, सीओ) पर फिर से

ए = दबाव। ऊंचाई (पी, पी 0); एलसीडी.क्लियर (); LCD.setCursor(0,0); LCD.print ("ऊंचाई:"); एलसीडी.सेट कर्सर (0,1); एलसीडी.प्रिंट (ए, 0); LCD.print ("मीटर"); देरी (3000); ) ) ) ) फ्लोट एच = dht.readHumidity (); // तापमान को सेल्सियस के रूप में पढ़ें (डिफ़ॉल्ट) फ्लोट टी = dht.readTemperature (); टी 2 = टी; एलसीडी.क्लियर (); LCD.setCursor(0,0); // दूसरी पंक्ति के LCD.print ("आर्द्रता:") की शुरुआत पर जाएं; LCD.setCursor(0,1);lcd.print(h); एलसीडी.प्रिंट ("%"); देरी (3000); एलसीडी.क्लियर (); LCD.setCursor(0,0); // दूसरी लाइन एलसीडी की शुरुआत पर जाएं। प्रिंट ("डीएचटी टेम्परेचर:"); एलसीडी.सेट कर्सर (0,1); एलसीडी प्रिंट (टी); एलसीडी.प्रिंट ("डीजीसी"); देरी (3000); एलसीडी.क्लियर (); LCD.setCursor(0,0); // दूसरी पंक्ति के LCD.print ("मीन टेंपरेचर:") की शुरुआत पर जाएं; एलसीडी.सेट कर्सर (0,1); LCD.प्रिंट ((t1+t2)/2); एलसीडी.प्रिंट ("डीजीसी"); देरी (3000); )

मैंने Arduino संस्करण 1.6.5 का उपयोग किया, कोड बिल्कुल फिट बैठता है, बाद में भी काम कर सकते हैं। यदि किसी कारण से कोड फिट नहीं होता है, तो आधार के रूप में संस्करण 1.6.5 का उपयोग करें।

मौसम देखना एक बहुत ही रोमांचक गतिविधि है। मैंने लोकप्रिय के आधार पर अपना मौसम स्टेशन बनाने का फैसला किया .

मौसम स्टेशन प्रोटोटाइप इस तरह दिखता है:

मेरे मौसम स्टेशन के कार्य:

  • कमरे और बाहरी तापमान का मापन और प्रदर्शन;
  • वर्तमान समय (घंटे और मिनट) का प्रदर्शन;
  • चंद्रमा और चंद्र दिवस के वर्तमान चरणों का प्रदर्शन;
  • एक सीरियल कनेक्शन के माध्यम से माप परिणामों को कंप्यूटर में स्थानांतरित करना;
  • प्रोटोकॉल द्वारा माप परिणामों का संचरण एमक्यूटीटीकंप्यूटर पर एप्लिकेशन का उपयोग करना।


हेक्स
-फ़ाइल
फर्मवेयर के लिए (संस्करण दिनांक 9 मई, 2018) - .
कैसे फ्लैश करें हेक्सबोर्ड के लिए फाइल अरुडिनोमैंने वर्णन किया है।

माइक्रोकंट्रोलर Arduino नैनो 3.0

मेरे मौसम केंद्र का "दिल" माइक्रोकंट्रोलर है EBAY):

सेंसर के संकेत और पूछताछ को नियंत्रित करने के लिए, मैं टाइमर 1 . का उपयोग करता हूं अरुडिनो, 200 हर्ट्ज (अवधि - 5 एमएस) की आवृत्ति के साथ रुकावट पैदा करता है।

सूचक

सेंसर की मापी गई रीडिंग और वर्तमान समय को प्रदर्शित करने के लिए, मैंने से कनेक्ट किया अरुडिनोचार अंकों का एलईडी संकेतक फोरयार्ड FYQ-5643BHसामान्य एनोड के साथ (सभी डिस्चार्ज के समान खंडों के एनोड संयुक्त होते हैं)।
संकेतक में चार सात-खंड अंक और दो अलग (घंटे) बिंदु होते हैं:

संकेतक के एनोड वर्तमान-सीमित प्रतिरोधों के माध्यम से टर्मिनलों से जुड़े होते हैं अरुडिनो:

स्राव होना 1 2 3 4
निष्कर्ष ए3 ए2 डी3 डी9

पिंस से जुड़े कैथोड खंड अरुडिनो:

खंड एक बी सी डी एफ जी पी
निष्कर्ष डी7 डी12 डी4 डी5 डी6 डी11 डी8 डी13

यदि संबंधित डिस्चार्ज के एनोड में कैथोड पर उच्च क्षमता (1) और कम क्षमता (0) है, तो संकेतक का खंड रोशनी करता है।

मैं संकेतक पर जानकारी प्रदर्शित करने के लिए गतिशील संकेत का उपयोग करता हूं - एक समय में केवल एक बिट सक्रिय होता है। सक्रिय निर्वहन 200 हर्ट्ज (प्रदर्शन अवधि 5 एमएस) की आवृत्ति पर वैकल्पिक होता है। इसी समय, खंडों की झिलमिलाहट आंखों के लिए अगोचर है।

तापमान संवेदक DS18x20

दूरस्थ तापमान माप की संभावना के लिए, मैंने एक सेंसर कनेक्ट किया , जो बाहरी तापमान माप की एक विस्तृत श्रृंखला प्रदान करता है। सेंसर बस से जुड़ा है 1 तारऔर इसके तीन आउटपुट हैं - पावर ( वीसीसी), जानकारी ( डैट), धरती ( जीएनडी):

सेंसर आउटपुट वीसीसी डैट जीएनडी
निष्कर्ष अरुडिनो 5वी ए 1 जीएनडी

पिन के बीच वीसीसीतथा डैटमैंने 4.7k ओम पुल-अप रोकनेवाला शामिल किया।

डिग्री सेल्सियस और फारेनहाइट के बीच कनवर्ट करने के लिए, आप निम्न प्लेट का उपयोग कर सकते हैं:

मैंने सेंसर को बॉलपॉइंट पेन से प्लास्टिक के मामले में घर की खिड़की के बाहर रखा:

\

पेशेवर मौसम केंद्र थर्मामीटर को सीधे धूप से बचाने और हवा को प्रसारित करने की अनुमति देने के लिए स्टीवेन्सन स्क्रीन का उपयोग करते हैं। स्टीवेन्सन स्क्रीन):

दबाव और तापमान सेंसर BMP280

पारा और एरोइड बैरोमीटर पारंपरिक रूप से वायुमंडलीय दबाव को मापने के लिए उपयोग किए जाते हैं।

पर पारा बैरोमीटरवायुमंडलीय दबाव पारा स्तंभ के वजन से संतुलित होता है, जिसकी ऊंचाई दबाव को मापने के लिए उपयोग की जाती है:

पर एरोइड बैरोमीटरवायुमंडलीय दबाव में बॉक्स के संपीड़न और खिंचाव का उपयोग किया जाता है:

अपने होम वेदर स्टेशन में वायुमंडलीय दबाव और कमरे के तापमान को मापने के लिए, मैं एक सेंसर का उपयोग करता हूँ - छोटा एसएमडी- पीजोरेसिस्टिव तकनीक पर आधारित 2 x 2.5 मिमी सेंसर:

बाज़ार से सेंसर वाला रूमाल ख़रीदा गया EBAY:

सेंसर बस से जुड़ा है I2C(डेटा संपर्क - एसडीए/एसडीआई, सिंक पिन - एससीएल/एससीके):

सेंसर आउटपुट वीसीसी जीएनडी एसडीआई एससीके
निष्कर्ष अरुडिनो 3वी3 जीएनडी ए4 ए5

Adafruit- फ़ाइलें Adafruit_Sensor.h, Adafruit_BMP280.h, Adafruit_BMP280.cpp.

वायुमंडलीय दबाव इकाइयाँ

समारोह के माध्यम से सेंसर पढ़ें दबावपास्कल में वायुमंडलीय दबाव का मान देता है। वायुमंडलीय दाब मापने की मूल इकाई है हेक्टोपास्कल(एचपीए) (1 एचपीए = 100 पा), जिसका एनालॉग ऑफ-सिस्टम यूनिट है" मिलीबार" (एमबार) (1 एमबार = 100 पीए = 1 एचपीए)। आमतौर पर इस्तेमाल की जाने वाली गैर-प्रणालीगत दबाव इकाई के बीच कनवर्ट करने के लिए " पारा का मिलीमीटर"(मिमी एचजी) और हेक्टोपास्कल, निम्नलिखित अनुपातों का उपयोग किया जाता है:
1 एचपीए = 0.75006 एमएमएचजी कला। ≈ 3/4 मिमी एचजी; 1 मिमीएचजी = 1.3332 एचपीए ≈ 4/3 एचपीए।

समुद्र तल से ऊंचाई पर वायुमंडलीय दबाव की निर्भरता

वायुमंडलीय दबाव को निरपेक्ष और सापेक्ष दोनों रूपों में दर्शाया जा सकता है।
काफी दबाव क्यूएफई(अंग्रेज़ी) काफी दबाव) समुद्र तल से ऊपर सुधार को ध्यान में रखे बिना वास्तविक वायुमंडलीय दबाव है।
1 मीटर की ऊंचाई में वृद्धि के साथ वायुमंडलीय दबाव लगभग 1 hPa कम हो जाता है:

बैरोमीटर का सूत्र आपको सापेक्ष दबाव (mmHg में) प्राप्त करने के लिए बैरोमीटर रीडिंग के सुधार को निर्धारित करने की अनुमति देता है:
$\Delta P = 760 \cdot (1 - (1 \over (10^ ( (0.0081350 \cdot H) \over (T + 0.00178308 \cdot H)))))$,
जहां $T$ रैंकिन पैमाने पर औसत हवा का तापमान है, ° आरए, $H$ - समुद्र तल से ऊँचाई, पैर।
डिग्री सेल्सियस को डिग्री रैंकिन में परिवर्तित करना:
$^(\circ)Ra = (^(\circ)C \cdot 1.8) + 491.67$
बैरोमीटर के सूत्र का उपयोग बैरोमीटर के समतलन के लिए किया जाता है - ऊँचाई का निर्धारण (0.1 - 0.5% की त्रुटि के साथ)। सूत्र हवा की आर्द्रता और ऊंचाई के साथ मुक्त गिरावट के त्वरण में परिवर्तन को ध्यान में नहीं रखता है। छोटे ऊंचाई के अंतर के लिए, इस घातीय निर्भरता को एक रैखिक निर्भरता द्वारा पर्याप्त सटीकता के साथ अनुमानित किया जा सकता है।
सापेक्ष दबाव क्यूएनएच(अंग्रेज़ी) सापेक्ष दबाव, क्यू-कोड समुद्री ऊंचाई) औसत समुद्र तल के लिए समायोजित वायुमंडलीय दबाव है। औसत समुद्र तल, एम एस एल) (के लिये एक हैऔर 15 डिग्री सेल्सियस का तापमान), और शुरू में उस ऊंचाई को ध्यान में रखते हुए निर्धारित किया जाता है जिस पर मौसम स्टेशन स्थित है। यह मौसम सेवा के डेटा, सार्वजनिक स्थानों पर कैलिब्रेटेड उपकरणों की रीडिंग, हवाई अड्डे (रिपोर्ट से) से पाया जा सकता है METAR), इंटरनेट से।
उदाहरण के लिए, पास के गोमेल हवाई अड्डे के लिए ( यूएमजीजी) मैं वास्तविक मौसम रिपोर्ट देख सकता हूँ METAR ru.allmetsat.com/metar-taf/russia.php?icao=UMGG पर:
UMGG 191800Z 16003MPS CAVOK M06/M15 Q1014 R28/CLRD//NOSIG ,
कहाँ पे Q1014- दबाव क्यूएनएचहवाई अड्डे पर 1014 hPa है।
बुलेटिन का इतिहास METARविमानन wxchartsarchive.com/product/metar से उपलब्ध है।
सामान्य सापेक्ष वायुदाब के लिए क्यूएनएच 760 मिमी एचजी का दबाव स्वीकार किया जाता है। कला। या 1013.25 hPa (0ºС के तापमान पर, उत्तरी या दक्षिणी गोलार्ध के 45º अक्षांश के नीचे)।
मैंने एरोइड बैरोमीटर के लिए दबाव निर्धारित किया है क्यूएनएचसंवेदनशीलता समायोजन पेंच के साथ:

मौसम पूर्वानुमान

दबाव परिवर्तन का विश्लेषण आपको मौसम पूर्वानुमान बनाने की अनुमति देता है, और इसकी सटीकता जितनी अधिक होती है, उतना ही अचानक दबाव बदल जाता है। उदाहरण के लिए, एक पुराने नाविक के अंगूठे का नियम यह है कि 8 घंटे की अवधि में 10 hPa (7.5 mmHg) के दबाव में गिरावट का मतलब है कि तेज हवाएं चल रही हैं।

हवा कहाँ से आती है? हवा कम दबाव वाले क्षेत्र के केंद्र में बहती है, हवा- उच्च दबाव वाले क्षेत्रों से कम दबाव वाले क्षेत्रों में हवा की क्षैतिज गति (उच्च वायुमंडलीय दबाव वायु द्रव्यमान को निम्न वायुमंडलीय दबाव के क्षेत्रों में निचोड़ता है)। यदि दबाव बहुत कम है, तो हवा पहुंच सकती है आंधी. साथ ही क्षेत्र में कम किया हुआदबाव (बैरिक डिप्रेशन या चक्रवात), गर्म हवा ऊपर उठती है और बादल बनाती है, जो अक्सर लाती है वर्षाया बर्फ.

मौसम विज्ञान में हवा की दिशा वह दिशा है जिससे हवा बह रही है:

यह दिशा घटाकर आठ अंक कर दी गई है।

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

आर्द्रता संवेदक

हवा की सापेक्ष आर्द्रता निर्धारित करने के लिए, मैं मॉड्यूल का उपयोग करता हूं DHT11(बाजार से खरीदा गया EBAY):

आर्द्रता संवेदक DHT11तीन आउटपुट हैं - पावर ( + ), जानकारी ( बाहर), धरती ( - ):

सेंसर आउटपुट + बाहर -
निष्कर्ष अरुडिनो 5वी डी10 जीएनडी

सेंसर के साथ काम करने के लिए, मैं पुस्तकालय का उपयोग करता हूं Adafruit- फ़ाइलें डीएचटी.एच, डीएचटी.सीपीपी.

आर्द्रता हवा में निहित जल वाष्प की मात्रा की विशेषता है। सापेक्षिक आर्द्रतावर्तमान तापमान पर अधिकतम संभव मात्रा के संबंध में हवा में नमी का अनुपात (प्रतिशत के रूप में) दिखाता है। सापेक्षिक आर्द्रता मापने के लिए उपयोग किया जाता है :

एक व्यक्ति के लिए, वायु आर्द्रता की इष्टतम सीमा 40 ... 60% है।

वास्तविक समय घड़ी

एक वास्तविक समय घड़ी के रूप में, मैंने मॉड्यूल लागू किया आरटीसी DS1302(एक घड़ी के साथ एक रूमाल बाज़ार से खरीदा गया था EBAY):

मापांक DS1302बस से जुड़ा 3 तार. के साथ इस मॉड्यूल का उपयोग करने के लिए अरुडिनोपुस्तकालय विकसित arduino_RTC(से arduino.com).

मॉड्यूल के साथ बोर्ड DS1302पांच पिन हैं जिन्हें मैंने बोर्ड के पिन से जोड़ा है अरुडिनो नैनो:

निष्कर्ष आरटीसी वीसीसी जीएनडी आरएसटी सीएलके डैट
निष्कर्ष अरुडिनो 5वी जीएनडी डी2 डी1 डी0

बिजली बंद होने पर घड़ी की सही रीडिंग रखने के लिए, मैंने बोर्ड पर सॉकेट में एक बैटरी डाली। सीआर2032.

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

कंप्यूटर पर डेटा स्थानांतरित करना और MQTT प्रोटोकॉल के माध्यम से काम करना

सीरियल कनेक्शन के माध्यम से डेटा स्थानांतरित करने के लिए अरुडिनोजोड़ता है यु एस बी-यूएआरटीकनवर्टर:

निष्कर्ष अरुडिनोप्रारूप में डेटा स्थानांतरित करने के लिए उपयोग किया जाता है 8एन1(8 डेटा बिट्स, नो पैरिटी, 1 स्टॉप बिट) 9600 बीपीएस पर। डेटा पैकेट में प्रेषित होता है, और पैकेट की लंबाई 4 वर्ण होती है। डेटा ट्रांसफर "में किया जाता है" बिट बैंग"मोड, हार्डवेयर सीरियल पोर्ट का उपयोग किए बिना अरुडिनो.

प्रेषित डेटा का प्रारूप:

पैरामीटर पहला बाइट दूसरा बाइट तीसरा बाइट चौथा बाइट
बाहरी तापमान हे स्पेस या माइनस दसियों डिग्री या स्थान डिग्री की इकाइयाँ
कमरे का तापमान मैं स्पेस या माइनस दसियों डिग्री या स्थान डिग्री की इकाइयाँ
वायुमंडलीय दबाव पी सैकड़ों मिमी कला। मिमी एचजी . के दसियों इकाइयाँ mmHg साथ।
सापेक्षिक आर्द्रता एच अंतरिक्ष दसियों प्रतिशत या स्थान प्रतिशत इकाइयाँ
वर्तमान समय दर्जनों घंटे घंटे इकाई दसियों मिनट मिनट की इकाइयाँ

एमक्यूटीटी

गोलंगआवेदन - प्रोटोकॉल क्लाइंट एमक्यूटीटी, जो मौसम स्टेशन से प्राप्त जानकारी को सर्वर पर भेजता है ( एमक्यूटीटी-दलाल) :

सेवा आपको एक मुफ्त योजना के साथ एक खाता बनाने की अनुमति देता है " "(सीमा: 10 कनेक्शन, 10 केबीपीएस):

मौसम केंद्र की रीडिंग की निगरानी के लिए, आप उपयोग कर सकते हैं एंड्रॉयड-अनुबंध :

भोजन

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

आप संपर्कों से कनेक्टेड पावर के लिए 9 वी की बैटरी का भी उपयोग कर सकते हैं विन(+) और जीएनडी (-).

मौसम स्टेशन संचालन

स्टार्टअप पर, सेंसर को इनिशियलाइज़ और चेक किया जाता है।

सेंसर के अभाव में डीएस18x20यदि कोई सेंसर नहीं है, तो त्रुटि "E1" जारी की जाती है - त्रुटि "ई 3"।

फिर मौसम स्टेशन का कार्य चक्र शुरू होता है:

  • बाहरी तापमान का मापन और प्रदर्शन;
  • कमरे के तापमान का मापन और प्रदर्शन;
  • वायुमंडलीय दबाव का माप और प्रदर्शन और इसके परिवर्तन की प्रवृत्ति;
  • सापेक्ष वायु आर्द्रता का मापन और प्रदर्शन;
  • वर्तमान समय का प्रदर्शन;
  • चंद्रमा के चरण और चंद्र दिवस का प्रदर्शन।


मेरे मौसम केंद्र का एक वीडियो my . पर उपलब्ध है -चैनल: https://youtu.be/vVLbirO-FVU

तापमान प्रदर्शन

तापमान को मापते समय, तापमान के दो अंक प्रदर्शित होते हैं और एक नकारात्मक तापमान के लिए, एक ऋण चिह्न (सबसे दाहिने अंक में एक डिग्री प्रतीक के साथ);
बाहरी तापमान के लिए, डिग्री चिह्न शीर्ष पर प्रदर्शित होता है:


कमरे के तापमान के लिए - नीचे:

दबाव प्रदर्शन

दबाव मापते समय, दबाव के तीन अंक एमएमएचजी में प्रदर्शित होते हैं (प्रतीक के साथ " पी"सबसे सही अंक में):

यदि दबाव तेजी से गिरा, तो प्रतीक के बजाय " पी"कैरेक्टर" सबसे दाहिने अंक में प्रदर्शित होता है ली"अगर यह तेजी से बढ़ा है - तो" एच"। परिवर्तन की तीक्ष्णता की कसौटी 8 घंटे में 8 मिमी एचजी है:

चूंकि मेरा मौसम केंद्र पूर्ण दबाव प्रदर्शित करता है ( क्यूएफई), तो सारांश में दी गई जानकारी की तुलना में रीडिंग को कुछ हद तक कम करके आंका जाता है METAR(जो प्रदान करता है क्यूएनएच) (14 यूटीसी मार्च 28, 2018):

दबाव अनुपात ( . के अनुसार) एटीआई) $(1015 \998 से अधिक) = $1.017 था। गोमेल हवाई अड्डे की ऊंचाई (आईसीएओ कोड .) यूएमजीजी) समुद्र तल से ऊपर 143.6 मीटर है एटीआईएस के अनुसार तापमान 1 ° . था सी.

मेरे मौसम केंद्र की रीडिंग लगभग पूर्ण दबाव के साथ मेल खाती है क्यूएफईके अनुसार एटीआई!

अधिकतम / न्यूनतम दबाव ( क्यूएफई) पूरे अवलोकन अवधि के लिए मेरे मौसम केंद्र द्वारा रिकॉर्ड किया गया:

सापेक्ष आर्द्रता प्रदर्शन

सापेक्ष वायु आर्द्रता प्रतिशत के रूप में प्रदर्शित होती है (प्रतिशत प्रतीक दो दाहिने हाथ के अंकों में प्रदर्शित होता है):

वर्तमान समय प्रदर्शन

वर्तमान समय संकेतक पर "HH:MM" प्रारूप में प्रदर्शित होता है, जिसमें पृथक कोलन प्रति सेकंड एक बार चमकता है:

चंद्रमा और चंद्र दिवस के चरणों का प्रदर्शन

संकेतक के पहले दो अंक वर्तमान चंद्र चरण प्रदर्शित करते हैं, और अगले दो - वर्तमान चंद्र दिवस:

चंद्रमा के आठ चरण हैं (अंग्रेजी और रूसी (नीला - गलत) नाम दिए गए हैं):

चरण संकेतक पर चित्रलेखों द्वारा प्रदर्शित किया जाता है:

अवस्था चित्रिय आरेख
बढ़ती दरांती (अर्धचंद्राकार)
घटता हुआ वर्धमान (अर्धचंद्राकार)

कंप्यूटर में डेटा ट्रांसफर करना

यदि आप मौसम स्टेशन को से जोड़ते हैं यु एस बी-यूएआरटीकनवर्टर (उदाहरण के लिए, एक माइक्रोक्रिकिट पर आधारित) CP2102) से जुड़ा यु एस बी-कंप्यूटर का पोर्ट, फिर आप मौसम स्टेशन द्वारा प्रेषित डेटा का निरीक्षण करने के लिए टर्मिनल प्रोग्राम का उपयोग कर सकते हैं:

मैं एक प्रोग्रामिंग भाषा में विकसित हुआ हूं गोलंगएक प्रोग्राम जो मौसम संबंधी टिप्पणियों का लॉग रखता है और सेवा को डेटा भेजता है और पर देखा जा सकता है एंड्रॉयड-स्मार्टफोन एप्लिकेशन का उपयोग कर :

मौसम संबंधी टिप्पणियों के लॉग के अनुसार, उदाहरण के लिए, आप वायुमंडलीय दबाव में परिवर्तन का एक ग्राफ बना सकते हैं:
न्यूनतम ध्यान देने योग्य दबाव वाले ग्राफ का उदाहरण


दबाव में मामूली वृद्धि के साथ ग्राफ का उदाहरण

नियोजित सुधार:

  • हवा की दिशा और गति सेंसर जोड़ना

मौसम स्टेशनों में, हवा की गति को मापने के लिए तीन कप एनीमोमीटर (1) का उपयोग किया जाता है, और हवा की दिशा निर्धारित करने के लिए मौसम फलक (2) का उपयोग किया जाता है:

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

इस उपकरण के संचालन का सिद्धांत यह है कि वायु प्रवाह - हवा द्वारा संवहन के कारण ताप तत्व से गर्मी को हटा दिया जाता है। इस मामले में, फिलामेंट का प्रतिरोध फिलामेंट के तापमान से निर्धारित होता है। तापमान $T$ से फिलामेंट $R_T$ के प्रतिरोध में परिवर्तन के नियम का रूप है:
$R_T = R_0 \cdot (1 + (\alpha \cdot (T - T_0)))$,
जहां $R_0$ तापमान $T_0$ पर फिलामेंट प्रतिरोध है, $\alpha$ प्रतिरोध का तापमान गुणांक है (टंगस्टन के लिए $\alpha = 4.5\cdot(10^(-3) (^(\circ)(C^) ( -1))))$)।

वायु प्रवाह की गति में परिवर्तन के साथ, तापमान एक स्थिर फिलामेंट करंट (डायरेक्ट करंट वाला एनीमोमीटर, इंजी। सीसीए) यदि हीटिंग तत्व का तापमान स्थिर रखा जाता है, तो तत्व के माध्यम से धारा वायु प्रवाह की गति के समानुपाती होगी (स्थिर तापमान एनीमोमीटर, इंजी। सीटीए).

जारी रहती है

श्रेणियाँ

लोकप्रिय लेख

2022 "kingad.ru" - मानव अंगों की अल्ट्रासाउंड परीक्षा