Avtor: Mladen Čempuh
e-mail: cempuh.mladen@gmail.com
V tem članku bo opisana uporaba DS1820 in DS18B20 digitalnih temperaturnih senzorjev z uporabo priloženih Bascom-AVR programskih knjižnic za podporo navedenih senzorjev.
Za senzor tipa DS1820 je narejena knjižnica „ds1820.inc“ , za senzor DS18B20 pa je narejena knjižnica „ds18b20.inc“. Obe knjižnici podpirata samo en DS1820 ali DS18B20 senzor na izbranem priključku za 1-Wire komunikacijo mikrokontrolerja.
Digitalna temperaturna senzorja DS1820 in DS18B20 se izdeluje v nekaj vrstah ohišja, najpogosteje se uporablja v ohišju TO-92 za merjenje npr. temperature zraka, in v paličastem ohišju s kablom (glej sliko 1).
Ta vsebina je samo za naročnike
Paličasto ohišje se izdeluje tudi v vodoodporni opciji, tako da je primerno za merjenje temperature vode in podobnih neagresivnih tekočin. Maksimalni temperaturni delovni obseg senzorjev je od -55°C do +125°C, za področje od -10°C do +85°C imajo originalni senzorji tovarniško deklarirano točnost +/- 0,5°C ali bolje. Na žalost, poceni temperaturni senzorji te vrste, ki sem jih nabavil od kitajskih internetnih dobaviteljev (in niso originalni od proizvajalca Dallas Semiconductor, danes je to Analog Devices) pogosto v navedenem temperaturnem obsegu ne ustrezajo navedenim tovarniškim mejam točnosti. Izjema je DS18B20 senzor, ki se prodaja v paličastem vodoodpornem ohišju pod oznako DFR0198 proizvajalca DF Robot, ki zanesljivo ustreza tovarniško deklarirani točnosti +/- 0,5°C (je tovarniško kalibriran), vendar ima ta senzor znatno višjo ceno.
Da bi lahko uporabljali tudi bistveno cenejše in v praksi manj točne DS1820 in DS18B20 senzorje z doseganjem točnosti do +/- 0,5°C v nekem ožjem merilnem področju, so priloženi primeri programov za t.i. offset temperaturno kalibracijo teh senzorjev. Offset temperaturna kalibracija izboljša točnost tudi originalnih senzorjev v ožjem temperaturnem področju okoli izbrane temperature, za katero je ta kalibracija narejena. Priložena je tudi knjižnica „calibrate_ds.inc“ , ki omogoča offset temperaturno kalibracijo v eni točki izbrani po želji uporabnika, kalibracijske podatke pa shrani v interni EEPROM mikrokontrolerja. Tako v primeru, da bi bilo potrebno zamenjati senzor, ni potrebno ponovno reprogramiranje mikrokontrolerja.
DS1820 in DS18B20 za prenos podatkov uporabljata 1-Wire komunikacijo z mikrokontrolerjem. Pri tem uporabnik po želji izbere I/O priključek mikrokontrolerja za 1-Wire komunikacijo, ki se veže s priključkom Data na senzorju. Med izbrani 1-Wire I/O priključek mikrokontrolerja in VCC (pozitivni pol napajanja) je potrebno vezati pull-up upor priporočene vrednosti 4,7 kΩ.
Navedena senzorja se lahko napajata tudi preko 1-Wire linije, ko je ta linija v stanju logične enice (t.i. parazitno napajanje), pri čemer je takrat pozitivni pol napajanja senzorjev potrebno vezati na maso GND. Tako sta za povezavo senzorjev z mikrokontrolerjem potrebni samo dve liniji (GND in Data). Vendar zaradi bolj zanesljivega dela senzorjev priporočam aktivno napajanje senzorjev, tako da se njegov pozitivni pol napajanja veže na VCC priključek napajanja mikrokontrolerja. DS1820 in DS18B20 senzorja imata interni 64 bitni (8 bajtni) ROM. Najnižji bajt ROM-a vsebuje podatek o vrsti senzorjev, to je 10H (heksadecimalno) za DS1820 ali 28H za DS18B20.
Naslednjih 6 bajtov ROM-a je enkratna identifikacijska številka tega senzorja. Najvišji bajt ROM-a vsebuje CRC 8 bitni podatek (eng. Cyclic Redunancy Check), kot rezultat CRC izračuna vsebino preostalih nižjih 7 bajtov ROM-a. S pomočjo tega CRC podatka mikrokontroler preverja pravilnost prenosa podatkov iz DS1820 ali DS18B20 ROM spomina. Glede na to, da priloženi knjižnici podpirata delo samo z enim DS1820 ali DS18B20 senzorjem na 1-Wire priključku mikrokontrolerja, identifikacija senzorja ni potrebna. Zato ta knjižnica preskoči identifikacijo senzorja, ko preko 1-Wire vodila pošlje heksadecimalni ukaz &HCC, s katerim preskoči branje ROM spomina. DS1820 ali DS18B20 senzor ima 9 bajtni blok za vpis in branje podatkov njegovega internega RAM/EEPROM spomina angl. Scratchpad.
Najnižja dva bajta sta RAM bajta TL in TH, ki vsebujeta podatek o izmerjeni temperaturi. Nekatere lokacije iz Scratchpad spomina so vrste RAM, nekatere so vrste EEPROM. Za boljše razumevanje so priložene PDF datoteke za DS1820 in za DS18B20. Pri branju podatkov iz Scratchpad spomina najvišji 9. bajt vsebuje CRC podatek, izračuna CRC vrednosti spodnjih 8 bajtov Scratchpad spomina, s čemer je omogočeno preverjanje pravilnosti branja vsebine Scratchpad spomina. Čeprav ima Bascom-AVR ukaz CRC8 za izračunavanje CRC 8 bitnega podatka za namen preverjanja pravilnosti prenosa podatkov, zaradi hitrosti izračuna tega podatka knjižnici „ds1820.inc“ in „ds18b20.inc“ uporabljata podatkovno 256 bajtno tabelo za hitro določanje vrednosti CRC8 podatka. To je tabela „crc8.inc“, ki jo je potrebno z ukazom $include vključiti v uporabniški program za ukazom End.
Uporaba DS1820 senzorja
Za uporabo DS1820 senzorja je potrebno v uporabniški program z ukazom $include vključiti programsko knjižnico „ds1820.inc“
$include „ds1820.inc“
Senzor DS1820 izmerjeno temperaturo pretvarja v 9 bitni digitalni podatek. To za merilni obseg senzorja od -55°C do +125°C daje resolucijo branja 0,5°C. Priložena knjižnica „ds1820.inc“ z uporabo podatkov iz Scratchpad lokacija TL, TH , COUNT REMAIN in COUNT PER °C (glej priloženi PDF za DS1820) izvrši izračun temperature s povečano točnostjo s čemer resolucija branja znaša 0,1°C. Tipičen čas trajanja konverzije temperature v digitalni podatek znaša okoli 200ms, maksimalen čas konverzije je do 500ms.
Za zagon konverzije temperature in izračun vrednosti izmerjene temperature se uporabi ukaz Ds1820, ki se vpisuje najpogosteje znotraj Do … Loop zanke.
Primer:
Do
Ds1820
…………..
…………..
Loop
End
$include „crc8.inc“
Ukaz Ds1820 zažene konverzijo temperature, čaka 550ms na zanesljiv zaključek konverzije temperature, preverja CRC korektnost prebranih podatkov iz senzorja DS1820 s pomočjo tabelarnih podatkov v datoteki „crc8.inc“ in če je CRC preverjanje podatkov pravilno, postavlja bajt spremenljivko Crc v stanje 0, in izračuna vrednost izmerjene temperature s povečano natančnostjo, izračunano vrednost temperature vpisuje v Single spremenljivko Temperature_ds.
Ukaz Ds1820 se uporablja najpogosteje znotraj Do-Loop zanke. Če je Crc = 0, takrat so podatki pravilno prebrani in lahko se uporabi podatek o temperaturi, vpisan v Single spremenljivko Temperature_ds. Vse te spremenljivke so dimenzionirane znotraj knjižnice „ds1820.inc“. Za zaokrožitev vrednosti temperature na želeno število decimalk se uporablja Bascom-AVR ukaz Fusing.
Če je po izvršitvi ukaza Ds1820 Bascom-AVR interna bit spremenljivka Err za oznako napake postavljena v 1 to pomeni, da 1-Wire komunikacija ni našla temperaturnega senzorja DS1820. Za uporabo DS1820 senzorja sta priložena dva Bascom-AVR programska primera.
Eden je program „Temperature DS1820.bas“, ki ne uporablja knjižnice „calibrate_ds.inc“, in program „Temperature DS1820 calibrate.bas“, ki uporablja „calibrate_ds.inc“ in kalibracijske podatke offset temperaturne kalibracije shrani v interni EEPROM mikrokontrolerja.
Več o offset temperaturni kalibraciji senzorjev je navedeno v delu članka: Offset kalibracija temperature DS1820 in DS18B20 senzorjev. Priloženi primeri za prikaz temperature uporabljajo LCD 1602 ali 2004 v 4 bitnem načinu dela.
Config Lcd = 16 * 2 ‚ LCD 1602
‚Config Lcd = 20 * 4 ‚ ili LCD 2004
Config Lcdpin = Pin , Db4 = PORTC.3 , Db5
= PORTC.2 , Db6 = PORTB.5 , Db7 = PORTB.4 ,
Rs = PORTC.5 , E = PORTC.4
Cls
Cursor Off
Backlight Alias PORTB.3
‚Config Backlight = Output
Backlight = 1 ‚ osvetlitev LCD-ja
Po potrebi redefiniraj postavke LCD-ja.
Uporaba DS18B20 senzorja
Za uporabo DS18B20 senzorja je potrebno v uporabniški program z ukazom $include vključiti knjižnico „ds18b20.inc“
$include „ds18b20.inc“
Senzor DS18B20 omogoča pretvorbo izmerjene temperature v 9, 10, 11 ali 12 bitni digitalni podatek, odvisno od postavk v konfiguracijskem registru (ang. Configuration register) v Scratchpad spominu. Knjižnica „ds18b20.inc“ uporablja 12 bitno pretvorbo izmerjene temperature. Tako se za delovno področje senzorja od -55°C do +125°C dobi 0,0625°C resolucija branja temperature. To je hkrati tudi njegova največja prednost glede na predhodno opisan tip senzorja DS1820.
Zaradi 12 bitne pretvorbe temperature je potreben daljši čas pretvorbe glede na senzor DS1820 in znaša maksimalno 750ms. Iz knjižnice „ds18b20.inc“ se uporablja ukaz Ds18b20 najpogosteje znotraj Do … Loop zanke uporabniškega programa. Ta zažene 12 bitno konverzijo izmerjene temperature, čaka 800ms za zanesljiv zaključek konverzije, preverja CRC prebranih podatkov iz Scratchpad spomina s pomočjo datoteke „crc8.inc“ in če so podatki pravilno prebrani, postavi bajtno spremenljivko Crc v 0, izračuna podatek temperature in ga vpiše v Single spremenljivko Temperature_ds.
Če senzor DS18B20 ni najden na 1-Wire priključku mikrokontrolerja, se postavi interna Bascom-AVR bit spremenljivka Err v stanje 1 za oznako napake senzorjev. Za uporabo senzorja DS18B20 sta prav tako priložena dva Bascom-AVR programska primera, „Temperature DS18B20.bas“, ki ne uporablja knjižnice „calibrate_ds.inc“ in „Temperature DS18B20 calibrate.bas“, ki jo uporablja. Primeri uporabljajo LCD 1602 ali 2004 v 4 bitnem načinu dela enako kot tudi v primerih za DS1820. Po potrebi redefinirajte postavke LCD-ja.
Shema mikrokontrolerskega vezja za priložene Bascom-AVR primere programov
V shemi na sliki 2 se uporablja mikrokontroler ATmega328 ali 328P, lahko se uporabi tudi ATmega8 ali 8A. Prav tako se lahko uporabi Arduino Uno ali Nano. Reset tipka ni obvezna. Priloženi programski primeri so predvideni za delovni takt 16MHz, kjer se uporablja zunanji kvarčni kristal in dva keramična kondenzatorja vrednosti 22pF. V kolikor se s fuse biti postavi delo mikrokontrolerja na interni kalibriran oscilator z delovnim taktom 8MHz, se 16 MHz kvarc in 22 pF kondenzatorja izpustijo. Preko izbranega Backlight = PB.3 izhoda in Mosfet tranzistorja BS170 se vklopi/izklopi osvetlitev ozadja LCD-ja. S trimer potenciometrom 10 kΩ se nastavi kontrast na LCD-ju. Lahko se uporabi dvovrstični LCD1602 ali npr. štirivrstični LCD2004. Senzor DS1820 ali DS18B20 se priklopi na izbrani 1-Wire priključek PD.5 mikrokontrolerja. Po potrebi se lahko izbere neki drugi I/O priključek. Obvezna je vgradnja pull-up upora 4,7 kΩ med izbranim 1-Wire priključkom in VCC. Za primere programov, ki uporabljajo programsko knjižnico „calibrate_ds.inc“ je obvezna vgradnja treh tipk s programskimi imeni Up$, Down$ in Enter$. Vezje se napaja iz 5V stabiliziranega izvora napajanja.
Offset kalibracija temperature DS1820 in DS18B20 senzorjev
Offset kalibracija temperature je popravek izmerjene in izračunane vrednosti temperature v Single spremenljivki Temperature_ds z algebrskim prištevanjem neke offset vrednosti tej spremenljivki. Offset vrednost predstavlja razliko med temperaturo izmerjeno z etalonskim termometrom in temperaturo izmerjeno z DS1820/18B20 senzorjem pri neki izbrani referenčni temperaturi.
DS1820/18B20 senzor in sonda etalonskega termometra morajo biti dovolj časa v čim boljšem medsebojnem kontaktu da bi bili sigurni da sta DS1820/18B20 senzor in sonda etalonskega termometra na isti temperaturi. Referenčno temperaturo za offset kalibracijo določa uporabnik tako, da izbere tisto temperaturo, na kateri mu je najbolj pomembno, da ima najboljšo točnost merjenja. Tako npr. za merjenje sobne temperature lahko izbere referenčno vrednost iz področja od 20°C do 25°C.Pri izbrani temperaturi Tref (°C) :
Offset vrednost = T etalona (°C) – TDS (°C)
Prvi način Offset kalibracije DS1820/18B20 senzorja je brez uporabe knjižnice „calibrate_ds.inc“. Za ta način kalibracije je priložen program „Temperature DS1820.bas“ za DS1820 senzor in program „Temperature DS18B20.bas“ za DS18B20 senzor. V uporabniškem programu je potrebno dimenzionirati Single spremenljivko Offset_ds. Z meritvijo vrednosti temperature etalonskega termometra in temperature DS1820/18B20 senzorjev je potrebno po formuli izračunati offset vrednost, ki se v program vpiše v spremenljivko Offset_ds.
Dim Offset_ds As Single
Offset_ds = 0.35
‚ izračunana offset vrednost
Po ukazu Ds1820 ali Ds18b20 (glede na senzor) je v Do … Loop zanki spremenljivki Temperature_ds prišteti vrednost spremenljivke Offset_ds.
Do
Ds1820 ‚ ukaz za senzor DS1820
‚ Ds18b20 ‚ ali ukaz za senzor DS18B20
Temperature_ds = Temperature_ds + Offset_ds
…………..
…………..
Loop
End
$include „crc8.inc“
Pomanjkljivost tega prvega načina offset temperaturne kalibracije je to, da se pri zamenjavi DS1820/18B20 senzorjev in določanju nove Offset vrednosti za ta novi senzor mora v uporabniški program v spremenljivko Offset_ds vpisati ta nova offset vrednost in mikrokontroler je potrebno ponovno reprogramirati po prevajanju, kar za uporabnika naprave ni praktično.
Da pri zamenjavi DS1820/18B20 senzorjev z novim senzorjem iste vrste mikrokontrolerja ne bi bilo potrebno ponovno reprogramirati, predlagam drugi način offset temperaturne kalibracije, to je z uporabo knjižnice „calibrate_ds.inc“.
Ta knjižnica se uporablja za kalibracijo temperature prebrane s senzorjev temperature DS1820 ali DS18B20. Podprto je delo samo z enim temperaturnim senzorjem te vrste. V uporabniškem programu je potrebno definirati vhode za tipke Up$ , Down$ in Enter$. Za delo s senzorjem se uporablja knjižnica „ds1820.inc“ ali „ds18b20.inc“ odvisno od vrste senzorja, ki se uporablja. Za to knjižnico je v uporabniški program potrebno vključiti knjižico „calibrate_ds.inc“. V uporabniškem programu je potrebno konfigurirati priključek za 1-Wire komunikacijo. Prav tako je potrebno definirati tudi delo z LCD-jem bodisi v 4 bitnem ali serijskem I2C načinu dela. Knjižica „calibrate_ds.inc“ je prilagojena delu z dvovrstičnim 1602 LCD-jem, lahko pa se uporabi tudi večji npr. LCD2004.
V uporabniškem programu je pred Do-Loop zanko potrebno definirati pogoj, ki se po resetu mikrokontrolerja izpolni, da se izvrši ukaz Calibrate_ds .
If Pogoj = izpolnjen Then
Calibrate_ds
End if
Do
……
……
Loop
Ukaz Calibrate_ds omogoča vpis offseta temperaturne vrednosti v spremenljivko Offset_ds na dve decimalki. Vrednost Offset_ds spremenljivke se nastavlja s tipkama Up$ in Down$ na dve decimalki v obsegu od -2,99°C do +2,99°C , potrdi se s pritiskom na tipko Enter$, s čemer se nameščena offset vrednost vpisuje v interni EEPROM. Po vpisu se izpiše sporočilo „WRITE IN EEPROM!“, in sporočilo „END CALIBRATION“ za oznako zaključka offset temperaturne kalibracije. Kalibracijski parametri zasedejo 6 bajtov EEPROM-a. Prvi bajt se ne uporablja. Če pred vklopom knjižnice „calibrate_ds.inc“ v uporabniškem programu niso dimenzionirane ERAM spremenljivke v EEPROM-u, takrat je ta prvi bajt na EEPROM naslovu 0, ki se ne uporablja, ker ni zanesljiv. Nato sledijo 4 bajti za Single vrednost offset vrednosti, in en bajt za pomožno marker spremenljivko. Torej, če pred knjižico „calibrate_ds.inc“ niso dimenzionirane ERAM spremenljivke, potem bo zaseden prostor v internem EEPROM-u od naslova 0 do naslova 5. Če so predhodno že dimenzionirane neke ERAM spremenljivke, potem bo zavzetih naslednjih 6 naslovov v internem EEPROM-u. S fuse biti mikrokontrolerja je potrebno onemogočiti brisanje internega EEPROM-a pri vpisu programa v mikrokontroler, da bi ohranili kalibracijske podatke v EEPROM-u. Po vsakem resetu knjižica „calibrate_ds.inc“ prebere shranjeno offset vrednost iz EEPROM-a v RAM spremenljivko Offset_ds. Prebrana temperatura se nahaja v Single spremenljivki Temperature_ds. V uporabniškem programu je potrebno napraviti korekcijo te temperature z algebrskim prištevanjem vrednosti Offset_ds spremenljivke spremenljivki Temperature_ds
Temperature_ds = Temperature_ds + Offset_ds
Primer uporabe tega načina kalibracije je v priloženem programu „Temperature DS1820 calibrate.bas“ za sensor DS1820 , za senzor DS18B20 pa v programu „Temperature DS18B20 calibrate.bas“ .
V naslednjem nadaljevanju bo opisana uporaba večjega števila DS18B20 senzorjev na istem 1-Wire priključku mikrokontrolerja z avtomatsko identifikacijo vsakega od priključenih senzorjev, in možnost njihove offset temperaturne kalibracije.
https://svet-el.si