![]() | ![]() |
![]() |
| ![]() |
| |||||||||||||||||||||||||
Elektronska čula u akciji
DHT11
# include <DHT_U.h> DHT senz1(4, DHT11); // pin prvog senzora DHT senz2(6, DHT11); // pin drugog senzora void setup() { Serial.begin(9600); senz1.begin(); // aktiviramo senzore senz2.begin(); Serial.println("Merenje temperature"); Serial.println("==================="); } void loop() { // ocitavanje temperature float t1 = senz1.readTemperature(); float t2 = senz2.readTemperature(); // ocitavanje relativne vlaznosti float rv1 = senz1.readHumidity(); float rv2 = senz2.readHumidity(); if ((isnan(t1)||isnan(rv1))||(isnan(t2)||isnan(rv2))) { Serial.println("Nepravilno ocitavanje podataka!"); } else { Serial.print("Temperatura: "); Serial.print((t1+t2)/2); Serial.print(" *C\t"); // ’\t’ je tabulator Serial.print("Relativna vlaznost: "); Serial.print((rv1+rv2)/2); Serial.print(" %\t"); // znak ’%’ Serial.println(); // na novi red delay(1000); } } Prvo dodajemo unifikovanu Adafruit DHT biblioteku (goo.gl/GEVGJy), koja pravi najmanje problema u radu sa ovom vrstom senzora. U sledeće dve linije inicijalizujemo dve instance klase DHT, pod nazivima senz1 i senz2. U oba slučaja prvi prosleđeni argument predstavlja digitalni pin Arduino uređaja preko koga ćemo primati informacije od senzora. Drugi argument precizira tip korišćenog senzora. Unutar bloka Setup(), prvo inicijalizujemo serijski monitor, a zatim aktiviramo rad sa oba senzora. Najvažniji deo koda je, kao i uvek, smešten u okviru bloka Loop(), gde na početku definišemo četiri varijable tipa float, kojima odmah dodeljujemo vrednosti putem metoda readTemperature() i readHumidity(). Putem funkcije isnan (is not a number), u okviru naredbe If ispitujemo da li su očitane vrednosti validni brojevi. Ukoliko neki od njih nije, ispisujemo poruku da podaci nisu pravilno očitani. Ako je sa brojevima sve u redu, prelazi se na deo koji ispisuje podatke preko serijskog monitora. Vrednosti temperature i relativne vlažnosti se konsekventno sabiraju i dele sa dva. DHT 22
Programski deo je skoro isti kao na modulu DHT11. #include <DHT_U.h> // Unifikovana biblioteka DHT senzor(3, DHT22); // treci data pin Arduina void setup() { Serial.begin(9600); senzor.begin(); Serial.println("Merenje temperature"); Serial.println("==================="); } void loop() { float temp = senzor.readTemperature(); float rv = senzor.readHumidity(); if (isnan(temp) || isnan(rv)) { Serial.println("Nepravilno ocitavanje podataka!"); } else { Serial.print("Temperatura = "); Serial.print(temp); Serial.print(" *C "); Serial.print("*** Rel. vlaznost = "); Serial.print(rv); Serial.println("%"); delay(2000); // pauza 2 sekunde } } Često se dešava da ovi senzori nakon priključivanja daju neprecizne podatke, pa je u pojedinim situacijama potrebno da prođe desetak minuta kako bi počeli da dobijaju stvarne vrednosti. Još jedna napomena koja se odnosi na module DHT11 i DHT22 – prilikom korišćenja napona od 3,3 volta, potrebno je koristiti što kraći kabl za napajanje. Specifikacija govori da je maksimalna dužina za DHT22 100 centimetara, dok je kod DHT11 do 25 centimetara. Pri napajanju od pet volti kod DHT11 žice mogu da budu dugačke do 30 metara, a kod DHT22 i do 100 metara. LM35 / TMP35
void setup() { Serial.begin(9600); pinMode(A0, INPUT); //A0 ima funkciju analognog ulaza analogReference(INTERNAL); // ref. napon je 1,1 V } void loop() { float tem = (analogRead(0) / 9.31); Serial.print("Trenutna temperatura = "); Serial.print(tem); Serial.print("*C"); Serial.println(); delay(1000); }
Prva naredba u bloku Loop() dodeljuje promenljivoj tem količnik jedne od 1024 ADC vrednosti i pomenutog broja 9,31. U slučaju da je vrednost ulaza analognog pina 0 jednaka nuli, temperatura će biti nula. U slučaju da ADC daje vrednost 100, temperatura će biti 10,74 stepena Celzijusa, dok će pri maksimalnoj vrednosti 1023 iznositi 109.88 stepeni Celzijusa. Dodatno je moguće unaprediti preciznost uvođenjem For..Next petlje koja, recimo, u roku od deset sekundi deset puta očitava vrednosti temperatura i zatim zbir tih vrednosti deli sa deset i dobija se temperatura filtrirana od eventualnog šuma. Imajte u vidu da nakon promene referentnog napona nekoliko narednih očitavanja ulaza analognog porta daje netačne rezultate. BME280 i BMP280
Za demonstraciju koristimo jednostavniji metod uz pomoć I2C interfejsa. Za to nam je potrebno da povežemo pinove SCL i SDA sa odgovarajućim pinovima na Arduinu. Oni koji su pratili prethodne nastavke znaju da se taj interfejs na modelu Arduino Uno R3 nalazi na dva mesta. Prvo mesto je na pinovima A4 i A5, dok se drugi I2C interfejs nalazi na kraju reda digitalnih pinova i nosi naziv TWI. Potrebno je da povežemo konektore na sledeći način: SDA <--> A4, SCL <--> A5 Kod korišćenja I2C interfejsa potencijalno postoji problem vezan za adresu uređaja. Pošto sama biblioteka ne poseduje funkciju kojom bi se ta adresa promenila, potrebno je u fajlu Adafruit_BMP280.h, u liniji koda #define BMP280_ADDRESS, promeniti 0x77 na 0x76. U broju SK 12/2016, kada smo govorili o upotrebi displeja povezanih putem I2C magistrale, prikazali smo mali program koji skenira adresni prostor tog interfejsa i pronalazi adrese uređaja, koje prikazuje u heksadecimalnom obliku. Alternativno je moguće koristiti biblioteku pod nazivom cactus_io_BME280_I2C, koju možemo preuzeti sa lokacije goo.gl/x8bLiU. Osim što omogućuje zadavanje adrese I2C uređaja, ona nudi još nekoliko dodatnih funkcija. Arduino skeč izgleda ovako: #include "Adafruit_BMP280.h" #include <Wire.h> //I2C biblioteka //#include "SPI.h" //ako koristimo SPI Adafruit_BMP280 bmp280; // koristimo I2C void setup() { //inicijalizujemo senzor if (!bmp280.begin()) { Serial.println("Uredjaj nije pronadjen"); while (1); //blokiraj rad Arduina do reseta } // ako je u redu, aktiviramo serijski monitor Serial.begin(9600); } void loop() { float atmprit = bmp280.readPressure();//pritisak (Pa) float tem = bmp280.readTemperature(); //temperatura //nivo mora float nadmvis = bmp280.readAltitude (1013.25); // prikazivanje informacija Serial.print(F("Atm. pritisak: ")); Serial.print(atmprit); Serial.print(" Pa"); Serial.print("\t"); //tabulacija Serial.print(("Temp: ")); Serial.print(tem); Serial.print(" *C"); Serial.print("\t"); Serial.print("Nadm. Visina: "); Serial.print(nadmvis); Serial.println(" m"); delay(2000); } Opet je pred nama jednostavan kod, kojeg ne treba nešto naročito komentarisati. Senzor inicijalizujemo naredbom bmp280.begin() i istovremeno putem petlje If..Then proveravamo da li je taj proces završen uspešno. Ako nije, ispisuje se poruka o grešci. To je znak da nešto nismo povezali kako treba ili je ukazana nepravilna adresa I2C uređaja. Zanimljiva je neobična komanda while (1), koju embedded programer koristi da bi obustavio rad sistema (petlja se neprekidno vrti u krug) do pojave reset signala. U okviru petlje loop(),koristeći pomenutu biblioteku funkcija, program poziva metode readPressure(), readTemperature() i bmp280.readAltitude() za dobijanje podataka o temperaturi, atmosferskom pritisku i nadmorskoj visini. Jedino ova poslednja stavka zaslužuje dodatno objašnjenje. Kao što samo ime govori, vazdušni pritisak je pritisak koji ostvaruje masa vazduha na površinu zemlje. On je najveći nad površinom mora, dok pri povećanju visine opada jer se vazduh razređuje. Standardni atmosferski (vazdušni) pritisak se definiše na 101325 Paskala (N/m2), odnosno 1013,25 milibara, odnosno 760 milimetara živinog stuba (jedan milimetar živinog stuba = 133,3 Paskala). Da bi se dobila tačna informacija o nadmorskoj visini, potrebno je poznavati podatke o takozvanom pritisku na nivou mora, koji se računa projekcijom pritiska sa neke lokacije na površinu mora. Problem je u tome što je taj podatak varijabilan i poseduju ga samo meteorološke službe. Uglavnom se saznaje putem medija. Pošto se pritisak menja sa promenom temperature i vlažnosti vazduha, menja se i taj podatak, pa odstupanja dovode do grešaka u merenju. Formula za računanje nadmorske visine preko atmosferskog pritiska izgleda ovako:
visina = 44330 * (1 – pow((p/p0), 0.190295) Prateća biblioteka će sama izračunati ove podatke, bez potrebe za intervencijom korisnika. Poznavanjem tačnih podataka je moguće dosta precizno odrediti na kojoj nadmorskoj visini se trenutno nalazimo. Ako koristimo SPI interfejs, prvo treba da skinemo oznaku komentara sa odgovarajuće direktive #include i, umesto koda za inicijalizaciju I2C interfejsa, dodati sledeće: //SPI Adafruit_BMP280 bmp280(10, 11, 12, 13); Već znamo da se pinovi sa navedenim brojevima digitalnih konektora odnose na hardverski SPI, tako da će shema povezivanja izgledati ovako:
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 |