Arduino: Senzori za rad sa vodom
Ovaj put ćemo se baviti senzorima koji na ovaj ili onaj način imaju vezu sa vodom, ali dobar deo njih funkcioniše i sa drugim tipovima fluida. Kao i uvek kada se radi o Arduinu, materija je zanimljiva, jednostavna i razumljiva svima, a potencijalno može da bude od velike koristi u praksi. Detekcija padavina Postoji više vrsta uređaja koji detektuju početak padavina, a njihova cena se kreće od nekoliko desetina centi pa do više hiljada dolara. Po načinu funkcionisanja te senzore možemo podeliti na: mehaničke, optičke, akustičke, rezistivne, kapacitativne i kompleksne. Kao i u mnoštvu drugih situacija, rezistivni (prate promenu otpora) senzori su najjeftinija varijanta, pa ćemo ih koristiti za naš konkretni primer. Naravno, pravilo o parama i muzici važi i ovde, pa tako ova vrsta senzora ima i svoje nedostatke i oni važe za nešto nepouzdaniju varijantu u odnosu na skupe modele. Tipičan problem predstavlja situacija kada površina senzora ostane mokra, a padavine u međuvremenu prestanu. Do nepreciznosti očitavanja može doći i u situacijama kada nakon kiše dođe do pada temperature, pa se površina senzora zaledi. Zato se kod skupljih modela ugrađuju grejači sa ulogom da suše površinu izloženu padavinama. Glavni deo senzora se sastoji od pločice koja je obično dimenzija četiri sa pet centimetara, sa dve nezavisne linije niklovanog provodnika koje su najčešće u obliku dva spregnuta češlja i koja definišu oblik sličan lavirintu. Postoje i brojni drugi načini da se definiše potrebni dezen, ali svi oni funkcionišu na istom principu. U slučaju suvog vremena, otpor na pločici je visok, što znači da će po formuli U=I*R napon biti viši. U slučaju padavina, otpor se smanjuje, a sa njime i napon. Da bismo odredili da li je prekoračen zadati prag merenja, koristimo integralno kolo koje se naziva komparator. Kao što se to može dokučiti iz naziva, njegova funkcija je da upoređuje nivo ulaznog signala sa referentnim naponom i u slučaju da prelazi zadati prag, izlazni pin će biti aktiviran. U konkretnom slučaju je korišćen komparator LM393, ali se mogu pronaći i pločice za čiju izradu su korišćeni čipovi LM193 i LM293. Nivo referentnog signala se podešava putem pratećeg potenciometra koji postaje niži ukoliko se okreće u smeru kazaljke na časovniku i obratno – prag se povećava okretanjem u smeru suprotnom od kretanja kazaljki. Na pločici se nalaze i dve SMD LE diode, od kojih jedna prikazuje da je modul priključen na struju, dok druga svetli u slučaju da je dostignut postavljeni prag osetljivosti očitavanja. void setup() { Serial.begin (9600); // brzina serijske veze pinMode (7 , INPUT); //pin D7 je ulaznog tipa } void loop() { //ispis vrednosti Serial.println (analogRead(A0)); Serial.println (digitalRead(7)); Serial.println ("-----"); delay(10000); // pauza 10 sekundi } S obzirom na to da je kod trivijalan, nećemo ga dodatno komentarisati. Samo ćemo da pomenemo da može još više da se uprosti izbacivanjem dela vezanog za očitavanje digitalnog pina. Osim toga, program je moguće proširiti sa nekoliko linija koje bi u zavisnosti od veličine analogne vrednosti davale tekstualnu informaciju o intenzitetu padavina (videti primer sa senzorom nivoa vode). Tako, na primer, ukoliko dobijemo vrednost veću od 1000, možemo ispisati da je vreme bez padavina. Sa vrednostima u opsegu 1000-500 bismo mogli reći da se radi o lakšoj kiši, dok bi vrednosti niže od toga predstavljale obilne padavine. Ovo je samo grubi primer, a preciznije vrednosti se dobijaju eksperimentalnim putem i zavise od vrste senzora, kao i uslova njegovog korišćenja. Senzor nivoa vode int izmereno; // vrednost sa analognog pina void setup() { Serial.begin(9600); // brzina prenosa podataka } void loop() { izmereno = analogRead(A0); //ocitavamo pin A0 if (izmereno<=450){ Serial.println("Nivo: 0mm"); } else if (izmereno>450 && izmereno<=605){ Serial.println("Nivo: 0-10mm"); } else if (izmereno>605 && izmereno<=660){ Serial.println("Nivo: 10-20mm"); } else if (izmereno>660 && izmereno<=680){ Serial.println("Nivo: 20-30mm"); } else if (izmereno>680){ Serial.println("Nivo: 30-40mm"); } delay(10000); // pauza izmedju merenja } Merenje popunjenosti rezervoara visina = dno – nivo Dno predstavlja udaljenost dna rezervoara od senzora, dok nivo reprezentuje distancu senzora od površine tečnosti. Poznajući dimenzije rezervoara, mogli bismo lako doći i do zapremine tečnosti u njemu. U slučaju pravougaonog oblika, po formuli: Volumen = sirina * duzina * visina a kod cilindričnog oblika to je volumen = poluprecnik2 * p * visina Sam senzor je vodootporan i može da izdrži pritisak do 30 bara, ali je prilikom merenja unutar tečnosti potrebno vrlo pažljivo izolovati sve kontakte. Pri tome je potrebno ostaviti nepokrivenim merni deo senzora (beli krug). To možemo postići korišćenjem voštanih materijala, termoplastičnog lepka ili omotavanjem sa vodootpornom trakom. Standardna podešavanja omogućavaju merenje dubine vode do deset metara, a u slučaju većih dubina (do 100 metara), potrebno je vršiti dodatnu kalibraciju u opsegu koji nameravamo meriti. Preciznost se računa na vrednost ispod jednog centimetra, a u slučaju kvalitetne kalibracije može doseći i do jednog milimetra. Opseg temperatura merenja iznosi od -40 do +85°C, ali je preciznost nešto veća za vrednosti do 40°C. Omogućeno je povezivanje preko I2C ili SPI interfejsa. Senzor vlažnosti tla (Higrometar) Ono čime Arduino platforma fascinira korisnike je lakoća dobijanja konačnih rezultata, pa je tako za procentualno računanje vlažnosti tla dovoljan sledeći kod: void setup() { Serial.begin(9600); } void loop() { int adc_vrednost = analogRead(A0); // ocitana vrednost float procenat = ( 100 – ( (adc_vrednost/1023.00) * 100 ) ); Serial.print("Vlaznost zemljista: "); Serial.print(procenat); Serial.println("%"); delay(5000); } U praksi na izlazu nikada ne dobijamo maksimalnu vrednost, odnosno nulu. Da bismo odredili koja je minimalna vrednost A/D konverzije za konkretni senzor, potrebno je da ga uronimo u vodu i da onda taj podatak koristimo za kalibraciju procenta vlažnosti zemlje. Moguće je definisati opsege koji određuju da li je tlo suvo, fertilno ili mokro: if (adc_vrednost > 700) {/*suvo*/} if (adc_vrednost < 700 && > 400) {/*fertilno*/} if (adc_vrednost < 400) {/*mokro*/} Jasno je da suvo tlo ne pogoduje normalnom rastu biljaka, ali je ista (ponekad i gora) situacija sa prekomerno mokrom zemljom koja dovodi do truljenja. Zato, u slučaju da senzor koristimo za automatsku kontrolu navodnjavanja, vrednosti više od 700 uključuju pumpu, dok se njen rad zaustavlja kada vlažnost dostigne vrednosti 400. Shema povezivanja je praktično jednaka onoj kod senzora za detekciju padavina, pa je nećemo ponavljati. Od nas se zahteva da analogni izlaz modula spojimo sa nekim od A/D ulaza Arduina, kao i da eventualno istu stvar odradimo sa digitalnim izlazom. Merenje protoka vode Još jedan od korisnih podataka u radu sa vodom se odnosi na merenje protoka tečnosti kroz cev. Uz Arduino se najčešće koristi modul pod nazivom YF-S201, koji se može nabaviti već po ceni od oko dva dolara, a tu je i varijanta YF-S201C, koja se prepoznaje po telu izrađenom od prozračne plastike. Njihove osnovne karakteristike podrazumevaju merenje protoka u opsegu od jedan do trideset litara u minuti sa pritiskom do 1,75 megapaskala, spoljnji prečnik ulazne cevi iznosi 0,5 inča (G1/2”), a radni napon se kreće u opsegu od pet pa do 24 volta sa potrošnjom struje do 15 miliampera. Moduli YF-S401, S402 i S403 imaju prečnik cevi G1/4”, protok 0,3-6 L/min, maksimalni hidraulički pritisak od 0,8 megapaskala i cenu od dva do tri dolara. Slični, ali i prilično skuplji, jesu moduli SEN-HZ21WA, dok module USN-HS06PA-1 karakterišu manje dimenzije, prečnik ulazne cevi od sedam milimetara, maksimalni pritisak 0,8 megapaskala i merenje protoka u opsegu 0,15 – 1,5 l/min sa preciznošću od jedan posto. Rade sa naponima u opsegu 3,6 – 26,4 volta, a cena im je oko pet dolara. Modul YF-G1 ima prečnik cevi od jedan inč, meri protok u opsegu 2 – 100 l/min, sa preciznošću od ±3% i može se naći za nešto više od deset dolara. Na ilustraciji koja prikazuje princip rada, vidimo da se na putu između ulazne i izlazne cevi nalazi mala plastična turbina koju pokreće mlaz vode i koja u jednom od svojih krilaca sadrži magnet. Iako je ovakav dizajn moguć, u konkretnom primeru modula YF-S201 magnet se nalazi u obliku prstena postavljenog na osovinu turbine, a aktivacija se postiže prilikom prolaska severnog pola magneta pored tela senzora. Što se tiče elektronike, ona je krajnje jednostavna i sastoji se od pločice na kojoj se nalazi senzor Honeywell 460S i jedan otpornik. Svi nabrojani modeli funkcionišu na principu Holovog efekta, koji u najkraćim crtama predstavlja pojavu napona na obodima tela kroz koje prolazi konstantna struja i to u trenutku kada ga izložimo delovanju magneta. Kada se magnet nađe u blizini senzora, on će uzrokovati pojavu izlaznog napona na signalnom pinu. Taj signal je u slučaju Arduina Uno potrebno dovesti do GPIO pinova D2 (INT0) ili D3 (INT1), pošto jedino oni imaju funkciju obrade eksternog prekida (interapta). Isti pinovi se koriste i kod drugih modela baziranih na čipu Atmega328 (Mini, Nano...), kod modela Due tu funkciju ima svaki digitalni pin, kod Zero svi digitalni pinovi osim D4, dok kod Mega2560 u obzir dolaze pinovi: 2, 3, 18, 19, 20 i 21. Što je protok vode veći, veći će biti broj ponavljanja tih signala prekida, pa ćemo na izlazu moći da proračunamo o kojim količinama se radi. Da vidimo kako to izgleda kada se pretoči u skeč: volatile int prekida; // broj signala sa senzora unsigned int lZaCas; // litara za cas unsigned long trenutno; // trenutno vreme unsigned long pocetak; // koristimo za poredjenje vremena void setup() { pinMode(2, INPUT_PULLUP); // ukljuci pull-up na pinu D2 Serial.begin(9600); attachInterrupt(0, prekid, RISING); // povezi prekid INT0 sa funkcijom prekid sei(); // omoguci prekid pocetak = millis(); // inicijalizujemo tajmer } void loop () { unsigned long trenutno = millis(); //uzmi vrednost tajmera if (trenutno >= (pocetak + 1000)) { // prosla 1 sekunda? //jeste, ispisi rezultate unsigned int lZaCas = (prekida * 60 / 7.5); // protok=(prekida x 60 min)/ 7.5 Serial.print(lZaCas, DEC); // ispisi vrednost Serial.println(" L/cas"); // zatim i tekst prekida = 0; // anuliraj broj prekida pocetak = millis(); // zapocinjemo novi ciklus merenja } } void prekid (){ // funkcija obrade prekida prekida++; // uvecaj brojac prekida za 1 } U bloku Setup() određujemo pin D2 za prijem prekida i istovremeno mu uključujemo pull-up otpornik. Funkcija attachInterrupt() prilikom prijema prekida na pinu D2 (0 označava INT0) u trenutku kada pin prelazi iz stanja logičke nule u jedinicu (RISING), poziva funkciju prekid() koja vrši povećanje vrednosti brojača prekida za 1. Pomoću sei() se postavljanjem fleg, a u registru SREG aktivira korišćenje prekida. Sledi inicijalizovanje tajmera na početne vrednosti. U okviru beskonačne petlje loop() na početku inicijalizujemo varijablu koja pokazuje trenutno vreme tajmera. Nakon toga, u okviru if naredbe ispitujemo da li je prošla jedna sekunda (1000 milisekundi) u odnosu na početak merenja. Ako jeste, prelazimo na deo za računanje protoka. Kod modula YF-S201 se protok vode u litrima na čas dobija množenjem broja generisanih prekida sa 60 (minuta) i deljenjem te vrednosti sa konstantom 7,5. Varijabla za brojanje prekida je tipa volatile int, što kompajleru govori da njenu vrednost ne drži u registru procesora, već da je smesti u SRAM. Ovo je obavezna praksa kada se radi sa prekidima. Za kraj teksta ćemo još spomenuti da prilikom izrade projekata namenjenih radu sa vodom često imamo potrebu za korišćenjem pumpi. Najjeftiniji modeli nemaju nikakvu oznaku na sebi, poznaju se po beloj plastici i koštaju oko 1,5 dolara. Po specifikaciji rade sa naponom od tri do šest volti, omogućuju protok do 100 litara na čas, imaju unutrašnji prečnik cevi od pet milimetara (0,2”) i maksimalni izbačaj na visinu 40 – 110 cm. Treba imati u vidu da je rok trajanja ovih uređaja ograničen na 500 radnih časova, mada to u praksi zna da bude i dosta kraće. Kvalitetnije pumpe se mogu nabaviti po ceni od pet do petnaest dolara. Igor S. RUŽIĆ |
| |||||||||||||||||||||||||||||
Home / Novi broj | Arhiva • Opšte teme | Internet | Test drive | Test run | PD kutak | CeDeteka | WWW vodič • Svet igara Svet kompjutera Copyright © 1984-2018. Politika a.d. • Redakcija | Kontakt | Saradnja | Oglasi | Pretplata • Help • English | |
SKWeb 3.22 |