Avtor: mag. Vladimir Mitrović
E-pošta: vmitrovic12@gmail.com
2020_282_47
Iz opisa modulov iz kompleta „37-in-1“, smo že spoznali dva s temperaturno odvisnim (NTC) uporom: KY-013 in KY-028. Prvi je navadni temperaturni senzor, ki temperaturo „pretvarja“ v enosmerno napetost na svojem izhodnem priključku; na drugem pa je dodan še primerjalnik (komparator), ki bo spremenil stanje na svojem izhodu pri neki določeni temperaturi okolice.
Oba modula omogočata merjenje temperature, če izhodno napetost s primernim algoritmom preračunamo v temperaturo. Na točnost takšnega merjenja vplivajo tako tolerance NTC uporov, kot tudi usklajenost algoritma s karakteristikami samega upora.
Če pa želimo bolj natančno izmeriti neko temperaturo, bomo v kompletu poiskali modul KY-001 ali KY-015. Prvi kot senzor uporablja integrirano vezje DS18B20, drugi pa DHT11, ki zna poleg temperature meriti tudi vlago. V tokratnem nadaljevanju bomo spoznali modul KY-001 in program, s pomočjo katerega lahko komuniciramo z vezjem DS18B20, mu izdamo ukaz za izvedbo meritve in ukaz, da nam pošlje rezultate meritev.
Ta vsebina je samo za naročnike
KY-001, Temperaturni senzor
Na modulu se nahaja integrirano vezje DS18B20, ki lahko meri temperaturo od -55°C do +125°C v 12-bitni ločljivosti. Točnost je znotraj ±0,5% za temperature med -10°C in +85°C DS18B20 je z mikrokontrolerjem povezan prek 1-bitnega vodila in skupne mase. Dovoljena napajalna napetost je od 3 do 5,5 V in posebna povezava za napajanje čipa, ki se sicer lahko uporabi, ni pa pogoj za njegovo delovanje, saj se sam čip lahko napaja tudi z vodila. V našem primeru je potrebno modul KY-001 tudi „čisto zares“ napajati, saj se na modulu nahajata tudi LED-ica s svojim preduporom. Poraba modula znaša 1-2 mA.
Za komunikacijo se uporablja 1-wire komunikacijski protokol, ki dovoljuje povezavo večjega števila 1-wire čipov na istem vodilu. Čipi se med sabo razlikujejo po tovarniško vpisani 64-bitni serijski številki, ki je sestavljena iz 8-bitne oznake čipa, enoličnega 48-bitnega naslova in 8-bitnega kontrolnega števila (CRC). Komunikacijo vzpostavi mikrokontroler z reset signalom, s čimer želi ugotoviti prisotnost 1-wire čipov na vodilu.
Nato mikrokontroler izda enega iz nabora ukazov, ki jih pozna in razume DS18B20 čip. Če je na vodilo priključenih več DS18B20 (ali drugih 1-wire) čipov, mora mikrokontroler najprej nasloviti čip, s katerim želi komunicirati, zatem pa mu izda ustrezen ukaz, npr. “začni pretvorbo temperature”. Pretvorba traja do 750 ms, čas pri posameznem čipu pa je odvisen od izbrane ločljivosti. Ko se ta čas izteče, mikrokontroler znova ustvari reset signal, naslovi isti čip in mu izda ukaz “preberi pomnilnik”, na katerega se čip odzove s pošiljanje vsebine svojega RAM pomnilnika, v katerem je zapisana izmerjena temperatura.
Vsekakor je za takšno komunikacijo ključnega pomena, da mikrokontroler pozna vse 64-bitne naslove čipov, ki so povezani na vodilo. Vse 1-wire komponente, vključno z DS18B20, poznajo ukaz “beri ROM”, na podlagi katerega mikrokontrolerju pošljejo svoj naslov. Vendar to deluje le v primeru, da se na vodilu v tistem trenutku nahaja le en čip; v nasprotnem primeru bi prišlo do prekrivanja v komunikaciji in nepredvidljivih dogajanj na vodilu. Prav zato so razvili postopek iskanja naslovov (ROM search) vseh 1-wire čipov na vodilu, s katerim je mogoče ugotoviti naslove vseh prisotnih čipov na vodilu, vendar pa je pri tem nemogoče ugotoviti, kateremu čipu pripada določen naslov.
Če je na 1-wire vodilo priključen en sam DS18B20 čip, je komunikacijski protokol bolj enostaven: po resetu mikrokontroler pošlje prvi ukaz oziroma obvestilo “preskočimo naslavljanje” in takoj zatem čipu pošlje želen ukaz.
Da bi našim bralcem olajšali uporabo DS18B20 in podobnih čipov iz družine DS1820, smo pripravili knjižnico DS18B20$SE.sub. V tej knjižnici se nahajajo ukazi s katerimi aktiviramo osnovne funkcije čipov, kličemo pa jih tako, kot bi šlo za „običajne“ Bascom-AVR ukaze
Knjižnica DS18B20$SE.su
Knjižnica DS18B20$SE.sub vsebuje nekaj globalnih spremenljivk in rutine (podprograme) za naslavljanje in komunikacijo s čipi iz družine DS1820, predvsem z DS18B20. Zato imajo vse spremenljivke in podprogrami predpono DS18B20$.
Ko v svoj program dodate knjižnico DS18B20$SE.sub, postane njegov sestavni del tudi integer spremenljivka Ds18b20$temp:
Dim Ds18b20$temp As Integer
V tej spremenljivki se nahaja rezultat zadnjega merjenja temperature in sicer v takšni obliki, v kakršni je zapisana s DS18B20 čipu. Poleg te spremenljivke podprogram dimenzionira še nekaj spremenljivk s predpono Ds18b20$$. Čeprav gre za globalne spremenljivke, so namenjene predvsem posameznim podprogramom iz knjižnice, jih ni priporočljivo uporabljati neposredno iz glavnega programa.
Opis ukazov iz te knjižnice:
Ukaz Ds18b20$read_address
Ds18b20$read_address par1
Parametri: | par1 | Ime polja spremenljivk (array), ki ga sestavlja 8 ili več posameznih elementov tipa byte |
Opomba: | Bere ROM pomnilnik DS18B20 čipa in zapiše v polje spremenljivk par1 njegovo 64-bitno enolično serijsko oznako. Ta podatek se uporablja za naslavljanje čipa. | |
Opombe: | Ukaz se bo lahko izvedel, kadar je na 1-wire vodilo priključena le ena 1-wire komponenta; v nasprotnem primeru na vodilu nastane prekrivanje in rezultati so popolnoma nepredvidljivi.
V primeru napake v komunikaciji in v primeru, da na 1-wire vodilo ni priključena niti ena DS18B20 komponenta, ta ukaz vrne postavljeno zastavico (bit) Err. |
Ukaz DS18b20$measure_temp
Ds18b20$measure_temp
Parametri: | Nima parametrov |
Opomba: | Sproži merjenje temperature brez naslavljanja čipa DS18B20. |
Opombe: | Ukaz se lahko izvede tudi takrat, ko je na 1-wire vodilo priključeno več DS18B20 čipov.
V primeru napake v komunikaciji in v primeru, da na 1-wire vodilo ni priključena niti ena DS18B20 komponenta, ta ukaz vrne postavljeno zastavico (bit) Err. |
Ukaz Ds18b20$read_temp
Ds18b20$read_temp
Parametri: | Brez parametrov |
Namen: | Zajame rezultat zadnjega merjenja temperature in ga shrani v globalno spremenljivko tipa integer z imenom DS18b20$temp. |
Opombe: | Ukaz se lahko izvede šele potem, ko je DS18B20 čip do kraja izvedel meritev, torej mora preteči vsaj 750 ms od izdaje ukaza Ds18b20$measure_temp.
Podatek v spremenljivki DS18b20$temp je prvotni obliki, popolnoma enak zapisu v RAM pomnilniku DS18B20 čipa. Ukaz se bo lahko izvedel, kadar je na 1-wire vodilo priključena le ena 1-wire komponenta; v nasprotnem primeru na vodilu nastane prekrivanje in rezultati so popolnoma nepredvidljivi. V primeru napake v komunikaciji in v primeru, da na 1-wire vodilo ni priključena niti ena DS18B20 komponenta, ta ukaz vrne postavljeno zastavico (bit) Err. |
Ukaz DS18b20$measure_temp_a
Ds18b20$measure_temp_a par1
Parametri: | par1 | Ime polja spremenljivk (array) v kateri se nahaja 64-bitni naslov DS18B20 čipa |
Namen: | Sproži merjenje temperature v naslovljenem DS18B20 čipu. | |
Opombe: | Če je na 1-wire vodilo priključenih več DS18B20 čipov, se bo odzval le naslovljeni čip.
V primeru napake v komunikaciji in v primeru, da na 1-wire vodilo ni priključena niti ena DS18B20 komponenta, ta ukaz vrne postavljeno zastavico (bit) Err. |
Ukaz Ds18b20$read_temp_a
Ds18b20$read_temp_a
Parametri: | par1 | Ime polja spremenljivk (array), v katerem je zapisan 64-bitni naslov DS18B20 čipa |
Namen: | Iz naslovljenega DS18B20 čipa pridobi rezultat zadnjega merjenja temperature in ga shrani v globalno spremenljivko Ds18b20$temp. | |
Opombe: | Ta ukaz se lahko izvede šele potem, ko naslovljeni DS18B20 čip zaključi z merjenjem, kar pomeni, da je treba po izdaji ukazov Ds18b20$measure_temp ali Ds18b20$measure_temp_a počakati z izdajo tega ukaza vsaj 750 ms.
Podatek v spremenljivki Ds18b20$temp je v prvotni obliki, torej popolnoma enak zapisu v RAM pomnilniku DS18B20. Če je na 1-wire vodilo priključenih več DS18B20 čipov, se bo odzval le naslovljeni čip. V primeru napake v komunikaciji in v primeru, da na 1-wire vodilo ni priključena niti ena DS18B20 komponenta, ta ukaz vrne postavljeno zastavico (bit) Err. |
Program 37 in 1_prog_9.bas
Ta program je napisan za preizkušanje delovanja KY-001 modula in ilustracijo uporabe ukazov iz DS18B20$SE.sub knjižnice. Modul je potrebno povezati na Arduino Uno tako, kot prikazuje shema na sliki 102b. S tipko S1 poženemo merjenje temperature in izpišemo rezultat meritve na emulatorju terminala. Delovanje programa lahko krmilimo tudi prek emulatorja terminala s pritiskom na tipke 1, 2 ali 3.
Na začetku programa moramo vključiti programsko knjižnico DS18B20$SE.sub:
$include "DS18B20$SE.sub"
S tem je v programu definirana spremenljivka DS18B20$temp, hkrati pa postanejo dostopni vsi ukazi iz te knjižnice. Sestavni del programa bodo postali le tisti ukazi, ki jih boste uporabljali.
Opombe: knjižnica uporablja nov način definiranja podprogramov (ConfigSubmode = New) zato je potrebno to upoštevati tudi v primerih, ko se v programu uporabljajo podprogrami iz kakšnih drugih knjižnic ali lastni podprogrami. Knjižnica podpira oba načina indeksiranja nizov, od 1 (Config Base = 1) in od 0 (Config Base = 1).
Zdaj moramo definirati še priključek na katerega je priključena tipka:
Config Arduino_pin#2 = Input Arduino_port#2 = 1
in priključek za 1-wire komunikacijo:
Config 1wire = Arduino_port#7
V glavni programski zanki program preverja, če je pritisnjena tipka S1 in če je morda prispel kakšen od ukazov z emulatorja terminala, potem pa izvede ustrezne podprograme. Ukaz “1” požene podprogram Ds18b20_measure_temp. Podprogram privzeto smatra, da je na 1-wire vodilu en sam DS18B20 čip, zato sproži merjenje temperature brez naslavljanja:
Ds18b20_measure_temp: Print "Temp = "; Ds18b20$measure_temp
Če ne pride do napake v komunikaciji, podprogram počaka 800 ms, da čip lahko v vsakem primeru do kraja izvede meritev, potem pa čipu izda ukaz za pošiljanje rezultata te meritve:
IfErr = 0 Then Waitms 800 Ds18b20$read_temp EndIf
Rezultat zadnje izvedene meritve se nahaja v spremenljivki Ds18b20$temp, ki je tipa integer. Zadnji štirje biti (Ds18b20$temp.3 -Ds18b20$temp.0) predstavljajo decimalna mesta, zato je potrebno rezultat pred prikazom ustrezno oblikovati. Najlažje bo za to uporabiti ukaz Fusing, ki je predviden za izpis spremenljivk tipa single. Zaradi tega bomo rezultat najprej naložili v pomožno single spremenljivko Temp_s in jo nato poslali emulatorju terminala:
IfErr = 0 Then Temp_s = Ds18b20$temp / 16 Print Fusing(temp_s , "#.#") ; "C"
Če je ugotovljena napaka v komunikaciji, se bo na emulatorju terminala izpisalo ustrezno sporočilo:
Else Print "DS1820?" EndIf Return
Izvajanje istega podprograma se ponavlja, dokler je pritisnjena tipka S1.
Ukaz “2” požene podprogram Ds18b20_read_address, ki prebere naslov, kar je pravzaprav tovarniško vpisana serijska številka DS18B20 čipa v ROM pomnilniku in jo izpiše na emulatorju terminala. Naslov čipa je shranjen v 8-bajtnem polju spremenljivk Ds1820_adr, ki je definiran na začetku programa:
Dim Ds1820_adr(8) As Byte ... Ds18b20_read_address: Ds18b20$read_address Ds1820_adr(_base)
Tu je spretno uporabljena Bascom-AVR konstanta _BASE, ki ji prevajalnik Bascom-AVR dodeli vrednost 0 ali 1, odvisno od izbranega načina indeksiranja nizov. Če je na primer izbrano standardni način indeksiranja od 1, bo ukazu DS18B20$read_address posredovan naslov prvega člena polja spremenljivk, to je Ds1820_adr(1). Če je izbrano indeksiranje od 0, bo ukazu zopet posredovan naslov prvega člena, kar bi bilo v tem primeru Ds1820_adr(0).
Če vmes ni prišlo do komunikacijske napake, bo podprogram na emulatorju terminala izpisal prebrani naslov:
Print "Addr = "; For I = 1 To 8 Print Hex(ds1820_adr(i)) ; Next Print Return
Tu smo kot privzeto vzeli standardno indeksiranje polj spremenljivk od 1, v nasprotnem primeru pa bi bilo potrebno spremeniti obseg za For-Next zanko na “0 to 7”.
Ukaz “3” sproži merjenje temperature na tistem DS18B20 čipu, katerega naslov je zapisan v polju spremenljivk Ds1820_adr(8). Podprogram Ds18b20_measure_temp_a je zelo podoben podprogramu Ds18b20_measure_temp, razen tega, da se za proženje merjenja in branja rezultatov uporabljajo ukazi s pripono _a:
Ds18b20_measure_temp_a: Ds18b20$measure_temp_a Ds1820_adr(1) IfErr = 0 Then Waitms 800 Ds18b20$read_temp_a Ds1820_adr(1) ... Return
Primer izpisa, ki ga program 37in1_prog_9.bas pošilja na emulator terminala je prikazan na sliki 102c. Vrstica “Addr =” je rezultat ukaza “2”, vrstica “Temp =” pa prikazuje rezultate ukaza “1” (temperatura raste, ker se je med merjenjem DS18B20 čip segreval zaradi držanja med prsti).
Opomba: datoteko Arduino_pins.sub z definicijami Arduino UNO priključkov, knjižnico DS18B20$SE.sub in program 37in1_prog_9.bas lahko dobite brezplačno v uredništvu revije Svet elektronike.
Barduino-22