Teplotní senzor (nebo také čidlo) DS18B20 od firmy Maxim (dříve Dallas) je v Arduino komunitě velice oblíbené. Za velmi dobrou cenu umožňuje měřit teplotu v rozsahu -55 až +125 stupňů Celsia, přičemž v rozsahu -10 až +85 stupňů Celsia má garantovanou přesnost ±0,5 °C. Další výhodou je také možnost zakoupit tento teplotní senzor jak v pouzdře TO-92, které se velikostí podobá obyčejným tranzistorům, tak i vodotěsnou variantu, kdy je senzor zataven v nerezové tyčince. Pro komunikaci s Arduino deskou je u čidla DS18B20 využita sběrnice OneWire, která využívá pouze jeden komunikační pin a toto čidlo také podporuje takzvaný parazitní režim, kdy pro spojení čidla s Arduino deskou stačí využít pouze 2 dráty.
Pro úspěšné propojení s Arduino deskou tedy stačí propojit pouze 2 vodiče a jeden odpor o velikosti 4700 ohmů. Propojíme krajní vodiče čidla VCC a GND společně se zemí na Arduinu, prostřední vodič DQ s pinem 4 a odpor spojíme na jednom konci s vodičem DQ a +5V na konci druhém, jak je vidět na schématu níže. Místo pinu 4 Arduino desky můžeme samozřejmě využít jiný volný datový pin, ale je nutné tuto volbu provést i v programu pro Arduino desku. Pokud chceme využít vodotěsné varianty, barvy vodičů odpovídají takto: červená=napájení, černá=zem, žlutá(zelená či bílá)=datový pin DQ.
Pro správné přeložení a nahrání uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovny DallasTemperature a OneWire, návod jak na to je uveden zde. Ukázkový kód obsahuje na začátku připojení obou zmíněných knihoven a dále konstantu, která obsahuje číslo datového pinu. Poté vytvoříme nejprve instanci oneWireDS pro využití funkce OneWire sběrnice a poté již instanci senzoryDS, která nám umožní jednoduše číst informace o připojených čidlech DS18B20. V podprogramu setup nastavíme komunikaci přes sériovou linku a také zapneme komunikaci knihovny s připojenými čidly. V nekonečné smyčce loop pak vždy načteme pomocí funkce requestTemperatures informace o všech připojených čidlech a následně vytiskneme teplotu připojeného čidla. Pokud máme připojených více čidel na jednom datovém pinu, přepínáme mezi těmito čidly pomocí změny čísla v závorce příkazu getTempCByIndex(0). Pořadí čidel je určeno jejich unikátní adresou, kterou nelze uživatelsky měnit. Rád bych upozornil na to, že každé volání funkce requestTemperatures zabere přibližně 0,7 vteřiny, je tedy vhodné tuto teplotu měřit například každých 10 vteřin, abychom příliš nezpomalovali ostatní funkce nahraného programu.
// Teplotní čidlo DS18B20 // připojení knihoven #include <OneWire.h> #include <DallasTemperature.h> // nastavení čísla vstupního pinu const int pinCidlaDS = 4; // vytvoření instance oneWireDS z knihovny OneWire OneWire oneWireDS(pinCidlaDS); // vytvoření instance senzoryDS z knihovny DallasTemperature DallasTemperature senzoryDS(&oneWireDS); void setup(void) { // komunikace přes sériovou linku rychlostí 9600 baud Serial.begin(9600); // zapnutí komunikace knihovny s teplotním čidlem senzoryDS.begin(); } void loop(void) { // načtení informací ze všech připojených čidel na daném pinu senzoryDS.requestTemperatures(); // výpis teploty na sériovou linku, při připojení více čidel // na jeden pin můžeme postupně načíst všechny teploty // pomocí změny čísla v závorce (0) - pořadí dle unikátní adresy čidel Serial.print("Teplota cidla DS18B20: "); Serial.print(senzoryDS.getTempCByIndex(0)); Serial.println(" stupnu Celsia"); // pauza pro přehlednější výpis delay(1000); }
Po nahrání programu do Arduino desky s připojeným modulem a termočlánkem dostaneme například tento výpis:
Teplota cidla DS18B20: 28.56 stupnu Celsia Teplota cidla DS18B20: 29.19 stupnu Celsia Teplota cidla DS18B20: 29.56 stupnu Celsia Teplota cidla DS18B20: 29.94 stupnu Celsia Teplota cidla DS18B20: 30.06 stupnu Celsia
Teplotní čidlo DS18B20 je velice oblíbené, zvláštně pro svou nízkou cenu a snadnou použitelnost. Umožňuje měřit teplotu s dostačující přesností pro domácí použití a je možné použít propojovací kabely mezi čidlem a Arduinem dlouhé až několik desítek metrů. Výrobce udává v ideálním případě vzdálenost 200m, já osobně mám ověřeno 12m s využitím parazitního režimu.
Seznam použitých komponent:
http://dratek.cz/arduino/1187-teplotni-senzor-digitalni-dallas-ds18b20-1452201536.html
http://dratek.cz/arduino/848-arduino-teplomer-vodotesny.html
http://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html
Poznámka: pro úplnost je níže obrázek zapojení oběma způsoby - normální a parazitní napájecí režim