====== Combined humidity-temperature sensor ====== //Vajalikud teadmised: [HW] [[et:hardware:homelab:digi]], [HW] [[et:hardware:homelab:combo]], [LIB] [[et:software:homelab:library:module:lcd_graphic]], \\ [LIB] [[et:software:homelab:library:module:sensor]]// ===== Teooria ===== [{{ :et:examples:sensor:am2302_pinout.jpg?180|DHT11}}] Temperatuuri ja niiskuse mõõtmiseks on olemas väga lai valik andureid, millest osa on ka kombineeritud andurid, mis väljastavad nii temperatuuri, kui ka niiskuse. Hinna poolest väga soodsad andurid on DHTxx seeria andurid, mille täpsus pole küll väga suur, kuid täiesti piisav tavakasutajale. Temperatuuriandureid toodetakse erineval tehnoloogial, millest termistoridest oli juttu ka eelmises peatükis. Lisaks termistor tüüpi temperatuurianduritele on olemas veel termopaarid, kiirguse kaudu temperatuuri mõõtvad andurid, metalltakistuse kaudu temperatuuri mõõtvad andurid, jne. Sõltumata anduri füüsikalisest mõõteprintsiibist on mitmetele anduritele ühte korpusesse koostatud ka juhtelektroonika, mis väljastab anduri lugemi digitaalse signaalina. Nagu eelpool mainitud on olemas kombineeritud andurid, mis lisaks temperatuurile mõõdavad veel mingit muud keskkonna parameetrit, millest kõige tüüpilisem on suhtelise niiskuse mõõtmine. Niiskus on sisuliselt vee osakaal õhus. Niiskuse erinev väärtus mõjutab seadmete tööd, korrosiooni ja elusorganismide talitlusvõimet ning elukeskkonda olulisel määral ja seetõttu on robottehnilistes seadmete oluline mõõta suhtelise niiskuse osakaalu õhus, et vastavalt sellele mingeid protsesse juhtida. Levinud niiskusanduri kasutusvaldkond on targa maja või targa kasvuhoone rakendused, kus vastavalt õhuniiskuse tasemele lülitatakse sisse konditsioneere, ventilaatoreid või niisutussüsteeme. Niiskusandurid toimivad jämedalt võttes kahel printsiibil, kus mõõtesuuruse elektriline teisendus toimub vastavalt mahtuvuse või takistuse kaudu. Mõlemal juhul teisendatakse õhu suhteline niiskus elektriliseks signaaliks, mis on sõltuvalt andurist, kas lihtne analoogsignaal (mingi pingevahemik) või mõne andmevahetusprotokolli digitaalsignaal. Levinud digitaalsignaali tüübid niiskuse ja temperatuuri anduritel on nn 1-juhtme (inglise keeles //1-wire//) signaal, kus andmevahetus toimub 1 füüsilise viigu kaudu. 1-juhtme andmevahetusprotokolli töötas välja Dallas Semiconductor lihtsamate seadmete ja anduritega suhtlemiseks. Lisaks mõlemasuunalisele andmevahetusele on võimalik ka seadme toide sama juhtme külge ühendada. Liides võimaldab ühele siinile ühendada üle 75 seadme, moodustades mikrokohtvõrke (inglise keeles //MicroLan//). MicroLan võrgus on üks juhtseade, mis juhib võrgus liiklust ja tagab, et siinil olevad seadmed ei üritaks korraga rääkida. [{{ :et:examples:sensor:1-wire_yhendus.png?380|1-juhtme tüüpi andurite võrguühendused}}] 1-juhtme ühendus on peamiselt kasutusel erinevate andurite ja mäludega suhtlemiseks. Saavutatav maksimaalne kiirus jääb 16,3 kbit/s piirimaile. Juhtseade alustab suhtlust taaskäivituse (inglise keeles //reset//) pulsiga, mis tõmbab siini maha vähemalt 480 µs. Peale seda järgneb 8 bitine korraldus, mida kuulavad kõik seadmed. Seade, millele see adresseeritud on, vastab. Andmeid saadetakse ja võetakse vastu 8 bitilistes gruppides, kus igal seadmel on unikaalne 64 bitine seerianumber. Bittide edastamine toimub pulsi pikkuse järgi. "1" saatmiseks tekitatakse pulss pikkusega 1 - 15 µs ja "0" saatmiseks 60 µs. ===== Praktika ===== Näiteks on toodud kaks erinevat temperatuuri/niiskuse andurit, mis kasutavad 1-juhtme andmevahetusliidest. 1-juhtme standardset andmevahetusliidest kasutab digitaalne termomeeter DS18S20, mille mõõdetav temperatuurivahemik on -55...+100 °C. DS18S20 temperatuurianduri saab ühendada tavalisse digitaalviiku, kus ühele siinile võib ühendada mitu andurit. Samuti tuleb valida anduri toiteviis, mis võib olla eraldi toiteviik või kasutatakse sama viiku, kuhu on ühendatud andmesidekanal. Andmesidekanaliga kokkuühendatud ühendusviisi kutsutakse parasiittoiteks ja sellisel juhul on kasutuses ainult kaks juhet. Robootika Kodulaboris on standardse 1-juhtme andmeside liidese kasutamiseks loodud eraldi teek //onewire.h//, mis sisaldab 1-juhtme siini juhtkäskusid. Andurispetsiifiline teek on //ds18x20.h//. DHTxx seeria andurite funktsionaalsus on integreeritud üldisesse andurite teeki //sensors.h//. Lisaks standard 1-juhtme protokollile on sarnastel omadustel põhinevad, kuid veidi erinevat toimeloogikat kasutatavad 1-juhtme siini andmevahetusprotokollid. Ühte sellist rakendatakse ka odavate kombineeritud niiskuse temperatuuriandurite DHTxx seeria juures. DHTxx andmesidepakett jaguneb järgmiselt: * Start bitt * niiskuse kõrgem bait * niiskuse madalam bait * temperatuuri kõrgem bait * temperatuuri madalam bait * CRC kontrollbait (eelnevate baitide summa madalaim bait) DHT11 anduril on temperatuuri ja niiskuse mõõtetulemus otseselt loetav kõrgemast baidist ning madalam bait on tühi. DHT22 anduril on temperatuuri ja niiskuse mõõtetulemus paketis 16 bitise arvuna ning ühe komakohaga, st tagastatud number 245 vastab temperatuurile 24,5 °C. [{{ :et:examples:sensor:dht_anduri_yhendus.png?250|DHTxx ühendamise skeem}}] Andmesiinil käib suhtlus avatud kollektor režiimis. See tähendab, et kõrge nivoo tuleneb siinile ühendatud //pullup// takistist ning andur ning mikrokontroller tekitavad andmebitte siini kordamööda madalale tõmmates. Start bitiks loetakse olukorda, kus kontroller tõmbab siini madalaks vähemalt 18 ms, ning pärast seda laseb kõrgeks tagasi. Pärast start biti saadab andur siinile vastuse biti ning mõõdetud tulemused. Andmete 0 ja 1 bitt on defineeritud biti kõrge osa laiusega. Bitt 0 on defineeritud kui 50 µs madal pulss, millele järgneb 26-28 µs kõrge pulss. Bitt 1 on defineeritud kui 50 µs madal pulss, millele järgneb 70 µs kõrge pulss. Andmepakett lõppeb 50 µs pikkuse madala pulsiga ning lõpuks laseb andur siini tagasi kõrgeks. Tarkvaraline realisatsioon on leitav teegi failist //sensors.c// funktsiooni //DHT_update// alt. Anduri lugemine on realiseeritud Kodulabori andurite teegis //sensors.h//. Käsuga //DHT_update()// uuendatakse kaht globaalset muutujat //dht_temp// (temperatuur) ja //dht_hum// (niiskus). Näitekoodis loetakse PORTE viiku 0 ühendatud andurit DHT11 ja PORTE viiku 1 ühendatud andurit DHT22. [{{:et:examples:sensor:dht_anduri_andmesignaal.png?580|DHTxx andmebitid}}] ~~CL~~ // Kodulabori DHT niiskus ja temperatuurianduri lugemise näidisprogramm // LCD-le kuvatakse temperatuur ja niiskus ning temperatuuri muutuse graafik #include #include #include #include #include // Andurite signaali ühendusviigu defineerimine pin DHTpin = PIN(E,0); // Põhiprogramm int main(void) { char text[60]; char i=0; // LCD ekraani algseadistamine lcd_gfx_init(); // Lõputu tsükkel while (1) { lcd_gfx_goto_char_xy(3, 0); lcd_gfx_write_string("DHTxx andur"); // DHTxx anduri näidu lugemine ja kuvamine LCD-l // DHT_update esimene parameeter on anduri tüüp (DHT11 või DHT22) DHT_update(DHT22,DHTpin); lcd_gfx_goto_char_xy(0,8); sprintf(text," Temperature: %2dC\n Humidity: %2d%%",dht_temp/10,dht_hum/10); lcd_gfx_write_string(text); // Temperatuuri graafiku joonistamine (toimib vaid kodulabor III generatsioonil) lcd_gfx_drawPixel(i++,100-(dht_temp/10)); sw_delay_ms(500); // Graafiku otsast alustamine, kui joon on lõppu jõudnud if (i>126) { i=0; lcd_gfx_clear(); } } }