Drugi modul, ki omogoča natančno merjenje temperature, je KY-015. V tem članku se bomo zato ukvarjali z njim, potem pa raziskali, kaj vse lahko pričakujemo od modula KY-013 z NTC uporom.
KY-015
Senzor temperature in vlažnosti (Temperature and Humidity Sensor Module, slika 103a)
Na modulu KY-015 se nahaja integrirano vezje DHT11, ki združuje senzor relativne vlažnosti in NTC upor v vlogi temperaturnega tipala, delovanje obeh pa upravlja 8-bitni mikrokontroler. Po specifikacijah proizvajalca je vsak DHT11 element tovarniško kalibriran, podatki so trajno zapisani v OTP pomnilnik mikrokontrolerja in jih uporablja algoritem za obdelavo izmerjenih vrednosti. Merilno območje za merjenje vlažnosti je od 20% – 90%, pri tem pa je točnost izmerjene vlage boljša od ± 5%, temperaturno merilno območje pa je od 0°C – 50°C s točnostjo izmerjene temperature boljšo od ± 2%.
Ta vsebina je samo za naročnike
- mikrokontroler pošlje na vodilo start signal, ki je negativni impulz, daljši od 18 ms;
- DHT11 odgovori z negativnim impulzom v trajanju 80 µs, potem pa začne pošiljati podatke;
- dolžina podatkov je 40 bitov, sestavljajo jih 16-bitna vlažnost (8 celoštevilčnih in 8 decimalnih mest) + 16-bitne temperature (8 celoštevilčnih in 8 decimalnih mest))+ 8 kontrolnih bitov;
- ko DHT11pošlje vse podatke, preklopi način delovanja v stanje spanja (sleep mode) v katerem ima zelo majhno porabo.
Binarne ničle in enke so pulzno-širinsko kodirane: “0” predstavlja negativni impulz dolžine 50 µs + pozitivni impulz trajanja 26-28 µs, logično “1” pa predstavlja negativni impulz trajanja 50 µs + pozitivni impulz trajanja 70 µs. Bascom-AVR nima predvidenega protokola za tako vrsto komunikacije, zato smo za naše bralce pripravili vse potrebne programske rutine in jih združili v programski knjižnici DHT11$SE.sub.
Knjižnica DHT11$SE.sub
V knjižnici DHT11$SE.sub se nahaja nekaj globalnih spremenljivk in podprogram DHT11$read, ki izvaja komunikacijski protokol in sprejema rezultate merjenja.
Ko DHT11$SE.sub knjižnico dodate svojemu programu, postanejo njegov sestavni del tudi naslednje spremenljivke:
Dim Dht11$h1 As Byte Dim Dht11$h2 As Byte Dim Dht11$t1 As Byte Dim Dht11$t2 As Byte
Prvi dve spremenljivki predstavljata celoštevilčni in decimalni del izmerjene vlažnosti, drugi dve pa celoštevilčni in decimalni del izmerjene temperature. Poleg omenjenih spremenljivk podprogram dimenzionira še nekaj drugih spremenljivk s predpono DHT11$$. Čeprav so tudi te spremenljivke globalne, so namenjene predvsem posameznim podprogramom iz knjižnice in jih ni priporočljivo uporabljati neposredno iz glavnega programa.
Knjižnica vsebuje le en ukaz, Dht11$read.
Ukaz Dht11$read
Dht11$read
Parametri: | Brez parametrov |
Funkcija: | Iz čipa DHT11 sprejema podatke o izvedenih meritvah i njih shranjuje v spremenljivke Dht11$h1, Dht11$h2, Dht11$t1 in Dht11$t2. |
Opombe: | V primeru napake v komunikaciji ali če vsebina kontrolnega registra (CRC) ni v skladu s sprejetimi podatki, ukaz postavi Err bit. |
Poleg tega ukaza se v knjižnici nahaja še nekaj podprogramov s predpono DHT$$. Te podprograme uporablja ukaz DHT$11read in jih ni priporočljivo uporabljati neposredno iz uporabniškega programa.
Program 37in1_prog_10.bas
Program je napisan za preverjanje delovanja KY-015 modula in ilustracijo uporabe knjižnice DHT11$SE.sub. Modul je treba povezati na Arduino Uno po shemi na sliki 103b. Program ciklično komunicira z modulom KY-015, sprejema podatke meritev iz DHT11 čipa, jih oblikuje in izpiše na emulatorju terminala. Tipka S1 je predvidena za nadgradnjo programa in se v tej različici ne uporablja.
Na začetku programa moramo vključiti programsko knjižnico DHT11$SE.sub:
$include "DHT11$SE.sub"
S tem so v programu definirane vse DHT11$ spremenljivke in ukaz Dht11$read postane dostopen. Opomba: Knjižnica uporablja nov način definiranja podprogramov (Config Submode = New), zato je treba to upoštevati, če se v programu uporabljajo podprogrami iz nekih drugih knjižnic ali lastni podprogrami.
Potem definiramo priključek mikrokontrolerja, ki ga bomo uporabljali za komunikacijo:
Dht11$in Alias Pind.6 Dht11$out Alias Portd.6
Zaradi omejitve pri pisanju podprogramov na tem nivoju smo morali isti priključek definirati dvakrat, kot izhodni in kot vhodni. Iz istega razloga ne moremo uporabljati alternativnih imen priključkov Arduino iz knjižnice Arduino_pins.sub, kot smo to lahko storili v ostalih programih. Po potrebi lahko priključek zamenjamo, vendar njegovega alternativnega imena ne smemo zamenjati, ker ga uporabljajo podprogrami iz knjižnice.
V glavni programski zanki program vsako sekundo in pol zbere podatke iz čipa DHT11
Do Waitms 1500 Dht11$read
in če ni bilo napak pri komunikaciji, izpiše izmerjeno vlažnost in temperaturo:
If Err = 0 Then Print "H = " ; Dht11$h1 ; "." ; Dht11$h2 ; "%" Print "t = " ; Dht11$t1 ; "." ; Dht11$t2 ; "C"
Če je ugotovljena napaka pri komunikaciji ali če CRC število ni ustrezno, bo program poslal obvestilo o napaki:
Else Print "DHT11 error!" End If Loop
Zelo enostavno, knjižnica je vse delo opravila sama!
Program 37in1_prog_11.bas
Če pa že imamo na razpolago kar dva modula s čipi za merjenje temperature, se spodobi, da ju med sabo primerjamo!
Modula KY-001 in KY-015 bomo z Arduino Uno ploščico povezali po shemi na sliki 104a. Potrebujemo še modul s tipko KY-004 (ali kakšno drugo tipko) in povezavo z osebnim računalnikom prek USB kabla, poleg tega pa seveda tudi ustrezni program, 37in1_prog_11.bas. Program uporablja obe knjižnici, DS18B20$SE.sub in DHT11$SE.sub, sestavljajo pa ga segmenti programov 37in1_prog_9.bas in 37in1_prog_10.bas.
Predvideni sta dve različici glavne programske zanke. V prvi se podprogram Measure_temp ciklično kliče vsakih 5 s
Do Wait 5 Gosub Measure_temp Loop
V drugi pa se isti podprogram izvede s pritiskom na tipko S1 ali s pošiljanjem ukaza “1” iz emulatorja terminala.
Do Debounce Arduino_pin#2 , 0 , Measure_temp , Sub Cmd = Inkey() If Cmd = "1" Then Gosub Measure_temp End If Loop
Podprogram Measure_temp združuje postopke komunikacije s čipi DS18B20 in DHT11 iz programa 37in1_prog_9.bas in 37in1_prog_10.bas, z nekoliko prilagojenim prikazom; rezultat programa je prikazan na sliki 104b.
Meritve se razlikujejo za približno 1°C, pri tem pa je opazno, da DS18B20 znatno hitreje reagira na temperaturne spremembe in bi morali biti, vsaj po podatkih iz tehnične dokumentacije, rezultati njegovih meritev nekoliko bolj točni od meritev z DHT11 čipom.
Kako izmeriti temperaturo z NTC uporom?
Ostane nam še en preizkus: primerjava meritev, ki jih dobimo z modulom KY-001, ki meri z DS18B20 čipom in KY-013 modulom z NTC uporom. Če želimo iz njega dobiti vse, kar zmore, se bomo okrog KY-013 modula morali malce potruditi! Shema na sliki 91a (Svet elektronike 277) prikazuje, da se na KY-013 modulu nahaja serijska vezava neznanega NTC upora in pull-up upora R1, z upornostjo 10 kΩ. Napetost izhodnega priključka je napetost na stiku teh dveh uporov in je odvisna od njunih vrednosti in napajalne napetosti. Pri temperaturi 25°C je bila izmerjena upornost NTC upora (približno) 10 kΩ, zato je razmerje vrednosti teh dveh uporov zelo blizu idealni vrednosti 1, zato bo izhodna napetost okrog 2,5 V (če je modul priključen na napajalno napetost 5 V). Ker je upornost NTC upora temperaturno odvisna, je tudi napetost na izhodnem priključku odvisna od temperature. Z merjenjem te napetosti z A/D pretvornikom mikrokontrolerja bomo dobili neko ADC vrednost med 0 in 1023. Če označimo upornost NTC upora pri temperaturi t kot Rt, bomo v programu lahko izračunali njegovo upornost s pomočjo formule 1.
Ta vrednost je funkcija temperature in v literaturi jo srečamo v dveh oblikah kot formuli:
- eksponentno enačbo, v kateri se pojavlja še temperaturni koeficient NTC upora, beta ali
- eksponentno Steinhart and Hart enačbo, v kateri se pojavljajo koeficienti A, B in C.
Kadar se srečamo z NTC uporom neznanih karakteristik, moramo te koeficiente določiti z merjenjem. V prvem primeru moramo merjenje upora Rt narediti na dveh, v drugem pa na treh enakomerno razporejenih temperaturah znotraj želenega merilnega območja. Tudi če bi imeli na voljo tehnično dokumentacijo NTC upora, je raztros vrednosti parametrov tolikšna, da je za vsako bolj točno merjenje priporočljivo vsak upor kalibrirati, kar seveda spet pomeni merjenje vrednosti upornosti pri dveh, oziroma treh temperaturah.
Ker je prva metoda bolj enostavna, jo bomo tudi mi uporabili. Sicer zagotavlja malo manjšo zanesljivost merjenja temperature, vendar bomo ugotovili, kakšno točnost lahko pričakujemo. V literaturi in na internetnih forumih so opisani postopki, s katerimi določamo dva začetna parametra: vrednost upornosti Rt pri temperaturi 25°C (to vrednost običajno označimo z R0), formula 2.
in vrednost parametra beta. Parameter beta se določa z merjenjem vrednosti upora Rt pri dveh med seboj dovolj “oddaljenih” temperaturah T1 in T2 in potem izračuna po formuli 3.
Temperaturi T1 in T2 se izražata v stopinjah Kelvina. Mi bomo splošno znane formule nekoliko spremenili in bomo namesto Rt raje izmerili razmerje Rt/R, tako na temperaturi 25°C, kot tudi pri vseh ostalih temperaturah, formula 4.
Izraz za izračun parametra beta je sedaj videti takole, formula 5.
Ko poznamo koeficient beta NTC upora in njegovo upornost R0 pri temperaturi T0 (T0 = 25°C = 298,15K), lahko temperaturo izračunamo z merjenjem upornosti NTC upora Rt, oziroma razmerja Rt/R1, formula 6.
Tudi tu so vse temperature v stopinjah Kelvina. Sedaj, ko poznamo osnove, lahko začnemo s pisanjem programa. Pravzaprav bomo napisali dva programa: s prvim bomo izmerili in izračunali osnovne parametre NTC upora na KY-013 modulu, potem pa bomo te vrednosti uporabili v drugem programu. V tem drugem programu bomo primerjali merjenja temperature z NTC uporom in našim etalonom, integriranim vezjem DS18B20.
Program 37in1_prog_12.bas
S tem programom določamo parametra R0/R1 in beta NTC upora z modula KY-013. Pri tem bomo potrebovali še natančni merilnik temperature, za kar bomo uporabili modul KY-001 z integriranim vezjem DS18B20 in tipko S1, samostojno ali tisto, ki je vgrajena na modulu KY-004. Vsi moduli se povežejo z Arduino Uno ploščico po shemi na sliki 105a. Če želimo doseči zanesljive rezultate, morata biti NTC upor in DS18B20 nameščena zelo blizu skupaj, še najbolje je, da se dotikata. To “merilno sondo” bomo povezali z Arduino Uno ploščico s kablom dolžine okrog 1 m, da jo bomo lahko enostavno postavili v prostore z različnimi temperaturami (na primer v zamrzovalnik ali v pečico).
Program v glavni programski zanki meri temperaturo z integriranim vezjem DS18B20, približno enkrat v sekundi:
Do Gosub Measure_temp ... Loop
Podprogram Measure_temp uporablja ukaze iz knjižnice DS18B20$SE.sub in je zelo podoben prej opisanemu; edina bistvena razlika je način izpisa temperature, ki ima sedaj tako obliko:
Measure_temp: Print Chr(13) ; "t = "; ... Print Fusing(temp_1 , "#.#") ; "C " ; ... Return
Znak Chr(13) je kontrolni znak CR (Carriage Return) in ta povzroči, da se izpis začne na začetku tekoče vrstice. Znak “;” na kraju drugega Print ukaza preprečuje pošiljanje kontrolnega znaka LF (Line Feed), ki bi povzročil premik na začetek naslednje vrstice. S to spremembo smo dosegli, da se izpis temperature ponavlja v isti vrstici emulatorja terminala, kar povzroči, da se izmerjeni podatki na zaslonu ne premikajo in s tem ne odvračajo pozornosti (slika 105b, segment 1).
Merjenje napetosti na NTC uporu lahko poženemo na dva načina: s pritiskom na tipko S1 ali s pošiljanjem ukaza “1” iz emulatorja terminala:
Do ... Debounce Arduino_pin#2 , 0 , Measure , Sub Cmd = Inkey() If Cmd = "1" Then Gosub Measure End If Loop
V podprogramu Measure bomo izmerili napetost na izhodnem priključku modula KY-013 z A/D pretvornikom (ADC), ga preračunali v razmerje Rt/R1 in potem te vrednosti prikazali v emulatorju terminala (slika 105b, segment 2). Zelo je pomembno, da to prvo merjenje izvedemo pri temperaturi točno 25°C; to bomo najlažje dosegli, če merilno sondo pokrijemo z dlanjo v obliki polkrogle in počakamo, da temperatura počasi naraste do 25°C. Merjenje je treba ponoviti pri temperaturi, ki je dovolj različna od 25°C: v segmentih 3 in 4 slike 105b je sonda najprej postavljena v zamrzovalnik, potem pa v rahlo segreto pečico. V obeh primerih je treba paziti, da se sonda ne dotika okoliških predmetov (da je nameščena prosto v zraku), poleg tega pa je potrebno čakati dovolj dolgo, da se temperatura stabilizira in šele potem začeti z merjenjem. V teh naslednjih merjenjih (v vseh, razen prvega) dobi program dovolj podatkov, da lahko izračuna parameter beta in ga nato tudi prikaže v emulatorju terminala.
Merjenje je priporočljivo nekajkrat ponoviti in vzeti srednje vrednosti parametrov Rt/R1 in beta. Mi smo to izvedli z enim samim merjenjem in dobili izmerjene vrednosti parametrov NTC upora na našem KY-013 modulu
R0/R1 = 1.0501 in beta = 3884.1
Program 37in1_prog_13.bas
Program 37in1_prog_13 uporablja izmerjene parametre NTC upora, s katerimi lahko potem izmerjeno napetost na NTC uporu z uporabo formule 7.
Preračuna v temperaturo in jo zatem prikaže na emulatorju terminala. Program ciklično meri temperaturo s pomočjo čipa DS18B20 in jo prikazuje na nepremičnem izpisu s prej opisano tehniko programiranja. S pritiskom na tipko S1 ali pošiljanjem ukaza “1” iz emulatorja terminala se izvede klic podprograma Measure. V njem se prebere vrednost A/D pretvornika, preračuna v razmerje Rt/R1 in se s primerjavo razmerja R0/R1 in vrednostjo beta parametra izračuna trenutna temperatura. Da bi lahko naredili ta izračun, je v program treba prenesti vrednosti parametrov, ki smo jih dobili s programom37in1_prog_12.bas; ti dve vrednosti vpišemo kot konstanti na začetku programa in v našem primeru imata take vrednosti:
Const Beta = 3884.1 Const R0r1 = 1.0501
Točnost meritev je bila preverjena z nameščanjem merilne sonde v prostore z različnimi temperaturami. V vseh primerih je bilo potrebno počakati, da se je temperatura, ki jo meri DS18B20 čip, stabilizirala in se je šele zatem izvedla meritev temperature z NTC uporom. Rezultati merjenja so prikazani na sliki 105c.
Opažamo, da se meritve v temperaturnem območju od -12°C do 35°C zelo dobro ujemajo; odstopanja niso večja od 1°C. Pri temperaturah nad 35°C se začnejo odčitki vse bolj razlikovati in pri temperaturi 63°C je odstopanje že okoli 3°C (najbrž bi se zgodilo isto, tudi če bi meritve izvajali pri temperaturah, znatno nižjih od -12°C). Za ta pojav obstajata dva razloga:
- parametri NTC upora so izmerjeni pri temperaturah -14°C in 25°C, zato smo lahko pričakovali, da bodo odstopanja pri teh temperaturah najmanjša; izkazalo se je, da je dobro “pokrito” tudi celotno področje med tema dvema mejnima temperaturama;
- upornost NTC upora je pri višjih temperaturah znatno manjša od upornosti pri 25°C, krivulja odvisnosti upornosti (in seveda tudi izhodne napetosti) od temperature je skoraj horizontalna, kar pomeni, da je potrebna večja sprememba temperature, da lahko zaznamo merljivo spremembo napetosti, ločljivost A/D pretvornika mikrokontrolerja v tem področju pa je premajhna, da bi lahko natančno izmerili nastale spremembe.
Kljub navedenim pomanjkljivostim pa se je točnost merjenja temperature z NTC uporom pokazala kot popolnoma zadovoljiva v razmeroma širokem temperaturnem razponu.
Opombe: Tu so programi predstavljeni zelo površno; za popolno razumevanje je potrebno dobiti na vpogled in proučiti celotne programe. Datoteko Arduino_pins.sub z definicijami Arduino UNO priključkov, knjižnici DS18B20$SE.sub in DHT11$SE.sub ter omenjeneprograme37in1_prog_10.bas,37in1_prog_11.bas, 37in1_prog_12.bas in 37in1_prog_13.bas lahko dobitebrezplačno v uredništvu revije Svet elektronike.
Opomba uredništva: pričujoči članek bi moral biti 23. po vrsti v seriji Barduino, vendar je zaradi napake objavljen kot 24. po vrsti. Bralcem in avtorju se za napako iskreno opravičujemo.
Avtor: mag. Vladimir Mitrović
E-pošta: vmitrovic12@gmail.com
2020_285_46
Barduino-24