Avtor: Mladen Čempuh
e-mail: cempuh.mladen@gmail.com
V preteklem članku sta bila opisana digitalna temperaturna senzorja DS1820 in DS18B20, pa tudi Bascom-AVR programske knjižnice za delo in kalibracijo enega takšnega senzorja. V tem nadaljevanju bo opisana Bascom-AVR programska knjižnica „multiple_ds18b20.inc“ za delo z več DS18B20 senzorji na enem 1-Wire priključku mikrokontrolerja.
Opisana bo tudi programska knjižnica „calibrate_multiple_ds.inc“ za njihovo offset temperaturno kalibracijo. Te programski knjižnici delata samo s senzorji DS18B20 in ne tudi z DS1820, ki so manj precizni in vse manj v uporabi.
Ta vsebina je samo za naročnike
Uporaba več senzorjev DS18B20 na enem 1-Wire priključku
Za uporabo več DS18B20 senzorjev je potrebno v uporabniškem programu definirati vhodne priključke mikrokontrolerja, na katere bosta priključeni tipki UP in ENTER, če pa uporabimo tudi knjižnico „calibrate_multiple_ds.inc“ za offset kalibracijo več senzorjev, je potrebno definirati tudi vhod za tipko DOWN.
V priloženih primerih programov je definiran vhodni priključek mikrokontrolerja za detekcijo kratkostičnika JP1, ki se uporablja kot pogoj za postopke identifikacije senzorja (ob pritisnjeni tipki UP) in offset kalibracije senzorjev (ob pritisnjeni tipki DOWN) po resetu mikrokontrolerja. Vse priložene knjižnice so prilagojene delu z dvovrstičnim LCD-jem 1602 (lahko tudi štirivrstični 2004). Na začetku uporabniškega programa je potrebno konfigurirati delo LCD-ja v 4 bitnem paralelnem načinu dela kot je v priloženih primerih programa v direktoriju Programs ali v serijskem I2C načinu dela (glej direktorij: Programs/I2C LCD). Za 1-Wire komunikacijo je izbran priključek PD.5 z ukazom Config 1wire = PORTD.5 , lahko pa je to tudi nek drugi priključek mikrokontrolerja. Med tem priključkom in VCC je obvezen 4,7 kΩ upor. Knjižnica „multiple_ds18b20.inc“ omogoča delo 2 do 8 senzorjev DS18B20 na enem po želji uporabnika izbranem 1-Wire priključku mikrokontrolerja, točnost branja temperature je v 12 bitni resoluciji oziroma v resoluciji 0,0625°C. Število uporabljenih DS18B20 senzorjev se definira v uporabniškem programu z vrednostjo konstante:
Const Nr_of_ds18b20 = 2
‘ uporabljata se 2 senzorja
Po definiranju vrednosti te konstante je v uporabniški potrebno vključiti programsko knjižnico:
$include „multiple_ds18b20.inc“
V kolikor konstanti Nr_of_ds18b20 pridružimo vrednost 1 za uporabo samo enega senzorja DS18B20, se bo pri prevajanju programa pojavila napaka „For only one DS18B20 sensor uses „ds18b20.inc“, ki nas napoti, da za uporabo samo enega senzorja uporabimo knjižnico „ds18b20.inc“ na način, ki je opisan v pretekli številki revije Svet Elektronike. V kolikor tej konstanti določimo število, ki je večje od 8, se bo pri prevajanju programa pojavila napaka „Too many DS18B20 sensors“ , ker je v knjižnici „multiple_ds18b20.inc“ število možnih senzorjev omejeno na maksimalno 8. V kolikor moramo uporabiti več kot 8 senzorjev lahko to naredimo na enostaven način tako, da uredimo knjižnico „multiple_ds18b20.inc“ in zamenjamo vrednost dveh konstant, ki sta navedeni na začetku knjižnice. To sta konstanti:
Const Max_ds18b20 = 8
‘ za največ 8 možnih senzorjev
Z zamenjavo števila 8 z večjim številom smo povečali število maksimalno možnih senzorjev, ki jih knjižnica podpira. Takrat je potrebno spremeniti tudi konstanto:
Const Bytes_for_id = 64
‘ Bytes_for_id = Max_ds18b20 * 8
Potrebna vrednost konstante Bytes_for_id se izračuna z množenjem predhodno definirane konstante Max_ds18b20 in števila 8. S to konstanto knjižnica dimenzionira bajtni niz Id_eeprom(n) v internem EEPROM pomnilniku mikrokontrolerja. S povečanjem števila možnih DS18B20 senzorjev se povečuje velikost tega bajtnega niza v internem EEPROM-u. Mikrokontroler pri identifikaciji vsakega od DS18B20 senzorjev (glej tekst: Identifikacija DS18B20 senzorjev) shrani njegove ID podatke, ki so dolgi 8 bajtov iz ROM pomnilnika v bajtni niz v EEPROM-u od neke pozicije v nizu, ki je odvisna od zaporedne številke, ki jo je med identifikacijo senzorjev uporabnik dodal temu senzorju. Pri branju podatkov o temperaturi uporabljenih senzorjev mikrokontroler s pomočjo ID podatka iz tega bajtnega niza po vrsti kliče vse DS18B20 senzorje na 1-Wire vodilu in bere podatke iz njihovega Scratchpad pomnilnika, preverja CRC korektnost prebranih podatkov in izračunava temperaturo vsakega senzorja.
Identifikacija DS18B20 senzorjev
Da bi pri delu z več DS18B20 senzorji na istem 1-Wire vodilu mikrokontroler lahko pristopal posamično vsakemu senzorju, in da bi lahko razlikoval, katera temperatura se nanaša na kateri senzor, je potrebno najprej napraviti programsko identifikacijo senzorjev. Zato se vsak od senzorjev, ki jih bomo uporabljali v programu mora posamično vezati na 1-Wire vodilo (samo po en senzor naenkrat!). Za identifikacijo senzorjev služi ukaz Ds18b20_identify. V uporabniškem programu je potrebno pred Do…Loop zanko postaviti neki pogoj izvrševanja tega ukaza:
If Pogoj1 = Izpolnjen Then
Ds18b20_identify
End if
V priloženih primerih Bascom-AVR programa za delo z več senzorji kot Pogoj1 za izvršitev ukaza Ds18b20_identify sem izbral, da vhodni priključek Jp1 (PD.3) na katerega se proti Gnd montira kratkostičnik JP1 ima stanje 0 in da je pri tem vhodni priključek Up$ (PD.0) na katerega je vezana tipka UP prav tako 0 (glej shemo na sliki 2.). Torej, pri resetu mikrokontrolerja in če je montiran kratkostičnik JP1 in če se drži pritisnjena tipka UP, se prične identifikacija enega priključenega DS18B20 senzorja.
If Jp1 = 0 And Up$ = 0 Then
Ds18b20_identify
End If
-------------
Do
-------------
Loop
Na zaslonu LCD-ja se izpisuje sporočilo „IDENTIFICATION“ in „Only one DS18B20“ za oznako začetka identifikacije ob opozorilu, da je mora biti priključen samo en DS18B20 senzor na 1-Wire vodilo. Nato sledi sporočilo „DS18B20 probe ? Nr. = 1 „ s čemer je ponujeno, da se priključeni senzor identificira pod zaporedno številko 1. Uporabnik s pritiskom na tipko UP lahko poveča to zaporedno številko do števila določenega z vrednostjo konstante Nr_of_ds18b20. Če se potem ponovno pritisne tipka UP, se zaporedno število prične od 1. Ko izberemo zaporedno število npr. 2, s katerim bomo identificirali priključeni senzor, pritisnemo tipko ENTER. Če na 1-Wire vodilu ni vezan DS18B20 senzor oziroma je okvarjena vezava ali senzor, mikrokontroler ne bo mogel prebrati ID podatke iz ROM pomnilnika senzorja pod zaporednim številom 2 in izpisalo se bo sporočilo „DS18B20 Nr.2 NOT FOUND!“ in se čaka reset mikrokontrolerja. Če je DS18B20 senzor detektiran na 1-Wire vodilu, in je preverjanje CRC prebranih podatkov ROM pomnilnika senzorjev detektiralo napako, se bo na LDC-ju izpisalo sporočilo „ID CRC NOT OK!“ in se čaka reset mikrokontrolerja. V kolikor je ROM pomnilnik senzorja pravilno prebran, se bo izpisalo sporočilo „DS18B20 Nr. 2“ za izbrano zaporedno število drugega senzorja in izpisala se bo v heksadecimalnem formatu vsebina 8 bajtov ROM pomnilnika (enkraten tovarniški ID) tega senzorja.
ID:28 . . . . . . . . . . . . . .
ID podatke ukaz za identifikacijo shrani v bajtni niz v internem EEPROM-u pomnilnika mikrokontrolerja. Ta bajtni niz se prične od naslova 1 če v uporabniškem programu pred vključitvijo knjižnice „multiple_ds18b20.inc“ niso dimenzionirane nekatere ERAM spremenljivke (naslov 0 EEPROM-a se ne uporablja, ker je nezanesljiv), velikost pa mu je določena s konstanto Bytes_for_id . Nato čaka na reset mikrokontrolerja. Položaj pomnjenja ID podatka DS18B20 senzorja v EEPROM-u je odvisen od izbrane zaporedne številke, ki je izbran za ta senzor pri identifikaciji. Sedaj lahko nadaljujemo z identifikacijo naslednjega senzorja, ki ga namesto predhodnega vežemo na 1-Wire vodilo in resetiramo mikrokontroler in ob tem držimo tipko UP. Važno je, da za vsak identificirani senzor izberemo različno zaporedno število, ker na 1-Wire vodilu ne smeta biti dva DS18B20 senzorja z istim zaporednim številom. Identifikacijo moramo napraviti za vse senzorje, ki jih bomo uporabili. Po narejeni identifikaciji vseh senzorjev, ki jih bomo uporabljali v svojem programu, odstranimo JP1 kratkostičnik in tako onemogočimo ponovno identifikacijo, če bi ob resetu slučajno pritisnili tipko UP. Vse identificirane senzorje vežemo paralelno na 1-Wire vodilo kot prikazano na sliki 1.
Opis ukaza Ds18b20 pri uporabi več DS18B20 senzorjev na istem 1-Wire vodilu
Ukaz Ds18b20 iz knjižnice „multiple_ds18b20.inc“ služi za sočasen zagon AD pretvorbe temperature v vseh DS18B20 senzorjih, ki so vezani na 1-Wire vodilo. Nato ukaz čaka 800ms da se AD pretvorba temperature v vseh senzorjih zanesljivo zaključi. V kolikor na 1-Wire vodilu ukaz Ds18b20 ne najde senzorjev, bo postavil interno Bascom-AVR bit spremenljivko Err v stanje 1, sicer je Err = 0.
Primer uporabe interne bit spremenljivke Err po ukazu Ds18b20 v programu:
Do
Ds18b20
If Err = 1 Then
Locate 1 , 1 : Lcd „DS18B20 NOT FIND „
Goto Lab_skip
End If
Lab_temperatures_ds:
‘——————————
Lab_skip:
Loop
V programu se ukaz Ds18b20 postavi znotraj Do … Loop zanke zato, da nepretrgoma prejemamo podatke o temperaturah vseh uporabljenih DS18B20 senzorjev. Po zaključku AD pretvorbe temperature v senzorjih (če je Err=0) ukaz bere podatke iz Scratchpad pomnilnika vseh DS18B20 senzorjev s CRC kontrolo pravilnosti branju teh podatkov. Če so podatki DS18B20 senzorjev pravilno prebrani, takrat so bajtne spremenljivke Crc(n)=0 , n je zaporedna številka senzorja. Iz pravilno prebranih podatkov izračuna temperaturo vsakega senzorja. Podatke o temperaturah shrani v niz Single spremenljivk Temperature_ds(n), n je zaporedna številka senzorja. Če je CRC kontrola pri branju podatka iz Scratchpad pomnilnika nekega n-senzorja ugotovila nekorektnost, je takrat ustrezna bajt spremenljivka CRC(n) različna od 0. V tem primeru ukaz ne izračuna temperaturo tega senzorja niti je ne vpiše v ustrezno Single spremenljivko Temperature_ds(n). Vse spremenljivke Crc(n) in Temperature_ds(n) so dimenzionirane znotraj knjižnice „multiple_ds18b20.inc“ odvisno od vrednosti konstante Nr_of_ds18b20, medtem ko je interna bit spremenljivka Err dimenzionirana v Bascom-AVR okolju.
Primer izpisa temperature na eno decimalko v programu za senzor številka 2 :
Lab_temperatures_ds:
If Crc(2) = 0 Then
Locate 1 , 1: Lcd „TEMP2 = „
; Fusing(temperature_ds(2) , „#.#“)
; Chr(223) ; „C „
Else
Locate: 1 , 1: Lcd „Nr.2 CRC NOT OK! „
End if
Da bi opisana ukaza Ds18b20 in Ds18b20_identify lahko preverila CRC prebranih podatkov iz senzorjev, je potrebno na koncu uporabniškega programa za ukazom End v program vključiti podatkovno tabelo za hitrejši izračun vrednosti CRC8.
End
$include „crc8.inc“
Offset kalibracija temperature več DS18B20 senzorjev na enem 1-Wire vodilu
Offset kalibracija temperature DS18B20 senzorjev se lahko dela po izvršeni identifikaciji uporabljenih senzorjev. Pri offset kalibraciji temperature morajo biti vsi DS18B20 senzorji vezani na 1-Wire vodilo. Za določanje offset vrednosti vsakega identificiranega senzorja je potrebno, da se etalonski termometer in DS18B20 senzor nahajata na isti referenčni temperaturi po izboru uporabnika. Za vsak senzor je potrebno izračunati offset vrednost kot algebrsko razliko temperature etalonskega termometra in temperature senzorjev. Prvi način offset kalibracije je brez uporabe knjižnice „calibrate_multiple_ds.inc“. Izračunana offset vrednost temperature za senzor z zaporednim številom 1 imenujemo pred Do … Loop zanko z imenom npr. Offset_ds1 Alias 0.1 , za senzor 2 nazivom Offset_ds2 Alias -0,15 itd. Za vsak senzor s zaporednim številom n se offset vrednost v Do … Loop zanki prišteje pripadajoči Single spremenljivki Temperature_ds(n) = Temperature_ds(n) + Offset_dsn , n je zaporedno število senzorjev. Pomanjkljivost tega načina kalibracije je, da je treba pri spremembi enega od senzorjev v program vpisati za ta senzor novo offset vrednost in ponovno programirati mikrokontroler.
Drugi način je z uporabo knjižnice „calibrate_multiple_ds.inc“ pri čemer se offset vrednosti ne vpisujejo v program, pač pa se pri kalibraciji vpisujejo v interni EEPROM pomnilnik mikrokontrolerja z uporabo tipk UP, DOWN in ENTER. Ta način pri zamenjavi senzorjev ne zahteva ponovnega programiranja mikrokontrolerja. Knjižnica dimenzionira niz Single spremenljivk Offset_ds(n) , n je zaporedno število senzorjev, velikost niza pa je odvisna od konstant Nr_of_ds18b20. Takoj za knjižnico „multiple_ds18b20.inc“ v program vključimo knjižnico:
$include „calibrate_multiple_ds.inc“
Za izvršitev offset kalibracije posameznega DS18B20 senzorja je potrebno pred Do … Loop zanko, in po pogoju za identifikacijo senzorjev napišemo tudi Pogoj2 za zagon kalibracije:
If Pogoj2 = Izpolnjen Then
Calibrate_ds
End if
V priloženih primerih programov, ki uporabljajo navedeno knjižnico kot Pogoj2 izvršitve ukaza Calibrate_ds je kot pogoj postavljen vgrajen kratkostičnik JP1 in da je pri resetiranju mikrokontrolerja pritisnjena tipka DOWN.
If Jp1 = 0 And Down$ = 0 Then
Calibrate_ds
End If
-------------
Do
-------------
Loop
Ukaz Calibrate_ds iz knjižnice „calibrate_multiple_ds.inc“ izpisuje na LCD-ju sporočilo „CALIBRATION“ in sporočilo „Select probe ? Nr. = 1“ s čemer išče izbor rednega števila senzorjev za kalibracijo. S tipko UP menjamo zaporedno število od ponujenega števila 1 do števila uporabljenih senzorjev določene s konstanto Nr_of_ds18b20 . Po tej izbiri pritisnemo tipko ENTER. Na LCD-ju se prikaže predhodno vpisani Offset na dve decimalki za ta senzor ali je Offset = 0.00 za prvo kalibracijo tega senzorja. S tipkama UP in DOWN namestimo želeni Offset v obsegu od -2.99°C do 2.99°C s korakom nastavljanja od 0,01°C. Ko smo Offset namestili na pravilno vrednost pritisnemo tipko ENTER in ta podatek se vpiše v interni EEPROM na naslov, ki je odvisen od zaporednega števila izbranega senzorja. Shrani se za bajtnim nizom Id-eeprom(n). Po vpisu offset vrednosti v EEPROM in sporočila „WRITE IN EEPROM!“, se izpisuje vprašanje „END CALIBRATION? YES/NO ? „ s ponujenim odgovorom „NO“. S tipko UP menjamo odgovor v „YES“, s tipko DOWN vračamo odgovor „NO“. Če pri odgovoru „NO“ pritisnemo tipko ENTER program skoči na kalibracijo istega ali nekega drugega DS18B20 senzorja, odvisno od ponovne izbire zaporednega števila senzorja. Če pri odgovoru „YES“ pritisnemo tipko ENTER se izpisuje sporočilo „END CALIBRATION!“ in zaključi se proces kalibracije senzorjev. Po zaključeni kalibraciji je potrebno razkleniti kratkostičnik JP1, da se ne bi ponovno pričela kalibracija v primeru držanja tipke DOWN ob resetu mikrokontrolerja. Da bi bili vsi podatki v internem EEPROM pomnilniku mikrokontrolerja shranjeni, je potrebno s fuse biti mikrokontrolerja onemogočiti brisanje vsebine EEPROM-a pred eventualno ponovnim programiranjem mikrokontrolerja.
Po shemi na sliki 2 so priloženi Bascom-AVR primeri programov:
Temperature DS18B20 x 2.bas – za dva DS18B20 senzorja, ne uporablja knjižnice za kalibracijo
Temperature DS18B20 x 2 calibrate.bas – za dva DS18B20 senzorja, uporablja knjižnico za kalibracijo
Temperature DS18B20 x 4 calibrate.bas – za štiri DS18B20 senzorje, uporablja knjižnico za kalibracijo
https://svet-el.si