Senzory‎ > ‎

DS18B20 Senzor teploty

Aktualizovaná verzia článku je na adrese http://www.arduinoslovakia.eu/page/ds18b20-senzor-teploty.

DS18B20 je digitálny senzor teploty s rozlíšením 9-12 bitov. Komunikuje pomocou rozhrania One Wire. Datasheet s podrobnosťami je na stránke výrobcu. Obvod je nutnosťou pre každého amatérskeho experimentátora a skôr alebo neskôr skončíte pri pokuse poskladať pomocou neho nejakú malú meteorologickú stanicu.

Popis obvodu

Bežný užívateľ si tento obvod kúpi v púzdre TO-92.
  • Pin1 - Sem sa pripojí zem.
  • Pin2 - Dátový prenos. Na tomto konektore je potrebné pripojiť pull-up rezistor s hodnotou 4,7 k (toto nie je potrebné dodržať úplne presne, možno pokojne použiť aj približnú hodnotu). Pull-up rezistor udržuje napätie na Pin2 na logickej jednotke (keď sa nič nedeje) a samotná komunikácia prebieha tak, že Arduino, alebo senzor ju podľa dohodnutého protokolu zhadzujú na nulu.
  • Pin3 - Napájanie. Napájanie je v rozsahu 3V - 5,5V, takže ho pripneme na 5V z Arduina.
https://sites.google.com/site/arduinoslovakia/senzory/ds18b20-senzor-teploty/ds18b20_pin.jpg?attredirects=0
Obvod je možné pripojiť dvomi spôsobmi:
  • Externé napájanie - Sú pripojené všetky tri konektory. Takto budeme senzor pripájať v tomto príklade.
  • Parazitické napájanie - Tomuto sa nebudeme venovať, podrobnosti je možné dohľadať v datasheete. Na informáciu stačí vedieť, že sa dá takto ušetriť jeden vodič a DS18B20 si berie energiu cez Pin2 a uskladňuje si ju interne v kondenzátore.

Inštalovanie knižníc

Na použitie je potrebné nainštalovať dve knižnice:

  • One Wire - Samotný One Wire protokol. Knižnicu je možné si stiahnuť priamo zo stránky jej správcu, Paula Stoffregena. Rozbaliť ju treba do adresára arduino-XXX\libraries\ (arduino-XXX treba na vašom počítači nahradiť správnou cestou, kam ste si nainštalovali vývojové prostredie Arduina). V adresári libraries po inštalácii pribudne adresár OneWire. V ňom je adresár examples, kde sa nachádza niekoľko príkladov a jeden z nich je použiteľný aj na senzor DS18B20.
  • Dallas Temperature Control Library - Toto nie je nevyhnutná knižnica, ale ak si ju nainštalujete, tak sa vám bude so senzorom pracovať pohodlnejšie. Knižnicu si možno stiahnuť zo stránky Dallas Temperature Control Library. V adresári libraries pribudne adresár dallas-temperature-control. Toto sa môjmu vývojovému prostrediu nepáčilo a musel som to premenovať na dallas_temperature_control.
Po inštalácii nezabudnite reštartovať vývojové prostredie, aby sa knižnice v ňom objavili. Aktuálne verzie knižníc (v čase písania tohoto článku) sa dajú stiahnuť aj priamo na tejto stránke.

Pripojenie k Arduinu

https://sites.google.com/site/arduinoslovakia/senzory/ds18b20-senzor-teploty/ds18b20_connect.jpg?attredirects=0
Pripojenie je jednoduché. Presne podľa popisu zapojenia. Treba si len vybrať, ktorý digitálny vstup bude čítať údaje zo senzora. V tomto prípade je to digitálny port 2.

Aká je presnosť merania

Presnosť merania je nepriamo úmerná času, ktorý potrebuje senzor na A/D prevod.
Presnosť v bitoch Čas merania  Presnosť merania
 9 93,75 ms  0,5°C
 10 187,5 ms  0,25°C
 11 375 ms  0,125°C
 12 750 ms  0,0625°C
Samozrejme, že každý bude chcieť merať v najvyššej presnosti, ale treba rátať s tým, že to spotrebuje celkom dosť času.

Viac senzorov

Bez problémov môžeme pripojiť aj viac senzorov na jednu zbernicu One Wire. Každý senzor má svoje jedinečné číslo (adresu), pomocou ktorého s nim komunikujeme.

Programujeme Arduino

  • Začneme jednoduchým, ale užitočným príkazom na skenovanie OneWire zbernice. Výsledkom je zoznam adries senzorov, ktoré sa nachádzajú na zbernici. Skener skenuje v päťsekundových intervaloch a je pripojený na digitálny pin 2. [onewire_scan.ino]
  • Experimentálne som skombinoval tento senzor a sedemsegmentový display a výsledkom je tento jednoduchý teplomer.

DS18B20 Tester

Toto je prepracovaná verzia programu onewire_scan.ino. V súbore ds18b20tester.zip sa nachádza program, ktorý vyhľadá všetky senzory na zbernici a následne v päťsekundových intervaloch číta teplotu z nich.

DS18B20 Array

V súbore ds18b20array.zip sa nachádza program, ktorý uľahčuje prácu so senzormi. Vyhľadá všetky senzory na zbernici a na sériový port pošle zdrojový kód, ktorý možno ľahko zahrnúť do svojich ďalších programov. Výhodou je to, že výsledkom je pole adries pre senzory, ktoré nie je nutné potom hľadať na zbernici.
Prináša to aj nevýhody. Už nie je možné meniť jeden senzor za druhý. Na druhej strane ale ten, kto pracuje naraz s viac senzormi, potrebuje presne vedieť, ktorý senzor má akú adresu a kam ho vývojár umiestnil.

