Arduino: DIY – Meteo Station (3) Tri puta meri jedanput prikaži | Naša meteorološka stanica je good to go, ostaje samo da se odlučimo na koji način ćemo prikazati očitane vrednosti, a u opticaju je nekoliko načina. U slučaju da nam treba online bežična varijanta, ESP-01 je jedno od rešenja koje se nameće. Ako pravimo kućnu varijantu sa serverom u okviru lokalne mreže, Ethernet šild, o kome smo pisali, prvi je pik na draftu. Ako pak jednostavno hoćemo da pritiskom na taster vidimo šta se dešava oko nas, dovoljan je ekran Nokie 5110, 1-CH relej i taster. Mi smo se odlučili za ovu drugu varijantu, gde smo uz pomenuti ekran i relej dodali vodootporni 5V taster sa svetlećom LED. Rekli smo da sve to mora da šljašti.Povezujemo ekran i relej po fritzing šemi, gde relej ugrađujemo u kućište, dok ekran i taster postavljamo na poklopac. Od pleksiglasa pravimo prozor kroz koji ćemo pratiti ekran. Ideja je da pritiskom na taster uključimo pozadinsko osvetljenje ekrana i tako vidimo šta se dešava oko nas i po mrklom mraku. Na sredini kućišta se našlo mesta još za taj jednokanalni relej, a njega i taster povezujemo prema šemi ispod. Inače, taster koje ćemo ugraditi je veoma zanimljivo. Vodonepropusno je, radi kao običan taster, a tu je ugrađena LED koja ima posebne izvode, radi na pet volti i koju ćemo uključiti o istom trošku kad i ekran. Sam taster, osim zajedničkog pina (COM), ima i NO i NC pinove koje koristimo u zavisnosti od toga da li želimo pritiskom na njega da otvorimo ili zatvorimo strujni krug. Ekran ugrađujemo na poklopac kućišta, ali iza komada pleksiglasa od kog je napravljen prozor, a koji smo propisno zadihtovali. Triger tastera u okviru skeča može se postaviti bilo gde, a mi smo, da ne bismo previše iskomplikovali ionako već povelik skeč, odlučili da tasterom samo uključujemo pozadinsko osvetljenje ekrana. Napajanja senzora i modula idu nezavisno u odnosu na očitavanje, tako da tasterom u principu možemo uraditi bilo šta. Warp one, engage! Na redu je skeč koji možete preuzeti sa adrese goo.gl/BUc3tM. Skeč je rađen onako kako je šta dodavano. Kao takav, nije najispeglaniji, ali smo se trudili da ne bude pretežak za praćenje. Mi smo sa naše strane ceo skeč propisno iskomentarisali u samom INO fajlu, a detalje možete pročitati u tekstu koji sledi.U početku dodajemo neophodne biblioteke, o kojima je uglavnom već bilo reči. Za DHT22 koristimo DHT.h, a o povezivanju ovog senzora je bilo reči (SK 4/2017). Za Dallas nam trebaju dve biblioteke (OneWire.h i DallasTemperature.h), a Wire.h se podrazumeva za I2C interfejs preko koga smo povezali BMP280. Tu su još dobro poznate Adafruit_Sensor, Adafruit_BMP280, Adafruit_GFX i Adafruit_PCD8544 biblioteke. Senzori gasa se takođe mogu koristiti uz odgovarajuće biblioteke, ali o njima će u nekom od narednih brojeva biti više reči. Nakon dodavanja biblioteka definišemo analogne i digitalne pinove na koje smo povezali senzore. Sledeće na redu su definicije u vezi sa tasterom. S obzirom na to da smo taster povezali na relej, potrebno je da čuvamo stanje logičke nule i jedinice. U suprotnom, relej bi bio otvoren samo dok se taster drži pritisnut. Nakon toga zadajemo konstante i pravimo objekte (dht, oneWire, bmp) i na kraju dodeljujemo pinove zadužene za Nokijin ekran. O radu sa pomenutim ekranom smo već pisali (SK 1/2017).Na kraju dolazi „štelovanje” vremena. Naime, s obzirom na sve što Mega treba da prikupi i prikaže, potrebno je napraviti određene zadrške u prikazivanju da bi se sve to pročitalo. Zadržavanje prikaza očitavanja jednog od senzora možemo uraditi na dva načina. Funkcijom delay() zaustavljamo kompletno izvršavanje skeča za određeni broj milisekundi, što i ne bi bio problem da nemamo i deo u vezi sa tasterom i relejem. Ako bismo koristili delay(), došli bismo u poziciju da „pecamo” kada će Mega nakon svih zastajanja završiti deo sa prikazivanjem, odnosno ceo loop, da bismo u pravom trenutku otvorili relej. Naravno, Arduino je sposoban za multitasking, a za to koristimo funkciju millis(). Pre toga treba da zadamo deklaracije (data types – unsigned long), u našem slučaju vreme, u kojoj milisekundi nakon početka loopa će se prikazati koje očitavanje, a samim tim i pravimo prividan zastoj u prikazivanju dok skeč teče dalje. Deklaracijom period zadajemo kada će se početi iz početka. Na ovaj način Mega će proveriti da li je vreme da ispiše određene podatke na displeju, ali neće stati, već će nastaviti dalje i videće da li smo pritisnuli taster na stanici.U funkciji setup pokrećemo Serial monitor, koji koristimo samo dok ne dobijemo gotov projekat. Zatim pokrećemo bmp, dht i ekran. Sledeće na redu je dodeljivanje moda digitalnim pinovima. U funkciji loop inicijalizujemo dve funkcije: sensorReadings() i buttonSwitch().Funkcija sensorReadings() sadrži sva očitavanja i kalkulacije, kao i prikaze, što na ekranu Nokije, što na Serial monitoru. Pomenuli smo da MQ135 modul ima i svoju biblioteku, ali mi smo se odlučili da prikupljamo deset očitavanja i uzimamo srednju vrednost. Bitno je napomenuti da je u zavisnosti od lokacije i eventualne zagađenosti možda potrebno korigovati co2Zero konstantu da bismo dobili nekih 400-405 ppm napolju. Funkcijom map() zadajemo raspon merenja na analognom pinu (0-1023), kao i raspon željenih očitavanja ppm. Za očitavanje MQ2 smo se odlučili za najprostiju varijantu, bez prosečnih vrednosti i uz map() funkciju. Inače, uz uzimanje podataka sa grafikona iz datasheeta za svaki od ova dva senzora moguće je dosta precizno utvrditi tačno prisustvo određenih gasova i, naravno, drugačiji skeč, ali o tome ćemo pisati u nekom od narednih brojeva. Za kišni senzor uzimamo vrednosti i uz if petlju opisno prikazujemo količinu kiše. O NTC-ju je isto tako bilo reči (SK 9/2017) i kod iz primera je naprosto prekopiran. Isto važi i za DHT senzor. Za Dallas koristimo sensor.requestTemperature() funkciju da izvučemo podatke preko biblioteke. Inače, Dallas je digitalni senzor, tako da razdaljina nije problem, a u našem slučaju je to samo jedan metar kabla. Za dobijanje ispravnih vrednosti UV senzora (UV intenzitet u mW/cm^2) potrebno je upoređivanje referentnog očitavanja napona od 3,3 volta koji dobijamo na referentnom A5 pinu. Daljim kalkulacijama i uz pomoć mapfloat() funkcije dobijamo tačan UV intenzitet. O BMP280 smo isto tako već pisali (SK 4/2017), pa je samo potrebno uneti odgovarajuću vrednost u zavisnosti od lokacije, a zarad tačne nadmorske visine. Na redu je prikazivanje na displeju. Redosled smo izdelili na devet delova i obrazac je sličan. if(millis()>vreme1+period){ vreme1=millis(); display.clearDisplay(); display.setTextSize(2); display.setCursor(0,0); display.println("DIY #1"); display.setTextSize(1); display.println("Meteo\nStation"); display.println("Svet\nkompjutera"); display.display(); } U ovom slučaju proveravamo da li je trenutno vreme (funkcija millis()) veće od deklarisanog vremena (vreme1) i perioda zajedno. Ako jeste, ispisujemo tekst dok vreme1 preuzima trenutno vreme od funkcije millis(). Isti princip važi za svaki naredni ispis, s tim što će biti u pitanju drugo deklarisano vreme i na taj način zadržavamo ispis na ekranu dok Mega u pozadini izvršava skeč bez zastajanja. Funkcijom buttonSwitch() proveravamo da li je došlo do pritiska tastera i menjamo state. Na taj način svakim pritiskom menjamo postojeće stanje, to jest, stanje se ne menja nakon prestanka pritiska tastera. Ovo je potrebno da bi relej dobio i zadržao svoju logičku nulu ili jedinicu, po potrebi, prostim pritiskom. O načinu funkcionisanja relej modula će u narednom periodu biti više reči.Na kraju su funkcije averageAnalogRead() i mapfolat(), koje koristimo za dobijanje ispravnih vrednosti UV senzora. Zaključak Meteorološka stanica je sa ovim gotova. U nekom vašem slučaju možete uzeti samo nekoliko senzora i neki manji Arduino i sve to spakovati u neku manju kutiju. Naravno, ova naša stanica se može i proširiti, ali i korigovati. Što se tiče kalibracije, razumljivo je da nemamo mogućnost da sve dobijene vrednosti proverimo i uporedimo sa referentnim. U većini slučajeva smo se oslonili na podatke koji se mogu naći na internetu. Ako bismo terali mak na konac, osim merača brzine i smera vetra, mogli smo dodati još senzor prašine i količine padavina. Govorimo o malo skupljim senzorima i njih smo ovaj put preskočili. Anemometar je već svojevrstan izazov i ako nam slobodno vreme dozvoli, napravićemo ga u DIY varijanti i makar dodati na forumu. Inače, za sva eventualna pitanja možete nam se obratiti putem foruma, a isto tako možete okačiti slike vaših projekata. Više fotografija naše izvedbe ovog projekta možete videti u odgovarajućoj galeriji na našem sajtu.Dejan PETROVIĆ | | |