Stručna zajednica za preuređenje kupaonice

Arduino vremenska stanica s bežičnim senzorom temperature. BMP085 Modul senzora barometarskog tlaka za arduino (ili kako napraviti meteorološku stanicu vlastitim rukama) Mjerenje temperature na otvorenom i kod kuće arduino

Kao i kod većine zaposlenih ljudi, jedino preostalo slobodno vrijeme oduzima vam izvođenje vlastitih projekata. Stoga dugo nisam stvarao i "svrbjele su me ruke" da nešto napravim. Ova se prilika, začudo, ukazala na sveučilištu. Iza prozora je rujan, 4. godina i nadolazeći kolegij iz strujnih krugova. Rečeno nam je da se kolegij može raditi u dvije varijante: papirnati i hardverski.

5 godina papirnati rad na našem sveučilištu rađen je po principu “uzmi staro i sastavi”. Ovakav pristup mi nije odgovarao svojom rutinom, pa sam odmah odabrao kolegij iz hardvera. Kao srce nastave predložen je Arduino mikrokontroler zbog njegove lakoće učenja. Nakon određivanja vrste kolegija, pojavilo se još jedno pitanje: što točno raditi. Kako nisam imao iskustva u programiranju mikrokontrolera, odmah sam otvorio Google i počeo proučavati postojeće projekte. Postoji mnogo projekata, neki od njih su prilično jednostavni, neki su briljantni (3D skener, na primjer), ali velika većina nije imala praktičnu primjenu. I htio sam upravo ono što onda ne bi ležalo na polici i tamo skupljalo prašinu. Nakon polusatnog izleta u svijet Arduina, zainteresirala me tema kućnih meteoroloških stanica, a projekti se nisu činili vrlo teškim za implementaciju (što je u osnovi podmitilo početnika).

Tako je odabrana tema za seminarski rad i s vremenom se činilo da nema problema.

Odabir komponente

Pregledavajući različite projekte, shvatio sam da bi mi Nano ili čak Pro Mini bili dovoljni, ali ipak sam odabrao Arduino Uno u nadi da ću voljeti programirati za Arduino i implementirati još neke projekte u budućnosti. Nikad prije nisam držao lemilicu u rukama, pa sam se zbog lakšeg razvoja odlučio i za nabavku Sensor Shielda v4.

Više

Ploča omogućuje brzo spajanje senzora, modula, servo motora, serijskih i I2C sučelja, a također daje izlaze svim portovima Duemilanova / Uno kontrolera faktora forme (može se spojiti i na mega seriju, ali uz ograničenja i posljedice koje iz toga proizlaze) . Podržava druge štitove na sebi.


Kao izvore meteoroloških podataka odabrao sam sljedeće senzore:


Odlučio se za senzore. Ali što učiniti s podacima koji dolaze sa senzora. Odlučio prikazati. Htio sam sliku u boji, pa sam odmah odbacio jednobojna rješenja. Nakon nekoliko minuta traženja, odabran je ST7735 1,8 inčni TFT zaslon.

Više

Budući da zaslon koristi 4-žilni SPI protokol za komunikaciju i ima vlastiti međuspremnik okvira koji se može adresirati pikselima, može se koristiti s bilo kojom vrstom mikrokontrolera. Zaslon od 1,8 inča ima 128x160 piksela u boji. Tu je i utor za microSD memorijsku karticu, tako da možete jednostavno učitati bitmape u boji iz FAT16 / FAT32 datotečnog sustava microSD kartice.

Karakteristike:

  • Dijagonala zaslona - 1,8 inča, rezolucija 128x160 piksela, 18-bitna boja (262 144 boje)
  • Kontroler s ugrađenim adresiranjem piksela međuspremnika video memorije
  • Ugrađeni microSD utor - koristi više od 2 digitalne linije
  • Kompatibilan s 3,3 i 5V
  • Dimenzije: 34 mm x 56 mm x 6,5 m


Programiranje Arduino kontrolera

Nakon što smo se odlučili za komponente meteorološke stanice, krenimo s programiranjem kontrolera. Arduino IDE korišten je za fleširanje Arduina. Također se koriste biblioteke iz Adafruita.

Prije nego prijeđemo na skicu, pogledajmo funkcionalnost:

  • Očitavanja se uzimaju sa senzora svakih 10 sekundi, a na ekranu se ažuriraju samo oni pokazatelji koji su se promijenili u odnosu na prethodno mjerenje
  • Implementiran prijenos podataka preko COM porta

Skica

#uključi // biblioteka za komunikaciju s I2C uređajima #include // Osnovna biblioteka za sve senzore #include // biblioteka za BMP180 #include // Osnovna grafička biblioteka #include // Biblioteka specifična za hardver #include // biblioteka za komunikaciju sa SPI uređajima #include "dht.h" // biblioteka za DHT #define DHT22_PIN 2 // spojite podatkovni pin DHT22 na 2 digitalni pin #define TFT_CS 10 // spojite CS pin TFT-a na 10 digitalni pin #define TFT_RST 9 // spojite RST pin TFT-a na 9 digitalni pin // ovo također možete spojiti na Arduino reset // u kojem slučaju postavite ovaj #define pin na 0! #define TFT_DC 8 // spojite DC pin TFT-a na 8 digitalni pin Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); //inicijalizirati TFT #define TFT_SCLK 13 // spojiti SCLK pin TFT-a na 13 digitalni pin #define TFT_MOSI 11 // spojiti MOSI pin TFT-a na 11 digitalni pin dht DHT; Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); //inicijaliziraj BMP180 int bmpFlag = 0; struct ( uint32_t total; uint32_t ok; uint32_t crc_error; uint32_t time_out; uint32_t povezivanje; uint32_t ack_l; uint32_t ack_h; uint32_t unknown; ) stat = ( 0,0,0,0,0,0,0,0); // struktura za dht status void setup(void) ( Serial.begin(9600); Serial.println("Meteo Test"); Serial.println(""); if(!bmp.begin()) // provjeri vezu za BMP180 ( Serial.print("Ooops, nije otkriven BMP180 ... Provjerite svoje ožičenje ili I2C ADDR!"); bmpFlag = 1; ) tft.initR(INITR_BLACKTAB); // Inicijalizirajte TFT i ispunite crnom bojom tft.fillScreen (ST7735_BLACK); tft.setRotation(tft.getRotation() + 1); tft.setTextSize(1.5); delay(500); // odgoda kako bi se osiguralo da je TFT inicijaliziran ) // zadnji izmjereni podaci float oldTemperature = 0 , stara nadmorska visina = 0, stari pritisak = 0, staraDHTHvlažnost = 0, staraDHTTtemperatura; bool wasUpdate = false; void loop(void) ( if(Serial.available() > 0) // imamo podatak serijski port ( Serial.read(); // čitanje bajta sa serijskog porta i slanje zadnjih izmjerenih podataka printValue("Pressure", oldPressure , " hPa", false); printValue("Temperatura", oldTemperature, " C", false); printValue("Nadmorska visina", oldAltitude, " m", false); printValue("Vlažnost", oldDHTHvlažnost, "%", false); printValue("DHT_temperature", oldDHTTemperature, " C", false); Serial.println("END_TRANSMISSION"); ) sensors_event_t događaj; temperatura plovka, nadmorska visina; if(bmpFlag == 0)( bmp.getEvent(&event) ; // dobivanje podataka iz BMP180 if (event.pressure) ( bmp.getTemperature(&temperature); float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA; altitude = bmp.pressureToAltitude(seaLevelPressure, event.pressure, temperature); ) else ( Serial.println("Senzor) greška"); ) ) uint32_t start = micros(); int chk = DHT.read22(DHT22_PIN);// dohvati podatke iz DHT22 uint32_t stop = micros(); stat.total++; switch (chk) // provjeri status DHT22 ( slučaj DHTLIB_OK: stat.ok++; pauza; case DHTLIB_ERROR_CHECKSUM: stat.crc_error++; Serial.print("Pogreška kontrolnog zbroja,\t"); pauza; case DHTLIB_ERROR_TIMEOUT: stat.time_out++; Serial.print("Greška isteka vremena,\t"); pauza; case DHTLIB_ERROR_CONNECT: stat.connect++; Serial.print("Pogreška povezivanja,\t"); pauza; case DHTLIB_ERROR_ACK_L: stat.ack_l++; Serial.print("Ack Low error,\t"); pauza; case DHTLIB_ERROR_ACK_H: stat.ack_h++; Serial.print("Ack High error,\t"); pauza; default:stat.unknown++; Serial.print("Nepoznata pogreška,\t"); pauza; ) if(bmpFlag ! = 0 || !event.pressure) // ažuriranje podataka ( tft.fillRect(0, 30, 160, 6, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED); printValue("GREŠKA BMP INICIJALIZACIJE", 0 , "", istina); ) else ( if(event.pressure != oldPressure) ( tft.fillRect(0, 30, 160, 7, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED) ; printValue("Tlak", event.pressure, " hPa", true); oldPressure = event.pressure; wasUpdate = true; ) if(temperature != oldTemperature) ( tft.fillRect(0, 38, 160, 7, ST7735_BLACK) ); tft.setCursor(0, 38); tft.setTextColor(ST7735_WHITE); printValue("Temperatura", temperatura, " C", true); oldTemperature = temperatura; wasUpdate = true; ) if(visina != oldAltitude) ( tft.fillRect(0, 46, 160, 7, ST7735_BLACK); tft.setCursor(0, 46); tft.setTextColor(ST7735_BLUE); printValue("Visina", visina, " m", istina); oldAltitude = visina; wasUpdate = true; ) ) if(DHT.humidity != oldDHTHhumidity) ( tft.fillRect(0, 54, 160, 7, ST7735_BLACK); t ft.setCursor(0, 54); tft.setTextColor(ST7735_GREEN); printValue("Vlažnost", DHT.vlažnost, "%", istina); oldDHTHvlažnost = DHT.vlažnost; wasUpdate = istina; ) if(DHT.temperature != oldDHTTemperature) ( tft.fillRect(0, 80, 160, 7, ST7735_BLACK); tft.setCursor(0, 80); tft.setTextColor(ST7735_YELLOW); printValue("DHT_temperature", DHT. temperatura, " C", istina); oldDHTTempature = DHT.temperatura; wasUpdate = true; ) if(wasUpdate) ( Serial.println("END_TRANSMISSION"); ) wasUpdate = false; kašnjenje (10000); ) void printValue(char* naslov, dvostruka vrijednost, char* mjera, bool tftPrint) ( if(tftPrint) // ispis podataka na TFT ( tft.print(title); tft.print(": "); tft.print( vrijednost); tft.println(mjera); ) Serial.print(naslov); // slanje podataka na serijski port Serial.print(": "); Serial.print(vrijednost); Serial.println(mjera); )

