Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • vijesti
  • Arduino čita senzore s prvih meteoroloških stanica. Kućna meteorološka stanica na Arduinu i slanje podataka u "People's Monitoring"

Arduino čita senzore s prvih meteoroloških stanica. Kućna meteorološka stanica na Arduinu i slanje podataka u "People's Monitoring"

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 čuvar?

Watchdog timer je u slučaju nužde. Kao što praksa pokazuje, ENC28J60 ne povlači više (ako ne pokvari memoriju) 4 istodobne veze. S obzirom na to koliko je servisnih veza, stalno se događa održavanje rada same mreže, a samo ostavljeni promet koji stvaraju sve vrste kućnih igračaka (na primjer, moderni televizori skeniraju dostupne hostove na mreži i otvaraju portove za njih), dizajn jednostavno pada u stupor. ENC28J60 ne zna samostalno raditi s mrežnim protokolima i sve je implementirano u knjižnicama. Možda je u njima.
Provjerio sam sve dostupne knjižnice i različite module (odjednom brak), ali dugo nisam mogao postići stabilan rad. Maksimalno razdoblje je bilo oko 3-4 tjedna.
Zbog toga se tamo vrti "pas", a ako se nešto dogodi, kontrolor se trgne. Nakon toga problem je nestao.
Također, ne poričem da je moguće da postoje određene nijanse ili problemi u mojoj kućnoj mreži. Ali budući da sam imao problem, to može smisliti druga osoba. Ja sam do sada samo pronašao takvo rješenje.
Koliko ja znam, Wiznet čipovi (W5100 i noviji) to nemaju ili su samo loše izgledali.

Prelazimo na ažuriranje

Ono što je najvažnije, ostavljamo čip ENC28J60 i idi na W5100... Pokušao sam implementirati sve na starom čipu, ali nema dovoljno memorije mikrokontrolera zbog vrlo velikih biblioteka za ENC28J60... Kada koristite novi čip, standard knjižnice od programera i svih unesenih promjena, ima još više 20% slobodna memorija mikrokontrolera ATMega328... A ovo, nove lepinje!

Ova verzija (nazovimo je druga) dodala je mogućnost bežičnog prijenosa očitanja senzora koristeći frekvenciju 433 MHz... Same module sam preuzeo od Kineza, označavajući XY-MK-5V... Želio bih napomenuti da je kvaliteta prijenosa daleko od savršene. Mogući su gubitak signala, šum, nemogućnost istovremenog prijenosa itd. itd. Ali njihova cijena (manje od 1 USD po kompletu) nadoknađuje ove nedostatke. Odat ću vam tajnu da se ovi (najjeftiniji) moduli nalaze u mnogim markiranim meteorološkim stanicama za kućnu upotrebu. Vau, neočekivano?

Počnimo s baznom stanicom

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

Modul odašiljača koristi napajanje 5V, GND(gdje bez majke onda) i D2 pin na kontroleru. Promijenite kontakt D2 (Podaci) možete koristiti funkciju vw_set_tx_pin iz vw biblioteke.

