Ďalší vynikajúci senzor na meranie teploty je Dallas DS18B20. V článku popisujem jeho parametre, dva spôsoby napájania, vnútornú pamäť (registre) a samozrejme zapojenie s Arduinom, jednoduchý program a nejaké fotky.
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 DS18B20 je tiež možnosť zakúpiť tento teplotný senzor 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 narozdiel od senzoru DHT11.
Parametre senzora DS18B20
- 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
Púzdro čidla
Č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.
Napájanie DS18B20
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
Zapojenie využíva 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.
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.
Dátová zbernica
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
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
Nazýva sa aj SCRATCHPAD a 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 |
S = znamienko (0 = + , 1 = -) I = celé číslo v °C D = desatinné miesta |
+ 85. 000°C | ||||||
pre 12-bitové rozlíšenie - všetky bity v teplotnom registri obsahujú platné údaje pre 11-bitové rozlíšenie - bit 0 nieje definovaný pre 10-bitové rozlíšenie - bity 0 a 1 nie sú definované pre 9-bitové rozlíšenie - bity 0, 1 a 2 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 DS18B20 s Arduinom
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.
Programovanie kódu pre Arduino
K naprogramovaniu bude potrebné použitie týchto 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.
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.
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. Taktiež som vyskúšal aj ďalšie senzory ako napr. DHT11 (DHT22) alebo BME280.