Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Greške
  • Unutarnja meteorološka stanica sa satnom hardverskom platformom arduino. Arduino meteorološka stanica s bežičnim senzorom temperature

Unutarnja meteorološka stanica sa satnom hardverskom platformom arduino. Arduino meteorološka stanica s bežičnim senzorom temperature

Nastavljamo s razvojem naše meteorološke stanice.

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

Jedan od naših kolega mi je napisao pitanje zašto je uveden watchdog timer?

Watchdog timer se postavlja u slučaju nužde. Kao što pokazuje praksa, ENC28J60 ne povlači više od (ako memorija ne uspije) 4 istodobne veze. Uzimajući u obzir koliko se servisnih veza stalno javlja za održavanje same mreže, a samo lijevi promet koji stvaraju sve vrste kućnih igračaka (na primjer, moderni televizori skeniraju dostupne hostove na mreži i otvaraju im se portovi), 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 (odjednom brak), ali dugo nisam uspio postići stabilan rad. Maksimalno razdoblje je bilo oko 3-4 tjedna.
Zbog toga se "pas" tamo vrti i, u tom slučaju, povlači kontroler. 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 u meni, može doći do druge osobe. Do sada sam pronašao samo ovo rješenje.
Koliko ja znam, Wiznet čipovi (W5100 i noviji) to nemaju ili jednostavno nisu dobro tražili.

Prijeđimo na ažuriranje

Najvažnije je da se udaljavamo 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. Kod korištenja novog čipa, standardnog knjižnice od programera i svih unesenih promjena, ostaje još više 20% slobodna memorija mikrokontrolera ATMega328. A ovo su nove lepinje!

Ova verzija (nazovimo je druga) dodaje mogućnost bežičnog prijenosa očitanja sa senzora koristeći frekvenciju 433 MHz. Same module sam preuzeo 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 istovremenog prijenosa itd. itd. Ali njihova cijena (manje od 1 USD po setu) nadoknađuje ove nedostatke. Odat ću vam tajnu da se upravo 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 smisla ga opisivati. Opisat ću samo dodatno uključene kontakte za module XY-MK-5V.