Za razliku od prethodne skice, ovo uključuje 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); char server = "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; EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE (ID bajta; // ID uređaja int Temperatura; // Temperatura float Tlak; // Tlak float Vlažnost; // Vlaga float rosišna točka; // Rosa / točka smrzavanja); SEND_DATA_STRUCTURE emitiranje; void setup () (// Inicijalizirajte Watchdog timer wdt_disable (); kašnjenje (8000); wdt_enable (WDTO_8S); // Inicijalizirajte konzolu Serial.begin (9600); // Inicijalizirajte DHT senzor dht.begin (); / / Inicijalizacija 433 MHz modula ET.begin (detalji (emitiranje)); vw_set_ptt_inverted (true); vw_set_tx_pin (2); vw_setup (2000); // Pokrenimo mrežu, ako nismo čekali podatke s DHCP poslužitelja , zatim // sebi dodijelimo adresu if (Ethernet.begin (mac) == 0) Ethernet.begin (mac, ip); // Inicijaliziraj 1-Wire Wire.begin (); kašnjenje (200); // Inicijaliziraj BMP180 s korekcijom visine // dps.init (MODE_STANDARD, 3200, true); // Inicijaliziraj BMP180 dps.init (); Serial.println (Ethernet.localIP ()); // Pošalji prve podatke odmah nakon uključivanja uređaja 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 ODNOS = 373,15 / (273,15 + celzijus); dvostruki RHS = -7,90298 * (ODNOS - 1); RHS + = 5,02808 * log10 (omjer); RHS + = -1,3816e-7 * (pow (10, (11,344 * (1 - 1 / RATIO))) - 1); RHS + = 8,1328e-3 * (pow (10, (-3,49149 * (ODNOS - 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) dvostruki T = log (VP / 0,61078); // temp var return (241,88 * T) / (17,558 - T); ) void send_info (bool eth) (bool fail = true; while (fail) (// Pokušavamo čitati podatke s DHT senzora vlažnosti dok ne dobijemo // rezultat. U 90% slučajeva sve radi dobro, ali trebamo 100 % ako ((H = dht.readHumidity ())> = 0) (// Dobivanje vlažnosti i temperature od senzora BMP180 dps.getPressure (& Pressure); dps.getTemperature (& Temperature); // Izračunajte rosu točka ako je vani temperatura iznad 0 stupnjeva Celzija // i očekujte rezultat iznad 0, u suprotnom ispišite 0. To je neophodno // kako ne bismo bili zavedeni tijekom zimske sezone. // dP = temperatura> 0? ((dPt = rosište (temperatura * 0,1, H))<0?0:dPt):0; dP = dewPoint(Temperature*0.1, H); // Отправляем данные в эфир 433 мГц broadcast.ID = 1; broadcast.Temperature = floor(Temperature*0.1); broadcast.Pressure = floor(Pressure/133.3*10)/10; broadcast.Humidity = floor(H*10)/10; broadcast.dewPoint = floor(dP*10)/10; ET.sendData(); delay(250); if(eth) { // Подключаемся к серверу "Народный мониторинг" if(client.connect(server, port)) { // Начинаем передачу данных // адрес_устройства_в_проекте, имя_устройства, GPS широта, GPS долгота client.print(F("#fe-31-31-0e-5a-3b#Arduino Uno#71.344699#27.200014\n")); // Температура client.print(F("#T0#")); client.print(Temperature*0.1); client.print(F("#Температура\n")); // Давление client.print("#P1#"); client.print(Pressure/133.3); client.print(F("#Давление\n")); // Влажность client.print("#H1#"); client.print(H); client.print(F("#Влажность\n")); // Точка росы\инея client.print("#T1#"); client.print(dP); client.print((dP <= 0)? F("#Точка инея\n"):F("#Точка росы\n")); //client.print(F("#Точка росы\n")); // Отправляем конец телеграммы client.print("##"); // Даем время отработать Ethernet модулю и разрываем соединение delay(250); client.stop(); } } // Останавливаем цикл, если передача завершена fail = !fail; break; } delay(250); } } void loop() { // Каждые 4 секунды сбрасываем сторожевой таймер микроконтроллера // Каждые 6 минут отправляем данные на "Народный мониторинг" // Каждые 30 секунд отсылаем данные в эфир 433 if(!(millis()%1000)) wdt_reset(); if(!(millis()%360000)) send_info(true); if(!(millis()%30000)) send_info(false); }

Samim modulima mora biti dodana antena. Za 433 MHz dovoljna je obična duga bakrena žica 17 cm... Bez antene možete zaboraviti na normalan rad.

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

Za implementaciju (na koljenu), koristio sam analogni Arduino NANO(na bazi ATMega328) i TFT prikaz na čipu ST7735S uz dopuštenje 128 x 160

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; int veličina; // 433 EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE (ID bajta; // ID uređaja int Temperatura; // Temperatura float Tlak; // Tlak float Vlažnost; // Vlaga float rosišna točka; // Rosa / točka smrzavanja); 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; Podaci o nizu; TFT TFT zaslon = TFT (cs, dc, rst); void setup () (Serial.begin (9600); // Inicijalizacija modula od 433 MHz ET.begin (detalji (emitiranje)); vw_set_ptt_inverted (true); vw_set_rx_pin (7); vw_setup (2000); vw_rx_start (); / Inicijalizacija i početna postavka 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 senzora TFTscreen.text ("mmHg", w / 2 + 5, 80); TFTscreen. tekst ("%", w / 2 + 5, 100); TFTscreen.text ("C", w / 2 + 5, 120); emitiranje.Temperatura = 0; emitiranje.Pritisak = 0; emitiranje.Vlažnost = 0; broadcast .dewPoint = 0; TFTPrint ();) void loop () (if (ET.receiveData ()) (if (broadcast.ID == 1) TFTPrint (); / * Serial.println (broadcast.Temperature); Serial .println (broadcast.Prissure); Serial.println (broadcast.Humidity); Serial.println (broadcast.dewPoint); Serial.println (); * /)) poništavanje promjena (int size, int x , int y, bool up, bool clear = false) (ako (izbriši) TFTscreen.stroke (0, 0, 0); ostalo (promjene (veličina, x, y,! gore, istina); TFTscreen.stroke ((gore)? 0: 255, 0, (gore)? 255: 0);) if ((veličina% 2) == 0 ) veličina ++; while (veličina> 0) (TFTscreen.line (x, y, x + (veličina--), y); ++ x, (gore)? - y: ++ y, --size;) / * while ( veličina> 0) (TFTscreen.line (x, y, (gore)? x + veličina-1: x, (gore)? y: y + veličina-1); ++ x, ++ y, --size; ) * /) int x_center (int w, int duljina, int veličina) (povratni pod ((w-duljina * (veličina * 5) + veličina * 2) / 2);) int x_alignment_right (int w, int duljina, int veličina) (povratni strop (w-duljina * (veličina * 5) + veličina * 2);) void TFTPrint () (veličina = 3; // ================= ==================================================== =============== // Prikaz očitanja temperature // ============================= ==================================================== ==== if (broadcast.Temperature! = Log_Temperature) (TFTscreen.setTextSize (veličina); // Izbriš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); // Prikaz 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 (emitiranje.Temperatura> 0) (r = karta (emitiranje.Temperatura, 0, 40, 255, 150); // Crvena b = karta (emitiranje.Temperatura, 0, 40, 30, 0); // Promijenite nijansa za vizualniji prijelaz kroz nulu) inače (r = karta (emitiranje.Temperatura, -40, 0, 0, 30); // Promijenite nijansu za vizualniji prijelaz kroz nulu b = karta (emitiranje.Temperatura, - 40, 0, 150, 255); // Plava) TFTscreen.stroke (b, g, r); // UPOZORENJE: pozicije boja su pomiješane u biblioteci, RGB prostor koristi BGR! TFTscreen.text (Temperatura, x_centar (w, info.length () + 1, veličina), 35); ) veličina = 1; // ================================================= ================================== // Prikaz očitanja tlaka // ========= ==================================================== ======================== if (broadcast.Prissure! = Log_Prissure) (TFTscreen.setTextSize (veličina); // Prebriši zastarjele podatke o podacima = String (Log_Prissure) ); info.toCharArray (Pritisak, info.length ()); TFTscreen.stroke (0, 0, 0); TFTscreen.text (Pritisak, x_alignment_right (w / 2-5, info.length (), veličina), 80 ); // Prikaz 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, istina); promjene (10, 106, 85, netočno, istina);) // ================================ ==================================================== = // Prikaz očitanja vlage // =================== ==================================================== ============== if (emitiranje.Vlažnost! = Dnevnik_Vlažnost) (TFTscreen.setTextSize (veličina); // Izbriši zastarjele podatke info = String (Log_Humidity); info.toCharArray (Vlažnost, info.length ()); TFTscreen.hod (0, 0, 0); TFTscreen.text (Vlažnost, x_alignment_right (w / 2-5, info.length (), veličina), 100); // Ispis 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.Humidity> Log_Humidity)? true: false); ) ostalo (promjene (10, 106, 105, istina, istina); promjene (10, 106, 105, netočno, istinito);) // =================== ==================================================== ============== // Prikaz očitanja točke rose/mraza // =========================== ==================================================== ====== if (broadcast.dewPoint! = Log_dewPoint) (TFTscreen.setTextSize (veličina); // Izbriši zastarjele 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 (), veličina), 120); promjene (10, 106, 125, (broadcast.dewPoint> Log_dewPoint)? True: false);) else (promjene (10, 106, 125, true, true); promjene (10, 106, 125, false, true);) // Ažurirajte vrijednosti u zapisnicima za sljedeće usporedba očitanja Log_Temperature = emitiranje.Temperatura; Log_Prissure = emitiranje.Pritisak; Dnevnik_Vlažnost = emitiranje.Vlažnost; Log_dewPoint = broadcast.dewPoint; )

Oznake su prikazane prilično kompaktno, ali kao što pokazuje praksa (i savjet mojih suboraca) - "po okusu i boji, čak ni moja žena nije prijatelj." Poslušao sam hrpu savjeta i prijedloga, ali oni su međusobno proturječni. Dakle, učinite to po svom ukusu.

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

Skriveni tekst

Neki od podataka su izmišljeni kako bi prikazali neke elemente dizajna.

Artefakti na displeju, to su prašina i druga prljavština nakupljena tijekom dužeg vremena na zaslonu je bio ... negdje tamo, ... e pa ne sjećam se odakle mi to! 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 desno od navedene zone. Svi izračuni se izvode u odnosu na veličinu navedenog teksta, na temelju izraza 1 veličina = 1PX x 1PX segmentu fonta.

Zaslon također prikazuje elemente koji odgovaraju povećanju ili smanjenju ove ili one 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čitanja povećaju, tada je element crven, inače plavi.

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 oko toga neko vrijeme i shvatio da su vrijednosti u funkciji moždani udar, objekti TFT prikaza navedeni su pogrešnim redoslijedom. BGR mjesto RGB... Ovo je greška programera ili nešto što ne razumijem.

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

Nedavno je jedan moj kolega bio domaćin male znanstvene izložbe.
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?
Arduino vremenska stanica 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.

Ona mora biti sposobna odrediti sljedeće parametre:

  • temperatura
  • vlažnost
  • pritisak
  • visina

Korak 1: kupite potrebne komponente







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

Od opreme će vam trebati:

  • Lemilica
  • Kliješta za jastučiće za nos
  • Žice

Korak 2: DHT22 senzor temperature i vlažnosti







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

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

Senzor AM2302 koristi digitalni signal. Ovaj senzor koristi jedinstveni sustav kodiranja i senzorsku tehnologiju, tako da su njegovi podaci pouzdani. Njegov senzorski element povezan je s 8-bitnim računalom s jednim čipom.

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

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

Pogledajmo prednosti i nedostatke tri modela senzora.

DHT11

Prednosti: nije potrebno 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 ° C, pogreška mjerenja razine relativne vlažnosti +/- 5%, neadekvatan raspon izmjerenih temperatura (0-50 ° C).
Primjene: vrtlarstvo, poljoprivreda.

DHT22

Prednosti: nije potrebno lemljenje, niska cijena, izglađene 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, automatsko mirovanje, visoka stabilnost i konzistentnost podataka.
Protiv: dva digitalna sučelja, pogreška u mjerenju razine vlažnosti, izmjereni temperaturni raspon 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 pin Arduina

Korak 3: BMP180 senzor tlaka



BMP180 je senzor barometarskog tlaka s I2C sučeljem.
Senzori barometrijskog tlaka mjere apsolutnu vrijednost okolnog zraka. Ova brojka ovisi o specifičnim vremenskim uvjetima i nadmorskoj visini.

Modul BMP180 je imao 3.3V 662kOhm regulator koji sam iz vlastite gluposti slučajno raznio. Morao sam izvršiti praćenje napajanja izravno do čipa.

Zbog nedostatka stabilizatora ograničen sam u izboru izvora napajanja - napon veći od 3,3V uništit će senzor.
Drugi 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 njegovom odnosu prema temperaturi i nadmorskoj visini.

Atmosferski tlak u bilo kojoj točki nije konstantan. Složene interakcije između Zemljine rotacije, nagiba Zemljine osi, dovode do pojave mnogih područja visokog i niskog tlaka, što, zauzvrat, dovodi do svakodnevne promjene vremenskih uvjeta. Promatrajući promjenu tlaka, možete napraviti kratkoročnu prognozu vremena.

Na primjer, pad tlaka obično znači kišovito vrijeme ili nadolazeću grmljavinu (približavanje području niskog tlaka, ciklona). Porast tlaka obično znači suho, vedro vrijeme (područje visokog tlaka, anticiklona prolazi iznad vas).

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 mijenjaju na svakoj lokaciji, referirat ć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 vrijednost pada na nulu. Krivulja za ovaj pad 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

Zapamtite da senzor BMP180 treba pristup okolnoj atmosferi kako bi mogao očitati tlak zraka, nemojte stavljati senzor u zatvoreno kućište. Mali otvor za ventilaciju trebao bi biti 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 ekstremnih temperatura 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 u njega može ući kroz otvor na poklopcu čipa. Za najtočnija mjerenja pokušajte zaštititi senzor od ambijentalnog svjetla.

Korak 4: sastavljanje uređaja







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

Ugradite otpornik od 10kΩ s podatkovnog pina na masu (Gnd). Sve lemimo.
Zatim, na isti način, ugrađujemo jednoredni konektor za senzor BMP180, napajanje je 3,3V. Sve povezujemo na I2C sabirnicu.

Konačno, LCD zaslon povezujemo na istu I2C sabirnicu kao i BMP180 senzor.
(Na četvrti konektor planiram kasnije spojiti RTC modul (sat realnog vremena) kako bi uređaj također pokazao vrijeme).

Korak 5: kodiranje




Učitaj 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! // # definirajte DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 DHT dht (DHTPIN, DHTTYPE); LiquidCrystal_I2C lcd (I2C_ADDR, En_pin, R_pin, 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 Temperature:"); 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.getPressure (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 (); // Očitaj temperaturu kao Celzijus (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.print (t); lcd.print ("deg C"); 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 ("deg C"); kašnjenje (3000); )

Koristio sam verziju Arduino 1.6.5, kod joj točno odgovara, može stati i na kasnije. Ako kod iz nekog razloga ne odgovara, upotrijebite verziju 1.6.5 kao osnovnu.

Jednom sam hodajući gradom vidio novu trgovinu elektronikom koja je otvorena. Ušavši u njega, pronašao sam veliki broj štitova za Arduinu. Imao sam kod kuće Arduino Uno i Arduino Nano je odmah dobio ideju da se igram s odašiljačima signala na daljinu. Odlučio sam kupiti najjeftiniji odašiljač i prijemnik od 433 MHz:

Odašiljač signala.


Prijemnik signala.

Nakon što smo zapisali najjednostavniju skicu prijenosa podataka (primjer je preuzet odavde), pokazalo se da odašiljači mogu biti sasvim prikladni za prijenos najjednostavnijih podataka, kao što su temperatura, vlažnost.

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

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

U prostranstvima interneta govori se da raspon 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 D2 pin Arduina
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 spojen je LCD zaslon i BMP085 barometar.


Dijagram povezivanja na 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
  • Brzina uzorkovanja nije veća od 1 Hz (ne više od jednom u 1 s.)
  • Dimenzije 15,5 mm x 12 mm x 5,5 mm
  • Razmak 4 pinova 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 Arduin.

Softverski dio kućne meteorološke stanice

Modul za prijenos 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 spajanje Dallas OneWire oneWire senzora (ONE_WIRE_BUS); DallasTemperaturni senzori (& oneWire); Adresa uređaja unutar termometra; void setup (void) (//Serial.begin(9600); vw_set_ptt_inverted (true); // Potrebno za DR3100 vw_setup (2000); // Postavite 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 je ovo senzor 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 (); / / Čekamo da prijenos završi kašnjenje (200);) void petlja (void) (za (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); // Postavite brzinu prijema vw_rx_start (); // Počnite pratiti emitiranje 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 za poruku 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 poruka nije adresirana na nas, izađite iz 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 dok (buf [i]! = "") (broj * = 10; broj + = buf [i] - "0"; i ++;) dps.getPressure (& Pressure); dps.getAltitude (& Altitude); dps.getTemperature (& Temperature); //Serial.print(command); Serial.print (""); Serial.println (broj); lcd.print ("T ="); lcd.setCursor (2.0); lcd.print (broj); lcd.setCursor (5.0); lcd.print ("P ="); lcd.print (Tlak / 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 (); // kašnjenje (2000.); int chk = senzor.čitaj (DHT11PIN); prekidač (chk) (slučaj DHTLIB_OK: //Serial.println("OK "); prekid; slučaj DHTLIB_ERROR_CHECKSUM: //Serial.println("Kontrolni zbroj"); prekid; slučaj DHTLIB_ERROR_TIMEOUT: //Serial.println("Istek vremena pogreška "); break; default: //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 na uređaj za primanje.
- prenijeti prijemnik i odašiljač u poseban mikrokontroler.

U nastavku prilažem fotografiju onoga što se dogodilo:

Popis radioelemenata

Oznaka Vrsta Vjeroispovijest Količina BilješkaPostićiMoja bilježnica
Dio za prijenos.
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
Radio prijemni dio.
Arduino ploča

Arduino Uno

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

Za osnovu je uzet projekt meteorološke postaje iz knjige V. Petina "Projekti pomoću Arduino kontrolera" 2. izdanje (projekt 5 Dodatka 2). Koristili smo Arduino IDE 1.8.5 na Windows 10.
Dobio sam grešku 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čito sam naišao na pogrešne knjižnice. Projekt je 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 prema zadanim postavkama ima adresu 0x77, tako da LCD indikator ima adresu 0x3F.
U nekim dijagramima knjige su pomiješane s mjestima gdje su SDA i SCL signali spojeni na Arduino ploču. Trebao bi biti: SDA - na A4, SCL - na A5. Ako BMP180 ima pet pinova, VIN pin se isporučuje s +5 volti.

Dijagram ožičenja

Sada sastavite cijeli krug. Koristio sam uobičajenu katodnu RGB LED diodu montiranu na ploču zajedno s otpornicima od 150 ohma. Zajednička katoda spojena je na GND kontakt, ostali pinovi su spojeni prema shemi. Nema potrebe mijenjati skicu, jer se svjetlina LED dioda mijenja ciklički.
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 shemi sam koristio piezo zvono ZP-22. Otpornik spojen na zvono je 100 ohma. Frekvencija zvuka se može promijeniti u programu. Odabrao sam frekvenciju od 1000 Hz. Ako naiđete na zujalicu s fiksnom frekvencijom zvuka, tada ga možete uključiti i isključiti jednostavnim primjenom i uklanjanjem napona, poput obične LED diode. Kratak bip se oglašava kada skica počne. 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 kOhm. Otpor može biti od 4,7 do 10 kOhm.
Spojite Vcc pin modula sata DS1302 na sabirnicu +5 Volt. To će smanjiti trošenje baterije, zapravo će raditi samo kada je Arduino isključen.

Program (skica)

Knjižnica bmp085 korištena je za servisiranje BMP180. Vrijednost tlaka ovisi o visini terena. Za ispravnu vrijednost atmosferskog tlaka morate odabrati nadmorsku visinu. Da biste to učinili, uredite redak dps.init (MODE_STANDARD, 10000, istina); Moja visina je 100 m (10 000 cm). Fragment prorač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 ZELENA igla = 6;
int BLUEpin = 11;

LiquidCrystal_I2C lcd (0x3f, 16, 2); // unesite svoju adresu 0x20 ... 0xff adresa
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.print (šum);
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 () (
Serija.početak (9600);
Žica.početak ();
kašnjenje (1000);

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

dht.početi ();
setup_bzz ();
bzz (100);

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

rtc.halt (lažno);
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) postavite vrijeme
//rtc.setDate(6, 8, 2010); // Postavite datum na 6. kolovoza 2010. postavite datum (dan, mjesec, godina)
}

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

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

ako je (((milis () - vrijeme1) / 1000,0)> = 1,0) (
dps.calcTrueTemperature ();
vrijeme1 = mili ();
}
dps.getPressure (& Pressure);
Serial.print ("Tlak (Pa):");
Serial.println (Tlak);

dugo p2;
int pi;
p2 = (tlak / 133,3224); // Pa u mmHg
pi = trunc (p2); // odbaciti razlomak 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);
analognoPisanje (BLUEpin, 255);
kašnjenje (5);
}

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

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

U direktoriju 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.
Prenesite skicu meteo_P. Zamijenite adresu LCD1602 na skici vrijednošću dobivenom skeniranjem I2C sabirnice. Sastavite i pokrenite skicu.
Ako skica radi, otvorite monitor porta i pogledajte poruke koje se pojavljuju. Podesite visinu u naredbi dps.init (MODE_STANDARD, 10000, istina); kako biste dobili stvarne vrijednosti tlaka.
Postavite 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 se vrijeme podmiri, ponovno komentirajte ovu liniju 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. Sa zakašnjenjem (2); ciklus traje 2-3 sekunde, s odgodom (5); - od 4 do 5 sekundi, s kašnjenjem (30); - do 15-16 sekundi. Informacije o indikatoru ažurirat će se u istom intervalu.
Kada se meteorološka stanica koristi autonomno, tj. bez spajanja na USB priključak računala, komentirajte retke s riječima Serial ... u skici kako biste onemogućili izlaz informacija na monitor COM porta.

P.S. Na skici knjige i u primjerima za DHT biblioteku naznačena je definicijska linija #defini DHTTYPE DHT 11... Skica se pokreće, ali se ruši nakon nekoliko sati. Sat se zaustavlja, prikaz se ne mijenja. Na monitoru porta pojavljuje se nejasna poruka s vezom na dht.
Uklonio sam slova DHT u ovom retku, t.j. učinio #defini DHTTYPE 11... Nakon toga, skica je počela stabilno raditi.

Članak je 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 enciklopedija Arduina. - M., DMK Press, 2017 .-- 152 str.
3.http: //arduinolearning.com/code/i2c-scanner.php
4.http: //arduino.ru/forum/programmirovanie/ds1302lcd1602
5.http: //robotekhnika18.rf/how-connect-lcd-1602-k-arduino-po-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/

Testirao sam pojedine dijelove sustava na Arduino UNO. Oni. Spojio sam ESP modul na UNO i proučio ga, odspojio, zatim spojio nRF24, itd. Za konačnu implementaciju senzora izvan prozora odabrao sam Arduino Pro Mini kao najbliži Uno od minijaturnih.



Što se tiče potrošnje energije, Arduino Pro Mini također izgleda dobro:

  • nema USB-TTL pretvarača, koji sam po sebi puno "jede",
  • LED je spojen preko 10k otpornika.

Za naprednu štednju energije planirano je:

  • uklonite LED - indikator napajanja na Arduino Pro Mini (žao mi je što nisam pokvario ploču)
  • ili koristite "goli" sklop na Atmel ATmega328 mikroprocesoru (ne koristi se)
  • koristite Low Power Library ili JeeLib.

Od knjižnica sam odabrao Low Power Library, jednostavna je i sadrži samo ono što vam treba.


Za središnju jedinicu, budući da je na nju planirano spojiti brojne periferije, odabrana je Arduino Mega ploča. Osim toga, potpuno je UNO kompatibilan i ima više memorije. Gledajući unaprijed, reći ću da je ovaj izbor bio potpuno opravdan.


Arduino Mega možete kupiti za oko 8 dolara.

Snaga i potrošnja energije

Sada o potrošnji hrane i energije.


Arduino Pro Mini dolazi u dva okusa:

  • za napon napajanja od 5V i frekvenciju od 16MHz
  • za napon napajanja od 3,3V i frekvenciju od 8MHz.

Budući da radio modul nRF24L01 + zahtijeva 3.3V za napajanje, a brzina ovdje nije bitna, kupite Arduino Pro Mini na 8MHz i 3.3V.


U ovom slučaju, raspon napona napajanja Arduino Pro Mini je:

  • 3,35-12V za 3,3V model
  • 5-12V za 5V model.

Već sam imao 5V Arduino Pro Mini, zato sam ga i koristio. Arduino Pro Mini možete kupiti za oko 4 dolara.


Napajanje centralne jedinice bit će iz mreže od 220 V preko male jedinice napajanja, dajući na izlazu 12V, 450mA, 5W. Tako za 5 dolara. Tu je i poseban izlaz za 5V.



A ako to nije dovoljno, onda ga možete staviti snažnije. Drugim riječima, nema smisla štedjeti napajanje centralne jedinice. Ali za daljinski bežični senzor, ušteda energije je najvažniji dio. Ali ni ja ne bih želio izgubiti funkcionalnost.


Stoga će Arduino Pro Mini i radio modul nRF24 napajati snop od 4 Ni-Mh baterije.


I zapamti maksimalni kapacitet moderne baterije oko 2500-2700mAh, sve je to više ili marketinški trikovi (Ansmann 2850) ili obmana (UltraFire 3500).


Ne koristim Li-Ion baterije iz nekoliko razloga:

  • vrlo skupo
  • kada temperatura okoline padne ispod 0°C, snaga litij-ionske baterije smanjuje se na 40-50%
  • oni koji su jeftini se proizvode bez zaštite i nesigurni (uz kratki spoj ili pražnjenje mogu eksplodirati i izgorjeti, pogledajte hrpu videa na YouTubeu)
  • stare, čak i ako se ne koriste (međutim, to se može reći za sve kemijske elemente), nakon 2 godine Li-Ion baterija gubi oko 20% svog kapaciteta.

Za prototip je sasvim moguće proći s visokokvalitetnim Ni-MH AA ili AAA baterijama. Štoviše, ne trebaju nam velike struje. Jedini nedostatak Ni-MH baterija je njihovo dugo vrijeme punjenja.

Opća shema meteorološke stanice

Hajde da rezimiramo. Evo općeg prikaza kako to radi.



Nastavit će se.

Oznake: Dodaj oznake

Vrhunski povezani članci