DS18B20 Demo Array

V súbore ds18b20demoarray.zip sa nachádza program, ktorý využíva predchádzajúci program.  V mojom prípade je použitých 6 senzorov a ich definícia vyzerá takto.
DeviceAddress da[]={
  {0x28,0x28,0x0F,0x45,0x06,0x00,0x00,0xD6}, // sensor 0
  {0x28,0x54,0x26,0x0E,0x05,0x00,0x00,0xA8}, // sensor 1
  {0x28,0xD4,0xCC,0x45,0x06,0x00,0x00,0xB5}, // sensor 2
  {0x28,0x8C,0x6E,0x45,0x06,0x00,0x00,0x8A}, // sensor 3
  {0x28,0xCE,0x75,0x44,0x06,0x00,0x00,0x12}, // sensor 4
  {0x28,0x49,0xBD,0x44,0x06,0x00,0x00,0x61}  // sensor 5
};

const int dacount=sizeof(da)/sizeof(DeviceAddress);
Výstup z programu je identický ako v súbore ds18b20tester.zip.

Vizualizácia údajov v Processingu

V súbore arduino_serial.zip sa nachádza zdrojový kód programu, ktorý vizualizuje údaje zo sériového portu. Naprogramoval som to v programe Processing 2.2.1, čo je pohodlný spôsob, ako rýchlo získať údaje z Arduina a previesť ich do vizuálne atraktívnejšej podoby, než poskytuje monitor sériového portu. Processing je v podstaje Java, doplnená nejakými knižnicami, ktoré vytvárajú prostredie nápadne podobné tomu, čo používame v IDE Arduina. Pre správne použitie programu je nutné, aby bol v Arduine program ds18b20demoarray.zip.
V tomto programe som sa sústredil na niekoľko funkcií, ktoré môžete použiť za základ vlastných konštrukcií.
  • Vypisovanie prijatých údajov do debug okna.
  • Rozdelenie prijatých údajov nezávisle na množstve použitých senzorov. Ja som použil 6 senzorov.
  • Ukladanie údajov v poli a ich analýza. Zisťuje sa minimum, maximum a rozdiel medzi najchladnejším a najhorúcejším senzorom.
  • Vykreslenie údajov z tohoto poľa do prehľadnej tabuľky, aby sa dalo sledovať, ako program postupne číta hodnoty z Arduina.
https://sites.google.com/site/arduinoslovakia/senzory/ds18b20-senzor-teploty/processing_ds18b20.png?attredirects=0

Narastanie teploty počas merania

Aj keď to človeka láka, aby meral v dvanásťbitovom rozlíšení jednu teplotu za druhou, treba si dať pozor na nárast teploty počas merania. Obvod má síce malú spotrebu, ale počas merania jej spotrebuje nezanedbateľné množstvo. Meranie v dvanásťbitovom rozlíšení trvá 750 ms a ak tam nebude prestávka, obvod sa mierne zahreje. Doporučuje sa nechávať medzi meraniami prestávku 5-10 s, aby mal obvod čas na ochladenie. Ak by ste sa chceli ohradiť, že potrebujete viac meraní, skúste sa ešte raz nad tým zamyslieť. Naozaj na to čo robíte nestačí 6-12 meraní za minútu?

Presnosť merania viac senzormi

Ak budú senzory umiestnené v rovnakých podmienkach, po ustálení teploty na senzoroch by ste sa mali dostať s teplotou na každom senzore veľmi blízko k sebe. Napríklad na obrázku vyššie je vidno, že 60 meraní dosahuje rozptyl iba 0,5 stupňa. Počas ladenia som chvíľami dosahoval aj 0,25 stupňa, ale to už je asi to dosiahnuteľné maximum.
Senzory sú veľmi citlivé a stačí smerom ku nim dýchať a už vidíte zmenu. Mne sa napríklad počas písania programu stalo, že som mal rozdiel aj niekoľko stupňov a teplota na všetkých bola podozrivo vysoká. Po chvíli som zistil, že mám senzory blízko vyfukovacieho otvoru chladenia na notebooku. Presunul som ich ďalej a bolo to ešte horšie, lebo teplý vzduch z otvoru išiel presne na miesto, ktoré bolo vzdialené asi pol metra.
Aj dotyk prstami spôsobí, že teplota na konkrétnom senzore bleskove vyletí o pár stupňov.
Ċ
Robo Ulbricht,
15. 8. 2013, 14:26
ċ
DallasTemperature_372Beta.zip
(23k)
Robo Ulbricht,
15. 8. 2013, 14:23
ċ
OneWire.zip
(15k)
Robo Ulbricht,
15. 8. 2013, 14:23
ċ
arduino_serial.zip
(2k)
Robo Ulbricht,
6. 4. 2015, 4:08
ċ
ds18b20array.zip
(1k)
Robo Ulbricht,
6. 4. 2015, 5:12
ċ
ds18b20demoarray.zip
(1k)
Robo Ulbricht,
6. 4. 2015, 5:12
ċ
ds18b20tester.zip
(2k)
Robo Ulbricht,
6. 4. 2015, 5:12
ċ
onewire_scan.ino
(3k)
Robo Ulbricht,
16. 8. 2013, 9:08
Comments