Vrijeme je za sastavljanje tijela

Glavni uvjet za kolegij bio je radni prototip u prezentiranom obliku. Stoga sam morao kupiti kućište i, naoružan turpijom, na bilo koji način ugurati meteorološku stanicu u kućište.

Kutija je kupljena u lokalnoj trgovini elektronike.

Okvir

(Na fotografiji je kućište malo drugačije. Imam prozirni poklopac)



Zatim su pomoću turpije napravljene rupe za izlaz senzora i napajanja. Senzore sam odlučio iznijeti vani, jer sam tijekom testiranja sustava bez kućišta primijetio da se stražnja strana ekrana jako zagrijava, što će utjecati na temperaturu unutar kućišta.

Kućište s otvorima za senzore i napajanje



Budući da sam morao zalemiti noge na 2 senzora i spalio sam stazu na jednom od njih, odlučio sam ne iskušavati sudbinu i ne lemiti žice na senzore (vježbat ću na nečemu drugom), ali kako bi spoj da budem koliko-toliko pouzdan, odlučio sam premotati traku.

Sustav prije "trpanja" u kućište



Kako je kućište puno veće od Arduina (nije bilo manjeg), morao sam smisliti potporu da se ploča ne vozi unutar kućišta. Također, od pjene je izrezana figura, au njoj pravokutnik za ekran kako bi se sakrila unutrašnjost kućišta. Nisam imao super ljepilo pri ruci, pa sam morao upotrijebiti dvostranu traku.

Čudesna kitova riba Yuda



Pričvršćujemo poklopac, spajamo struju i čekamo.

Gotova meteorološka stanica u zgradi



Nakon prikaza rezultata na ekranu, otkrivamo neugodnu pogrešku u mjerenju vlažnosti: DHT22 marljivo ispisuje brojku od 99,90% (izuzetno rijetko ima 1,00%). Počnimo otkrivati ​​u čemu je problem. Prvo što radimo je da pogledamo izlaz vrijednosti na COM port. Dobar osjećaj. Nakon nekoliko ponovnih učitavanja, rastavljanja i ponovnog sastavljanja kućišta, pada mi na pamet pomisao da odgovor potražimo na Googleu. Očekivano, ruski Google nije rekao ništa pametno. U REDU. Počnemo tražiti na engleskom i na jednom od foruma naiđemo na dečke sa sličnim problemom. Prve četiri stranice rasprave ne daju ništa smisleno, a na petoj stranici nalazimo odgovor na naše pitanje:
Na senzore vlage lako mogu utjecati pogrešni plinovi ili vrlo dugo izlaganje visokoj vlažnosti IIRC. U podatkovnoj tablici postoji postupak kako "resetirati" senzor, možete pokušati.

Ostalo je samo pitanje kada i kako sam uspio naškoditi DHT22. Ali bilo je vrijeme za predaju kolegija, pa sam rješenje ovog problema ostavio za kasnije.

Pogovor

Nastava je položena. Meteorološka stanica je odgođena na neodređeno vrijeme dok se ne zatvore svi repovi na sveučilištu. Međutim, morao sam se vratiti na meteorološku stanicu ranije nego što sam mislio. Dogodilo se da sam sredinom studenog promijenio radno mjesto iu novom timu upoznao ljude koje zanima Arduino platforma i slično. Stoga se moj interes za ovu platformu nije imao vremena ohladiti, već se ponovno rasplamsao. Izvadio sam svoju meteorološku stanicu, spojio je na računalo i sjetio se da provodim prijenos podataka s Arduina preko COM porta. I onda mi je pala na pamet ideja da napišem program koji prima podatke preko COM porta od Arduina i te podatke prenosi na nadzor ljudi, ali to je sasvim druga priča.

Također bih želio imati bežične senzore i ipak implementirati meteorološku stanicu na Arduino Pro Mini. Stoga sam naručio 4 Arduino Pro Mini s 3.3V napajanjem, 4 nRF24L01 + radio modula i još neke dodatne senzore o kojima ću također pokušati pričati sljedeći put. U međuvremenu, čekam pošiljku, planiram implementirati povezivanje sata u stvarnom vremenu kako bih mogao spremiti vrijeme ažuriranja podataka i same podatke na microSD karticu, pod uvjetom da nema veze s klijentom preko COM porta.

Možete pomoći i dodijeliti neka sredstva za razvoj stranice



U slobodno vrijeme sam i ovaj put napisao upute za izradu male meteorološke stanice. Funkcionirat će kao sat s datumom i pokazivati ​​temperaturu unutar i izvan prostorije. Koristit ćemo Arduino UNO kao glavni kontroler, ali dovoljna je i druga ploča s Atmega328p. Za prikaz koristimo grafički ekran WG12864B. Također ćemo spojiti dva senzora temperature ds18b20. Jedan je unutra, drugi je iznesen van. Počnimo.

U procesu izrade domaćih proizvoda trebamo:

Arduino UNO (Ili bilo koja druga Arduino kompatibilna ploča)
- WG12864B grafički ekran
- senzor temperature ds18b20, 2 kom
- Napajanje 6 - 12 V
- Otpornici 4,7 Kom 0,25 W, 2 kom.
- Otpornici 100 ohma 0,25 W
- Pretinac za baterije za 4 AAA "mali prst" baterije
- Kutija iz uloška SEGA konzole
- Izolacijska traka
- Spajanje žica
- tiskana ploča
- Gumbi
- Pisarski nož
- lemilica
- Lem, kolofonij
- Dvostrana traka

Korak 1 Pripremite WG12864B3.
Za one koji prije nisu radili s ekranima, to može biti zastrašujuće veliki broj modifikacije, naizgled identični, ekrani. Pojasnit ću malo. Većina ekrana ove vrste radi na ks0107/ks0108 čipovima. Svi zasloni mogu se podijeliti u 4 vrste:

Opcija A: HDM64GS12L-4, Crystalfontz CFAG12864B, Sparkfun LCD-00710CM, NKC Electronics LCD-0022, WinStar WG12864B-TML-T

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

Opcija C: Shenzhen Jinghua Displays Co Ltd. JM12864

Opcija D: Wintek- Cascades WD-G1906G, Wintek - GEN/WD-G1906G/KS0108B, Wintek/WD-G1906G/S6B0108A, TECDIS/Y19061/HD61202, Varitronix/MGLS19264/HD61202

Izgledaju gotovo isto. Ali spojne igle su različite. Odabrao sam i preporučujem vam WG12864B3 V2.0, ali ako je zaslon došao u drugom ili ga jednostavno nemate pri ruci, lako ćete to shvatiti pomoću tablice:

Kratke specifikacije:

Na internetu postoji mnogo različitih shema povezivanja i čini se da sve radi. Stvar je u tome što ne postoje samo različiti ekrani, već i dva načina povezivanja: serijski i paralelno. Kada koristimo vezu preko serijskog porta, potrebna su nam samo 3 izlaza mikrokontrolera. S paralelnim minimumom od 13. Izbor je u ovom slučaju očit, Arduino ionako nema puno zaključaka. Za paralelna veza dijagram ožičenja je sljedeći:

Za serijsku vezu, koju ćemo koristiti, shema je sljedeća:

WG12864B - Arduino UNO 1 (GND) - GND 2 (VCC) - +5V 4 (RS) - 10 5 (R/W) - 11 6 (E) - 13 15 (PSB) - GND 19 (BLA) - preko otpornika 100 Ohm - +5V 20 (BLK) - GND

Za podešavanje kontrasta potenciometar mora biti na ekranu. Postoje zasloni bez toga, ali ovo je sada rijetkost:

Potreban je otpornik od 100 ohma kako napon od 5 volti ne bi slučajno spalio diode pozadinskog osvjetljenja.

Korak 2 Izrada kućišta.
Za kućište uzmite kutiju iz uloška Sega set-top box-a. Ako ne nađete ovu kutiju pri ruci, možete koristiti drugu kutiju. Glavno je da ekran i Arduino stanu u njega.

Odrežite prozirnu foliju na vrhu kutije tako da ne ostanu komadići:

Zatim, pomoću klerikalnog noža, izrežite prozor 37x69 za ekran.

Na poleđini, uz rub izreza, lijepimo dvostranu traku, po mogućnosti crnu:

Skinemo zaštitni papir s ljepljive trake i na njega zalijepimo ekran:

Izvana bi trebalo izgledati ovako:

Ispod ekrana, također na dvostranoj traci, montiramo Arduino, prethodno napravivši izreze za USB priključak i utičnicu:

Izrezi za Arduino utičnice moraju biti napravljeni s obje strane kutije tako da se može slobodno zatvoriti:

Korak 3 Senzori temperature.
Koristit ćemo digitalne senzore temperature DS18B20. Koristeći ih, dobivamo veću točnost mjerenja, pogrešku ne veću od 0,5 °C, u širokom temperaturnom rasponu od -55 ... + 125 °C. Osim toga, senzor je digitalan i sam obavlja sve izračune, a Arduino jednostavno prima gotova očitanja. Kada spajate ovaj senzor, ne zaboravite na 4,7 KΩ otpornik za povlačenje između DQ i VDD pinova. Također je moguće nekoliko opcija povezivanja. Uz vanjsko napajanje, po mom mišljenju najbolja opcija, koristit ćemo ga:

S bilo kojom opcijom napajanja, senzori su spojeni paralelno:

Senzor unutarnje temperature postavit ćemo na malu ploču zajedno s dva gumba pomoću kojih ćemo postaviti vrijeme i datum na satu:

Spojimo zajedničku žicu s oba gumba na GND, spojimo žicu s prvog gumba na A0, s drugog na A1.
Fiksiramo ga na dvostranu traku pored Arduina:

Senzor, koji bi trebao biti postavljen izvan prostorije, bolje je odabrati u metalnom kućištu otpornom na prašinu:

Izračunajte žicu potrebne duljine tako da možete objesiti senzor izvan prozora, glavna stvar je da ne smije biti veća od 5 metara, ako vam je potrebna veća duljina, morat ćete smanjiti vrijednost povlačenja- gore otpornik.

Spojimo žicu iz DQ podatkovne sabirnice oba senzora na pin 5 Arduina.
Vdd - +5 Arduino.
GND - GND Arduino.

Korak 4 Prehrana.
Za napajanje možete koristiti napajanje s naponom od 6 do 12 volti. Na kraju žice za napajanje, zalemite utikač koji odgovara Arduino utičnici:

Ili možete staviti odjeljak za baterije za četiri "AAA", "mali prst" baterije u kućište. I spojite pozitivnu žicu iz ležišta na Vin Arduino, a negativnu žicu na GND.

Korak 5 Pripremite programsko okruženje.
Prvo morate preuzeti i instalirati Arduino IDE sa službene web stranice

Također dodajte u dvije biblioteke potrebne za skicu. OneWire - potreban za komunikaciju s ds18b20 senzorima:

U8glib - koristi se za prikaz informacija na ekranu:

Preuzimanje knjižnica. Zatim raspakiramo arhive, a sadržaj arhiva premjestimo u mapu "libraries", koja se nalazi u mapi s instaliranim Arduino IDE. Također možete dodati biblioteke kroz Arduino IDE. Da biste to učinili, bez raspakiravanja arhiva, pokrenite Arduino IDE, odaberite Sketch - Connect Library s izbornika. Na samom vrhu padajućeg popisa odaberite stavku "Dodaj. Zip biblioteku". Navedite mjesto preuzetih arhiva. Nakon svih koraka, trebate ponovno pokrenuti Arduino IDE.

Korak 6 Uređivanje skice.
Senzori temperature rade koristeći One Wire protokol i imaju jedinstvenu adresu za svaki uređaj - 64-bitni kod. Nije preporučljivo dodavati naredbe za traženje senzora u skici. Nema potrebe svaki put opterećivati ​​Arduino da bi senzori štucali. Stoga, prvo, nakon što smo prikupili sve zajedno, popunjavamo Arduino skicu koja se nalazi u izborniku Datoteka - Primjeri - Dallas Temperatura - OneWireSearch. Zatim pokrećemo Tools - Port Monitor. Arduino bi trebao pronaći naše senzore, napisati adrese i očitanja temperature. Te adrese moraju biti zapisane ili jednostavno negdje kopirane. Sada otvorite skicu Ard_Tic_Tak_WG12864B_2_x_Term_Serial i potražite retke:

Bajt addr1=(0x28, 0xFF, 0x75, 0x4E, 0x87, 0x16, 0x5, 0x63);// adresa internog bajta addr2=(0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x16, 0x5, 0x97); senzor

Adrese senzora koji odgovaraju lokaciji zamjenjujemo našim adresama.
Naš sat ne koristi RTC modul (sat realnog vremena) pa je potrebno ispraviti sat. Radi praktičnosti uklonite komentare iz retka (sekunde će se pojaviti na zaslonu):

//u8g.setPrintPos(44, 50); u8g.ispis(sek); // Ispis sekundi za kontrolu ispravnosti poteza

Instalirati pravo vrijeme, preko monitora porta. Da biste to učinili, otvorite port monitor, pričekajte da početna mjerenja temperature završe i unesite trenutni datum i vrijeme u formatu "dan, mjesec, godina, sati, minute, sekunde". Bez razmaka, brojevi su odvojeni zarezima ili točkama.

Ako je sat u žurbi, promijenite vrijednost na veću, preporučujem eksperimentiranje s korakom od 100 jedinica. Ako zaostaje treba smanjiti vrijednost u retku:

If (micros() - prevmicros >494000) ( // promijenite u nešto drugo da prilagodite da je bilo 500000

Empirijski dovoljno točno određujemo broj na kojem sat ide. Da biste odredili točnost poteza, potreban vam je izlaz u sekundama. Nakon precizne kalibracije broja, sekunde se mogu komentirati i tako ukloniti sa zaslona.
Učitavanje skice.

Na temelju projekta meteorološke stanice iz knjige V. Petina "Projekti koji koriste Arduino kontroler" 2. izdanje (projekt 5 Dodatka 2). Koristio Arduino IDE 1.8.5 na Windows 10.
Došlo je do pogreške prilikom pokretanja skice

Na internetu možete preuzeti biblioteke za Arduino koje imaju isti naziv, ali različit sadržaj. Skica možda neće raditi ako koristite "pogrešnu" biblioteku. Očigledno sam dobio pogrešne biblioteke. U projekt sam dodao senzor BMP180 za mjerenje atmosferskog tlaka i preradio skicu.

Dijagram povezivanja

Skeniranje adresa

Prvo spojite BMP180 senzor i LCD1602 indikator na Arduino. Sastavite skicu I2C skenera i pokrenite je da odredite adrese uređaja na I2C sabirnici.

Svakih 5 sekundi program skenira uređaje i izdaje adrese COM portu. Pronašao sam dva uređaja s adresama 0x3F i 0x77. BMP180 standardno ima adresu 0x77, tako da LCD indikator ima adresu 0x3F.
U nekim shemama, knjige su pomiješane gdje su SDA i SCL signali spojeni na Arduino ploču. Treba biti: SDA - na A4, SCL - na A5. Ako BMP180 modul ima pet pinova, tada se +5 volti primjenjuje na VIN pin.

Dijagram ožičenja

Sada sastavite krug u potpunosti. Koristio sam običnu katodu RGB LED postavljenu na ploču zajedno s otpornicima od 150 ohma. Zajednička katoda spojena je na GND pin, ostali pinovi su spojeni prema dijagramu. Nema potrebe mijenjati skicu, jer se svjetlina LED dioda mijenja prema cikličkom zakonu.
Na dijagramu je prikazan spoj RGB LED-a sa zajedničkom anodom, kao u knjizi.
Ako se na LCD1602 zaslonu ne vide znakovi, okrenite kontrolu svjetline. Pozadinsko osvjetljenje indikatora troši prilično veliku struju, stoga koristite napajanje sa strujom od najmanje 2 A. Koristio sam USB hub s vanjskim napajanjem od 2 A.
U krugu sam koristio ZP-22 piezo poziv. Otpornik spojen na zvono je 100 ohma. Frekvencija zvuka se može promijeniti u programu. Odabrao sam frekvenciju od 1000 Hz. Ako naiđete na zujalicu s fiksnom frekvencijom zvuka, možete je uključiti i isključiti jednostavnim primjenom i uklanjanjem napona, poput obične LED diode. Kada skica započne, čuje se kratki zvučni signal. Možete omogućiti periodično signaliziranje dok program radi uklanjanjem komentara iz reda //bzz(100); u skici.
U projektu sam koristio senzor DHT11 u obliku modula s već montiranim otpornikom od 4,7 kΩ. Otpor može biti od 4,7 do 10 kOhm.
Spojite Vcc pin modula sata DS1302 na +5 Volt tračnicu. Na ovaj način ćete smanjiti potrošnju baterije, zapravo će raditi samo kada je Arduino isključen.

Program (skica)

Knjižnica bmp085 korištena je za posluživanje BMP180. Vrijednost tlaka ovisi o visini područja. Za točnu vrijednost atmosferskog tlaka potrebno je odabrati visinu. Da biste to učinili, uredite redak dps.init(MODE_STANDARD, 10000, true); Moja visina je 100 m (10000 cm). Fragment izračuna tlaka preuzet je iz primjera BMP085_test2.ino biblioteke bmp085.

meteo_P skica

#uključi
#uključi
#uključi
#uključi "dht.h"
#uključi
BMP085 dps = BMP085();
dugi tlak = 0, nadmorska visina = 0;
nepredpisano dugo vrijeme1 = 0;

#definiraj DHTPIN 10
#define DHTTYPE 11 // 11 - DHT11, 22 - DHT22
DHT dht(DHTPIN, DHTTYPE);

int kCePin = 4; // RST DS1302
int kIoPin = 3; // Podaci DS1302
int kSclkPin = 2; // CLK DS1302
DS1302 rtc(kCePin, kIoPin, kSclkPin);

int REDpin = 9;
int ZELENI pin = 6;
int PLAVI pin = 11;

LiquidCrystal_I2C lcd(0x3f, 16, 2); // postavite svoju adresu 0x20...0xff adresu
unsigned long memTime;
int bzzPin = 8;

void HumTempRead() (
float hum = dht.readHumidity();
float temp = dht.readTemperature();
if (isnan(hum) || isnan(temp)) (
Serial.println("Nije uspjelo čitanje s DHT senzora!");
lcd.setCursor(0, 1);
lcd.print("H=--% T=---");
lcd.setCursor(11, 1);
lcd.print((char)223);
lcd.setCursor(12, 1);
lcd.print("C");
) inače (
lcd.setCursor(0, 1);
lcd.print("H=");
lcd.setCursor(2, 1);
LCD ispis (pjevušenje);
lcd.setCursor(4, 1);
lcd.print("%T=+");
lcd.setCursor(9, 1);
LCD ispis (temp);
lcd.setCursor(11, 1);
lcd.print((char)223);
lcd.setCursor(12, 1);
lcd.print("C") ;
}
}

void setup_bzz() (
pinMode(bzzPin, IZLAZ);
}

void bzz(int _bzzTime) (
ton(bzzPin, 1000, _bzzTime); // frekvencija 1000 Hz
}

void setup()(
Serial.begin(9600);
Wire.begin();
kašnjenje (1000);

dps.init(MODE_STANDARD, 10000, istina); // 100 metara (nadmorska visina u cm)

dht.početak();
postava_bzz();
bzz(100);

lcd.init();
lcd.pozadinsko osvjetljenje();
lcd.home();
// lcd.setCursor(0, 0);

rtc.halt(false);
rtc.writeProtect(false);

//rtc.setDOW(PETAK); // Postavite dan u tjednu na PETAK postavite dan u tjednu
//rtc.setTime(4, 58, 0); // Postavite vrijeme na 12:00:00 (24-satni format)
//rtc.setDate(6, 8, 2010); // Postavite datum na 6. kolovoza 2010. postavite datum (dan, mjesec, godina)
}

lcd.setCursor(8, 0);
lcd.print(rtc.getTimeStr());

if ((milis() - memTime > 2000) ili (millis()< memTime)) { // DHT11/22 1 time each 2 seconds
HumTempRead();
memTime = millis();
}
kašnjenje (100);

if (((milis() - vrijeme1) / 1000,0) >= 1,0) (
dps.calcTrueTemperature();
vrijeme1 = millis();
}
dps.getPressure(&Pritisak);
Serial.print("Tlak (Pa):");
Serijski ispis (pritisak);

longp2;
intpi;
p2 = (pritisak / 133,3224); // Pa u mmHg
pi = trunc(p2); // odbacivanje razlomljenog dijela broja

lcd.setCursor(0, 0);
lcd.print("P=");
lcd.setCursor(2, 0);
LCD ispis (pi); // izlaz atm. pritisak na LCD-u
lcd.setCursor(5, 0);
lcd.print("mm");
// kašnjenje(3000);
//bzz(100); // odkomentirajte ako želite slušati signale
{
za (int vrijednost = 0; vrijednost<= 255; value += 1) {
analogWrite(REDpin, vrijednost);
analogWrite(GREENpin, 255 - vrijednost);
analogWrite(BLUEpin, 255);
kašnjenje(5);
}

za (int vrijednost = 0; vrijednost<= 255; value += 1) {
analogWrite(REDpin, 255);
analogWrite(GREENpin, vrijednost);
analogWrite(BLUEpin, 255 - vrijednost);
kašnjenje(5);
}

za (int vrijednost = 0; vrijednost<= 255; value += 1) {
analogWrite(REDpin, 255 - vrijednost);
analogWrite(GREENpin, 255);
analogWrite(BLUEpin, vrijednost);
kašnjenje(5);
}
}
}

U katalogu datoteka možete preuzeti skicu i biblioteke koje su korištene u projektu.

Uvezite biblioteke LiquidCrystal_I2C.zip, bmp085.zip, DS1302.zip i DHT.zip iz preuzete arhive u Arduino IDE. Idite na izbornik Skica Povežite knjižnicu Dodaj .zip biblioteku... au prozoru odaberite zip arhivu knjižnice.
Preuzmite skicu meteo_P. Zamijenite adresu LCD1602 u skici s vrijednošću dobivenom skeniranjem I2C sabirnice. Kompajlirajte i pokrenite skicu.
Ako skica radi, otvorite port monitor i pogledajte izlazne poruke. Podudaranje visine u izjavi dps.init(MODE_STANDARD, 10000, true); da biste dobili stvarne vrijednosti tlaka.
Namjestite svoj sat. Odkomentirajte liniju //rtc.setTime(4, 58, 0); au zagradi navedite trenutno vrijeme (sat, minute i sekunde odvojene zarezima) i ponovno učitajte skicu u kontroler. Nakon što je vrijeme postavljeno, ponovno komentirajte ovu liniju i ponovno pokrenite skicu.
Ako vas živcira osvjetljenje noćnog svjetla, možete ga podesiti mijenjanjem duljine odgode u for petljama na kraju skice. S odgodom(2); petlja traje 2-3 sekunde, s kašnjenjem(5); — od 4 do 5 sekundi, s odgodom (30); - do 15-16 sekundi. Podaci o indikatoru ažurirat će se u istom intervalu.
Kada se meteorološka stanica koristi autonomno, tj. bez spajanja na USB priključak računala, komentirajte retke s riječima Serial ... u skici kako biste onemogućili izlaz informacija na monitor COM priključka.

P.S. Na skici knjige i u primjerima za DHT biblioteku naznačena je linija definicije #definiraj DHTTYPE DHT 11. Skica radi, ali se ruši nakon nekoliko sati. Sat se zaustavlja, zaslon se ne mijenja. Na monitoru porta pojavljuje se nejasna poruka u kojoj se spominje dht.
U ovom redu sam uklonio slova DHT, tj. učinio #define DHTTYPE 11. Nakon toga, skica je počela raditi stabilno.

Članak ažuriran 25.06.2018

Korišteni resursi
1. Petin V.A. Projekti koji koriste Arduino kontroler (elektronika) 2. izdanje, St. Petersburg. BHV-Petersburg, 2015. 464 str.
2. Petin V. A., Binyakovsky A. A. Praktična Arduino enciklopedija. - M., DMK Press, 2017. - 152 str.
3.http://arduinolearning.com/code/i2c-scanner.php
4. http://arduino.ru/forum/programmirovanie/ds1302lcd1602
5. http://robotics18.rf/how-to-connect-lcd-1602-to-arduino-by-i2c/
6. Primjer BMP085_test2.ino iz biblioteke bmp085.zip
7. http://proginfo.ru/round/
8. http://homes-smart.ru/index.php?id=14&Itemid=149&option=com_content&view=article
9. http://iarduino.ru/lib/datasheet%20bmp180.pdf
10. http://it-donnet.ru/hd44780_dht11_arduino/

Nastavljamo razvijati našu meteorološku stanicu.

Prije nego prijeđem na ažuriranje, želim malo pojasniti.

Jedan naš kolega mi je pisao zašto je uveden watchdog timer?

Watchdog timer je postavljen u slučaju nužde. Kao što pokazuje praksa, ENC28J60 ne povlači više od (ako memorija ne zakaže) 4 istovremene veze. Uzimajući u obzir koliko se uslužnih veza stalno događa za održavanje same mreže, i samo lijevog prometa koji stvaraju sve vrste kućnih igračaka (na primjer, moderni televizori skeniraju dostupne hostove na mreži i njihovi portovi su otvoreni), dizajn jednostavno pada u stupor. . ENC28J60 ne zna samostalno raditi s mrežnim protokolima i sve je implementirano u knjižnicama. Možda su samo oni.
Provjerio sam sve dostupne knjižnice i različite module (iznenada brak), ali dugo nisam uspio postići stabilan rad. Maksimalno razdoblje bilo je oko 3-4 tjedna.
Za to se "pas" vrti tamo i, u tom slučaju, povlači upravljač. Nakon toga problem je nestao.
Također ne poričem da postoje određene nijanse ili problemi u mojoj kućnoj mreži. Ali budući da je problem bio kod mene, može doći s drugom osobom. Do sada sam našao samo ovo rješenje.
Koliko ja znam Wiznetovi čipovi (W5100 i noviji) to nemaju ili jednostavno nisu dobro tražili.

Prijeđimo na ažuriranje

Što je najvažnije, udaljavamo se od čipa ENC28J60 i idi na W5100. Pokušao sam implementirati sve na starom čipu, ali nema dovoljno memorije mikrokontrolera zbog vrlo velikih biblioteka za ENC28J60. Kada koristite novi čip, standard knjižnicama od programera i sve učinjene promjene, ostaje još više 20% slobodna memorija mikrokontrolera ATMega328. A ovo su nove kiflice!

Ova verzija (nazovimo je druga) dodaje mogućnost bežičnog prijenosa očitanja sa senzora pomoću frekvencije 433 MHz. Same module sam uzeo od Kineza, označavajući XY-MK-5V. Želim napomenuti da je kvaliteta prijenosa daleko od savršene. Može doći do gubitka signala, šuma, nemogućnosti simultanog prijenosa itd. itd. Ali njihova cijena (manje od 1 dolara po setu) nadoknađuje ove nedostatke. Reći ću vam tajnu da se ovi (najjeftiniji) moduli nalaze u mnogim markiranim meteorološkim stanicama za kućnu upotrebu. Vau, neočekivano?

Počnimo s baznom stanicom

Selimo se u Arduino UNO i Ethernet štit(prva verzija) na temelju čipa W5100. Ovo je sendvič i nema ga smisla opisivati. Opisat ću samo dodatno uključene kontakte za module XY-MK-5V.

Modul odašiljača koristi struju 5V, GND(kud bez majke onda) i D2 pin na kontroleru. Uredi kontakt D2 (PODACI) možete koristiti funkciju vw_set_tx_pin iz vw knjižnice.

Za razliku od prethodne skice, ova koristi dvije dodatne biblioteke:

#uključi #uključi

Sama skica

Skriveni tekst

#uključi #uključi #uključi #uključi #uključi #uključi #uključi #uključi #define DHTTYPE DHT22 #define DHTPIN 5 DHT dht(DHTPIN, DHTTYPE); bajt mac = (0x54, 0x34, 0x31, 0x31, 0x31, 0x31); charserver = "narodmon.ru"; int port = 8283; IP adresa ip(192,168,0,201); EthernetClient klijent; BMP085 dps = BMP085(); dugo Temperatura = 0, Tlak = 0; plovak H, dP, dPt; bool interval = istina; EasyTransferVirtualWireET; struct SEND_DATA_STRUCTURE( byte ID; // ID uređaja int Temperatura; // Temperatura float Pressure; // Pressure float Vlažnost; // Vlažnost float dewPoint; // Točka rose/smrzavanja); SEND_DATA_STRUCTURE emitiranje; void setup() ( // Inicijaliziraj Watchdog timer wdt_disable(); delay(8000); wdt_enable(WDTO_8S); // Inicijaliziraj konzolu Serial.begin(9600); // Inicijaliziraj DHT senzor dht.begin(); // Inicijaliziraj modul 433 MHz ET.begin(details(broadcast)); vw_set_ptt_inverted(true); vw_set_tx_pin(2); vw_setup(2000); // Pokretanje mreže, ako nismo čekali podatke s DHCP poslužitelja, onda // sami sebi dodijelimo adresu if (Ethernet.begin(mac) == 0) Ethernet.begin(mac, ip); // Inicijaliziraj 1-Wire Wire.begin(); delay(200); // Inicijaliziraj BMP180 s podešavanjem visine // dps.init (MODE_STANDARD, 3200, true); // Inicijaliziraj BMP180 dps.init(); Serial.println(Ethernet.localIP()); // Pošalji prve podatke odmah nakon što se uređaj uključi send_info(true ); ) // funkcija dewPoint NOAA / / referenca (1) : http://wahiduddin.net/calc/density_algorithms.htm // referenca (2) : http://www.colorado.edu/geography/weather_station/Geog_site /about.htm dvostruka točka rosišta (dvostruki celzijus, dvostruka vlažnost) ( // (1) Tlak zasićene pare = ESGG(T) dvostruki OMJER = 373,15 / (273,15 + celzijus); dvostruki RHS = -7,90298 * (OMJER - 1); RHS += 5,02808 * log10 (OMJER); RHS += -1,3816e-7 * (pow(10, (11,344 * (1 - 1/OMJER))) - 1) ; RHS += 8,1328e-3 * (pow(10, (-3,49149 * (OMJER - 1))) - 1) ; RHS += log10(1013,246); // faktor -3 služi za podešavanje jedinica - Tlak pare SVP * vlažnost dvostruko VP = pow(10, RHS - 3) * vlažnost; // (2) ROSIŠTE = F(tlak pare) dvostruko T = log(VP/0,61078); // temp var return (241,88 * T) / (17,558 - T); ) void send_info(bool eth) ( bool fail = true; while(fail) ( // Pokušavamo očitati podatke s DHT senzora vlage dok // ne dobijemo rezultat. U 90% slučajeva sve radi dobro, ali trebamo 100 % if((H = dht.readHumidity()) >= 0) ( // Dohvaćanje vlažnosti i temperature sa senzora BMP180 dps.getPressure(&Pressure); dps.getTemperature(&Temperature); // Izračunajte točku rosišta ako vanjska temperatura je iznad 0 stupnjeva Celzijevih // i očekujte rezultat iznad 0, inače ispišite 0. Ovo je neophodno // kako ne bi doveli u zabludu u zimskoj sezoni. // dP = Temperatura>0?((dPt=rosište(Temperatura*0,1, H))<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); }

Samim modulima mora se dodati antena. Za 433 MHz dovoljna je normalna bakrena žica 17 cm. Bez antene možete zaboraviti na normalan rad.

Prelazimo na najvažniji dio ovog ažuriranja - lokalnu bežičnu stanicu

Da bih ga implementirao (na koljenu), koristio sam analogni Arduino NANO(na bazi ATMega328) i TFT prikaz na čipu ST7735S s dopuštenjem 128x160

Skriveni tekst



Pinout zaslon -> kontroler

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

Modul prijamnika je spojen samo na isti način kao i odašiljač PODACI zakačiti D7.

Par slika kako to izgleda:

Skriveni tekst

Skica prijemnika

Skriveni tekst

#uključi #uključi #uključi #uključi int x, y; int w = 128, h = 160; intsize; // 433 EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( byte ID; // ID uređaja int Temperatura; // Temperatura float Pressure; // Pressure float Vlažnost; // Vlažnost float dewPoint; // Točka rose/smrzavanja); SEND_DATA_STRUCTURE emitiranje; int Log_Temperatura = -1; float Log_Pressure = -1; float Log_Vlažnost = -1; float Log_dewPoint = -1; // TFT #define cs 10 #define dc 9 #define rst 8 char Temperatura, tlak, vlažnost, rosište; Stringinfo; TFT TFT zaslon = TFT (cs, dc, prvi); void setup()( Serial.begin(9600); // Inicijaliziraj 433MHz modul ET.begin(details(broadcast)); vw_set_ptt_inverted(true); vw_set_rx_pin(7); vw_setup(2000); vw_rx_start(); // Inicijaliziraj i početno podešavanje prikaza TFTscreen.begin(); TFTscreen.setRotation(2); TFTscreen.background(0, 0, 0); // Crtanje statičnih elemenata // 1. Posjetite nas TFTscreen.stroke(255, 255, 255); TFTscreen .setTextSize(1); TFTscreen.text(" ", 10, 10); // 2. Opis očitanja sa senzora TFTscreen.text("mmHg", w/2+5, 80); TFTscreen.text ("% ", w/2+5, 100); TFTscreen.text("C", w/2+5, 120); emitiranje.Temperatura = 0; emitiranje.Tlak = 0; emitiranje.Vlažnost = 0; emitiranje .dewPoint = 0; TFTPrint(); ) void loop()( if(ET.receiveData())( if(broadcast.ID == 1) TFTPrint(); /* Serial.println(broadcast.Temperature); Serial. println(broadcast .Tlak); Serial.println(broadcast.Humidity); Serial.println(broadcast.dewPoint); Serial.println(); */ ) ) void promjene(int veličina, int x , int y, bool up, bool clear = false) ( if(clear) TFTscreen.stroke(0, 0, 0); else ( promjene (veličina, x, y, !gore, istina); TFTscreen.stroke((gore)?0:255, 0, (gore)?255:0); ) if((veličina%2) == 0 )veličina++; dok(veličina > 0) ( TFTscreen.line(x, y, x+(veličina--), y); ++x, (gore)?--y:++y, --veličina; ) /* dok( veličina > 0) ( TFTscreen.line(x, y, (gore)?x+veličina-1:x, (gore)?y:y+veličina-1); ++x, ++y, --veličina; ) */ ) int x_centar(int w, int duljina, int veličina) ( return floor((w-duljina*(veličina*5)+veličina*2)/2); ) int x_alignment_right(int w, int duljina, int size) ( return ceil(w-length*(size*5)+size*2); ) void TFTPrint() ( size = 3; // ================== =================================================== = ============== // Prikaz očitanja temperature // ============================ = ================================================= == == if(broadcast.Temperature != Log_Temperature) ( TFTscreen.setTextSize(size); // Prebriši zastarjele podatke String info = String(Log_Temperature); info.concat(" C"); if(Log_Temperature > 0) info = " +"+info; info.toCharArray(Temperatura, info.length()+1); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Temperatura, x_center(w, info.length()+1, veličina ), 35); // Izlaz novih očitanja i info = String(broadcast. temperatura); info.concat("C"); if(broadcast.Temperature > 0) info = "+"+info; info.toCharArray(Temperatura, info.length()+1); // Promjena boje vrijednosti temperature ovisno o samoj temperaturi int r, g = 0, b; if(broadcast.Temperature > 0) ( r = karta(broadcast.Temperature, 0, 40, 255, 150); // Crveno b = map(broadcast.Temperature, 0, 40, 30, 0); // Promjena nijanse za više vizualnog prelaska nule) else ( r = map(broadcast.Temperature, -40, 0, 0, 30); // Promijenite nijansu za više vizualnog prelaska nule b = map(broadcast.Temperature, -40, 0, 150 , 255); // Plavi ) TFTscreen.stroke(b, g, r); // PAŽNJA: položaji boja su obrnuti u biblioteci, RGB mjesto koristi BGR! TFTscreen.text(Temperatura, x_centar(w, info.length()+1, size), 35); ) veličina = 1; // ================================================ = =================================== // Prikaz očitanja tlaka // ======== = =================================================== ======================= if(broadcast.Pressure != Log_Pressure) ( TFTscreen.setTextSize(size); // Prebriši informacije o ustajalim podacima = String(Log_Pressure ); info.toCharArray(pritisak, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(pritisak, x_alignment_right(w/2-5, info.length(), veličina), 80 ); // Izlaz novih očitanja info = String(broadcast.Pressure); info.toCharArray(Pressure, info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(Pressure, x_alignment_right(w/ 2-5, info.length(), size), 80); changes(10, 106, 85, (broadcast.Pressure > Log_Pressure)?true:false); ) else ( changes(10, 106, 85, true, istina); promjene(10, 106, 85, laž, istina); ) // ============================== = ================================================= = / / Očitavanja izlazne vlažnosti // =================== =================================================== = ============= if(broadcast.Humidity != Log_Humidity) ( TFTscreen.setTextSize(size); // Prebriši informacije o ustajalim podacima = String(Log_Humidity); info.toCharArray(Vlažnost, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Vlažnost, x_alignment_right(w/2-5, info.length(), veličina), 100); // Izlaz novih očitanja info = String(broadcast.Humidity); info.toCharArray(Vlažnost, info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(Vlažnost, x_alignment_right(w/2-5, info.length(), veličina), 100); promjene(10, 106, 105, (broadcast.Humidity > Log_Humidity)?true:false); ) else ( promjene(10, 106, 105, istina, istina); promjene(10, 106, 105, laž, istina); ) // ================== =================================================== = ============= // Prikaži točku rosišta\mraz // ========================= == ================================================ === === if(broadcast.dewPoint ! = Log_dewPoint) ( TFTscreen.setTextSize(size); // Prebriši zastarjele podatke info = 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); // Prikaz novih očitanja info = String(broadcast.dewPoint); info.toCharArray(dewPoint, info.length()); TFTscreen.stroke(255, 255, 255);TFTscreen.text(dewPoint, x_alignment_right(w/2-5, info.length(), size), 120);promjene(10, 106, 125, (broadcast.dewPoint > Log_dewPoint)?true:false); ) else ( changes(10, 106, 125, true, true); changes(10, 106, 125, false, true); ) // Ažurirajte vrijednosti u zapisima za kasnije usporedba Log_Temperature = emitiranje.Temperatura; Log_Pressure = emitiranje.Pressure; Log_Humidity = emitiranje.Vlažnost; log_dewPoint = emitiranje.dewPoint; )

Očitanja su prikazana prilično kompaktno, ali kao što praksa pokazuje (i savjet mojih drugova) - "okus i boja, čak ni žena nije prijatelj." Naslušao sam se hrpe savjeta i sugestija, ali oni su kontradiktorni. Pa učinite to po svom ukusu.

Činilo mi se da je dizajn dio projekta koji oduzima najviše vremena!

Skriveni tekst

Dio podataka je proizveden za prikaz nekih elemenata dizajna.

Artefakti na zaslonu su prašina i druga prljavština nakupljena tijekom dugog vremena u kojem je zaslon bio ... negdje tamo ... pa, ne sjećam se odakle mi to! Pusti me na miru!

Skica ima funkcije pozicioniranja. Oni su prilično primitivni, ali vam omogućuju postizanje određenih učinaka.

  1. x_centar
  2. x_poravnanje_desno

Prvi centrira tekst, a drugi ga poravnava na desnu stranu navedene zone. Svi izračuni se rade u odnosu na veličinu zadanog teksta, na temelju izraza 1 veličina = 1PX x 1PX segment fonta.

Zaslon također prikazuje elemente koji odgovaraju povećanju ili smanjenju jedne ili druge očitane vrijednosti. Prikazuju se kao trokuti. Ali u kodu funkcije promjene postoji alternativni prikaz u obliku trokuta zakrenutih za 45 stupnjeva. Ako očitanje raste, tada je element crven, inače je plav.

Usput, boja i sjena glavne temperature mijenjaju se ovisno o samoj temperaturi. Prilično kontroverzna odluka, ali po mom mišljenju, vizualno ugodna. Mučio sam se s tim neko vrijeme i shvatio da su vrijednosti u funkciji moždani udar, objekt TFT zaslona, ​​navedeni su pogrešnim redoslijedom. BGR mjesto RGB. Ovo je pogreška programera, dobro, ili ja nešto ne razumijem.

P.S: Sve je prilično zanimljivo, ali po mom mišljenju zaslužuje daljnji razvoj. Što ćemo učiniti za neko vrijeme.

Promatranje vremena vrlo je uzbudljiva aktivnost. Odlučio sam izgraditi svoju meteorološku stanicu na temelju popularne .

Prototip meteorološke stanice izgleda ovako:

Funkcije moje meteorološke stanice:

  • mjerenje i prikaz sobne i vanjske temperature;
  • prikaz trenutnog vremena (sati i minute);
  • prikaz trenutnih faza mjeseca i lunarnog dana;
  • prijenos rezultata mjerenja na računalo putem serijske veze;
  • prijenos rezultata mjerenja po protokolu MQTT pomoću aplikacije na računalu.


šesterokutni
-datoteka
firmware za (verzija od 9. svibnja 2018.) - .
Kako bljeskati šesterokutni-file to board Arduino opisao sam.

Mikrokontroler Arduino Nano 3.0

"Srce" moje meteorološke stanice je mikrokontroler eBay):

Za kontrolu indikacije i ispitivanja senzora koristim mjerač vremena 1 Arduino, uzrokujući prekide s frekvencijom od 200 Hz (razdoblje - 5 ms).

Indikator

Za prikaz izmjerenih očitanja senzora i trenutnog vremena, spojio sam se na Arduinočetveroznamenkasti LED indikator Dvorište FYQ-5643BH sa zajedničkim anodama (skupljaju se anode identičnih segmenata svih izboja).
Indikator sadrži četiri znamenke od sedam segmenata i dvije razdjelne točke (sat):

Anode indikatora spojene su preko otpornika za ograničenje struje na stezaljke Arduino:

pražnjenje 1 2 3 4
zaključak A3 A2 D3 D9

Segmentne katode spojene na igle Arduino:

segment a b c d e f g str
zaključak D7 D12 D4 D5 D6 D11 D8 D13

Segment indikatora svijetli ako anoda odgovarajućeg pražnjenja ima visok potencijal (1), a nizak potencijal (0) na katodi.

Koristim dinamičku indikaciju za prikaz informacija na indikatoru - samo jedna znamenka je aktivna u jednom trenutku. Aktivna pražnjenja se izmjenjuju na frekvenciji od 200 Hz (period prikaza 5 ms). U isto vrijeme, treperenje segmenata je neprimjetno očima.

Senzor temperature DS18x20

Za mogućnost daljinskog mjerenja temperature spojio sam senzor , koji pruža širok raspon mjerenja vanjske temperature. Senzor je spojen na sabirnicu 1 žica i ima tri izlaza - snagu ( VCC), podaci ( DAT), Zemlja ( GND):

izlaz senzora VCC DAT GND
zaključak Arduino 5V A1 GND

Između igala VCC i DAT Uključio sam pull-up otpornik od 4,7 k ohma.

Za pretvorbu između stupnjeva Celzija i Fahrenheita možete koristiti sljedeću ploču:

Postavio sam senzor izvan prozora kuće u plastičnu kutiju od kemijske olovke:

\

Profesionalne meteorološke stanice koriste Stevenson zaslon kako bi zaštitile termometar od izravne sunčeve svjetlosti i omogućile cirkuliranje zraka. stevensonov ekran):

Senzor pritiska i temperature BMP280

Živin i aneroidni barometri tradicionalno se koriste za mjerenje atmosferskog tlaka.

NA živin barometar atmosferski tlak je uravnotežen težinom živinog stupca čija se visina koristi za mjerenje tlaka:

NA aneroidni barometar koristi se kompresija i rastezanje kutije pod atmosferskim tlakom:

Za mjerenje atmosferskog tlaka i sobne temperature u svojoj kućnoj meteorološkoj stanici koristim senzor - mali smd- 2 x 2,5 mm senzor temeljen na piezorezistivnoj tehnologiji:

Rupčić sa senzorom je kupljen na tržnici eBay:

Senzor je spojen na sabirnicu I2C(podatci za kontakt - SDA/SDI, sinkronizacija - SCL/SCK):

izlaz senzora VCC GND SDI SCK
zaključak Arduino 3V3 GND A4 A5

adafruit- datoteke Adafruit_Sensor.h, Adafruit_BMP280.h, Adafruit_BMP280.cpp.

Jedinice za atmosferski tlak

Senzor preko funkcije readPressure daje vrijednost atmosferskog tlaka u paskalima. Osnovna jedinica za mjerenje atmosferskog tlaka je hektopaskal(hPa) (1 hPa = 100 Pa), čiji je analog jedinica izvan sustava " milibar" (mbar) (1 mbar = 100Pa = 1hPa). Za pretvorbu između uobičajeno korištenih nesustavnih jedinica tlaka " milimetar žive" (mm Hg) i hektopaskala, koriste se sljedeći omjeri:
1 hPa = 0,75006 mmHg Umjetnost. ≈ 3/4 mm Hg; 1 mmHg =1,3332 hPa ≈ 4/3 hPa.

Ovisnost atmosferskog tlaka o nadmorskoj visini

Atmosferski tlak može se prikazati u apsolutnom i relativnom obliku.
Apsolutni tlak QFE(Engleski) apsolutni tlak) je stvarni atmosferski tlak, bez uzimanja u obzir korekcije iznad razine mora.
Atmosferski tlak opada za oko 1 hPa s porastom nadmorske visine od 1 m:

Barometrijska formula omogućuje određivanje korekcije očitanja barometra za dobivanje relativnog tlaka (u mmHg):
$\Delta P = 760 \cdot (1 - (1 \preko (10^ ( (0,0081350 \cdot H) \više (T + 0,00178308 \cdot H) ))))$ ,
gdje je $T$ prosječna temperatura zraka na Rankinovoj ljestvici, ° Ra, $H$ - visina iznad razine mora, stope.
Pretvaranje Celzijevih stupnjeva u Rankineove stupnjeve:
$^(\circ)Ra = (^(\circ)C \cdot 1.8) + 491,67$
Barometarska formula služi za barometarski nivelman - određivanje visina (s pogreškom od 0,1 - 0,5%). Formula ne uzima u obzir vlažnost zraka i promjenu ubrzanja slobodnog pada s visinom. Za male visinske razlike ova se eksponencijalna ovisnost može s dovoljnom točnošću aproksimirati linearnom ovisnošću.
Relativni tlak QNH(Engleski) relativni tlak, Q-kod Nautička visina) je atmosferski tlak prilagođen za srednju razinu mora. Srednja razina mora, MSL) (za JE i temperaturu od 15 stupnjeva Celzijusa), a inicijalno se postavlja uzimajući u obzir nadmorsku visinu na kojoj se nalazi meteorološka postaja. Može se pronaći iz podataka meteorološke službe, očitanja kalibriranih instrumenata na javnim mjestima, zračnoj luci (iz izvješća METAR), s Interneta.
Na primjer, za obližnju zračnu luku Gomel ( UMGG) Mogu vidjeti stvarni vremenski izvještaj METAR na ru.allmetsat.com/metar-taf/russia.php?icao=UMGG :
UMGG 191800Z 16003MPS CAVOK M06/M15 Q1014 R28/CLRD//NOSIG ,
gdje Q1014- pritisak QNH u zračnoj luci iznosi 1014 hPa.
Povijest biltena METAR dostupno na aviationwxchartsarchive.com/product/metar.
Za normalan relativni tlak zraka QNH prihvaća se tlak od 760 mm Hg. Umjetnost. ili 1013,25 hPa (na temperaturi od 0ºS, ispod geografske širine od 45º sjeverne ili južne hemisfere).
Postavio sam tlak za aneroidni barometar QNH s vijkom za podešavanje osjetljivosti:

Vremenska prognoza

Analiza promjena tlaka omogućuje vam izradu vremenske prognoze, a točnost je veća što se tlak naglo mijenja. Na primjer, staro navigacijsko pravilo je da pad tlaka od 10 hPa (7,5 mmHg) tijekom razdoblja od 8 sati znači da su na putu jaki vjetrovi.

Odakle dolazi vjetar? Zrak struji u središte područja niskog tlaka, vjetar- horizontalno kretanje zraka iz prostora visokotlačni u području niskog tlaka (visoki atmosferski tlak istiskuje zračne mase u područje niskog atmosferskog tlaka). Ako je tlak vrlo nizak, vjetar može doseći oluja. Istodobno, na području smanjena tlak (barična depresija ili ciklon), topli zrak se diže i stvara oblake, koji često donose kiša ili snijeg.

Smjer vjetra u meteorologiji je smjer iz kojeg vjetar puše:

Ovaj smjer je sveden na osam točaka.

Algoritam se često koristi za predviđanje vremena na temelju atmosferskog tlaka i smjera vjetra. Zambretti.

Senzor vlažnosti

Za određivanje relativne vlažnosti zraka koristim modul DHT11(kupljeno na tržnici eBay):

Senzor vlažnosti DHT11 ima tri izlaza - snaga ( + ), podaci ( van), Zemlja ( - ):

izlaz senzora + van -
zaključak Arduino 5V D10 GND

Za rad sa senzorom koristim biblioteku iz adafruit- datoteke DHT.h, DHT.cpp.

Vlažnost karakterizira količinu vodene pare koja se nalazi u zraku. Relativna vlažnost prikazuje udio vlage u zraku (u postocima) u odnosu na najveću moguću količinu pri trenutnoj temperaturi. Koristi se za mjerenje relativne vlažnosti :

Za osobu je optimalni raspon vlažnosti zraka 40 ... 60%.

Sat stvarnog vremena

Kao sat stvarnog vremena primijenio sam modul RTC DS1302(rupčić sa satom je kupljen na tržnici eBay):

Modul DS1302 spojen na autobus 3 žice. Za korištenje ovog modula sa Arduino knjižnica razvijena arduino_RTC( iz iarduino.ru).

Ploča s modulom DS1302 ima pet pinova koje sam spojio na pinove ploče Arduino Nano:

zaključak RTC VCC GND RST CLK DAT
zaključak Arduino 5V GND D2 D1 D0

Kako bih zadržao točna očitanja sata kada je struja isključena, umetnuo sam bateriju u utičnicu na ploči. CR2032.

Točnost mog modula sata nije bila velika - sat je brži za oko jednu minutu u četiri dana. Stoga sam resetirao minute na "nulu", a satove na najbliže držeći tipku spojenu na Arduino A0 pin nakon uključivanja meteorološke stanice. Nakon inicijalizacije, pin A0 se koristi za prijenos podataka kroz serijsku vezu.

Prijenos podataka na računalo i rad preko MQTT protokola

Za prijenos podataka putem serijske veze na Arduino povezuje USB-UART konverter:

Zaključak Arduino koristi se za prijenos podataka u formatu 8N1(8 podatkovnih bitova, bez pariteta, 1 stop bit) pri 9600 bps. Podaci se prenose u paketima, a duljina paketa je 4 znaka. Prijenos podataka provodi se u " malo prasak" način rada, bez korištenja hardverskog serijskog priključka Arduino.

Format prenesenih podataka:

Parametar 1. bajt 2. bajt 3. bajt 4. bajt
vanjska temperatura o razmak ili minus deseci stupnjeva ili prostor jedinice stupnjeva
sobna temperatura ja razmak ili minus deseci stupnjeva ili prostor jedinice stupnjeva
Atmosferski tlak str stotine mm Umjetnost. deseci mm Hg jedinice mmHg S.
relativna vlažnost h prostor deseci postotaka ili razmak postotne jedinice
Trenutno vrijeme desetke sati jedinice sati desetke minuta jedinice minuta

MQTT

golang klijent aplikacijskog protokola MQTT, koji šalje informacije dobivene od meteorološke stanice na poslužitelj ( MQTT-broker) :

Servis omogućuje vam stvaranje računa s besplatnim planom " " (ograničenja: 10 veza, 10 Kbps):

Za praćenje očitanja meteorološke stanice možete koristiti Android-Dodatak :

Hrana

Za napajanje meteorološke stanice koristim punjač od starog mobitela. Motorola, izlazni napon od 5 V sa strujom do 0,55 A i spojen na kontakte 5V(+) i GND (-):

Također možete koristiti bateriju od 9 V za napajanje, spojenu na kontakte VIN broj(+) i GND (-).

Rad meteorološke stanice

Prilikom pokretanja, senzori se inicijaliziraju i provjeravaju.

U nedostatku senzora DS18x20 izdaje se pogreška "E1" ako nema senzora - pogreška "E3".

Tada se pokreće radni ciklus meteorološke stanice:

  • mjerenje i prikaz vanjske temperature;
  • mjerenje i prikaz sobne temperature;
  • mjerenje i prikaz atmosferskog tlaka i trenda njegove promjene;
  • mjerenje i prikaz relativne vlažnosti zraka;
  • prikaz trenutnog vremena;
  • prikaz mjesečeve mijene i lunarnog dana.


Videozapis moje meteorološke stanice dostupan je na mojoj -kanal: https://youtu.be/vVLbirO-FVU

Prikaz temperature

Prilikom mjerenja temperature prikazuju se dvije znamenke temperature, a za negativnu temperaturu znak minus (sa simbolom stupnja u krajnjoj desnoj znamenki);
za vanjsku temperaturu, znak stupnjeva je prikazan na vrhu:


za sobnu temperaturu - ispod:

Prikaz tlaka

Prilikom mjerenja tlaka prikazuju se tri znamenke tlaka u mmHg (sa simbolom " P" u krajnjoj desnoj znamenki):

Ako je tlak naglo pao, tada umjesto simbola " P" znak " je prikazan u krajnjoj desnoj znamenki L"ako je naglo porastao - onda" H". Kriterij za oštrinu promjene je 8 mm Hg u 8 sati:

Budući da moja meteorološka stanica prikazuje apsolutni tlak ( QFE), onda se očitanja pokazuju pomalo podcijenjena u usporedbi s informacijama u sažetku METAR(koji pruža QNH) (14 UTC, 28. ožujka 2018.):

Omjer tlaka (prema ATIS) bio je $(1015 \preko 998) = $1,017. Visina zračne luke Gomel (ICAO kod UMGG) nadmorske visine iznosi 143,6 m. Temperatura prema ATIS-u iznosila je 1 ° C.

Očitanja moje meteorološke stanice gotovo su se podudarala s apsolutnim tlakom QFE prema ATIS!

Maks./min. tlak ( QFE) koje je zabilježila moja meteorološka stanica za cijelo razdoblje promatranja:

Prikaz relativne vlažnosti

Relativna vlažnost zraka prikazana je u postocima (simbol postotka prikazan je na dvije desne znamenke):

Prikaz trenutnog vremena

Trenutno vrijeme je prikazano na indikatoru u formatu "HH:MM", pri čemu dvotočka za razdvajanje treperi jednom u sekundi:

Prikaz mjesečevih mijena i lunarnog dana

Prve dvije znamenke indikatora prikazuju trenutnu lunarnu fazu, a sljedeće dvije - trenutni lunarni dan:

Mjesec ima osam faza (navedena su engleska i ruska (plava - netočna) imena):

Na indikatoru faza prikazani su piktogramima:

faza piktogram
rastući srp (polumjesec)
opadajući polumjesec (polumjesec)

Prijenos podataka na računalo

Ako meteorološku stanicu povežete s USB-UART pretvarač (na primjer, na temelju mikro kruga CP2102) spojen na USB-priključak računala, tada možete koristiti terminalski program za praćenje podataka koje prenosi meteorološka stanica:

Razvijao sam se u programskom jeziku golang program koji vodi dnevnik meteoroloških opažanja i šalje podatke servisu i može se pogledati na Android-pametni telefon pomoću aplikacije :

Prema dnevniku meteoroloških opažanja, možete, na primjer, izgraditi grafikon promjena atmosferskog tlaka:
primjer grafa s primjetnim minimumom tlaka


primjer grafikona s blagim porastom tlaka

Planirana poboljšanja:

  • dodavanje senzora za smjer i brzinu vjetra

U meteorološkim postajama za mjerenje brzine vjetra koristi se anemometar s tri šalice (1), a za određivanje smjera vjetra vjetrokaz (2):

Također se koristi za mjerenje brzine vjetra. anemometri s vrućom žicom(Engleski) anemometar s vrućom žicom). Kao grijanu žicu možete koristiti volframovu žarnu nit iz žarulje s razbijeno staklo. U industrijskim anemometrima s vrućom žicom senzor se obično nalazi na teleskopskoj cijevi:

Princip rada ovog uređaja je da se toplina uklanja iz grijaće tijelo zbog konvekcije strujanjem zraka – vjetar. U ovom slučaju, otpor žarne niti određen je temperaturom žarne niti. Zakon promjene otpora žarne niti $R_T$ od temperature $T$ ima oblik:
$R_T = R_0 \cdot (1 + (\alpha \cdot (T - T_0)))$ ,
gdje je $R_0$ otpor žarne niti na temperaturi $T_0$, $\alpha$ je temperaturni koeficijent otpora (za volfram $\alpha = 4,5\cdot(10^(-3) (^(\circ)(C^ ( -1))))$).

S promjenom brzine strujanja zraka, temperatura se mijenja pri konstantnoj struji žarne niti (anemometar s istosmjerna struja, Engleski CCA). Ako se temperatura grijača održava konstantnom, tada će struja kroz element biti proporcionalna brzini strujanja zraka (anemometar konstantne temperature, eng. CTA).

Nastavit će se

Slični postovi