Arduino ამინდის სადგურის პროექტი wifi-ით. Arduino კონტროლერის პროგრამირება. დასრულებული მეტეოროლოგიური სადგური შენობაში

მშრომელი ადამიანების უმეტესობის მსგავსად, საკუთარი პროექტების განხორციელება მხოლოდ თქვენს დარჩენილ თავისუფალ დროს ატარებს. ამიტომ დიდი ხანია არაფერი შემიქმნია და რაღაცის გაკეთება მეზარებოდა. უცნაურია, მაგრამ ეს შესაძლებლობა გაჩნდა უნივერსიტეტში. ფანჯრის მიღმა სექტემბერია, მეოთხე წელი და მომავალი კურსი მიკროსქემის დიზაინის შესახებ. გვითხრეს, რომ კურსები შეიძლება გაკეთდეს ორი ვარიაციით: ქაღალდი და აპარატურა.

5 წლის განმავლობაში ჩვენს უნივერსიტეტში ქაღალდის კურსები ტარდებოდა პრინციპით „აიღეთ ძველი და შეაერთეთ“. ეს მიდგომა არ მომეწონა მისი რუტინულობის გამო, ამიტომ მაშინვე ავირჩიე ტექნიკის კურსები. Arduino მიკროკონტროლერი იყო შემოთავაზებული, როგორც სასწავლო პროცესის გულში მისი სწავლის სიმარტივის გამო. კურსის ტიპის განსაზღვრის შემდეგ კიდევ ერთი კითხვა დარჩა: კონკრეტულად რა უნდა გაკეთდეს. ვინაიდან მიკროკონტროლერების პროგრამირების გამოცდილება არ მქონდა, მაშინვე გავხსენი Google და დავიწყე არსებული პროექტების შესწავლა. ბევრი პროექტია, ზოგი საკმაოდ მარტივია, ზოგიც გენიალური (მაგალითად, 3D სკანერი), მაგრამ აბსოლუტურ უმრავლესობას პრაქტიკული გამოყენება არ ჰქონდა. მე უბრალოდ მინდოდა ისეთი რამ, რაც თაროზე არ დადგებოდა და მტვერს არ აგროვებდა. არდუინოს სამყაროში ნახევარსაათიანი ექსკურსიის შემდეგ დავინტერესდი სახლის მეტეოროლოგიური სადგურების თემით და პროექტების განხორციელება არც თუ ისე რთული მეჩვენა (რაც ძირითადად იზიდავდა ახალბედას).

ასე შეირჩა კურსის თემა და დროთა განმავლობაში პრობლემა არ ჩანდა.

კომპონენტის შერჩევა

სხვადასხვა პროექტების გადახედვისას მივხვდი, რომ Nano ან თუნდაც Pro Mini საკმარისი იქნებოდა ჩემთვის, მაგრამ მაინც ავირჩიე Arduino Uno იმ იმედით, რომ მომეწონა პროგრამირება Arduino-სთვის და განვახორციელებდი სხვა პროექტებს მომავალში. აქამდე არასოდეს მქონია ხელით შედუღების უთო, ამიტომ უფრო მარტივი განვითარებისთვის გადავწყვიტე მეყიდა Sensor Shield v4.

მეტი დეტალი

დაფა ხელს უწყობს სენსორების, მოდულების, სერვო ძრავების, სერიული და I2C ინტერფეისების სწრაფ კავშირს და ასევე აჩვენებს Duemilanova/Uno ფორმის ფაქტორის კონტროლერის ყველა პორტს (ასევე შეიძლება დაკავშირდეს მეგა სერიასთან, მაგრამ შეზღუდვებითა და შემდგომი შედეგებით) . მხარს უჭერს სხვა ფარებს თავის თავზე.


მეტეოროლოგიური მონაცემების წყაროდ შემდეგი სენსორები ავირჩიე:


მე გადავწყვიტე სენსორები. მაგრამ რა ვუყოთ სენსორებიდან მოსულ მონაცემებს? გადავწყვიტე მისი ჩვენება. მინდოდა ფერადი სურათი, ამიტომ მაშინვე გადავაგდე მონოქრომული გადაწყვეტილებები. რამდენიმე წუთის ძიების შემდეგ, არჩეული იქნა ST7735 1.8 დიუმიანი TFT დისპლეი.

მეტი დეტალი

ვინაიდან დისპლეი იყენებს 4-მავთულის SPI პროტოკოლს კომუნიკაციისთვის და აქვს საკუთარი პიქსელ-მისამართიანი ჩარჩო ბუფერი, მისი გამოყენება შესაძლებელია ნებისმიერი სახის მიკროკონტროლერთან. 1.8 დიუმიანი დისპლეი აქვს 128x160 ფერადი პიქსელი. ასევე არის microSD ბარათის სლოტი, შესაბამისად, შეგიძლიათ მარტივად ჩატვირთოთ სრული ფერადი ბიტმაპის სურათები FAT16/FAT32 microSD ბარათის ფაილური სისტემიდან.

სპეციფიკაციები:

  • ეკრანის დიაგონალი - 1.8 ინჩი, გარჩევადობა 128x160 პიქსელი, 18 ბიტიანი ფერი (262,144 ფერი)
  • კონტროლერი ვიდეო მეხსიერების ბუფერის ჩაშენებული პიქსელური მისამართით
  • ჩაშენებული microSD სლოტი - იყენებს 2-ზე მეტ ციფრულ ხაზს
  • თავსებადია 3.3 და 5 ვ
  • ზომები: 34 მმ x 56 მმ x 6.5 მ


Arduino კონტროლერის პროგრამირება

მას შემდეგ რაც გადავწყვეტთ კომპონენტებს ამინდის სადგურისთვის, ჩვენ დავიწყებთ კონტროლერის დაპროგრამებას. Arduino IDE გამოიყენებოდა Arduino firmware-ის გასანათებლად. ასევე გამოიყენა ადაფრუტის ბიბლიოთეკები.

სანამ ესკიზზე გადავიდოდეთ, მოდით შევხედოთ ფუნქციურობას:

  • კითხულობს სენსორებიდან ყოველ 10 წამში ერთხელ და ეკრანზე განახლდება მხოლოდ ის ინდიკატორები, რომლებიც შეიცვალა წინა გაზომვებთან შედარებით.
  • განხორციელდა მონაცემთა გადაცემა COM პორტით

ესკიზი

#შეიცავს // ბიბლიოთეკა I2C მოწყობილობებთან კომუნიკაციისთვის #include // ძირითადი ბიბლიოთეკა ყველა სენსორისთვის #include // ბიბლიოთეკა BMP180-ისთვის #include // ძირითადი გრაფიკული ბიბლიოთეკა #include // აპარატურის სპეციფიკური ბიბლიოთეკა #include // ბიბლიოთეკა SPI მოწყობილობებთან კომუნიკაციისთვის #include "dht.h" // library for DHT #define DHT22_PIN 2 // DHT22-ის მონაცემთა პინის დაკავშირება 2 ციფრულ პინთან #define TFT_CS 10 // დაკავშირება TFT-ის CS პინი 10 ციფრულ პინთან #define TFT_RST 9 // დააკავშირეთ TFT-ის RST პინი 9 ციფრულ პინთან // თქვენ ასევე შეგიძლიათ დააკავშიროთ ეს Arduino-ს გადატვირთვასთან // ამ შემთხვევაში დააყენეთ ეს #define პინი 0-ზე! #define TFT_DC 8 // დააკავშირეთ TFT-ის DC პინი 8 ციფრულ პინთან Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); //TFT-ის დაწყება #define TFT_SCLK 13 // TFT-ის SCLK პინის დაკავშირება 13 ციფრულ პინთან #define TFT_MOSI 11 // TFT-ის MOSI პინის დაკავშირება 11 ციფრულ dht DHT-თან; Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); //დაწყება BMP180 int bmpFlag = 0; struct ( uint32_t სულ; uint32_t ok; uint32_t crc_error; uint32_t time_out; uint32_t დაკავშირება; uint32_t ack_l; uint32_t ack_h; uint32_t უცნობია; ) სტატისტიკა = (0,0,0,0,0,0); // struct dht სტატუსისთვის void setup(void) ( Serial.begin(9600); Serial.println("Meteo Test"); Serial.println(""); if(!bmp.begin()) // შეამოწმეთ კავშირი BMP180-ისთვის ( Serial.print ("ოუპს, BMP180 არ არის გამოვლენილი ... შეამოწმეთ თქვენი გაყვანილობა ან I2C ADDR!"); bmpFlag = 1; ) tft.initR(INITR_BLACKTAB // დაწყვიტეთ TFT და შეავსეთ შავი ფერის tft.fillScreen). ; (ST7735_BLACK tft.setRotation(tft.setTextSize(1.5), რათა უზრუნველყოფილი იყოს TFT-ის ინიციალიზაცია ) // გაზომილი მონაცემების ძველი ტემპერატურა = 0 ; , ძველი წნევა = 0, ძველიDHTHსინესტე = 0, ძველიDHTTტემპერატურა; = 0 || !event.pressure) // მონაცემების განახლება (tft.fillRect(0, 30, 160, 6, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED); printValue("ERROR BMP INITIALIZATION", 0 , "", true ) else (if(event.pressure != oldPressure) (tft.fillRect(0, 30, 160, 7, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED) ; printValue ("Pressure", event.pressure, "hPa", true oldPressure = event.pressure = true) if(temperature != oldTemperature) (tft.fillRect(0, 38, 160, 7, ST7735_BLACK); tft.setCursor); (0, 38); (0, 46) tft.setTextColor(ST7735_BLUE) ; 54, 160, 7, ST7735_BLACK tft.setCursor(0, 54);

სხეულის აწყობის დროა

კურსის ძირითადი პირობა იყო სამუშაო პროტოტიპი წარმოდგენილ ფორმაში. ამიტომ, მე მომიწია საცხოვრებლის ყიდვა და ფაილით შეიარაღებული, მეტეოროლოგიური სადგური რაიმე ფორმით ჩამესვა საცხოვრებელში.

ქეისი შეძენილია ადგილობრივი რადიო ელექტრონიკის მაღაზიიდან.

ჩარჩო

(ფოტოზე საქმე ცოტა სხვანაირია. გამჭვირვალე სახურავი მაქვს)



შემდეგ, ფაილის გამოყენებით, ხვრელები გაკეთდა სენსორების გამოსასვლელად და ელექტროენერგიის მიწოდებისთვის. გადავწყვიტე სენსორები გარეთ გადამეტანა, რადგან სისტემის კეისის გარეშე ტესტირებისას შევამჩნიე, რომ ეკრანის უკანა მხარე ძალიან გაცხელდა, რაც იმოქმედებდა კორპუსის შიგნით ტემპერატურაზე.

კორპუსი სენსორებისა და დენის ღიობებით



რადგან ფეხები 2 სენსორზე მომიწია და ერთ-ერთზე ტრაკი დამეწვა, გადავწყვიტე ბედის ცდუნება და მავთულები სენსორებზე არ შემეყარა (სხვა რამეზე ვივარჯიშებ) და დაკავშირების მიზნით მეტ-ნაკლებად სანდო რომ ვყოფილიყავი, გადავწყვიტე ელექტრო ფირის გადახვევა.

სისტემა საცხოვრებელში "ჩაყრამდე".



ვინაიდან კორპუსი გაცილებით დიდია ვიდრე Arduino (უფრო პატარა არ იყო), მომიწია საყრდენი, რათა დაფა არ გადამძვრალიყო ქეისის შიგნით. ასევე, ქაფიდან ამოჭრეს ფიგურა და მასში ჩასმული იყო ეკრანის მართკუთხედი კორპუსის შიგნიდან დასამალად. მე არ მქონდა სუპერწებო ხელზე, ამიტომ მომიწია ორმხრივი ლენტის გამოყენება.

სასწაული-იუდა თევზი-ვეშაპი



დაახურეთ თავსახური, შეაერთეთ დენი და დაელოდეთ.

დასრულებული მეტეოროლოგიური სადგური შენობაში



შედეგების ეკრანზე ჩვენების შემდეგ, ჩვენ გამოვავლენთ უსიამოვნო შეცდომას ტენიანობის გაზომვისას: DHT22 გულმოდგინედ აწარმოებს ფიგურას 99,90% (1,00% უკიდურესად იშვიათია). დავიწყოთ იმის გარკვევა, თუ რა არის პრობლემა. პირველი, რასაც ვაკეთებთ, არის COM პორტის მნიშვნელობების გამომავალი. როგორც ჩანს, ყველაფერი კარგადაა. ქეისის რამდენიმე შევსების, დაშლისა და აწყობის შემდეგ თავში ჩნდება აზრი, რომ პასუხი გუგლში მოძებნოთ. როგორც მოსალოდნელი იყო, რუსულ Google-ს სასარგებლო არაფერი უთქვამს. OK. ვიწყებთ ინგლისურ ენაზე ძებნას და ერთ-ერთ ფორუმზე ვხვდებით ბიჭებს მსგავსი პრობლემის მქონე. დისკუსიის პირველი ოთხი გვერდი არ იძლევა რაიმე სასარგებლოს, მაგრამ მეხუთე გვერდზე ვპოულობთ პასუხს ჩვენს კითხვაზე:
ტენიანობის სენსორებზე ადვილად შეიძლება დაზარალდეს არასწორი აირები ან მაღალი ტენიანობის IIRC ძალიან ხანგრძლივი ზემოქმედება. მონაცემთა ფურცელში არის სენსორის „გადატვირთვის“ პროცედურა, შეგიძლიათ სცადოთ.

დარჩა ერთადერთი კითხვა, როდის და როგორ მოვახერხე DHT22-ის დაზიანება. მაგრამ მოახლოვდა კურსების გავლის დრო და ამიტომ ამ პრობლემის გადაწყვეტა მოგვიანებით დავტოვე.

შემდგომი სიტყვა

კურსი გაიარა. მეტეოროლოგიური სადგური გაურკვეველი ვადით გადაიდო, სანამ უნივერსიტეტში ყველა კუდს არ დაიხურება. თუმცა მეტეოსადგურში იმაზე ადრე მოგვიწია დაბრუნება, ვიდრე მეგონა. ისე მოხდა, რომ ნოემბრის შუა რიცხვებში შევცვალე სამუშაო ადგილი და ახალ გუნდში გავიცანი ადამიანები, რომლებიც დაინტერესებულნი არიან Arduino პლატფორმით და მსგავსი. ამიტომ, ჩემი ინტერესი ამ პლატფორმის მიმართ, გაციების დრო რომ არ მქონია, ისევ გაჩნდა. ამოვიღე ჩემი მეტეოროლოგიური სადგური, დავუკავშირე კომპიუტერს და გამახსენდა, რომ მონაცემთა გადაცემა Arduino-დან COM პორტით განვახორციელე. შემდეგ კი გამიჩნდა იდეა დამეწერა პროგრამა, რომელიც იღებს მონაცემებს COM პორტის მეშვეობით Arduino-დან და გადასცემს ამ მონაცემებს საჯარო მონიტორინგზე, მაგრამ ეს სრულიად განსხვავებული ამბავია.

მე ასევე მინდა მქონდეს უკაბელო სენსორები და მაინც დავნერგო ამინდის სადგური Arduino Pro Mini-ზე. ამიტომ შევუკვეთე 4 Arduino Pro Minis 3.3V დენის წყაროთი, 4 nRF24L01+ რადიო მოდული და რამდენიმე დამატებითი სენსორი, რაზეც შემდეგ ჯერზე ვეცდები ვისაუბრო. ამასობაში ველოდები ამანათს, იგეგმება რეალურ დროში საათის კავშირის განხორციელება, რათა მონაცემთა განახლების დრო და თავად მონაცემები შეინახოს microSD ბარათზე, იმ პირობით, რომ არ იქნება კავშირი კლიენტი COM პორტის საშუალებით.

თქვენ შეგიძლიათ დაეხმაროთ და გადარიცხოთ გარკვეული თანხები საიტის განვითარებისთვის



ახლახან ჩემმა კოლეგამ მოაწყო მცირე სამეცნიერო გამოფენა.
ჩემმა მასწავლებელმა მთხოვა კოლეჯის სტუდენტებისთვის ელექტრონიკის პროექტის წარდგენა. ორი დღე მქონდა რაღაც საინტერესო და საკმაოდ მარტივი მოსაფიქრებლად.



ვინაიდან აქ ამინდის პირობები საკმაოდ ცვალებადია და ტემპერატურა 30-40°C-ის ფარგლებში მერყეობს, გადავწყვიტე სახლის მეტეოროლოგიური სადგურის გაკეთება.

რა ფუნქციები აქვს სახლის მეტეოროლოგიურ სადგურს?
Arduino ამინდის სადგური ეკრანით არის მოწყობილობა, რომელიც აგროვებს მონაცემებს ამინდისა და გარემო პირობების შესახებ სხვადასხვა სენსორების გამოყენებით.

როგორც წესი, ეს არის შემდეგი სენსორები:

  • ქარი
  • ტენიანობა
  • წვიმა
  • ტემპერატურა
  • წნევა
  • სიმაღლეებს

ჩემი მიზანია გავაკეთო პორტატული დესკტოპის ამინდის სადგური საკუთარი ხელით.

მას უნდა შეეძლოს შემდეგი პარამეტრების განსაზღვრა:

  • ტემპერატურა
  • ტენიანობა
  • წნევა
  • სიმაღლე

ნაბიჯი 1: შეიძინეთ საჭირო კომპონენტები







  • DHT22, ტემპერატურისა და ტენიანობის სენსორი.
  • BMP180, წნევის სენსორი.
  • შემდუღებელი
  • ერთი რიგის 40 გამომავალი კონექტორი

აღჭურვილობა დაგჭირდებათ:

  • Soldering რკინის
  • ცხვირის ბალიშები
  • მავთულები

ნაბიჯი 2: DHT22 ტემპერატურისა და ტენიანობის სენსორი







ტემპერატურის გასაზომად გამოიყენება სხვადასხვა სენსორები. DHT22, DHT11, SHT1x პოპულარულია

მე აგიხსნით რით განსხვავდებიან ისინი ერთმანეთისგან და რატომ გამოვიყენე DHT22.

AM2302 სენსორი იყენებს ციფრულ სიგნალს. ეს სენსორი მუშაობს უნიკალურ კოდირების სისტემაზე და სენსორის ტექნოლოგიაზე, ამიტომ მისი მონაცემები საიმედოა. მისი სენსორის ელემენტი დაკავშირებულია 8-ბიტიან ერთ ჩიპიან კომპიუტერთან.

ამ მოდელის თითოეული სენსორი არის ტემპერატურული კომპენსირებული და ზუსტად დაკალიბრებული, კალიბრაციის კოეფიციენტი მდებარეობს ერთჯერად პროგრამირებად მეხსიერებაში (OTP მეხსიერება). წაკითხვისას სენსორი იხსენებს კოეფიციენტს მეხსიერებიდან.

მცირე ზომა, დაბალი ენერგიის მოხმარება, გადაცემის დიდი მანძილი (100 მ) ხდის AM2302-ს შესაფერისი თითქმის ყველა აპლიკაციისთვის და 4 გამომავალი ერთ რიგში ინსტალაციას ძალიან მარტივს ხდის.

მოდით შევხედოთ სამი სენსორის მოდელის დადებით და უარყოფით მხარეებს.

DHT11

დადებითი: არ საჭიროებს შედუღებას, სამი მოდელიდან ყველაზე იაფი, სწრაფი სტაბილური სიგნალი, დიაპაზონი 20 მ-ზე მეტი, ძლიერი ჩარევა.
მინუსები: ბიბლიოთეკა! არ არსებობს გარჩევადობის ვარიანტები, ტემპერატურის გაზომვის შეცდომა არის +/- 2°C, ფარდობითი ტენიანობის დონის გაზომვის შეცდომა არის +/- 5%, გაზომილი ტემპერატურის არაადეკვატური დიაპაზონი (0-50°C).
გამოყენების სფერო: მებაღეობა, სოფლის მეურნეობა.

DHT22

დადებითი: არ საჭიროებს შედუღებას, დაბალი ღირებულება, გლუვი მოსახვევები, მცირე გაზომვის შეცდომები, დიდი გაზომვის დიაპაზონი, დიაპაზონი 20 მ-ზე მეტი, ძლიერი ჩარევა.
უარყოფითი მხარეები: მგრძნობელობა შეიძლება იყოს უფრო მაღალი, ტემპერატურის ცვლილებების ნელი თვალყურის დევნება, საჭიროებს ბიბლიოთეკას.
გამოყენების სფეროები: გარემოსდაცვითი კვლევები.

SHT1x

დადებითი: არ არის საჭირო შედუღება, გლუვი მოსახვევები, დაბალი გაზომვის შეცდომები, სწრაფი რეაგირება, დაბალი ენერგიის მოხმარება, ავტომატური ძილის რეჟიმი, მაღალი სტაბილურობა და მონაცემთა თანმიმდევრულობა.
მინუსები: ორი ციფრული ინტერფეისი, შეცდომა ტენიანობის დონის გაზომვისას, გაზომილი ტემპერატურის დიაპაზონი 0-50°C, საჭიროა ბიბლიოთეკა.
გამოყენების სფეროები: ექსპლუატაცია მკაცრ გარემოში და გრძელვადიან ინსტალაციაში. სამივე სენსორი შედარებით იაფია.

ნაერთი

  • Vcc - 5V ან 3.3V
  • გნდ - გნდთან
  • მონაცემები – Arduino-ს მეორე პინზე

ნაბიჯი 3: BMP180 წნევის სენსორი



BMP180 - ბარომეტრული ატმოსფერული წნევის სენსორი I2C ინტერფეისით.
ბარომეტრიული წნევის სენსორები ზომავენ ატმოსფერული ჰაერის აბსოლუტურ მნიშვნელობას. ეს მაჩვენებელი დამოკიდებულია კონკრეტულ ამინდის პირობებზე და ზღვის დონიდან სიმაღლეზე.

BMP180 მოდულს ქონდა 3.3V 662kOhm სტაბილიზატორი, რომელიც მე ჩემი სისულელეების გამო შემთხვევით ავაფეთქე. ელექტრომომარაგება პირდაპირ ჩიპზე მომიწია.

სტაბილიზატორის არარსებობის გამო, შეზღუდული ვარ ენერგიის წყაროს არჩევანში - 3.3 ვ-ზე მეტი ძაბვა გაანადგურებს სენსორს.
სხვა მოდელებს შეიძლება არ ჰქონდეს სტაბილიზატორი, დარწმუნდით, რომ შეამოწმეთ მისი არსებობა.

სენსორისა და I2C ავტობუსის შეერთების დიაგრამა Arduino-სთან (ნანო ან უნო)

  • SDA-A4
  • SCL - A5
  • VCC - 3.3V
  • GND - GND

მოდი ცოტა ვისაუბროთ წნევაზე და მის ურთიერთობაზე ტემპერატურასა და სიმაღლეზე.

ატმოსფერული წნევა ნებისმიერ წერტილში არ არის მუდმივი. დედამიწის ბრუნვასა და დედამიწის ღერძის დახრილობას შორის რთული ურთიერთქმედება იწვევს მაღალი და დაბალი წნევის მრავალი უბნის გამოჩენას, რაც თავის მხრივ იწვევს ამინდის პირობების ყოველდღიურ ცვლილებებს. წნევის ცვლილებების დაკვირვებით, შეგიძლიათ გააკეთოთ ამინდის მოკლევადიანი პროგნოზი.

მაგალითად, წნევის ვარდნა ჩვეულებრივ ნიშნავს წვიმიან ამინდს ან ჭექა-ქუხილის მოახლოებას (დაბალი წნევის ზონას, ციკლონს). წნევის მატება ჩვეულებრივ ნიშნავს მშრალ, ნათელ ამინდს (თქვენზე გადის მაღალი წნევის ზონა, ანტიციკლონი).

ატმოსფერული წნევა ასევე იცვლება სიმაღლესთან ერთად. აბსოლუტური წნევა ევერესტის საბაზო ბანაკში (5400 მ ზღვის დონიდან) უფრო დაბალია ვიდრე დელიში (216 მ ზღვის დონიდან).

ვინაიდან აბსოლუტური წნევის მაჩვენებლები განსხვავდება თითოეულ ადგილას, ჩვენ მივმართავთ შედარებით წნევას, ან ზღვის დონის წნევას.

სიმაღლის გაზომვა

საშუალო წნევა ზღვის დონეზე არის 1013,25 GPa (ან მილიბარი). თუ ატმოსფეროზე მაღლა აწევთ, ეს მნიშვნელობა ნულამდე ეცემა. ამ შემოდგომის მრუდი საკმაოდ მკაფიოა, ასე რომ თქვენ შეგიძლიათ გამოთვალოთ სიმაღლე ზღვის დონიდან შემდეგი განტოლების გამოყენებით: alti=44330*

თუ თქვენ იღებთ ზღვის დონის წნევას 1013,25 GPa, როგორც p0, განტოლების გამოსავალი არის თქვენი ამჟამინდელი სიმაღლე ზღვის დონიდან.

Სიფრთხილის ზომები

გახსოვდეთ, რომ BMP180 სენსორს სჭირდება წვდომა მიმდებარე ატმოსფეროში, რათა შეძლოს ჰაერის წნევის წაკითხვა, არ მოათავსოთ სენსორი დახურულ კორპუსში. სავენტილაციო პატარა ხვრელი საკმარისი იქნება. მაგრამ არ დატოვოთ იგი ძალიან ღია - ქარი აღრევს წნევასა და სიმაღლეზე. გაითვალისწინეთ ქარის დაცვა.

დაიცავით სითბოსგან. წნევის გაზომვა მოითხოვს ზუსტ ტემპერატურას. შეეცადეთ დაიცვათ სენსორი ტემპერატურის ცვლილებებისგან და არ დატოვოთ იგი მაღალი ტემპერატურის წყაროებთან ახლოს.

დაიცავით ტენიანობისგან. BMP180 სენსორი მგრძნობიარეა ტენიანობის დონის მიმართ, შეეცადეთ თავიდან აიცილოთ შესაძლო წყალი სენსორში შესვლისგან.

ნუ დაბრმავებთ სენსორს. მოულოდნელი იყო სენსორის სილიკონის მგრძნობელობა სინათლის მიმართ, რომელიც მას ჩიპის საფარის ხვრელით მიაღწევდა. ყველაზე ზუსტი გაზომვებისთვის, შეეცადეთ დაიცვათ სენსორი გარემოს სინათლისგან.

ნაბიჯი 4: მოწყობილობის აწყობა







ერთი რიგის კონექტორების დაყენება Arduino Nano-სთვის. ძირითადად, ჩვენ დავჭრათ ისინი ზომით და ცოტათი დავფშვათ ისე, როგორც იყო. შემდეგ ჩვენ ვამაგრებთ მათ. ამის შემდეგ ჩვენ ვამონტაჟებთ ერთ რიგის კონექტორებს DHT22 სენსორისთვის.

ჩვენ ვამონტაჟებთ 10 kOhm რეზისტორს მონაცემთა გამოსვლიდან მიწამდე (Gnd). ჩვენ ვამაგრებთ ყველაფერს.
შემდეგ ზუსტად ანალოგიურად ვამონტაჟებთ BMP180 სენსორისთვის ერთ რიგის კონექტორს, რაც ელექტროენერგიის მიწოდებას 3.3 ვ. ჩვენ ყველაფერს ვუკავშირდებით I2C ავტობუსს.

და ბოლოს, ჩვენ ვუკავშირდებით LCD ეკრანს იმავე I2C ავტობუსს, როგორც BMP180 სენსორს.
(მოგვიანებით ვგეგმავ RTC მოდულის (რეალური დროის საათის) დაკავშირებას მეოთხე კონექტორთან, რათა მოწყობილობამ ასევე აჩვენოს დრო).

ნაბიჯი 5: კოდირება




ჩამოტვირთეთ ბიბლიოთეკები

Arduino-ზე ბიბლიოთეკების დასაყენებლად მიჰყევით ბმულს

#შეიცავს
#include #include #include "DHT.h" #include

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 // რა ციფრულ პინთან ვართ დაკავშირებული

// გააუქმეთ კომენტარის ნებისმიერი ტიპი, რომელსაც იყენებთ! //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 DHT dht(DHTPIN, DHTTYPE, LiquidIClCrystald) Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin float t1,t2;

void setup() ( Serial.begin(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);

სტატუსი = წნევა.getTemperature(T);

if (სტატუსები != 0) ( Serial.print("1"); lcd.clear(); lcd.setCursor(0,0); lcd.print("Baro Temperature:"); lcd.setCursor(0,1 lcd.print(T,2) lcd.print("deg C");

status = presion.startPressure(3);

if (status != 0) ( // დაველოდოთ გაზომვის დასრულებას: delay(status);

სტატუსი = წნევა.getPressure(P,T);

if (სტატუსები != 0) (lcd.clear(); lcd.setCursor(0,0); lcd.print("abslt ზეწოლა:"); lcd.setCursor(0,1); lcd.print(P,2 lcd.print("mb");

მე გამოვცადე სისტემის ცალკეული ნაწილები Arduino UNO-ზე. იმათ. ESP მოდული შევაერთე uno-ზე და შევისწავლე, გავთიშე, მერე გავაერთე nRF24 და ა.შ. ფანჯრის სენსორის საბოლოო განხორციელებისთვის მე ავირჩიე Arduino Pro Mini, როგორც Uno-სთან უახლოესი მინიატურა.



ენერგიის მოხმარების თვალსაზრისით, Arduino Pro Mini ასევე კარგად გამოიყურება:

  • არ არის USB-TTL გადამყვანი, რომელიც თავად ბევრს "ჭამს",
  • LED უკავშირდება 10k რეზისტორის საშუალებით.

ენერგიის მოწინავე დაზოგვისთვის დაიგეგმა:

  • ამოიღეთ LED - დენის ინდიკატორი Arduino Pro Mini-ზე (ვნანობ, დაფა არ დამიზიანებია)
  • ან გამოიყენეთ "შიშველი" ასამბლეა Atmel ATmega328 მიკროპროცესორზე (არ გამოიყენა)
  • გამოიყენეთ დაბალი სიმძლავრის ბიბლიოთეკა ან JeeLib.

ბიბლიოთეკებიდან მე ავირჩიე Low Power Library, ის მარტივია და შეიცავს მხოლოდ იმას, რაც საჭიროა.


ცენტრალური განყოფილებისთვის, რადგან დაგეგმილი იყო მასზე მრავალი პერიფერიული მოწყობილობის დაკავშირება, აირჩიეს Arduino Mega დაფა. გარდა ამისა, იგი სრულად თავსებადია UNO-სთან და აქვს მეტი მეხსიერება. წინ რომ ვიხედები, ვიტყვი, რომ ეს არჩევანი სრულიად გამართლებული იყო.


შეგიძლიათ შეიძინოთ Arduino Mega დაახლოებით 8 დოლარად.

სიმძლავრე და ენერგიის მოხმარება

ახლა ენერგიისა და ენერგიის მოხმარების შესახებ.


Arduino Pro Mini მოდის ორ ტიპად:

  • მიწოდების ძაბვისთვის 5V და სიხშირე 16MHz
  • მიწოდების ძაბვისთვის 3.3V და სიხშირე 8MHz.

ვინაიდან nRF24L01+ რადიო მოდული საჭიროებს 3.3 ვ-ს ელექტრომომარაგებისთვის და სიჩქარე აქ არ არის მნიშვნელოვანი, მაშინ იყიდეთ Arduino Pro Mini 8 MHz და 3.3 V.


ამ შემთხვევაში, Arduino Pro Mini-ს მიწოდების ძაბვის დიაპაზონი არის:

  • 3.35-12V 3.3V მოდელისთვის
  • 5-12V 5V მოდელისთვის.

უკვე მქონდა Arduino Pro Mini 5V-ზე, ამიტომ გამოვიყენე. შეგიძლიათ შეიძინოთ Arduino Pro Mini დაახლოებით 4 დოლარად.


ცენტრალური ბლოკი იკვებება 220 ვოლტიანი ქსელიდან მცირე ელექტრომომარაგების საშუალებით, რომელიც უზრუნველყოფს გამომავალს 12 ვ, 450 mA, 5 ვტ. მოიწონეთ ეს 5 დოლარად. ასევე არის ცალკე 5 ვ პინი.



და თუ ეს საკმარისი არ არის, მაშინ შეგიძლიათ დააინსტალიროთ რაიმე უფრო ძლიერი. სხვა სიტყვებით რომ ვთქვათ, ცენტრალური ერთეულისთვის ენერგიის დაზოგვას დიდი აზრი არ აქვს. მაგრამ დისტანციური უკაბელო სენსორისთვის ენერგიის დაზოგვა ყველაზე მნიშვნელოვანი ნაწილია. მაგრამ არც ფუნქციონირების დაკარგვა მინდა.


ამიტომ, Arduino Pro Mini და nRF24 რადიო მოდული იკვებება 4 Ni-Mh ბატარეით.


და დაიმახსოვრე თანამედროვე ბატარეის მაქსიმალური ტევადობადაახლოებით 2500-2700 mAh, მეტი არაფერია ან მარკეტინგული ხრიკები (Ansmann 2850) ან მოტყუება (UltraFire 3500).


მე არ ვიყენებ Li-Ion ბატარეებს რამდენიმე მიზეზის გამო:

  • ძალიან ძვირი
  • როდესაც გარემო ტემპერატურა ეცემა 0°C-ზე დაბლა, ლითიუმ-იონური ბატარეის სიმძლავრე მცირდება 40-50%-მდე.
  • ისინი, რომლებიც იაფია, იწარმოება დაცვის გარეშე და არის სახიფათო (მოკლე ჩართვის ან გამონადენის დროს შეიძლება აფეთქდეს და დაიწვას, იხილეთ რამდენიმე ვიდეო YouTube-ზე)
  • ისინი ბერდება, მაშინაც კი, თუ ისინი არ გამოიყენება (თუმცა, ეს შეიძლება ითქვას ყველა ქიმიურ ელემენტზე), 2 წლის შემდეგ Li-Ion ბატარეა კარგავს სიმძლავრის დაახლოებით 20% -ს.

პროტოტიპისთვის სავსებით შესაძლებელია მაღალი ხარისხის Ni-MH AA ან AAA ბატარეებით. უფრო მეტიც, ჩვენ არ გვჭირდება დიდი დენები. Ni-MH ბატარეების ერთადერთი მინუსი არის მათი ხანგრძლივი დატენვის დრო.

ამინდის სადგურის ზოგადი დიაგრამა

შევაჯამოთ. აქ არის ზოგადი დიაგრამა, თუ როგორ მუშაობს ეს ყველაფერი.



გაგრძელება.

ტეგები: ტეგების დამატება

ჩვენ ვაგრძელებთ ჩვენი ამინდის სადგურის განვითარებას.

სანამ განახლებაზე გადავალთ, მინდა ცოტა დავაზუსტო.

ერთ-ერთმა ჩვენმა კოლეგამ მომწერა, რატომ შემოიღეს მცველი ტაიმერი?

დამკვირვებელი ტაიმერი მოქმედებს საგანგებო სიტუაციის შემთხვევაში. როგორც პრაქტიკა გვიჩვენებს, ENC28J60 არ ამუშავებს 4 ერთდროულ კავშირზე მეტს (თუ მეხსიერება არ ფუჭდება). იმის გათვალისწინებით, თუ რამდენი სერვისის კავშირი მუდმივად ხდება ქსელის მუშაობის შესანარჩუნებლად და უბრალოდ დარჩენილი ტრაფიკი, რომელიც შექმნილია ყველა სახის საყოფაცხოვრებო სათამაშოებით (მაგალითად, თანამედროვე ტელევიზორები სკანირებენ ქსელში არსებულ ჰოსტებს და მათ ღია პორტებს), დიზაინი უბრალოდ გადადის სისულელე. ENC28J60 დამოუკიდებლად ვერ მუშაობს ქსელის პროტოკოლებთან და ყველაფერი დანერგილია ბიბლიოთეკებში. ალბათ მხოლოდ ისინი არიან.
მე შევამოწმე ყველა ხელმისაწვდომი ბიბლიოთეკა და სხვადასხვა მოდული (მოულოდნელად გაუმართავი), მაგრამ დიდი ხნის განმავლობაში ვერ მივაღწიე სტაბილურ მუშაობას. მაქსიმალური პერიოდი იყო დაახლოებით 3-4 კვირა.
სწორედ ამიტომ ტრიალებს იქ „ძაღლი“ და თუ რამე მოხდება, კონტროლერს ათრევს. ამის შემდეგ პრობლემა გაქრა.
ასევე არ უარვყოფ, რომ ჩემს საშინაო ქსელში შეიძლება იყოს გარკვეული ნიუანსები ან პრობლემები. მაგრამ რადგან მე მქონდა პრობლემა, შეიძლება სხვა ადამიანსაც ჰქონდეს. ჯერჯერობით მხოლოდ ეს გამოსავალი ვიპოვე.
რამდენადაც ვიცი, Wiznet-ის ჩიპებს (W5100 და უფრო მაღალი) არ აქვთ ეს, ან უბრალოდ საკმარისად კარგად არ გამოიყურებოდა.

მოდით გადავიდეთ განახლებაზე

რაც მთავარია, ჩვენ ვშორდებით ჩიპს ENC28J60და წადი W5100. მე ვცადე ყველაფრის დანერგვა ძველ ჩიპზე, მაგრამ არ არის საკმარისი მიკროკონტროლერის მეხსიერება ძალიან დიდი ბიბლიოთეკებისთვის ENC28J60. ახალი ჩიპის გამოყენებისას, სტანდარტულიბიბლიოთეკები დეველოპერისგან და განხორციელებული ყველა ცვლილებისგან, კიდევ უფრო მეტი რჩება 20% უფასო მიკროკონტროლერის მეხსიერება ATMega328. და ეს არის ახალი ფუნთუშები!

ამ ვერსიაში (მოდით მას მეორე ვუწოდოთ) სენსორებიდან წაკითხულის უსადენოდ გადაცემის შესაძლებლობა სიხშირის გამოყენებით 433 MHz. მოდულები თავად ავიღე ჩინურიდან, მარკირება XY-MK-5V. მინდა აღვნიშნო, რომ გადაცემის ხარისხი შორს არის სრულყოფილი. სიგნალის შესაძლო დაკარგვა, ხმაური, ერთდროულად გადაცემის შეუძლებლობა და ა.შ. და ა.შ. მაგრამ მათი ფასი (1 დოლარზე ნაკლები თითო კომპლექტში) ანაზღაურებს ამ ხარვეზებს. მე გეტყვით საიდუმლოს, რომ ეს (ყველაზე იაფი) მოდულები გვხვდება ბევრ ბრენდირებულ მეტეოროლოგიურ სადგურში სახლის გამოყენებისთვის. ვაა, მოულოდნელი?

დავიწყოთ საბაზო სადგურით

ჩვენ გადავდივართ Arduino UNOდა Ethernet Shield(პირველი ვერსია) ჩიპზე დაფუძნებული W5100. ეს არის სენდვიჩი და აზრი არ აქვს მის აღწერას. მე მხოლოდ აღვწერ მოდულების დამატებით ჩართულ კონტაქტებს XY-MK-5V.

გადამცემის მოდული იყენებს ენერგიას 5 ვ, GND(სად იქნებოდა დედის გარეშე) და D2პინი კონტროლერზე. კონტაქტის რედაქტირება D2 (DATA)შეგიძლიათ გამოიყენოთ ფუნქცია vw_set_tx_pin vw ბიბლიოთეკიდან.

წინა ესკიზისგან განსხვავებით, ეს იყენებს ორ დამატებით ბიბლიოთეკას:

#შეიცავს #შეიცავს

თავად ესკიზი

ფარული ტექსტი

#შეიცავს #შეიცავს #შეიცავს #შეიცავს #შეიცავს #შეიცავს #შეიცავს #შეიცავს #define DHTTYPE DHT22 #define DHTPIN 5 DHT dht(DHTPIN, DHTTYPE); ბაიტი mac = (0x54, 0x34, 0x31, 0x31, 0x31, 0x31); char server = "narodmon.ru"; int პორტი = 8283; IPAddress ip(192,168,0,201); EthernetClient კლიენტი; BMP085 dps = BMP085(); ხანგრძლივი ტემპერატურა = 0, წნევა = 0; ათწილადი H, dP, dPt; bool ინტერვალი = true; EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( byte ID; // Device ID int Temperature; // Temperature float Pressure; // Pressure float Humidity; // Humidity float dewPoint; // Dew/frost point ); SEND_DATA_STRUCTURE გადაცემა; void setup() (// Watchdog ტაიმერის ინიციალიზაცია wdt_disable(); delay(8000); wdt_enable(WDTO_8S); // კონსოლის Serial.begin(9600); // DHT სენსორის ინიცირება dht.begin(); / / 433 MHz მოდულის ინიციალიზაცია ET.begin(details(broadcast) vw_set_tx_pin(2) თუ ჩვენ არ მივიღეთ მონაცემები DHCP-დან); // მივცეთ მისამართი, თუ (Ethernet.begin(mac) == 0) Ethernet.begin(mac, ip // Initializing 1-Wire Wire.begin( // Initializing BMP180 with height adjusted // dps); init (MODE_STANDARD, 3200, true // Initialize BMP180 dps.init(Serial.println(Ethernet.localIP()) მოწყობილობის ჩართვისთანავე გაგზავნეთ პირველი მონაცემები (true)); NOAA / / მითითება (1) : http://wahiduddin.net/calc/density_algorithms.htm // მითითება (2) : http://www.colorado.edu/geography/weather_station/Geog_site/about.htm double dewPoint( ორმაგი ცელსიუსი , ორმაგი ტენიანობა) ( // (1) გაჯერების ორთქლის წნევა = ESGG(T) ორმაგი რაციონი = 373.15 / (273.15 + ცელსიუსი); ეს აუცილებელია // იმისათვის, რომ არ იყოს შეცდომაში შეყვანილი ზამთრის სეზონზე.<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 MHzსაკმარისია ჩვეულებრივი გრძელი სპილენძის მავთული 17 სმ. ანტენის გარეშე, შეგიძლიათ დაივიწყოთ ნორმალური მუშაობა.

მოდით გადავიდეთ ამ განახლების ყველაზე მნიშვნელოვან ნაწილზე - ადგილობრივ უკაბელო სადგურზე

მის განსახორციელებლად (მუხლზე) გამოვიყენე ანალოგი Arduino NANO(დაფუძნებული ATMega328) და TFTჩვენება ჩიპზე ST7735Sნებართვით 128 x 160

ფარული ტექსტი



Pinout ჩვენება -> კონტროლერი

============================= LED | 3.3V SCK | SCK (13) SDA | MOSI(11)A0 | DC (9) RESET | RST(8)CS | CS (10) GND | GND VCC | 5V =============================

მიმღების მოდული დაკავშირებულია ისევე, როგორც გადამცემი, მხოლოდ DATAდამაგრება D7.

რამდენიმე სურათი, თუ როგორ გამოიყურება:

ფარული ტექსტი

მიმღების ესკიზი

ფარული ტექსტი

#შეიცავს #შეიცავს #შეიცავს #შეიცავს int x, y; int w = 128, h = 160; int ზომა; // 433 EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( byte ID; // Device ID int Temperature; // Temperature float Pressure; // Pressure float Humidity; // Humidity float dewPoint; // Dew/frost point ); SEND_DATA_STRUCTURE გადაცემა; ტემპერატურა); = Log_dewPoint) ( TFTscreen.setTextSize(ზომა); // მოძველებული მონაცემების გადაწერა = String(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 // გამომავალი new readings info = String(broadcast.dewPoint(dewPoint, info.length()); TFTscreen.stroke(255, 255, 255); Log_dewPoint)?true:false) else (ცვლილებები (10, 106, 125, true, true); ცვლილებები (10, 106, 125, false, true); ) // განაახლეთ ჟურნალებში არსებული მნიშვნელობები შემდგომისთვის. ჩვენებების შედარება Log_Temperature = მაუწყებლობა.ტემპერატურა;

წაკითხვები საკმაოდ კომპაქტურად არის ნაჩვენები, მაგრამ როგორც პრაქტიკა გვიჩვენებს (და ჩემი ამხანაგების რჩევა) - ”გემოვნება და ფერი, ცოლიც კი არ არის მეგობარი”. ბევრი რჩევა და წინადადება მოვისმინე, მაგრამ ისინი ერთმანეთს ეწინააღმდეგება. ამიტომ, გააკეთეთ ეს თქვენი გემოვნებით.

მეჩვენებოდა, რომ დიზაინი არის პროექტის ის ნაწილი, რომელიც დიდ დროს იკავებს!

ფარული ტექსტი

ზოგიერთი მონაცემი შექმნილია დიზაინის ზოგიერთი ელემენტის ასახვისთვის.

ეკრანზე გამოსახული არტეფაქტები არის მტვერი და სხვა ჭუჭყიანი, რომელიც დაგროვდა იმ დიდი ხნის განმავლობაში, რაც ეკრანი იყო... სადღაც იქ,... კარგი, არ მახსოვს, საიდან მოვიპოვე! დამანებე თავი!

ესკიზს აქვს პოზიციონირების ფუნქციები. ისინი საკმაოდ პრიმიტიულები არიან, მაგრამ საშუალებას გაძლევთ მიაღწიოთ გარკვეულ ეფექტებს.

  1. x_ცენტრი
  2. x_alignment_right

პირველი აფიქსირებს ტექსტს, ხოლო მეორე ასწორებს მას მითითებული ზონის მარჯვენა მხარეს. ყველა გამოთვლა კეთდება მოცემული ტექსტის ზომასთან შედარებით, გამოხატვის საფუძველზე 1 ზომა = 1PX x 1PXშრიფტის სეგმენტი.

ჩვენება ასევე აჩვენებს ელემენტებს, რომლებიც შეესაბამება კონკრეტული წაკითხვის მნიშვნელობის ზრდას ან შემცირებას. ისინი გამოსახულია სამკუთხედების სახით. მაგრამ ფუნქციის კოდში ცვლილებებიარსებობს ალტერნატიული ჩვენება სამკუთხედების სახით, რომლებიც ბრუნავს 45 გრადუსით. თუ ჩვენებები იზრდება, ელემენტი წითელია, წინააღმდეგ შემთხვევაში, ლურჯი.

სხვათა შორის, ძირითადი ტემპერატურის ფერი და ჩრდილი იცვლება თავად ტემპერატურის მიხედვით. საკმაოდ საკამათო გადაწყვეტილებაა, მაგრამ ჩემი აზრით ვიზუალურად კომფორტული. ცოტა ხანს ვიბრძოდი და მივხვდი, რომ მნიშვნელობები ფუნქციაშია ინსულტი, TFT დისპლეის ობიექტები ჩამოთვლილია არასწორი თანმიმდევრობით. BGRადგილი RGB. ეს დეველოპერის შეცდომაა, ან რაღაც ვერ გავიგე.

PS: ყველაფერი საკმაოდ საინტერესოა, მაგრამ ჩემი აზრით შემდგომ განვითარებას იმსახურებს. ეს არის ის, რასაც ჩვენ გავაკეთებთ გარკვეული დროის შემდეგ.

მშრომელი ადამიანების უმეტესობის მსგავსად, საკუთარი პროექტების განხორციელება მხოლოდ თქვენს დარჩენილ თავისუფალ დროს ატარებს. ამიტომ დიდი ხანია არაფერი შემიქმნია და რაღაცის გაკეთება მეზარებოდა. უცნაურია, მაგრამ ეს შესაძლებლობა გაჩნდა უნივერსიტეტში. ფანჯრის მიღმა სექტემბერია, მეოთხე წელი და მომავალი კურსი მიკროსქემის დიზაინის შესახებ. გვითხრეს, რომ კურსები შეიძლება გაკეთდეს ორი ვარიაციით: ქაღალდი და აპარატურა.

5 წლის განმავლობაში ჩვენს უნივერსიტეტში ქაღალდის კურსები ტარდებოდა პრინციპით „აიღეთ ძველი და შეაერთეთ“. ეს მიდგომა არ მომეწონა მისი რუტინულობის გამო, ამიტომ მაშინვე ავირჩიე ტექნიკის კურსები. Arduino მიკროკონტროლერი იყო შემოთავაზებული, როგორც სასწავლო პროცესის გულში მისი სწავლის სიმარტივის გამო. კურსის ტიპის განსაზღვრის შემდეგ კიდევ ერთი კითხვა დარჩა: კონკრეტულად რა უნდა გაკეთდეს. ვინაიდან მიკროკონტროლერების პროგრამირების გამოცდილება არ მქონდა, მაშინვე გავხსენი Google და დავიწყე არსებული პროექტების შესწავლა. ბევრი პროექტია, ზოგი საკმაოდ მარტივია, ზოგიც გენიალური (მაგალითად, 3D სკანერი), მაგრამ აბსოლუტურ უმრავლესობას პრაქტიკული გამოყენება არ ჰქონდა. მე უბრალოდ მინდოდა ისეთი რამ, რაც თაროზე არ დადგებოდა და მტვერს არ აგროვებდა. არდუინოს სამყაროში ნახევარსაათიანი ექსკურსიის შემდეგ დავინტერესდი სახლის მეტეოროლოგიური სადგურების თემით და პროექტების განხორციელება არც თუ ისე რთული მეჩვენა (რაც ძირითადად იზიდავდა ახალბედას).

ასე შეირჩა კურსის თემა და დროთა განმავლობაში პრობლემა არ ჩანდა.

კომპონენტის შერჩევა

სხვადასხვა პროექტების გადახედვისას მივხვდი, რომ Nano ან თუნდაც Pro Mini საკმარისი იქნებოდა ჩემთვის, მაგრამ მაინც ავირჩიე Arduino Uno იმ იმედით, რომ მომეწონა პროგრამირება Arduino-სთვის და განვახორციელებდი სხვა პროექტებს მომავალში. აქამდე არასოდეს მქონია ხელით შედუღების უთო, ამიტომ უფრო მარტივი განვითარებისთვის გადავწყვიტე მეყიდა Sensor Shield v4.

მეტი დეტალი

დაფა ხელს უწყობს სენსორების, მოდულების, სერვო ძრავების, სერიული და I2C ინტერფეისების სწრაფ კავშირს და ასევე აჩვენებს Duemilanova/Uno ფორმის ფაქტორის კონტროლერის ყველა პორტს (ასევე შეიძლება დაკავშირდეს მეგა სერიასთან, მაგრამ შეზღუდვებითა და შემდგომი შედეგებით) . მხარს უჭერს სხვა ფარებს თავის თავზე.


მეტეოროლოგიური მონაცემების წყაროდ შემდეგი სენსორები ავირჩიე:


მე გადავწყვიტე სენსორები. მაგრამ რა ვუყოთ სენსორებიდან მოსულ მონაცემებს? გადავწყვიტე მისი ჩვენება. მინდოდა ფერადი სურათი, ამიტომ მაშინვე გადავაგდე მონოქრომული გადაწყვეტილებები. რამდენიმე წუთის ძიების შემდეგ, არჩეული იქნა ST7735 1.8 დიუმიანი TFT დისპლეი.

მეტი დეტალი

ვინაიდან დისპლეი იყენებს 4-მავთულის SPI პროტოკოლს კომუნიკაციისთვის და აქვს საკუთარი პიქსელ-მისამართიანი ჩარჩო ბუფერი, მისი გამოყენება შესაძლებელია ნებისმიერი სახის მიკროკონტროლერთან. 1.8 დიუმიანი დისპლეი აქვს 128x160 ფერადი პიქსელი. ასევე არის microSD ბარათის სლოტი, შესაბამისად, შეგიძლიათ მარტივად ჩატვირთოთ სრული ფერადი ბიტმაპის სურათები FAT16/FAT32 microSD ბარათის ფაილური სისტემიდან.

სპეციფიკაციები:

  • ეკრანის დიაგონალი - 1.8 ინჩი, გარჩევადობა 128x160 პიქსელი, 18 ბიტიანი ფერი (262,144 ფერი)
  • კონტროლერი ვიდეო მეხსიერების ბუფერის ჩაშენებული პიქსელური მისამართით
  • ჩაშენებული microSD სლოტი - იყენებს 2-ზე მეტ ციფრულ ხაზს
  • თავსებადია 3.3 და 5 ვ
  • ზომები: 34 მმ x 56 მმ x 6.5 მ


Arduino კონტროლერის პროგრამირება

მას შემდეგ რაც გადავწყვეტთ კომპონენტებს ამინდის სადგურისთვის, ჩვენ დავიწყებთ კონტროლერის დაპროგრამებას. Arduino IDE გამოიყენებოდა Arduino firmware-ის გასანათებლად. ასევე გამოიყენა ადაფრუტის ბიბლიოთეკები.

სანამ ესკიზზე გადავიდოდეთ, მოდით შევხედოთ ფუნქციურობას:

  • კითხულობს სენსორებიდან ყოველ 10 წამში ერთხელ და ეკრანზე განახლდება მხოლოდ ის ინდიკატორები, რომლებიც შეიცვალა წინა გაზომვებთან შედარებით.
  • განხორციელდა მონაცემთა გადაცემა COM პორტით

ესკიზი

#შეიცავს // ბიბლიოთეკა I2C მოწყობილობებთან კომუნიკაციისთვის #include // ძირითადი ბიბლიოთეკა ყველა სენსორისთვის #include // ბიბლიოთეკა BMP180-ისთვის #include // ძირითადი გრაფიკული ბიბლიოთეკა #include // აპარატურის სპეციფიკური ბიბლიოთეკა #include // ბიბლიოთეკა SPI მოწყობილობებთან კომუნიკაციისთვის #include "dht.h" // library for DHT #define DHT22_PIN 2 // DHT22-ის მონაცემთა პინის დაკავშირება 2 ციფრულ პინთან #define TFT_CS 10 // დაკავშირება TFT-ის CS პინი 10 ციფრულ პინთან #define TFT_RST 9 // დააკავშირეთ TFT-ის RST პინი 9 ციფრულ პინთან // თქვენ ასევე შეგიძლიათ დააკავშიროთ ეს Arduino-ს გადატვირთვასთან // ამ შემთხვევაში დააყენეთ ეს #define პინი 0-ზე! #define TFT_DC 8 // დააკავშირეთ TFT-ის DC პინი 8 ციფრულ პინთან Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); //TFT-ის დაწყება #define TFT_SCLK 13 // TFT-ის SCLK პინის დაკავშირება 13 ციფრულ პინთან #define TFT_MOSI 11 // TFT-ის MOSI პინის დაკავშირება 11 ციფრულ dht DHT-თან; Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); //დაწყება BMP180 int bmpFlag = 0; struct ( uint32_t სულ; uint32_t ok; uint32_t crc_error; uint32_t time_out; uint32_t დაკავშირება; uint32_t ack_l; uint32_t ack_h; uint32_t უცნობია; ) სტატისტიკა = (0,0,0,0,0,0); // struct dht სტატუსისთვის void setup(void) ( Serial.begin(9600); Serial.println("Meteo Test"); Serial.println(""); if(!bmp.begin()) // შეამოწმეთ კავშირი BMP180-ისთვის ( Serial.print ("ოუპს, BMP180 არ არის გამოვლენილი ... შეამოწმეთ თქვენი გაყვანილობა ან I2C ADDR!"); bmpFlag = 1; ) tft.initR(INITR_BLACKTAB // დაწყვიტეთ TFT და შეავსეთ შავი ფერის tft.fillScreen). ; (ST7735_BLACK tft.setRotation(tft.setTextSize(1.5), რათა უზრუნველყოფილი იყოს TFT-ის ინიციალიზაცია ) // გაზომილი მონაცემების ძველი ტემპერატურა = 0 ; , ძველი წნევა = 0, ძველიDHTHსინესტე = 0, ძველიDHTTტემპერატურა; = 0 || !event.pressure) // მონაცემების განახლება (tft.fillRect(0, 30, 160, 6, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED); printValue("ERROR BMP INITIALIZATION", 0 , "", true ) else (if(event.pressure != oldPressure) (tft.fillRect(0, 30, 160, 7, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED) ; printValue ("Pressure", event.pressure, "hPa", true oldPressure = event.pressure = true) if(temperature != oldTemperature) (tft.fillRect(0, 38, 160, 7, ST7735_BLACK); tft.setCursor); (0, 38); (0, 46) tft.setTextColor(ST7735_BLUE) ; 54, 160, 7, ST7735_BLACK tft.setCursor(0, 54);

სხეულის აწყობის დროა

კურსის ძირითადი პირობა იყო სამუშაო პროტოტიპი წარმოდგენილ ფორმაში. ამიტომ, მე მომიწია საცხოვრებლის ყიდვა და ფაილით შეიარაღებული, მეტეოროლოგიური სადგური რაიმე ფორმით ჩამესვა საცხოვრებელში.

ქეისი შეძენილია ადგილობრივი რადიო ელექტრონიკის მაღაზიიდან.

ჩარჩო

(ფოტოზე საქმე ცოტა სხვანაირია. გამჭვირვალე სახურავი მაქვს)



შემდეგ, ფაილის გამოყენებით, ხვრელები გაკეთდა სენსორების გამოსასვლელად და ელექტროენერგიის მიწოდებისთვის. გადავწყვიტე სენსორები გარეთ გადამეტანა, რადგან სისტემის კეისის გარეშე ტესტირებისას შევამჩნიე, რომ ეკრანის უკანა მხარე ძალიან გაცხელდა, რაც იმოქმედებდა კორპუსის შიგნით ტემპერატურაზე.

კორპუსი სენსორებისა და დენის ღიობებით



რადგან ფეხები 2 სენსორზე მომიწია და ერთ-ერთზე ტრაკი დამეწვა, გადავწყვიტე ბედის ცდუნება და მავთულები სენსორებზე არ შემეყარა (სხვა რამეზე ვივარჯიშებ) და დაკავშირების მიზნით მეტ-ნაკლებად სანდო რომ ვყოფილიყავი, გადავწყვიტე ელექტრო ფირის გადახვევა.

სისტემა საცხოვრებელში "ჩაყრამდე".



ვინაიდან კორპუსი გაცილებით დიდია ვიდრე Arduino (უფრო პატარა არ იყო), მომიწია საყრდენი, რათა დაფა არ გადამძვრალიყო ქეისის შიგნით. ასევე, ქაფიდან ამოჭრეს ფიგურა და მასში ჩასმული იყო ეკრანის მართკუთხედი კორპუსის შიგნიდან დასამალად. მე არ მქონდა სუპერწებო ხელზე, ამიტომ მომიწია ორმხრივი ლენტის გამოყენება.

სასწაული-იუდა თევზი-ვეშაპი



დაახურეთ თავსახური, შეაერთეთ დენი და დაელოდეთ.

დასრულებული მეტეოროლოგიური სადგური შენობაში



შედეგების ეკრანზე ჩვენების შემდეგ, ჩვენ გამოვავლენთ უსიამოვნო შეცდომას ტენიანობის გაზომვისას: DHT22 გულმოდგინედ აწარმოებს ფიგურას 99,90% (1,00% უკიდურესად იშვიათია). დავიწყოთ იმის გარკვევა, თუ რა არის პრობლემა. პირველი, რასაც ვაკეთებთ, არის COM პორტის მნიშვნელობების გამომავალი. როგორც ჩანს, ყველაფერი კარგადაა. ქეისის რამდენიმე შევსების, დაშლისა და აწყობის შემდეგ თავში ჩნდება აზრი, რომ პასუხი გუგლში მოძებნოთ. როგორც მოსალოდნელი იყო, რუსულ Google-ს სასარგებლო არაფერი უთქვამს. OK. ვიწყებთ ინგლისურ ენაზე ძებნას და ერთ-ერთ ფორუმზე ვხვდებით ბიჭებს მსგავსი პრობლემის მქონე. დისკუსიის პირველი ოთხი გვერდი არ იძლევა რაიმე სასარგებლოს, მაგრამ მეხუთე გვერდზე ვპოულობთ პასუხს ჩვენს კითხვაზე:
ტენიანობის სენსორებზე ადვილად შეიძლება დაზარალდეს არასწორი აირები ან მაღალი ტენიანობის IIRC ძალიან ხანგრძლივი ზემოქმედება. მონაცემთა ფურცელში არის სენსორის „გადატვირთვის“ პროცედურა, შეგიძლიათ სცადოთ.

დარჩა ერთადერთი კითხვა, როდის და როგორ მოვახერხე DHT22-ის დაზიანება. მაგრამ მოახლოვდა კურსების გავლის დრო და ამიტომ ამ პრობლემის გადაწყვეტა მოგვიანებით დავტოვე.

შემდგომი სიტყვა

კურსი გაიარა. მეტეოროლოგიური სადგური გაურკვეველი ვადით გადაიდო, სანამ უნივერსიტეტში ყველა კუდს არ დაიხურება. თუმცა მეტეოსადგურში იმაზე ადრე მოგვიწია დაბრუნება, ვიდრე მეგონა. ისე მოხდა, რომ ნოემბრის შუა რიცხვებში შევცვალე სამუშაო ადგილი და ახალ გუნდში გავიცანი ადამიანები, რომლებიც დაინტერესებულნი არიან Arduino პლატფორმით და მსგავსი. ამიტომ, ჩემი ინტერესი ამ პლატფორმის მიმართ, გაციების დრო რომ არ მქონია, ისევ გაჩნდა. ამოვიღე ჩემი მეტეოროლოგიური სადგური, დავუკავშირე კომპიუტერს და გამახსენდა, რომ მონაცემთა გადაცემა Arduino-დან COM პორტით განვახორციელე. შემდეგ კი იდეა გამიჩნდა დამეწერა პროგრამა, რომელიც იღებს მონაცემებს COM პორტის მეშვეობით Arduino-დან და გადასცემს ამ მონაცემებს საჯარო მონიტორინგზე
  • არდუინო
  • ტეგების დამატება

    რაიმე შეკითხვა?

    შეატყობინეთ შეცდომას

    ტექსტი, რომელიც გაეგზავნება ჩვენს რედაქტორებს: