Projekty‎ > ‎

Dallas DS18B20

Teplotný senzor (alebo tiež čidlo) DS18B20 od firmy Maxim (predtým Dallas) je v Arduino komunite veľmi obľúbené. Za veľmi dobrú cenu umožňuje merať teplotu v rozsahu od -55 až do +125 stupňov Celzia, pričom v rozsahu -10 až +85 stupňov Celzia má garantovanú presnosť ± 0,5 ° C. Ďalšou výhodou je tiež možnosť zakúpiť tento teplotný senzor ako v puzdre TO-92, ktoré sa veľkosťou podobá obyčajným tranzistorom, tak i vodotesnú variantu, kedy je senzor zatavený v nerezovej tyčinke. Pre komunikáciu s Arduino doskou je u čidla DS18B20 využitá zbernica OneWire, ktorá využíva iba jeden komunikačný pin. Tento snímač tiež podporuje takzvaný parazitný režim, kedy pre spojenie čidla s Arduino doskou stačí využiť iba 2 vodiče.

Senzor čidlo DS18B20 v púzdre TO-92
Senzor čidlo Dallas DS18B20 vodotesný vodeodolnýSenzor čidlo Dallas DS18B20 modul s tromi vývodmi

Parametre senzora sú nasledovné:

  • napájacie napätie je v rozsahu 3,0V až 5,5V
  • počas merania a počas zápisu do EEPROM senzor potrebuje prúd 1,5 mA.
  • rozsah meranej teploty je od –55°C do +125°C (-67°F do +257°F)
  • presnosť 0,5°C v rozsahu –10°C do +85°C
  • rozlíšenie senzora je voliteľné v rozsahu 9 až 12-bit
  • meranie teploty s rozlíšením 12-bit trvá 750ms
  • obojsmerná poloduplexná prevádzka

Čidlo je vyrábané v týchto troch púzdrach: TO-92, SO-8 a uSOP-8. Najpoužívanejšie v našich projektoch je púzdro TO-92.

Čidlo DS18B20 je vyrábané v troch púzdrach: TO-92, SO-8 a uSOP-8

Existujú dva spôsoby ako môžeme čidlo zapojiť a to s externým napájaním alebo s parazitným napájaním.

Externé napájanie - tu pri zapojení využijeme celkovo tri vodiče. Dva sú napájacie a jeden dátový. Taktiež treba pripojiť jeden pull up rezistor 4,7kΩ medzi dátový vodič a Vdd. Viac senzorov napájame paralelne na tieto vodiče ale už bez ďalších rezistorov. Toto zapojenie doporučujem a ďalej budem v príkladoch používať toto zapojenie.

Externé napájanie DS18B20 pri zapojení využijeme tri vodiče. Dva sú napájacie a jeden dátový.

Parazitné napájanie - pri tomto zapojení si vystačíme s dvomi vodičmi. Senzor je napájaný v podstate cez dátový vodič.Toto zapojenie sa používa, keď je k dispozícii len dvojvodičová linka. Pri dlhých vedeniach a zapojených viacerých senzorov to môže spôsobovať chyby v komunikácii.

Parazitné napájanie DS18B20 s dvomi vodičmi cez dátový vodič

Dátová zbernica môže dosahovať vzdialenosť desiatky metrov, výrobca udáva v ideálnom prípade vzdialenosť až 200m. Na jednu takúto 1Wire zbernicu je teda možné zapojiť do 150 čidiel, ktoré sa dajú „adresovať“.

Komunikácia je inicializovaná mikropočítačom zmenou úrovne napätia na zbernici na 0V. Komunikácia je založená na takzvaných „časových slotoch“, čiže od závislosti doby trvania poklesu úrovne napätia je slave zariadením identifikovaný typ operácie (zápis log.1 alebo log.0, čítanie log.1 alebo log.0, reset a identifikácia zariadenia). Každé čidlo obsahuje unikátny 64 bitový ROM CODE. Prvých horných 8 bitov slúži na zabezpečenie CRC kódom, potom nasleduje 48-bitové sériové číslo zariadenia a dolných 8 bitov tvorí kód identifikujúci typ zariadenia, teda v našom prípade každý snímač DS18B20 bude mať toto číslo 0x28. Táto 64-bitová informácia je unikátna pre každé vyrobené zariadenie s možnosťou tak jednoznačnej identifikácie aj viacerých zariadení rovnakého typu pripojených na jednu linku.

8-bit CRC 48-bit sériové číslo 8-bit typ zariadenia (28h)
MSB LSB MSB LSB MSB LSB

Pamäť senzora – nazvaná SCRATCHPAD obsahuje nasledovných 8 bajtov:

SCRATCHPAD (POWER-UP STATE)
BYTE 0 TEMPERATURE LSB (50h) (85°C) EEPROM
BYTE 1 TEMPERATURE MSB (05h)
BYTE 2 TH REGISTER OR USER BYTE 1* <----> TH REGISTER OR USER BYTE 1*
BYTE 3 TL REGISTER OR USER BYTE 2* <----> TL REGISTER OR USER BYTE 2*
BYTE 4 CONFIGURATION REGISTER* <----> CONFIGURATION REGISTER*
BYTE 5 RESERVED (FFh)
BYTE 6 RESERVED
BYTE 7 RESERVED (10h)
BYTE 8 CRC*
*POWER-UP STATE DEPENDS ON VALUE(S) STORED IN EEPROM.

Byte 0 a 1 obsahujú dohromady 16 bitové číslo s údajom o teplote. Tento byte je len na čítanie (read-only):

LS Byte
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
I 3 I 2 I 1 I 0 D -1 D-2 D -3 D -4
MS Byte
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
S S S S S I 6 I 5 I 4
I = celé číslo v °C
D = desatinné miesta
S = znamienko (0 = + , 1 = -)
+85.000°C
pre 12-bitové rozlíšenie - všetky bity v teplotnom registri budú obsahovať platné údaje. 
pre 11-bitové rozlíšenie - bit 0 nieje definovaný
pre 10-bitové rozlíšenie - bity 1 a 0 sú nedefinované
pre 9-bitové rozlíšenie - bity  2, 1 a 0 nie sú definované

Teplota (°C)  Digitálny výstup (binárny) Digitálny výstup (hex)
+125 0000 0111 1101 0000 07D0h
+85* 0000 0101 0101 0000 0550h
+25.0625 0000 0001 1001 0001 0191h
+10.125 0000 0000 1010 0010 00A2h
+0.5 0000 0000 0000 1000 0008h
0 0000 0000 0000 0000 0000h
-0.5 1111 1111 1111 1000 FFF8h
-10.125 1111 1111 0101 1110 FF5Eh
-25.0625 1111 1110 0110 1111 FE6Fh
-55 1111 1100 1001 0000 FC90h
* nastavená hodnota teploty pri zapnutí je + 85 ° C.

Byte 2 a 3 sú TH a TL bajty a vyžívajú sa na signalizáciu alarmu. Nastavujú sa užívateľom a ich hodnota je porovnávaná s nameranou hodnotou a podľa toho sa nastavuje S bit. Viac v datasheete.

Byte 4 je konfiguračný register. Nastavíme ním rozlíšenie 9 až 12 bitov:

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
0 R1 R0 1 1 1 1 1
R1 R0 Rozlíšenie Konverzný čas
0 0 9 93.75ms (tCONV/8)
0 1 10 187.5ms (tCONV/4)
1 0 11 375ms (tCONV/2)
1 1 12 750ms (tCONV)

Byte 5, 6 a 7 sú rezervované pre interné použitie a nieje možné ich prepísať

Byte 8 je iba na čítanie a obsahuje kód CRC pre bajty 0 až 7 scratchpadu


Zapojenie s Arduinom je veľmi jednoduché. Použil som Arduino Nano spolu so senzorom Dallas DS18B20 a rezistorom 4k7 zapojených na breadboarde. Existuje tento senzor aj ako modul pre Arduino na plošnom spoji, ktorý už obsahuje aj pull up rezistor. Samozrejme môžeme pripojiť aj viac senzorov na jednu zbernicu OneWire.

Senzor čidlo Dallas DS18B20 zapojenie Fritzing na Arduino Nano s pull-up rezistorom


Programovanie kódu pre Arduino vyžaduje použitie dvoch knižníc:

  • OneWire - samotný OneWire komunikačný protokol. Knižnicu je možné si stiahnuť buď priamo zo stránky jej správcu Paula Stoffregena alebo si ju vyhľadáte a nainštalujete priamo v správcovi knižníc. 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.
  • DallasTemperature - 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 alebo ju nájdete priamo v správcovi knižníc a nainštalujete v Arduino IDE. V adresári libraries pribudne adresár DallasTemperature.
Inštalovanie knižníc OneWire DallasTemperature v Arduino IDE pre senzor čidlo Dallas DS18B20

Nezabudnite po inštalácii reštartovať vývojové prostredie, ak by sa knižnice v ňom neobjavili. Ja budem používať v programoch obe knižnice. Každý senzor má svoje jedinečné číslo (adresu), pomocou ktorého s ním komunikujeme.

projekt Arduino Dallas DS18B20 meranie teploty na breadboarde

Fotka projektu

Vyskúšal som zapojiť dva senzory a použil som príklad z DallasTemperature, ktorý sa volá Tester.ino:


Ten vypisuje údaje v nasledovnej podobe.

Dallas Temperature IC Control Library Demo
Locating devices...Found 2 devices.
Parasite power is: OFF
Found device 0 with address: 28FF105DB5160581
Setting resolution to 9
Resolution actually set to: 9
Found device 1 with address: 28FF9436C216049A
Setting resolution to 9
Resolution actually set to: 9
Requesting temperatures...DONE
Temperature for device: 0
Temp C: 25.50 Temp F: 77.90
Temperature for device: 1
Temp C: 26.00 Temp F: 78.80

Pri zmene rozlíšenia z 9-bitov na 12-bitov som program upravil zmenou #define TEMPERATURE_PRECISION 12 a výpis po zmene je nasledovný:

Dallas Temperature IC Control Library Demo
Locating devices...Found 2 devices.
Parasite power is: OFF
Found device 0 with address: 28FF105DB5160581
Setting resolution to 12
Resolution actually set to: 12
Found device 1 with address: 28FF9436C216049A
Setting resolution to 12
Resolution actually set to: 12
Requesting temperatures...DONE
Temperature for device: 0
Temp C: 25.56 Temp F: 78.01
Temperature for device: 1
Temp C: 25.81 Temp F: 78.46

Teplotný snímač DS18B20 je veľmi obľúbený, zvláštne pre svoju nízku cenu a ľahkú použiteľnosť. Umožňuje merať teplotu s dostačujúcou presnosťou pre domáce použitie a je možné použiť prepojovacie vodiče medzi snímačom a Arduinom dlhé až niekoľko desiatok metrov.


Vhodné produkty na vytvorenie tohto projektu: