Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Greške
  • Unutrašnja meteorološka stanica sa satnom hardverskom platformom arduino. Arduino meteorološka stanica sa bežičnim senzorom temperature

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

Nastavljamo sa razvojem naše meteorološke stanice.

Prije nego što pređemo na ažuriranje, želim malo pojasniti.

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

Watchdog timer se postavlja u slučaju nužde. Kao što pokazuje praksa, ENC28J60 ne povlači više od (ako memorija ne pokvari) 4 istovremene veze. S obzirom na to koliko se servisnih konekcija stalno javlja za održavanje same mreže, i samo ostavljen promet koji stvaraju razne kućne igračke (na primjer, moderni televizori skeniraju dostupne hostove na mreži i otvaraju im se portovi), dizajn jednostavno pada u omamljenost . ENC28J60 ne zna samostalno raditi sa mrežnim protokolima i sve je implementirano u bibliotekama. Možda su samo oni.
Provjerio sam sve dostupne biblioteke i različite module (odjednom brak), ali dugo nisam uspio postići stabilan rad. Maksimalni period je bio oko 3-4 sedmice.
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 pošto je problem bio kod mene, to može smisliti druga osoba. 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.

Idemo dalje na ažuriranje

Najvažnije je da se udaljavamo od čipa ENC28J60 i idi na W5100. Pokušao sam sve implementirati na starom čipu, ali nema dovoljno memorije mikrokontrolera zbog veoma velikih biblioteka za ENC28J60. Kada koristite novi čip, standardno biblioteke 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čitavanja sa senzora koristeći frekvenciju 433 MHz. Same module sam uzeo od Kineza, markiranje XY-MK-5V. Želim napomenuti da je kvalitet prijenosa daleko od savršenog. Može doći do gubitka signala, smetnji, nemogućnosti istovremenog prijenosa itd. itd. Ali njihova cijena (manje od 1 dolara po setu) nadoknađuje ove nedostatke. Odaću vam tajnu da se upravo ovi (najjeftiniji) moduli nalaze u mnogim brendiranim meteorološkim stanicama za kućnu upotrebu. Vau, neočekivano?

Počnimo sa baznom stanicom

Selimo se u Arduino UNO I Ethernet Shield(prva verzija) zasnovana na čipu W5100. Ovo je sendvič i nema smisla ga opisivati. Opisaću samo dodatno uključene kontakte za module XY-MK-5V.

Modul predajnika koristi napajanje 5V, GND(gdje onda bez majke) i D2 pin na kontroleru. Uredi kontakt D2 (Podaci) možete koristiti funkciju vw_set_tx_pin iz vw biblioteke.

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

#include #include

Sama skica

Skriveni tekst

#include #include #include #include #include #include #include #include #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, Pritisak = 0; float H, dP, dPt; bool interval = istina; EasyTransferVirtualWireET; struct SEND_DATA_STRUCTURE( ID bajta; // ID uređaja int Temperatura; // Temperatura plutajući Pritisak; // Pritisak plutajući Vlažnost; // Vlažnost plutajuća tačka rose; // Tačka rose/mraz ); 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); // Pokrenimo mrežu, ako nismo čekali podatke sa DHCP servera, 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, istina); // 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 tačka rose (dvostruki celzijus, dvostruka vlažnost) ( // (1) Pritisak pare zasićenja = ESGG(T) dvostruki ODNOS = 373,15 / (273,15 + celzijus); dvostruki RHS = -7,90298 * (ODNOS - 1); RHS += 5,02808 * log10(RACIO); RHS += -1,3816e-7 * (pow(10, (11,344 * (1 - 1/RATIO))) - 1) ; RHS += 8,1328e-3 * (pow(10, (-3,49149 * (RACIO - 1))) - 1) ; RHS += log10(1013.246); // faktor -3 je za podešavanje jedinica - Pritisak pare SVP * vlažnost duplo VP = pow(10, RHS - 3) * vlažnost; // (2) TAČKA ROSE = F(pritisak pare) duplo 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 pročitati podatke sa DHT senzora vlažnosti dok ne dobijemo // rezultat. U 90% slučajeva sve radi dobro, ali nam treba 100 % if((H = dht.readHumidity()) >= 0) ( // Dobijte vlažnost i temperaturu od senzora BMP180 dps.getPressure(&Pressure); dps.getTemperature(&Temperature); // Izračunajte tačku rose ako temperatura je vani iznad 0 stepeni Celzijusa // i očekujte rezultat iznad 0, u suprotnom ispišite 0. Ovo je neophodno // kako ne bismo zavarali u zimskoj sezoni. // dP = Temperatura>0?((dPt=Tač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 se mora dodati antena. Za 433 MHz normalna bakarna ž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 dozvolu 128x160