Modul odašiljača koristi napajanje 5V, GND(gdje 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čiti #uključiti

Sama skica

Skriveni tekst

#uključiti #uključiti #uključiti #uključiti #uključiti #uključiti #uključiti #uključiti #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; plutaju H, dP, dPt; bool interval = istina; EasyTransferVirtualWireET; struct SEND_DATA_STRUCTURE( ID bajta; // ID uređaja int Temperatura; // Temperatura plutajući Tlak; // Tlak plutajući Vlažnost; // Vlažnost float rosišna točka; // Točka rose/mrzište ); 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(); // Inicijalizacija modul od 433 MHz ET.begin(details(broadcast)); vw_set_ptt_inverted(true); vw_set_tx_pin(2); vw_setup(2000); // Pokrenite mrežu, 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 je uređaj uključen 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 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 * (ODNOS - 1); RHS += 5,02808 * log10 (ODNOS); RHS += -1,3816e-7 * (pow(10, (11,344 * (1 - 1/RADIO))) - 1) ; RHS += 8,1328e-3 * (pow(10, (-3,49149 * (RADIO - 1))) - 1) ; RHS += log10 (1013,246); // faktor -3 je za podešavanje jedinica - Tlak pare SVP * vlažnost dvostruko VP = pow(10, RHS - 3) * vlažnost; // (2) TOČKA ROSE = 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šavam čitati podatke s DHT senzora vlažnosti dok ne dobijemo // rezultat. U 90% slučajeva sve radi dobro, ali trebamo 100 % if((H = dht.readHumidity()) >= 0) ( // Dobijte vlažnost i temperaturu od senzora BMP180 dps.getPressure(&Pressure); dps.getTemperature(&Temperature); // Izračunajte točku rosišta ako temperatura je vani iznad 0 stupnjeva Celzijusa // i očekujte rezultat iznad 0, u suprotnom izlaz 0. To je neophodno // kako ne bismo zavarali u zimskoj sezoni. // dP = Temperatura>0?((dPt=točka rose(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 biti dodana antena. Za 433 MHz normalna bakrena žica je dovoljna 17 cm. Bez antene možete zaboraviti na normalan rad.

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

Za implementaciju (na koljenu), koristio sam analogni Arduino NANO(na bazi ATMega328) i TFT prikaz na čipu ST7735S uz dopuštenje 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 prijemnika 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čiti #uključiti #uključiti #uključiti int x, y; int w = 128, h = 160; intsize; // 433 EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( ID bajta; // ID uređaja int Temperatura; // Temperatura plutajući Tlak; // Tlak plutajući Vlažnost; // Vlažnost float rosišna točka; // Točka rose/mrzište ); SEND_DATA_STRUCTURE emitiranje; int Log_Temperatura = -1; float Log_Pritisak = -1; float Log_Vlažnost = -1; float Log_dewPoint = -1; // TFT #define cs 10 #define dc 9 #define rst 8 char Temperatura, Pressure, Humidity, dewpoint; Stringinfo; TFT TFT zaslon = TFT(cs, dc, rst); 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(); // Initialize(); // Initialize početno podešavanje prikaza TFTscreen.begin(); TFTscreen.setRotation(2); TFTscreen.background(0, 0, 0); // Crtanje statičkih 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.Pritisak = 0; emitiranje.Vlažnost = 0; emitiranje .rosa = 0; TFTPrint(); ) void loop()( if(ET.receiveData())( if(broadcast.ID == 1) TFTPrint(); /* Serial.println(broadcast.Temperature); Serial. println(broadcast .Pritisak); Serial.println(broadcast.Humidity); Serial.println(broadcast.dewPoint); Serial.println(); */ ) ) praznine promjene (int size, 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((size%2) == 0 )veličina++; while(size > 0) ( TFTscreen.line(x, y, x+(size--), y); ++x, (gore)?--y:++y, --size; ) /* while( veličina > 0) ( TFTscreen.line(x, y, (gore)?x+size-1:x, (gore)?y:y+size-1); ++x, ++y, --size; ) */ ) int x_center(int w, int duljina, int veličina) ( return floor((w-length*(size*5)+size*2)/2); ) int x_alignment_right(int w, int length, int veličina) ( vrati ceil(w-duljina*(veličina*5)+veličina*2); ) void TFTPrint() ( veličina = 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 (emitiranje. temperatura); info.concat("C"); if(broadcast.Temperature > 0) info = "+"+info; info.toCharArray(Temperatura, info.length()+1); // Mijenjamo boju vrijednosti temperature ovisno o samoj temperaturi int r, g = 0, b; if(broadcast.Temperature > 0) (r = map(broadcast.Temperature, 0, 40, 255, 150); // Crvena b = map(broadcast.Temperature, 0, 40, 30, 0); // Promjena nijanse za vizualniji prijelaz nule ) else ( r = map(broadcast.Temperature, -40, 0, 0, 30); // Promijeni nijansu za vizualniji prijelaz nule b = map(broadcast.Temperature, -40, 0 , 150, 255); // Plava ) TFTscreen.stroke(b, g, r); // PAŽNJA: pozicije boja su obrnute u biblioteci, RGB mjesto koristi BGR! TFTscreen.text(Temperatura, x_centar(w, info.length()+1, veličina), 35); ) veličina = 1; // ================================================ = =================================== // Prikaz očitanja tlaka // ======== = =================================================== ======================== if(broadcast.Pressure != Log_Pressure) ( TFTscreen.setTextSize(size); // Prebriši zastarele podatke info = 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(Prissure, info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(Pritisak, x_alignment_right(w/ 2-5, info.length(), veličina), 80); promjene (10, 106, 85, (broadcast.Prissure > Log_Prissure)?true:false); ) ostalo (promjene (10, 106, 85, true, istina); promjene (10, 106, 85, netočno, istina); ) // ============================== = ================================================== = / / Izlazna očitanja vlažnosti // =================== ==================================================== ============= if(broadcast.Humidity != Log_Humidity) ( TFTscreen.setTextSize(size); // Prebrišite zastarele podatke info = 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.hod (255, 255, 255); TFTscreen.text(Vlažnost, x_alignment_right(w/2-5, info.length(), veličina), 100); promjene (10, 106, 105, (broadcast.Vlažnost > Log_Vlažnost)?true:false); ) ostalo ( promjene (10, 106, 105, istina, istina); promjene (10, 106, 105, lažno, istinito); ) // =================== ==================================================== ============= // Prikaži točku rosišta\mraz // =========================== == ==================================================== === if(broadcast.dewPoint ! = Log_dewPoint) ( TFTscreen.setTextSize(size); // Prebriši ustajale podatke info = String(Log_dewPoint); info.toCharArray(dewPoint, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text (točka rose, x_alignment_right(w/2-5, info.length(), veličina), 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);changes(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 zapisnicima za kasnije usporedba Log_Temperature = emitiranje.Temperatura; Log_Prissure = emitiranje.Pritisak; Dnevnik_Vlažnost = emitiranje.Vlažnost; log_dewPoint = broadcast.dewPoint; )

Očitanja su prikazana prilično kompaktno, ali kao što praksa pokazuje (i savjet mojih suboraca) - "okus i boja, čak ni žena nije prijatelj." Poslušao sam hrpu savjeta i sugestija, ali su jedni drugima u suprotnosti. Dakle, učinite to po svom ukusu.

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

Skriveni tekst

Dio podataka je izmišljen za prikaz nekih elemenata dizajna.

Artefakti na zaslonu su prašina i druga prljavština nakupljena tijekom dugog vremena na kojem je zaslon bio ... negdje, ... pa, ne sjećam se odakle sam to dobio! Ostavi 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_alignment_right

Prvi centrira tekst, a drugi ga poravnava s desne strane navedene zone. Svi proračuni se vrše 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 vrijednosti očitanja. Prikazuju se kao trokuti. Ali u kodu funkcije promjene postoji alternativni prikaz u obliku trokuta zarotiranih za 45 stupnjeva. Ako se očitanje poveća, element je crven, u suprotnom je plav.

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

P.S: Sve je dosta zanimljivo, ali po meni zaslužuje daljnji razvoj. Što ćemo učiniti za neko vrijeme.

Jedan moj kolega nedavno je bio domaćin malog sajma znanosti.
Učiteljica me zamolila da studentima predstavim projekt elektronike. Imao sam dva dana da smislim nešto zanimljivo i dovoljno jednostavno.



Budući da su vremenski uvjeti ovdje prilično promjenjivi, a temperatura varira u rasponu od 30-40°C, odlučio sam napraviti kućnu meteorološku stanicu.

Koje su funkcije kućne meteorološke stanice?
Meteorološka stanica bazirana na Arduinu sa zaslonom je uređaj koji prikuplja podatke o vremenskim i okolišnim uvjetima pomoću raznih senzora.

Obično su to sljedeći senzori:

  • vjetar
  • vlažnost
  • kiša
  • temperatura
  • pritisak
  • visine

Moj cilj je vlastitim rukama napraviti prijenosnu stolnu meteorološku stanicu.

Trebao bi moći definirati sljedeće parametre:

  • temperatura
  • vlažnost
  • pritisak
  • visina

Korak 1: Kupite prave komponente







  • DHT22, senzor temperature i vlage.
  • BMP180, senzor tlaka.
  • Lem
  • Jednoredni konektor 40 izlaza

Od opreme će vam trebati:

  • lemilica
  • kliješta za nos
  • žice

Korak 2: DHT22 senzor temperature i vlažnosti







Za mjerenje temperature koriste se različiti senzori. DHT22, DHT11, SHT1x su popularni

Objasnit ću po čemu se razlikuju jedni od drugih i zašto sam koristio DHT22.

Senzor AM2302 koristi digitalni signal. Ovaj senzor radi na jedinstvenom sustavu kodiranja i senzorskoj tehnologiji, tako da su njegovi podaci pouzdani. Njegov senzorski element povezan je s 8-bitnim računalom s jednim čipom.

Svaki senzor ovog modela je termički kompenziran i točno kalibriran, koeficijent kalibracije pohranjen je u jednokratnu programabilnu memoriju (OTP memorija). Prilikom čitanja očitanja, senzor će pozvati koeficijent iz memorije.

Mala veličina, mala potrošnja energije, velika udaljenost prijenosa (100m) čine AM2302 prikladnim za gotovo sve aplikacije, a 4 izlaza u nizu čine instalaciju vrlo jednostavnom.

Pogledajmo prednosti i nedostatke tri modela senzora.

DHT11

Prednosti: ne zahtijeva lemljenje, najjeftiniji od tri modela, brz stabilan signal, domet preko 20 m, jake smetnje.
Protiv: Knjižnica! Nema mogućnosti rezolucije, pogreška mjerenja temperature +/- 2°S, pogreška mjerenja razine relativne vlažnosti +/- 5%, neadekvatan raspon izmjerenih temperatura (0-50°S).
Primjene: vrtlarstvo, poljoprivreda.

DHT22

Prednosti: ne zahtijeva lemljenje, niska cijena, glatke krivulje, male pogreške mjerenja, veliki raspon mjerenja, domet preko 20 m, jake smetnje.
Protiv: osjetljivost bi mogla biti veća, sporo praćenje promjena temperature, potrebna biblioteka.
Primjene: studije okoliša.

SHT1x

Prednosti: nije potrebno lemljenje, glatke krivulje, male pogreške u mjerenju, brz odziv, niska potrošnja energije, automatski način mirovanja, visoka stabilnost i konzistentnost podataka.
Protiv: dva digitalna sučelja, pogreška u mjerenju razine vlažnosti, raspon mjerenih temperatura je 0-50°C, potrebna je knjižnica.
Primjene: rad u teškim uvjetima i u dugotrajnim instalacijama. Sva tri senzora su relativno jeftina.

Spoj

  • Vcc - 5V ili 3,3V
  • Gnd - s Gnd
  • Podaci - na drugi Arduino pin

Korak 3: BMP180 senzor tlaka



BMP180 je senzor barometarskog atmosferskog tlaka s I2C sučeljem.
Senzori barometrijskog tlaka mjere apsolutnu vrijednost okolnog zraka. Ovaj pokazatelj ovisi o specifičnim vremenskim uvjetima i visini iznad razine mora.

Modul BMP180 je imao regulator od 3.3V 662k ohma, koji sam svojom glupošću slučajno raznio. Morao sam napraviti strujni udar izravno na čip.

Zbog nedostatka stabilizatora ograničen sam u odabiru izvora napajanja – naponi iznad 3,3V će uništiti senzor.
Ostali modeli možda nemaju stabilizator, svakako ga provjerite.

Dijagram povezivanja senzora i I2C sabirnice s Arduinom (nano ili uno)

  • SDA-A4
  • SCL-A5
  • VCC - 3,3 V
  • GND-GND

Razgovarajmo malo o tlaku i kako je on povezan s temperaturom i visinom.

Atmosferski tlak u bilo kojoj točki nije konstantan. Složena interakcija između Zemljine rotacije i nagiba Zemljine osi rezultira mnogim područjima visokog i niskog tlaka, što zauzvrat rezultira dnevnim vremenskim obrascima. Promatrajući promjenu tlaka, možete napraviti kratkoročnu vremensku prognozu.

Na primjer, pad tlaka obično znači kišovito vrijeme ili približavanje grmljavinske oluje (približavanje području niskog tlaka, ciklona). Porast tlaka obično znači suho, vedro vrijeme (preko vas prelazi područje visokog tlaka, anticiklona).

Atmosferski tlak također se mijenja s visinom. Apsolutni tlak u baznom kampu na Everestu (5400 m nadmorske visine) niži je od apsolutnog tlaka u Delhiju (216 m nadmorske visine).

Budući da se očitanja apsolutnog tlaka razlikuju na svakoj lokaciji, odnosit ćemo se na relativni tlak ili tlak na razini mora.

Mjerenje visine

Prosječni tlak na razini mora je 1013,25 GPa (ili milibara). Ako se podignete iznad atmosfere, ova će vrijednost pasti na nulu. Krivulja ovog pada je sasvim razumljiva, tako da možete sami izračunati visinu koristeći sljedeću jednadžbu: alti=44330*

Ako uzmete tlak na razini mora od 1013,25 GPa kao p0, rješenje jednadžbe je vaša trenutna nadmorska visina.

Mjere opreza

Imajte na umu da senzor BMP180 treba pristup atmosferi kako bi mogao očitati tlak zraka, ne stavljajte senzor u zatvoreno kućište. Mali otvor za ventilaciju bit će dovoljan. Ali nemojte ga ostavljati previše otvorenim - vjetar će srušiti očitanja tlaka i visine. Razmislite o zaštiti od vjetra.

Zaštititi od vrućine. Za mjerenje tlaka potrebna su točna očitanja temperature. Pokušajte zaštititi senzor od temperaturnih fluktuacija i ne ostavljajte ga u blizini izvora visokih temperatura.

Štiti od vlage. Senzor BMP180 je osjetljiv na razinu vlage, pokušajte spriječiti mogući prodor vode na senzor.

Nemojte zaslijepiti senzor. Iznenađenje je bila osjetljivost silikona u senzoru na svjetlost, koja na njega može pasti kroz rupu na poklopcu čipa. Za najtočnija mjerenja pokušajte zaštititi senzor od ambijentalnog svjetla.

Korak 4: Sastavljanje uređaja







Instalacija jednorednih konektora za Arduino Nano. Uglavnom, izrezali smo ih na veličinu i malo izbrusili da izgledaju kao da jesu. Zatim ih lemimo. Nakon toga ugrađujemo jednoredne konektore za DHT22 senzor.

Ugradite otpornik od 10kΩ od izlaza podataka na masu (Gnd). Sve lemimo.
Zatim, na isti način, ugradimo jednoredni konektor za senzor BMP180, napravimo napajanje 3,3V. Sve povezujemo I2C sabirnicom.

Na kraju, LCD zaslon povezujemo na istu I2C sabirnicu kao i BMP180 senzor.
(Planiram kasnije spojiti RTC modul (sat realnog vremena) na četvrti konektor tako da uređaj također pokazuje vrijeme).

Korak 5: Kodiranje




Preuzmite knjižnice

Da biste instalirali knjižnice na Arduino, slijedite vezu

#uključiti
#include #include #include "DHT.h" #include

SFE_BMP180 tlak;

#define VISINA 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 // na koji digitalni pin smo "ponovo povezani

// Dekomentirajte bilo koju vrstu koju koristite! //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 DHT dht(DHTPIN, DHTTYPE); LiquidCrystal_I2C lcd(I2Cn_pin,wR_AD,) 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);

status = tlak.getTemperature(T); if (status != 0) ( Serial.print("1"); lcd.clear(); lcd.setCursor(0,0); lcd.print("Baro Temperatura: "); lcd.setCursor(0,1 ); lcd.print(T,2); lcd.print("deg C"); t1=T; kašnjenje (3000);

status = tlak.startPritisak(3); if (status != 0) ( // Pričekajte da se mjerenje završi: kašnjenje(status);

status = tlak.getPritisak(P,T); if (status != 0) (lcd.clear(); lcd.setCursor(0,0); lcd.print("abslt pressure: "); lcd.setCursor(0,1); lcd.print(P,2 ); lcd.print(" mb "); kašnjenje (3000);

p0 = tlak.razina brtve (P,VISINA); // nalazimo se na 1655 metara (Boulder, CO)

a = tlak.visina (P,p0); lcd.clear(); lcd.setCursor(0,0); lcd.print("Visina: "); lcd.setCursor(0,1); lcd.print(a,0); lcd.print("metri"); kašnjenje (3000); ) ) ) ) float h = dht.readVlažnost(); // Čitanje temperature kao Celzijusa (zadano) float t = dht.readTemperature(); t2=t; lcd.clear(); lcd.setCursor(0,0); // idi na početak 2. retka lcd.print("Vlažnost: "); lcd.setCursor(0,1);lcd.print(h); lcd.print("%"); kašnjenje (3000); lcd.clear(); lcd.setCursor(0,0); // idi na početak 2. retka lcd print("DHT Tempurature: "); lcd.setCursor(0,1); LCD ispis(t); lcd.print("degC"); kašnjenje (3000); lcd.clear(); lcd.setCursor(0,0); // idi na početak 2. retka lcd.print("Srednja temperatura: "); lcd.setCursor(0,1); lcd.print((t1+t2)/2); lcd.print("degC"); kašnjenje (3000); )

Koristio sam Arduino verziju 1.6.5, kod mu točno odgovara, mogu raditi i kasniji. Ako kod iz nekog razloga ne odgovara, upotrijebite verziju 1.6.5 kao osnovnu.

Kao i većina zaposlenih ljudi, izrada vlastitih projekata oduzima jedino preostalo slobodno vrijeme. Stoga, dugo nisam stvarao i "ruke su me svrbele" da nešto napravim. Ta se prilika, začudo, pojavila na sveučilištu. Iza prozora je rujan, 4. godina i nadolazeći kolegij iz struke. Rečeno nam je da se nastavni predmeti mogu raditi u dvije varijante: papirnati i hardverski.

Na našem sveučilištu 5 godina se izrađivala papirna nastava po principu „uzmi stare i saberi ih“. Ovakav pristup mi nije odgovarao svojom rutinom pa sam odmah odabrao nastavu iz hardvera. Kao srce nastave, Arduino mikrokontroler je predložen zbog njegove lakoće učenja. Nakon što smo odredili vrstu nastave, ostalo je još jedno pitanje: što točno učiniti. Budući da nije bilo iskustva u programiranju mikrokontrolera, odmah sam otvorio Google i počeo proučavati postojeće projekte. Mnogo je projekata, neki 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 ne bi tada ležalo na polici i skupljalo prašinu tamo. Nakon polusatnog izleta u svijet Arduina, zainteresirala me tema kućnih meteoroloških stanica, a projekti mi se nisu činili baš teški za implementaciju (što je u osnovi podmitilo početnika).

Tako je odabrana tema za seminarski rad, a s vremenom se činilo da nije bilo nikakvih problema.

Odabir komponenti

Promatrajući različite projekte, shvatio sam da bi mi bio dovoljan Nano ili čak Pro Mini, ali ipak sam odabrao Arduino Uno u nadi da bih htio programirati za Arduino i implementirati još neke projekte u budućnosti. Nikada prije nisam držao lemilicu u rukama, pa sam zbog lakšeg razvoja odlučio kupiti i Sensor Shield v4.

Više

Ploča olakšava brzo spajanje senzora, modula, servo motora, serijskih i I2C sučelja, a također izlazi na sve portove Duemilanova/Uno form factor kontrolera (može se spojiti i na mega seriju, ali s ograničenjima i posljedicama). 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 iz senzora. Odlučio prikazati. Htio sam sliku u boji pa sam odmah odbacio jednobojna rješenja. Nakon nekoliko minuta traženja, odabran je ST7735 TFT zaslon od 1,8 inča.

Više

Budući da zaslon koristi 4-žični SPI protokol za komunikaciju i ima vlastiti međuspremnik okvira koji se može adresirati u 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 punoj 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 pikselskim adresiranjem 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 za meteorološku stanicu, krenimo s programiranjem kontrolera. Arduino IDE je korišten za flash Arduino. Također se koriste knjižnice iz Adafruita.

Prije nego što prijeđemo na skicu, pogledajmo funkcionalnost:

  • Očitavanja se uzimaju sa senzora svakih 10 sekundi i 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čiti // knjižnica za komunikaciju s I2C uređajima #include // Osnovna biblioteka za sve senzore #include // knjižnica za BMP180 #include // Osnovna grafička biblioteka #include // Knjižnica specifična za hardver #include // knjižnica za komunikaciju sa SPI uređajima #include "dht.h" // knjižnica za DHT #define DHT22_PIN 2 // povežite podatkovni pin DHT22 na 2 digitalna pina #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 tom 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 ukupno; uint32_t ok; uint32_t crc_error; uint32_t time_out; uint32_t connect; uint32_t ack_l; uint32_t ack_h; uint32_t nepoznato; ) stat = (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("Ups, 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); kašnjenje (500); // kašnjenje kako bi se osiguralo da je TFT inicijaliziran ) // zadnji izmjereni podaci float oldTemperature = 0 , staraVisina = 0, staraTlak = 0, staraDHTHvlažnost = 0, staraDHTTtemperatura; bool wasUpdate = lažno; void loop(void) ( if(Serial.available() > 0) // imamo podatke serijski port ( Serial.read(); // čitanje bajta sa serijskog porta i slanje posljednje izmjerene podatke printValue("Pressure", oldPressure) , " hPa", false); printValue("Temperatura", oldTemperature, " C", false); printValue("Altitude", oldAltitude, "m", false); printValue("Vlažnost", oldDHTHumidity, "%", false); printValue("DHT_temperature", oldDHTTemperature, " C", false); Serial.println("END_TRANSMISSION"); ) senzors_event_t događaj; temperatura plutanja, 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(S) (Serijski tlak); ) error"); ) ) uint32_t start = micros(); int chk = DHT.read22(DHT22_PIN);// dohvati podatke od DHT22 uint32_t stop = micros(); stat.total++; switch (chk) // provjeri status DHT22 ( slučaj DHTLIB_OK: stat.ok++; pauza; slučaj DHTLIB_ERROR_CHECKSUM: stat.crc_error++; Serial.print("Pogreška kontrolnog zbroja,\t"); pauza; slučaj DHTLIB_ERROR_TIMEOUT: stat.time_out++; Serial.print("Pogreška isteka,\t"); pauza; slučaj DHTLIB_ERROR_CONNECT: stat.connect++; Serial.print("Pogreška povezivanja,\t"); pauza; slučaj DHTLIB_ERROR_ACK_L: stat.ack_l++; Serial.print("Ack Low error,\t"); pauza; slučaj 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("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; 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(altitude != oldAltitude) ( tft.fillRect(0, 46, 160, 7, ST7735_BLACK); tft.setCursor(0, 46); tft.setTextColor(ST7735_BLUE); printValue("Altitude", altitude, "m", true); oldAltitude = nadmorska visina; wasUpdate = true; ) ) if(DHT.humidity != oldDHTHumidity) (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_tempera."), temperatura, " C", true); oldDHTTemperature = DHT.temperature; 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(title); // pošalji podatke na serijski port Serial.print(": "); Serial.print(vrijednost); Serial.println(mjera); )

Vrijeme je za sastavljanje tijela

Glavni uvjet za nastavu bio je radni prototip u prezentiranom obliku. Stoga sam morao kupiti kovčeg i, naoružan dosjeom, na bilo koji način gurnuti meteorološku stanicu u kućište.

Kućište je kupljeno u lokalnoj trgovini elektronikom.

Okvir

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



Zatim su pomoću datoteke napravljene rupe za izlaz senzora i napajanje. Senzore sam odlučio iznijeti van, 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 rupama za senzore i napajanje



Kako sam morao zalemiti noge na 2 senzora i na jednom sam zapalio stazu, odlučio sam ne iskušavati sudbinu i ne lemiti žice na senzore (vježbat ću na nečem drugom), već kako bih spojio da budem manje-više pouzdan, odlučio sam premotati vrpcu.

Sustav prije "trpanja" u kućište



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

Čudesna Yuda riba kit



Pričvrstimo poklopac, spojimo napajanje i čekamo.

Završena meteorološka stanica u zgradi



Nakon prikaza rezultata na ekranu, otkrivamo neugodnu pogrešku u mjerenju vlažnosti: DHT22 marljivo daje brojku od 99,90% (izuzetno je rijetko imati 1,00%). Počnimo shvatiti 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 misao potražiti odgovor u Googleu. Očekivano, ruski Google nije rekao ništa razumno. U REDU. Počinjemo tražiti na engleskom i na jednom od foruma nailazimo 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 vlažnosti lako mogu utjecati pogrešni plinovi ili vrlo dugo izlaganje IIRC visoke vlažnosti. U podatkovnoj tablici postoji postupak kako "resetirati" senzor, možete ga isprobati.

Ostalo je samo pitanje kada sam i kako uspio naštetiti DHT22. Ali došlo je vrijeme za polaganje kolegija, pa sam rješenje ovog problema ostavio za kasnije.

Pogovor

Radovi su položeni. Vremenska 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. Tako se dogodilo da sam sredinom studenog promijenio radno mjesto i u novom timu upoznao ljude koji su zainteresirani za Arduino platformu i slično. Stoga se moj interes za ovu platformu nije imao vremena ohladiti, ponovno je planuo. Izvadio sam svoju meteorološku stanicu, spojio je na računalo i sjetio se da implementiram prijenos podataka s Arduina preko COM porta. I tada 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 još uvijek 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 govoriti sljedeći put. U međuvremenu čekam pošiljku, planiram implementirati povezivanje sata u stvarnom vremenu kako bih vrijeme ažuriranja podataka i same podatke mogao pohraniti na microSD karticu, pod uvjetom da nema veze s klijentom preko COM porta.

Možete pomoći i doznačiti neka sredstva za razvoj stranice



Nekako sam šetajući gradom ugledao novu radnju radio elektronike koja se otvorila. Ulazeći u njega, pronašao sam veliki broj štitova za Arduino. Imao sam kod kuće Arduino Uno i Arduino Nano i odmah sam dobio ideju da se igram s odašiljačima signala iz daljine. Odlučio sam kupiti najjeftiniji odašiljač i prijemnik na 433 MHz:

Odašiljač signala.


prijemnik signala.

Nakon snimanja najjednostavnije skice prijenosa podataka (primjer je preuzet odavde), pokazalo se da odašiljači mogu biti sasvim prikladni za prijenos jednostavnih podataka, kao što su temperatura, vlažnost.

Odašiljač ima sljedeće karakteristike:
1. Model: MX-FS-03V
2. Radijus djelovanja (ovisno o prisutnosti blokirajućih objekata): 20-200 metara
3. Radni napon: 3,5 -12V
4. Dimenzije modula: 19*19mm
5. Modulacija signala: AM
6. Snaga odašiljača: 10mW
7. Frekvencija: 433MHz
8. Potrebna duljina vanjske antene: 25cm
9. Jednostavan za spajanje (samo tri žice): DATA ; VCC ; Zemlja.

Karakteristike prijemnog modula:
1. Radni napon: DC 5V
2. Struja: 4mA
3. Radna frekvencija: 433,92MHz
4. Osjetljivost: - 105dB
5. Dimenzije modula: 30*14*7mm
6. Potrebna vanjska antena: 32 cm.

U prostranstvima interneta govori se da domet prijenosa informacija pri 2Kb/s može doseći i do 150m. Nisam to sam provjeravao, ali u dvosobnom stanu prihvaća svugdje.

Hardver kućne vremenske stanice

Nakon nekoliko eksperimenata, odlučio sam spojiti senzor temperature, vlažnosti i odašiljač na Arduino Nano.


Senzor temperature DS18D20 spojen je na arduino na sljedeći način:

1) GND na minus mikrokontrolera.
2) DQ kroz pull-up otpornik na masu i na Arduino D2 pin
3) Vdd do +5V.

Modul odašiljača MX -FS - 03V napaja se od 5 volti, izlaz podataka (ADATA) spojen je na pin D13.

Na Arduino Uno sam spojio LCD zaslon i barometar BMP085.


dijagram ožičenja za arduino uno

Prijemnik signala spojen je na pin D10.

Modul BMP085 je digitalni senzor atmosferskog tlaka. Senzor vam omogućuje mjerenje temperature, tlaka i nadmorske visine. Sučelje veze: I2C. Napon napajanja senzora 1,8-3,6 V

Modul je spojen na Arduino na isti način kao i ostali I2C uređaji:

  • VCC - VCC (3,3V);
  • GND-GND;
  • SCL - na analogni pin 5;
  • SDA - na analogni pin 4.
  • Vrlo niska cijena
  • Snaga i I/O 3-5V
  • Određivanje vlažnosti 20-80% s točnošću od 5%.
  • Određivanje temperature 0-50 stupnjeva. s 2% točnosti
  • Frekvencija prozivanja ne veća od 1 Hz (ne više od jednom u 1 sek.)
  • Dimenzije 15,5 mm x 12 mm x 5,5 mm
  • 4 igle s razmakom nogu od 0,1"

DHT ima 4 igle:

  1. Vcc (3-5V napajanje)
  2. Izlaz podataka - Izlaz podataka
  3. Nije korišteno
  4. Općenito

Povezuje se na D8 Arduino.

Softver za kućne vremenske stanice

Modul odašiljača mjeri i prenosi temperaturu svakih 10 minuta.

Ispod je program:

/* Sketch verzija 1.0 Šalji temperaturu svakih 10 min. */ #include #include #include #define ONE_WIRE_BUS 2 //Pin za povezivanje Dallas senzora OneWire oneWire(ONE_WIRE_BUS); Senzori temperature Dallas (&oneWire); Adresa uređaja unutar termometra; void setup(void) ( //Serial.begin(9600); vw_set_ptt_inverted(true); // Potrebno za DR3100 vw_setup(2000); // Postavi brzinu prijenosa (bps) sensors.begin(); if (!sensors .getAddress (insideThermometer, 0)); printAddress(insideThermometer); sensors.setResolution(insideThermometer, 9); ) void printTemperature(DeviceAddress deviceAddress) (float tempC = sensors.getTempC(deviceAddress); //Serial.print("Temp C : " ); //Serial.println(tempC); //Formiranje podataka za slanje int number = tempC; char simbol = "c"; //Simbol usluge za utvrđivanje da se radi o senzoru String strMsg = "z "; strMsg + = simbol; strMsg += " "; strMsg += broj; strMsg += " "; char msg; strMsg.toCharArray(msg, 255); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); // Pričekajte da se prijenos dovrši kašnjenje (200); ) void loop(void) ( for (int j=0; j<= 6; j++) { sensors.requestTemperatures(); printTemperature(insideThermometer); delay(600000); } } //Определение адреса void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16); //Serial.print("0"); //Serial.print(deviceAddress[i], HEX); } }

Prijemni uređaj prima podatke, mjeri tlak i temperaturu u prostoriji te ih prenosi na zaslon.

#include #include LiquidCrystal lcd(12, 10, 5, 4, 3, 2); #include dht11 senzor; #define DHT11PIN 8 #include #include BMP085 dps = BMP085(); dugo Temperatura = 0, Tlak = 0, Visina = 0; void setup() ( Serial.begin(9600); vw_set_ptt_inverted(true); // Potrebno za DR3100 vw_setup(2000); // Postavi brzinu prijema vw_rx_start(); // Pokreni praćenje zraka lcd.begin(16, 2); Wire.begin(); kašnjenje (1000); dps.init(); //lcd.setCursor(14,0); //lcd.write(byte(0)); //lcd.home(); ) void loop() ( uint8_t buf; // Međuspremnik poruka uint8_t buflen = VW_MAX_MESSAGE_LEN; // Duljina međuspremnika if (vw_get_message(buf, &buflen)) // Ako je poruka primljena ( // Počni raščlanjivati ​​int i; // Ako je poruka nije adresirano na nas , izađi if (buf != "z") ( return; ) char command = buf; // Naredba je na indeksu 2 // Numerički parametar počinje s indeksom 4 i = 4; int broj = 0; // Budući da je prijenos znak po znak , tada morate pretvoriti skup znakova u broj while (buf[i] != " ") ( broj *= 10; broj += buf[i] - "0"; i++; ) dps.getPressure(&Pressure); dps.getAltitude (&Altitude); dps.getTemperature(&Temperature); //Serial.print(command); Serial.print(" "); Serijski println(broj); lcd.print("T="); lcd.setCursor(2,0); lcd ispis (broj); lcd.setCursor(5,0); lcd.print("P="); lcd.print(Pritisak/133,3); lcd.print("mmH"); lcd.setCursor(0,1); lcd.print("T="); lcd.print(temperatura*0,1); lcd.print("H="); lcd.print(senzor.vlažnost); lcd.home(); //odgoda (2000); int chk = senzor.čitaj(DHT11PIN); switch (chk) ( case DHTLIB_OK: //Serial.println("OK"); break; case DHTLIB_ERROR_CHECKSUM: //Serial.println("checksum error"); break; case DHTLIB_ERROR_TIMEOUT: //Serial.println("Time out pogreška"); prekid; zadano: //Serial.println("Nepoznata pogreška"); break; ) ) )

p.s. U budućnosti planiram dodati sljedeće:
- senzor vlage na odašiljaču, preraditi algoritam prijenosa podataka
- senzor za mjerenje brzine i smjera vjetra.
- dodajte još jedan zaslon prijemniku.
- prenijeti prijemnik i odašiljač u poseban mikrokontroler.

Ispod je fotografija onoga što se dogodilo:

Popis radio elemenata

Oznaka Tip Vjeroispovijest Količina BilješkaPostićiMoja bilježnica
prijenosni dio.
Arduino ploča

Arduino Nano 3.0

1 U bilježnicu
senzor temperature

DS18B20

1 U bilježnicu
Otpornik

220 ohma

1 U bilježnicu
modul odašiljačaMX-FS-03V (433 MHz)1 U bilježnicu
dio za radio prijem.
Arduino ploča

Arduino Uno

1 U bilježnicu
Trimer otpornik 1 U bilježnicu
Otpornik

Temeljeno na projektu meteorološke stanice iz knjige V. Petina "Projekti pomoću Arduino kontrolera" 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 knjižnice 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. Projektu 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. Našao sam dva uređaja s adresama 0x3F i 0x77. BMP180 ima adresu 0x77 prema zadanim postavkama, tako da LCD indikator ima adresu 0x3F.
U nekim od shema, knjige su pomiješane gdje su SDA i SCL signali spojeni na Arduino ploču. Trebao bi biti: SDA - na A4, SCL - na A5. Ako modul BMP180 ima pet pinova, tada se na VIN pin primjenjuje +5 volti.

Dijagram ožičenja

Sada u potpunosti sastavite krug. Koristio sam uobičajenu katodnu RGB LED diodu montiranu na ploču zajedno s otpornicima od 150 ohma. Zajednička katoda je spojena na GND pin, ostali pinovi su spojeni prema dijagramu. Nema potrebe mijenjati skicu, jer se svjetlina LED dioda mijenja prema cikličkom zakonu.
Dijagram prikazuje spoj RGB LED-a sa zajedničkom anodom, kao u knjizi.
Ako na LCD1602 zaslonu nisu vidljivi znakovi, okrenite kontrolu svjetline. Pozadinsko osvjetljenje indikatora troši dosta struje, stoga koristite napajanje sa strujom od najmanje 2 A. Koristio sam USB hub s vanjskim napajanjem od 2 A.
U krugu sam koristio piezo poziv ZP-22. Otpornik spojen na zvono je 100 ohma. Frekvencija zvuka se može mijenjati u programu. Odabrao sam frekvenciju od 1000 Hz. Ako naiđete na zujalicu s fiksnom frekvencijom zvuka, tada ga možete uključiti i isključiti jednostavno primjenom i uklanjanjem napona, poput obične LED diode. Kada skica počne, oglašava se kratki zvučni signal. Možete omogućiti periodično signaliziranje dok je program pokrenut dekomentiranjem retka //bzz(100); u skici.
U projektu sam koristio DHT11 senzor 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 voltnu tračnicu. Na ovaj način ćete smanjiti trošenje baterije, zapravo će raditi samo kada je napajanje Arduina isključeno.

Program (skica)

Biblioteka bmp085 korištena je za opsluživanje BMP180. Vrijednost tlaka ovisi o visini područja. Za ispravnu vrijednost atmosferskog tlaka morate 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čiti
#uključiti
#uključiti
#include "dht.h"
#uključiti
BMP085 dps = BMP085();
dugo Tlak = 0, Visina = 0;
neoznačeno 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 PLAVA igla = 11;

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

void HumTempRead() (
float hum = dht.readVlažnost();
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");
) drugo (
lcd.setCursor(0, 1);
lcd.print("H=");
lcd.setCursor(2, 1);
lcd ispis (hum);
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, OUTPUT);
}

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

void setup()(
Serial.begin(9600);
Žica.početak();
kašnjenje (1000);

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

dht.begin();
setup_bzz();
bzz(100);

lcd.init();
lcd.backlight();
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 (milis()< memTime)) { // DHT11/22 1 time each 2 seconds
HumTempRead();
memTime = millis();
}
kašnjenje (100);

ako (((milis() - vrijeme1) / 1000,0) >= 1,0) (
dps.calcTrueTemperature();
vrijeme1 = millis();
}
dps.getPrissure(&Prissure);
Serial.print("Pritisak(Pa):");
Serijski println(tlak);

longp2;
intpi;
p2 = (tlak / 133,3224); // Pa u mmHg
pi = trunc(p2); // odbacivanje razlomka broja

lcd.setCursor(0, 0);
lcd.print("P=");
lcd.setCursor(2, 0);
LCD ispis (pi); // izlazni atm. pritisak na LCD-u
lcd.setCursor(5, 0);
lcd.print("mm");
// kašnjenje (3000);
//bzz(100); // dekomentirajte ako želite slušati signale
{
za (int vrijednost = 0; vrijednost<= 255; value += 1) {
analogWrite(REDpin, vrijednost);
analogWrite(GREENpin, 255 - vrijednost);
analogniPisanje(PLAVApin, 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 knjižnice 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... i u prozoru odaberite zip arhivu knjižnice.
Preuzmite meteo_P skicu. Zamijenite adresu LCD1602 na skici s vrijednošću dobivenom skeniranjem I2C sabirnice. Sastavite i pokrenite skicu.
Ako skica radi, otvorite monitor porta i pogledajte izlazne poruke. Uskladite visinu u naredbi dps.init(MODE_STANDARD, 10000 , true); kako bi dobili stvarne vrijednosti tlaka.
Postavite svoj sat. Dekomentirajte redak //rtc.setTime(4, 58, 0); a u zagradama navedite trenutno vrijeme (sat, minute i sekunde odvojene zarezima) i ponovno učitajte skicu u kontroler. Nakon što je vrijeme postavljeno, ponovno komentirajte ovaj redak i ponovno pokrenite skicu.
Ako vas nervira osvjetljenje noćnog svjetla, možete ga prilagoditi promjenom duljine kašnjenja u for petljama na kraju skice. S odgodom (2); petlja traje 2-3 sekunde, s odgodom(5); — od 4 do 5 sekundi, s kašnjenjem (30); - do 15-16 sekundi. Informacije o indikatoru bit će ažurirane 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 porta.

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

Članak ažuriran 25.06.2018

Korišteni resursi
1. Petin V.A. Projekti koji koriste Arduino kontroler (elektronika) 2. izdanje, St. Petersburg. BHV-Peterburg, 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/

Vrhunski povezani članci