Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • vijesti
  • Arduino prvo čita senzore sa meteoroloških stanica. Kućna meteorološka stanica na Arduinu i slanje podataka u "People's monitoring"

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

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. Uredite 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, true); // Inicijaliziraj BMP180 dps.init(); Serial.println(Ethernet.localIP()); // Pošalji prve podatke odmah nakon što je uređaj uključen send_info(true ); ) // funkcija dewPoint NOAA // referenca (1) : http://wahiduddin.net/calc/density_algorithms.htm // referenca (2) : http://www.colorado.edu/geography/weather_station/Geog_site /about.htm dvostruka 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); // Prebrisati 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 kako praksa pokazuje (i savjet 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 sam to dobio! 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 na desnu stranu navedene zone. Svi proračuni se vrše u odnosu na veličinu datog teksta, na osnovu izraza 1 veličina = 1PX x 1PX font segment.

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
  • temperatura
  • pritisak
  • visine

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

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

  • temperatura
  • 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 pohranjen je u jednokratnu programabilnu memoriju (OTP memorija). Prilikom čitanja očitanja, senzor će pozvati koeficijent iz memorije.

Mala veličina, mala potrošnja energije, velika udaljenost prijenosa (100m) čine AM2302 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.

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/

Testirao sam pojedinačne dijelove sistema na Arduino UNO. One. Spojio sam ESP modul na uno i proučio ga, isključio, zatim spojio nRF24, itd. Za konačnu implementaciju senzora prozora, izabrao sam Arduino Pro Mini kao minijaturu najbližu Uno-u.



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

  • ne postoji USB-TTL konverter, koji sam po sebi dosta "jede",
  • LED je povezan preko 10k otpornika.

Za naprednu uštedu 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 (nisam ga koristio)
  • koristite Low Power Library ili JeeLib.

Od biblioteka sam izabrao Low Power Library, jednostavan je i sadrži samo ono što vam treba.


Za centralnu jedinicu, s obzirom da je planirano da se na nju povežu brojne periferije, odabrana je Arduino Mega ploča. Osim toga, potpuno je kompatibilan sa UNO-om 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 hrani i potrošnji energije.


Postoje dvije vrste Arduino Pro Mini:

  • za napon napajanja 5V i frekvenciju 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, zbog čega sam ga i koristio. Arduino Pro Mini možete kupiti za oko 4 USD.


Napajanje centralne jedinice će biti iz mreže od 220 V preko male jedinice za napajanje, dajući izlaz od 12V, 450mA, 5W. Ovako nešto za 5 dolara. Postoji i poseban izlaz za 5V.



A ako to nije dovoljno, onda to možete izraziti snažnije. Drugim riječima, štednja energije za centralnu jedinicu nema previše smisla. Ali za daljinski bežični senzor, ušteda energije je najvažniji dio. Ali ne želim ni izgubiti funkcionalnost.


Stoga će Arduino Pro Mini i nRF24 radio modul biti napajani snopom od 4 Ni-Mh baterije.


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


Ne koristim Li-Ion baterije iz nekoliko razloga:

  • vrlo skupo
  • kada temperatura okoline padne ispod 0°C, snaga litijum-jonske baterije se smanjuje na 40-50%
  • one koje su jeftine su napravljene bez zaštite i nesigurne (pri kratkom spoju ili pražnjenju mogu eksplodirati i izgorjeti, pogledajte gomilu videa na youtube-u)
  • stare, čak i ako se ne koriste (međutim, to se može reći za sve hemijske 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. Štaviše, nisu nam potrebne velike struje. Jedini nedostatak Ni-MH baterija je njihovo dugo vrijeme punjenja.

Opća shema meteorološke stanice

Hajde da sumiramo. Evo generalnog dijagrama kako sve to funkcionira.



Nastavlja se.

Oznake: Dodajte oznake

Top Related Articles