Skriveni tekst



Pinout displej -> kontroler

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

Modul prijemnika je povezan samo na isti način kao i predajnik PODACI to pin D7.

Par slika kako to izgleda:

Skriveni tekst

Skica prijemnika

Skriveni tekst

#include #include #include #include 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 Pritisak; // Pritisak plutajući Vlažnost; // Vlažnost plutajuća tačka rose; // Tačka rose/mraz ); SEND_DATA_STRUCTURE emitiranje; int Log_Temperature = -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 TFTscreen = 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čitavanja 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 .dewpoint = 0; TFTPrint(); ) void loop()( if(ET.receiveData())( if(broadcast.ID == 1) TFTPrint(); /* Serial.println(broadcast.Temperature); Serial. println(broadcast .Pressure); Serial.println(broadcast.Humidity); Serial.println(broadcast.dewPoint); Serial.println(); */ ) ) void 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 )size++; 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 dužina, 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-dužina*(veličina*5)+veličina*2); ) void TFTPrint() ( veličina = 3; // ================= ================================================== = ============== // Prikaz očitavanja temperature // ============================= = =================================================== == if(broadcast.Temperature != Log_Temperature) ( TFTscreen.setTextSize(size); // Prebrišite zastarele 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 (emitovanje. 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 vizuelniji prelaz nule ) else ( r = map(broadcast.Temperature, -40, 0, 0, 30); // Promijenite nijansu za vizualniji prelaz 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_center(w, info.length()+1, veličina), 35); ) veličina = 1; // ================================================ = ==================================== // Prikaz očitavanja pritiska // ======== = ================================================== ======================== if(broadcast.Pressure != Log_Prissure) ( 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(Pritisak, 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, istina, true); promjene (10, 106, 85, false, true); ) // =============================== = ================================================== = / / 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.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 ( changes(10, 106, 105, true, true); changes(10, 106, 105, false, true); ) // =================== ================================================== = ============= // Prikaz tačke rose\mraz // =========================== == ================================================ === === if(broadcast.dewPoint ! = Log_dewPoint) ( TFTscreen.setTextSize(size); // Prebrišite zastarele 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(), 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(), veličina), 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 zapisnicima za kasnije poređenje Log_Temperature = emitiranje.Temperatura; Log_Prissure = emitiranje.Pritisak; Log_Humidity = emitiranje.Vlažnost; log_dewPoint = broadcast.dewPoint; )

Očitavanja su prikazana prilično kompaktno, ali kao što pokazuje praksa (i savjeti mojih drugova) - "ukus i boja, čak ni žena nije prijatelj." Slušao sam gomilu savjeta i sugestija, ali su jedni drugima u suprotnosti. Pa uradite to po svom ukusu.

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

Skriveni tekst

Dio podataka je izmišljen da prikaže neke elemente dizajna.

Artefakti na displeju su prašina i druga prljavština nakupljena tokom dužeg vremena u kojoj je displej bio ... negdje tamo ... pa, ne sjećam se odakle mi to! Ostavi me na miru!

Skica ima funkcije pozicioniranja. Oni su prilično primitivni, ali vam omogućavaju da postignete određene efekte.

  1. x_center
  2. x_alignment_right

Prvi centrira tekst, a drugi ga poravnava sa desnom stranom navedene zone. Svi proračuni se vrše u odnosu na veličinu datog teksta, na osnovu izraza 1 veličina = 1PX x 1PX segment fonta.

Displej također prikazuje elemente koji odgovaraju povećanju ili smanjenju jedne ili druge vrijednosti očitavanja. Prikazuju se kao trouglovi. Ali u kodu funkcije promjene postoji alternativni prikaz u obliku trouglova rotiranih za 45 stepeni. Ako se očitavanje poveća onda je element crven, u suprotnom je plav.

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

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

Moj kolega je nedavno bio domaćin malog sajma nauke.
Učitelj me je zamolio da studentima predstavim projekat elektronike. Imao sam dva dana da smislim nešto zanimljivo i dovoljno jednostavno.



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

Koje su funkcije kućne meteorološke stanice?
Arduino meteorološka stanica s displejom 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
  • temperaturu
  • pritisak
  • visine

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

Trebalo bi biti u mogućnosti definirati sljedeće parametre:

  • temperaturu
  • vlažnost
  • pritisak
  • visina

Korak 1: Kupite prave komponente







  • DHT22, senzor temperature i vlage.
  • BMP180, senzor pritiska.
  • Lemljenje
  • 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

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

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

Svaki senzor ovog modela je termički kompenzovan i precizno kalibriran, koeficijent kalibracije je pohranjen u jednokratnoj programabilnoj memoriji (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 pogodnim 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: Biblioteka! Nema opcija rezolucije, greška merenja temperature +/- 2°S, greška merenja nivoa relativne vlažnosti +/- 5%, neadekvatan opseg izmerenih temperatura (0-50°S).
Primjene: vrtlarstvo, poljoprivreda.

DHT22

Prednosti: ne zahtijeva lemljenje, niska cijena, glatke krive, male greš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.
Primene: studije životne sredine.

SHT1x

Prednosti: nije potrebno lemljenje, glatke krive, male greške u mjerenju, brz odziv, niska potrošnja energije, automatski režim mirovanja, visoka stabilnost i konzistentnost podataka.
Protiv: dva digitalna interfejsa, greška u merenju nivoa vlažnosti, opseg merenih temperatura je 0-50°C, potrebna je biblioteka.
Primjene: rad u teškim okruženjima i dugotrajnim instalacijama. Sva tri senzora su relativno jeftina.

Compound

  • Vcc - 5V ili 3.3V
  • Gnd - sa Gnd
  • Podaci - na drugi Arduino pin

Korak 3: BMP180 senzor pritiska



BMP180 je senzor barometarskog atmosferskog pritiska sa I2C interfejsom.
Senzori barometrijskog pritiska mjere apsolutnu vrijednost okolnog zraka. Ovaj pokazatelj zavisi od specifičnih vremenskih uslova i visine nadmorske visine.

Modul BMP180 je imao 3.3V 662k ohm regulator, koji sam, svojom glupošću, slučajno razneo. Morao sam napraviti strujni udar direktno na čip.

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

Dijagram povezivanja senzora i I2C magistrale sa Arduinom (nano ili uno)

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

Hajde da razgovaramo malo o pritisku i kako je on povezan sa temperaturom i visinom.

Atmosferski pritisak u bilo kojoj tački nije konstantan. Složena interakcija između Zemljine rotacije i nagiba Zemljine ose rezultira mnogim područjima visokog i niskog pritiska, što zauzvrat rezultira dnevnim vremenskim obrascima. Posmatrajući promjenu pritiska, 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 pritiska, ciklon). Rast pritiska obično znači suho, vedro vrijeme (preko vas prelazi područje visokog pritiska, anticiklon).

Atmosferski pritisak se takođe menja sa visinom. Apsolutni pritisak u baznom kampu na Everestu (5400 m nadmorske visine) je niži od apsolutnog pritiska u Delhiju (216 m nadmorske visine).

Budući da se očitavanja apsolutnog tlaka razlikuju na svakoj lokaciji, mi ćemo se odnositi na relativni pritisak ili pritisak na razini mora.

Mjerenje visine

Srednji pritisak na nivou mora je 1013,25 GPa (ili milibara). Ako se podignete iznad atmosfere, ova vrijednost će pasti na nulu. Kriva ovog pada je sasvim razumljiva, tako da možete sami izračunati visinu koristeći sljedeću jednačinu: alti=44330*

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

Mere predostrožnosti

Zapamtite da BMP180 treba pristup atmosferi da bi mogao očitati tlak zraka, nemojte stavljati senzor u zatvoreno kućište. Mali otvor za ventilaciju će biti dovoljan. Ali ne ostavljajte ga 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 tačna očitavanja temperature. Pokušajte zaštititi senzor od temperaturnih fluktuacija i ne ostavljajte ga u blizini izvora visokih temperatura.

Zaštititi od vlage. Senzor BMP180 je osjetljiv na nivoe 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 može pasti na njega kroz rupu na poklopcu čipa. Za najpreciznija mjerenja, pokušajte zaštititi senzor od ambijentalnog svjetla.

Korak 4: Sastavljanje uređaja







Instaliranje 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.

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

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

Korak 5: Kodiranje




Preuzmite biblioteke

Da biste instalirali biblioteke na Arduino, slijedite vezu

#include
#include #include #include "DHT.h" #include

SFE_BMP180 pritisak;

#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,E2C_pin,wR) 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 = pressure.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 = pressure.startPressure(3); if (status != 0) ( // Čekamo da se mjerenje završi: delay(status);

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

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

a = pritisak.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.readHumidity(); // Čitanje temperature kao Celzijusa (podrazumevano) float t = dht.readTemperature(); t2=t; lcd.clear(); lcd.setCursor(0,0); // idi na početak 2. reda 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. reda lcd print("DHT Tempurature: "); lcd.setCursor(0,1); lcd print(t); lcd.print("degC"); kašnjenje (3000); lcd.clear(); lcd.setCursor(0,0); // idi na početak 2. reda 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 se tačno uklapa, mogu raditi i kasniji. Ako kod iz nekog razloga ne odgovara, koristite verziju 1.6.5 kao osnovnu.

Kao i većina zaposlenih ljudi, izvođenje vlastitih projekata oduzima jedino preostalo slobodno vrijeme. Dakle, dugo nisam stvarao i "svrbele su me ruke" da nešto uradim. Ova prilika se, začudo, pojavila na univerzitetu. Iza prozora je septembar, 4. godina i nadolazeći predmeti iz kola. Rečeno nam je da se nastavni rad može raditi u dvije varijante: papir i hardver.

Punih 5 godina na našem fakultetu se radila nastavna nastava po principu „uzmi stare i sastavi 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 određivanja vrste nastave, pojavilo se još jedno pitanje: šta tačno raditi. Pošto nije bilo 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 ne bi tada ležalo na polici i skupljalo prašinu tamo. Nakon polusatnog izleta u svijet Arduina, zainteresirala me je tema kućnih meteoroloških stanica, a projekti su mi se činili nisu baš teški za implementaciju (što je u osnovi podmitilo početnika).

Tako je odabrana tema za seminarski rad i vremenom se činilo da nije bilo problema.

Odabir komponenti

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

Više

Ploča omogućava brzo povezivanje senzora, modula, servo motora, serijskih i I2C interfejsa, a takođe i izlazi na sve portove Duemilanova/Uno form faktor kontrolera (može se povezati i na mega seriju, ali sa ograničenjima i posledicama). Podržava druge štitove na sebi.


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


Odlučili smo se za senzore. Ali šta učiniti s podacima koji dolaze od senzora. Odlučeno da se prikaže. Želeo sam sliku u boji, pa sam odmah odbacio jednobojna rešenja. Nakon nekoliko minuta traženja, odabran je ST7735 TFT ekran od 1,8 inča.

Više

Budući da ekran koristi 4-žični SPI protokol za komunikaciju i ima vlastiti bafer okvira koji se može adresirati u pikselima, može se koristiti sa bilo kojom vrstom mikrokontrolera. Ekran od 1,8 inča ima 128x160 piksela u boji. Tu je i slot za microSD memorijsku karticu, tako da možete lako učitati bitmape u punoj boji iz sistema datoteka FAT16/FAT32 na microSD kartici.

karakteristike:

  • Dijagonala ekrana - 1,8 inča, rezolucija 128x160 piksela, 18-bitna boja (262.144 boje)
  • Kontroler sa ugrađenim pikselskim adresiranjem bafera video memorije
  • Ugrađeni microSD slot - koristi više od 2 digitalne linije
  • Kompatibilan sa 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 flešovanje Arduina. Također korištene biblioteke iz Adafruita.

Prije nego pređemo na skicu, pogledajmo funkcionalnost:

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

Skica

#include // biblioteka za komunikaciju sa 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 // poveži podatkovni pin DHT22 na 2 digitalna pina #define TFT_CS 10 // poveži 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 // povežite DC pin TFT-a na 8 digitalni pin Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); //inicijaliziraj TFT #define TFT_SCLK 13 // poveži SCLK pin TFT-a na 13 digitalni pin #define TFT_MOSI 11 // poveži 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()) // provjerite vezu za BMP180 ( Serial.print("Ups, nije detektovan BMP180 ... Provjerite svoje ožičenje ili I2C ADDR!"); bmpFlag = 1; ) tft.initR(INITR_BLACKTAB); // Inicijalizirajte TFT i popunite crnom bojom tft.fillScreen (ST7735_BLACK); tft.setRotation(tft.getRotation() + 1); tft.setTextSize(1.5); delay(500); // kašnjenje kako bi se osiguralo da je TFT inicijaliziran ) // posljednji izmjereni podaci float oldTemperature = 0 , oldAltitude = 0, oldPrissure = 0, oldDHTHvlažnost = 0, oldDHTTtemperature; bool wasUpdate = false; 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) ; // dobijemo podatke iz BMP180 if (event.pressure) ( bmp.getTemperature(&temperature); float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA; altitude = bmp.pressureToAltitude(seaLevelPressure, event.pressure(S) greška"); ) ) uint32_t start = micros(); int chk = DHT.read22(DHT22_PIN);// dobij podatke od DHT22 uint32_t stop = micros(); stat.total++; switch (chk) // provjeri status DHT22 ( case DHTLIB_OK: stat.ok++; break; case DHTLIB_ERROR_CHECKSUM: stat.crc_error++; Serial.print("Greška kontrolne sume,\t"); break; slučaj DHTLIB_ERROR_TIMEOUT: stat.time_out++; Serial.print("Greška isteka vremena,\t"); break; case DHTLIB_ERROR_CONNECT: stat.connect++; Serial.print("Greška pri povezivanju,\t"); break; case DHTLIB_ERROR_ACK_L: stat.ack_l++; Serial.print("Ack Low error,\t"); break; case DHTLIB_ERROR_ACK_H: stat.ack_h++; Serial.print("Ack High error,\t"); break; default:stat.unknown++; Serial.print("Nepoznata greška,\t"); break; ) 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 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); oldDHTHumidity = 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."), DHT_tempera. temperatura, " C", istina); oldDHTTemperature = DHT.temperature; wasUpdate = istina; ) 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 da sastavite tijelo

Glavni uslov za rad bio je radni prototip u prezentabilnom obliku. Stoga sam morao kupiti futrolu i, naoružan dosjeom, na bilo koji način gurnuti meteorološku stanicu u kućište.

Kućište je kupljeno u lokalnoj prodavnici elektronike.

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. Odlučio sam da iznesem senzore napolje, jer sam prilikom testiranja sistema bez kućišta primetio da se zadnja strana ekrana jako zagreva, što će uticati na temperaturu unutar kućišta.

Kućište sa rupama za senzore i napajanje



Pošto sam morao da zalemim noge na 2 senzora, a na jednom sam zapalio stazu, odlučio sam da ne iskušavam sudbinu i ne lemim žice na senzore (vežbaću na nečem drugom), već da bih spojio da budem manje-više pouzdan, odlučio sam da premotam traku.

Sistem prije "trpanja" u kućište



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

Čudo Yuda kit riba



Pričvrstimo poklopac, priključimo napajanje i čekamo.

Završena meteorološka stanica u zgradi



Nakon prikaza rezultata na ekranu, otkrivamo neugodnu grešku u mjerenju vlažnosti: DHT22 marljivo daje cifru od 99,90% (izuzetno je rijetko imati 1,00%). Počnimo da otkrivamo u čemu je problem. Prva stvar koju radimo je da pogledamo izlaz vrijednosti ​​​na COM port. Dobro je. Nakon nekoliko ponovnog postavljanja, rastavljanja i ponovnog sastavljanja kućišta, pada mi na pamet misao da potražim odgovor u Google-u. Očekivano, ruski Google nije rekao ništa razumno. UREDU. Počinjemo tražiti na engleskom i na jednom od foruma nailazimo na momke sa sličnim problemom. Prve četiri stranice rasprave ne daju ništa smisleno, a na petoj strani nalazimo odgovor na naše pitanje:
Senzori vlažnosti mogu lako biti pogođeni pogrešnim gasovima ili veoma dugom izloženošću visokoj vlažnosti IIRC. U datasheet-u postoji procedura kako da "resetujete" senzor, možete probati.

Ostalo je samo pitanje kada i kako sam uspio naštetiti DHT22. Ali došlo je vrijeme za polaganje predmeta, 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 univerzitetu. Međutim, morao sam se vratiti na meteorološku stanicu ranije nego što sam mislio. Desilo se da sam sredinom novembra promijenio radno mjesto i u novom timu upoznao ljude koji su zainteresovani za Arduino platformu i slično. Stoga, moje interesovanje za ovu platformu nije imalo vremena da se ohladi, ponovo je rasplamsalo. Izvadio sam svoju meteorološku stanicu, spojio je na kompjuter i sjetio se da implementiram prijenos podataka sa 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 sa 3.3V napajanjem, 4 nRF24L01 + radio modula i još neke dodatne senzore, o kojima ću također pokušati govoriti sljedeći put. U medjuvremenu cekam paket, planiram da implementiram konekciju sata u realnom vremenu da mogu da snimim vreme ažuriranja podataka i same podatke na microSD kartici, pod uslovom da nema veze sa klijentom preko COM porta.

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



Nekako, šetajući gradom, ugledao sam novu radnju radio elektronike koja je otvorena. Ulazeći u to, naš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 sa odašiljačima signala iz daljine. Odlučio sam kupiti najjeftiniji predajnik i prijemnik na 433 MHz:

Predajnik signala.


prijemnik signala.

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

Predajnik ima sljedeće karakteristike:
1. Model: MX-FS-03V
2. Radijus djelovanja (zavisi od prisutnosti blokirajućih objekata): 20-200 metara
3. Radni napon: 3,5 -12V
4. Dimenzije modula: 19*19mm
5. Modulacija signala: AM
6. Snaga predajnika: 10mW
7. Frekvencija: 433MHz
8. Potrebna dužina vanjske antene: 25 cm
9. Jednostavan za povezivanje (samo tri žice): DATA ; VCC ; Zemlja.

Karakteristike prijemnog modula:
1. Radni napon: DC 5V
2. Struja: 4mA
3. Radna frekvencija: 433.92MHz
4. Osetljivost: - 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 lično proveravao, ali u dvosobnom stanu prihvata svuda.

Hardver kućne meteorološke stanice

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


Senzor temperature DS18D20 je povezan 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 predajnika MX -FS - 03V se napaja sa 5 volti, izlaz podataka (ADATA) je povezan na pin D13.

Povezao sam LCD ekran i BMP085 barometar na Arduino Uno.


dijagram ožičenja za arduino uno

Prijemnik signala je spojen na pin D10.

Modul BMP085 je digitalni senzor atmosferskog pritiska. Senzor vam omogućava mjerenje temperature, pritiska i nadmorske visine. Interfejs veze: I2C. Napon napajanja senzora 1,8-3,6 V

Modul je povezan 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% sa tačnošću od 5%.
  • Određivanje temperature 0-50 stepeni. sa 2% tač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 sa razmakom nogu od 0,1"

DHT ima 4 pina:

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

Povezuje se na D8 Arduino.

Softver za kućnu vremensku stanicu

Modul predajnika 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); DallasTemperaturni senzori (&oneWire); DeviceAddress insideThermometer; 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"; //Servisni simbol 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(); / / Sačekajte da se transfer završ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 pritisak i temperaturu u prostoriji i prenosi ih na displej.

#include #include LiquidCrystal lcd(12, 10, 5, 4, 3, 2); #include dht11 senzor; #define DHT11PIN 8 #include #include BMP085 dps = BMP085(); dugo Temperatura = 0, Pritisak = 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 nadzor zraka lcd.begin(16, 2); Wire.begin(); delay(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; // Dužina međumemorije if (vw_get_message(buf, &buflen)) // Ako je poruka primljena ( // Počni raščlanjivati ​​int i; // Ako je poruka nije adresiran na nas, izađi if (buf != "z") ( return; ) char command = buf; // Naredba je na indeksu 2 // Numerički parametar počinje na indeksu 4 i = 4; int broj = 0; // Budući da je prijenos karakter po znak, tada morate konvertirati 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 print(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(sensor.humidity); lcd.home(); //delay(2000); int chk = sensor.read(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 error"); break; default: //Serial.println("Nepoznata greška"); break; ) ) )

P.S. U budućnosti planiram dodati sljedeće:
- senzor vlažnosti na transmiter, preraditi algoritam za prenos podataka
- senzor za mjerenje brzine i smjera vjetra.
- dodajte još jedan ekran prijemniku.
- prebaciti prijemnik i predajnik u poseban mikrokontroler.

Ispod je fotografija onoga što se dogodilo:

Lista radio elemenata

Oznaka Tip Denominacija Količina BilješkaProdavnicaMoja beležnica
prenosni dio.
Arduino ploča

Arduino Nano 3.0

1 U notes
senzor temperature

DS18B20

1 U notes
Otpornik

220 ohma

1 U notes
modul predajnikaMX-FS-03V (433 MHz)1 U notes
radio prijemni dio.
Arduino ploča

Arduino Uno

1 U notes
Trimer otpornik 1 U notes
Otpornik

Na osnovu projekta meteorološke stanice iz knjige V. Petina "Projekti koristeći Arduino kontroler" 2. izdanje (projekat 5 Priloga 2). Koristio Arduino IDE 1.8.5 na Windows 10.
Došlo je do greš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. Projektu sam dodao senzor BMP180 za mjerenje atmosferskog tlaka i preradio skicu.

Dijagram povezivanja

Skeniranje adresa

Prvo povežite BMP180 senzor i LCD1602 indikator na Arduino. Sastavite skicu I2C skenera i pokrenite je da odredite adrese uređaja na I2C magistrali.

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

Dijagram ožičenja

Sada u potpunosti sastavite krug. Koristio sam običnu katodu RGB LED montiranu na ploču zajedno sa otpornicima od 150 oma. Zajednička katoda je spojena na GND pin, ostali pinovi su povezani prema dijagramu. Nema potrebe za mijenjanjem skice, jer se svjetlina LED dioda mijenja prema cikličnom zakonu.
Dijagram prikazuje vezu RGB LED-a sa zajedničkom anodom, kao u knjizi.
Ako na LCD1602 ekranu nisu vidljivi znakovi, okrenite kontrolu svjetline. Pozadinsko osvetljenje indikatora troši dosta struje, pa koristite napajanje sa strujom od najmanje 2 A. Koristio sam USB hub sa eksternim napajanjem od 2 A.
U krugu sam koristio piezo poziv ZP-22. Otpornik spojen na zvono je 100 oma. Frekvencija zvuka se može promijeniti u programu. Odabrao sam frekvenciju od 1000 Hz. Ako naiđete na zujalicu sa fiksnom frekvencijom zvuka, onda ga možete uključiti i isključiti jednostavnim primjenom i uklanjanjem napona, poput obične LED diode. Kada skica počne, čuje se kratak bip. Možete omogućiti periodično signaliziranje dok je program pokrenut dekomentiranjem reda //bzz(100); u skici.
U projektu sam koristio DHT11 senzor u obliku modula sa već montiranim otpornikom od 4,7 kΩ. Otpor može biti od 4,7 do 10 kOhm.
Povežite Vcc pin modula sata DS1302 na +5 voltnu šinu. Na ovaj način ćete smanjiti trošenje baterije, zapravo će raditi samo kada je napajanje Arduina isključeno.

Program (skica)

Biblioteka bmp085 je korištena za opsluživanje BMP180. Vrijednost pritiska ovisi o visini terena. Za ispravnu vrijednost atmosferskog tlaka potrebno je odabrati visinu. Da biste to uradili, uredite liniju dps.init(MODE_STANDARD, 10000, true); Moja visina je 100 m (10000 cm). Fragment proračuna tlaka je preuzet iz primjera BMP085_test2.ino biblioteke bmp085.

meteo_P skica

#include
#include
#include
#include "dht.h"
#include
BMP085 dps = BMP085();
dugačak pritisak = 0, visina = 0;
unsigned long time1 = 0;

#defini 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 vašu 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("Neuspjelo čitanje sa 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 print (hum);
lcd.setCursor(4, 1);
lcd.print("%T=+");
lcd.setCursor(9, 1);
lcd print(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);
Wire.begin();
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(FRIDAY); // Postavite dan u sedmici na PETAK postavite dan u sedmici
//rtc.setTime(4, 58, 0); // Postavite vrijeme na 12:00:00 (24h format)
//rtc.setDate(6, 8, 2010); // Postavite datum na 6. avgust 2010. postavite datum (dan, mjesec, godina)
}

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

if ((millis() - memTime > 2000) ili (milis()< 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(&Prissure);
Serial.print("Pritisak(Pa):");
Serial println(Pritisak);

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

lcd.setCursor(0, 0);
lcd.print("P=");
lcd.setCursor(2, 0);
lcd print(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);
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 LiquidCrystal_I2C.zip, bmp085.zip, DS1302.zip i DHT.zip biblioteke iz preuzete arhive u Arduino IDE. Idite na meni Skica Povežite biblioteku Dodaj .zip biblioteku... i u prozoru izaberite zip arhivu biblioteke.
Preuzmite meteo_P skicu. Zamijenite adresu LCD1602 na skici vrijednošću dobivenom skeniranjem I2C magistrale. Sastavite i pokrenite skicu.
Ako skica radi, otvorite monitor porta i pogledajte izlazne poruke. Uskladite visinu u naredbi dps.init(MODE_STANDARD, 10000 , istina); da dobijete stvarne vrednosti pritiska.
Podesite svoj sat. Dekomentirajte red //rtc.setTime(4, 58, 0); a u zagradama navedite trenutno vrijeme (sat, minute i sekunde odvojene zarezima) i ponovo učitajte skicu u kontroler. Nakon što je vrijeme postavljeno, ponovo komentirajte ovu liniju i ponovo pokrenite skicu.
Ako vas nervira osvjetljenje noćnog svjetla, možete ga podesiti promjenom dužine kašnjenja u for petljama na kraju skice. Sa zakašnjenjem(2); petlja traje 2-3 sekunde, sa kašnjenjem(5); — od 4 do 5 sekundi, sa kašnjenjem (30); - do 15-16 sekundi. Informacije o indikatoru će se ažurirati u istom intervalu.
Kada se meteorološka stanica koristi autonomno, tj. bez povezivanja na USB port računara, komentarišite linije sa rečima Serial ... na skici da biste onemogućili izlaz informacija na monitor COM porta.

PS. Na skici knjige i u primjerima za DHT biblioteku navedena je linija definicije #define DHTTYPE DHT 11. Skica radi, ali se ruši nakon nekoliko sati. Sat se zaustavlja, displej se ne menja. Na monitoru porta pojavljuje se nejasna poruka u kojoj se spominje dht.
U ovom redu uklonio sam slova DHT, tj. urađeno #define 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/

Top Related Articles