Jedním z nejjednodušších a nejlevnějších způsobů, jak přidat do projektu Arduino snímání teploty, je použití 1-drátového teplotního čidla DS18B20. Tyto snímače jsou poměrně přesné a ke své činnosti nepotřebují žádné externí komponenty. Stačí tedy jen několik málo připojení a kód pro Arduino a během chvilky budete snímat teplotu!
DS18B20 1-Wire Temperature Sensor
DS18B20 je teplotní senzor s 1-Wire rozhraním vyráběný společností Dallas Semiconductor Corp. Unikátní rozhraní 1-Wire® vyžaduje pouze jeden digitální pin pro obousměrnou komunikaci s mikrokontrolérem.
Senzor se obvykle dodává ve dvou provedeních. Jeden, který se dodává v pouzdře TO-92, vypadá přesně jako běžný tranzistor. Druhý ve stylu vodotěsné sondy, který může být užitečnější, když potřebujete měřit něco daleko, pod vodou nebo pod zemí.
Teplotní čidlo DS18B20 je poměrně přesné a ke své činnosti nepotřebuje žádné externí komponenty. Dokáže měřit teploty od -55 °C do +125 °C s přesností ±0,5 °C.
Rozlišení teplotního čidla je uživatelsky konfigurovatelné na 9, 10, 11 nebo 12 bitů. Výchozí rozlišení při zapnutí je však 12 bitů (tj. přesnost 0,0625 °C).
Snímač lze napájet zdrojem 3 V až 5,5 V a při aktivních převodech teploty spotřebovává pouze 1 mA.
Níže jsou uvedeny kompletní specifikace:
Napájení | 3 V až 5.5V |
Spotřeba proudu | 1mA |
Teplotní rozsah | -55 až 125°C |
Přesnost | ±0.5°C |
Rozlišení | 9 až 12 bitů (volitelné) |
Čas konverze | < 750ms |
Více DS18B20 na jedné sběrnici
Jednou z největších výhod DS18B20 je, že více DS18B20 může koexistovat na jedné 1-drátové sběrnici. Protože každý DS18B20 má z výroby vypálený jedinečný 64bitový sériový kód, je snazší je od sebe odlišit.
Tato funkce může být obrovskou výhodou, pokud chcete ovládat mnoho DS18B20 rozmístěných na velké ploše.
Chcete-li vědět, jak číst teplotu z více snímačů teploty DS18B20, podívejte se na tento návod.
Vývody senzoru DS18B20
GND je zemnicí pin.
DQ je 1-Wire Data Bus by měl být připojen k digitálnímu pinu na mikrokontroléru.
Pin VDD napájí senzor, který může mít napětí 3,3 až 5 V.
Připojení teplotního senzoru DS18B20 k Arduinu
Teorie už bylo dost, pojďme na to prakticky! Připojíme DS18B20 k Arduinu.
Připojení je poměrně jednoduché. Začněte připojením VDD k výstupnímu pinu 5V na Arduinu a GND k zemi.
Dále připojte zbývající pin digitálního signálu DQ k digitálnímu pinu 2 na Arduinu. Budete také muset přidat pull-up rezistor 4,7k mezi signálový a napájecí pin, aby byl přenos dat stabilní. (Interní pull-upy na arduinu nefungují)
Dejte pozor, abyste DS18B20 zapojili správně. Pokud ho dáte špatně, bude se zahřívat a pak se zlomí.
Pokud používáte vodotěsnou verzi DS18B20, připojte červený proužek k 5V, černý připojte k zemi a žlutý proužek jsou data, která jdou na digitální pin 2 na arduinu. Ještě musíte připojit pullup rezistor 4,7 K z dat na 5 V.
Instalace knihovny pro DS18B20
Protokol Dallas 1-Wire je poněkud složitý a vyžaduje spoustu kódu pro rozbor komunikace. Abychom tuto zbytečnou složitost skryli, nainstalujeme knihovnu DallasTemperature.h, abychom mohli vydávat jednoduché příkazy pro získání údajů o teplotě ze snímače.
Pro instalaci knihovny přejděte do Sketch > Include Library > Manage Libraries…Počkejte, až Správce knihoven stáhne index knihoven a aktualizuje seznam nainstalovaných knihoven.
Vyhledávání filtrujte zadáním ‚ds18b20‘. Mělo by tam být několik položek. Vyhledejte položku DallasTemperature od Milese Burtona. Klepněte na tuto položku a vyberte možnost Instalovat.
Tato knihovna Dallas Temperature je hardwarově specifická knihovna, která zpracovává funkce nižší úrovně. Je třeba ji spárovat s knihovnou One Wire Library, aby mohla komunikovat s jakýmkoli jednovodičovým zařízením, nejen s DS18B20. Nainstalujte si i tuto knihovnu.
Kód pro Arduino
Následující náčrt vám poskytne kompletní představu o tom, jak číst údaje o teplotě ze snímače teploty DS18B20, a může sloužit jako základ pro další praktické experimenty a projekty.
#include <OneWire.h>#include <DallasTemperature.h>// Data wire is plugged into digital pin 2 on the Arduino#define ONE_WIRE_BUS 2// Setup a oneWire instance to communicate with any OneWire deviceOneWire oneWire(ONE_WIRE_BUS);// Pass oneWire reference to DallasTemperature libraryDallasTemperature sensors(&oneWire);void setup(void){ sensors.begin();// Start up the library Serial.begin(9600);}void loop(void){ // Send the command to get temperatures sensors.requestTemperatures(); //print the temperature in Celsius Serial.print("Temperature: "); Serial.print(sensors.getTempCByIndex(0)); Serial.print((char)176);//shows degrees character Serial.print("C | "); //print the temperature in Fahrenheit Serial.print((sensors.getTempCByIndex(0) * 9.0) / 5.0 + 32.0); Serial.print((char)176);//shows degrees character Serial.println("F"); delay(500);}
Takto vypadá výstup v sériovém monitoru.
Vysvětlení kódu:
Sketch začíná zařazením knihoven OneWire.h a DallasTemperature.h a deklarací pinu Arduino, ke kterému je připojen signální pin senzoru.
#include <OneWire.h>#include <DallasTemperature.h>#define ONE_WIRE_BUS 2
Následuje vytvoření objektu OneWire předáním signálního pinu senzoru do jeho konstruktoru. Tento jednovodičový objekt nám umožní komunikovat s libovolným jednovodičovým zařízením, nejen s DS18B20. Abychom mohli komunikovat se senzorem DS18B20, musíme vytvořit objekt knihovny DallasTemperature a jako parametr předat odkaz na jednovodičový objekt.
OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);
Po vytvoření objektu DallasTemperature můžeme zadávat níže uvedené jednoduché příkazy pro interakci se senzorem.
-
begin()
Funkce vyhledá připojené snímače na sběrnici a nastaví pro každý z nich bitové rozlišení (12 bitů). -
requestTemperatures()
Funkce odešle příkaz pro všechny snímače na sběrnici, aby provedly převod teploty. -
getTempCByIndex(deviceIndex)
Funkce přečte a vrátí údaj o teplotě ze snímače.deviceIndex
není nic jiného než umístění čidla na sběrnici. Pokud na sběrnici používáte pouze jeden snímač DS18B20, nastavte jej na 0.
Další užitečné funkce v knihovně DallasTemperature.h
Existuje několik užitečných funkcí, které můžete použít s objektem DallasTemperature. Několik z nich je uvedeno níže:
-
setResolution()
Funkce nastavuje rozlišení interního analogově-digitálního převodníku DS18B20 na 9, 10, 11 nebo 12 bitů, což odpovídá přírůstkům 0,5 °C, 0,25 °C, 0,125 °C a 0,0625 °C. -
bool getWaitForConversion()
Funkce vrací hodnotu příznaku waitForConversion. Může být užitečná, když chcete zkontrolovat, zda je převod teploty dokončen. -
setHighAlarmTemp()
&setLowAlarmTemp()
Funkce nastavuje interní alarmy vysoké & nízké teploty pro zařízení ve stupních Celsia. Platný rozsah je -55 až 125 °C. -
bool hasAlarm()
Funkce vrací true, pokud má zařízení alarmový stav, když teplota překročí nastavení vysokého & nízkého teplotního alarmu.