Jednym z najprostszych i niedrogich sposobów dodania czujnika temperatury do projektu Arduino jest użycie DS18B20 1-Wire Temperature Sensor. Czujniki te są dość precyzyjne i nie potrzebują żadnych zewnętrznych komponentów do pracy. Tak więc, z zaledwie kilkoma połączeniami i odrobiną kodu Arduino będziesz wykrywał temperaturę w mgnieniu oka!
DS18B20 1-Wire Temperature Sensor
DS18B20 jest czujnikiem temperatury z interfejsem 1-Wire produkowanym przez Dallas Semiconductor Corp. Unikalny interfejs 1-Wire® wymaga tylko jednego cyfrowego pinu do dwukierunkowej komunikacji z mikrokontrolerem.
Czujnik jest dostarczany zazwyczaj w dwóch formach. Jeden, który jest dostarczany w opakowaniu TO-92 wygląda dokładnie jak zwykły tranzystor. Drugi to wodoodporna sonda, która może być bardziej przydatna, gdy trzeba zmierzyć coś daleko, pod wodą lub pod ziemią.
DS18B20 temperature sensor jest dość precyzyjny i nie potrzebuje żadnych zewnętrznych komponentów do pracy. Może mierzyć temperatury z zakresu od -55°C do +125°C z dokładnością ±0,5°C.
Rozdzielczość czujnika temperatury jest konfigurowana przez użytkownika na 9, 10, 11 lub 12 bitów. Jednak domyślną rozdzielczością przy włączaniu zasilania jest 12 bitów (tj. precyzja 0,0625°C).
Czujnik może być zasilany napięciem od 3V do 5,5V i pobiera tylko 1mA podczas aktywnej konwersji temperatury.
Tutaj pełna specyfikacja:
Zasilanie | 3V do 5.5V |
Zużycie prądu | 1mA |
Zakres temperatur | -55 do 125°C |
Dokładność | ±0.5°C |
Rozdzielczość | 9 do 12 bitów (do wyboru) |
Czas konwersji | < 750ms |
Multiple DS18B20 On Single Bus
Jedną z największych zalet DS18B20 jest to, że wiele DS18B20 może współistnieć na tej samej magistrali 1-żyłowej.przewodowej magistrali. Ponieważ każdy DS18B20 ma fabrycznie wypalony unikalny 64-bitowy kod seryjny, łatwiej jest je od siebie odróżnić.
Ta cecha może być ogromną zaletą, gdy chcemy sterować wieloma DS18B20 rozmieszczonymi na dużym obszarze.
Aby dowiedzieć się, jak odczytać temperaturę z wielu czujników temperatury DS18B20, sprawdź ten poradnik.
DS18B20 Sensor Pinout
GND to pin masy.
DQ to magistrala danych 1-Wire powinna być podłączona do pinu cyfrowego mikrokontrolera.
VDD to pin zasilający czujnik, który może być pomiędzy 3.3 a 5V.
Podłączenie czujnika temperatury DS18B20 do Arduino
Dość teorii, przejdźmy do praktyki! Podłączmy DS18B20 do Arduino.
Podłączenia są dość proste. Zacznij od podłączenia VDD do pinu 5V out na Arduino i GND do masy.
Następnie podłącz pozostały pin sygnału cyfrowego DQ do pinu cyfrowego 2 na Arduino. Będziesz musiał również dodać rezystor podciągający 4,7k pomiędzy pinem sygnałowym a pinem zasilania, aby utrzymać stabilny transfer danych. (wewnętrzne podciąganie w arduino nie działa)
Bądź ostrożny, aby umieścić DS18B20 we właściwy sposób. Jeśli umieścisz go w niewłaściwy sposób, nagrzeje się i pęknie.
Jeśli używasz wodoodpornej wersji DS18B20, podłącz czerwony pasek do 5V, czarny do masy, a żółty to dane, które idą do cyfrowego pinu 2 w arduino. Nadal musisz podłączyć rezystor podciągający 4,7K od danych do 5V.
Instalacja biblioteki dla DS18B20
Protokół Dallas 1-Wire jest nieco skomplikowany i wymaga mnóstwa kodu do zrozumienia komunikacji. Aby ukryć tę niepotrzebną złożoność, zainstalujemy bibliotekę DallasTemperature.h, tak abyśmy mogli wydawać proste polecenia w celu uzyskania odczytów temperatury z czujnika.
Aby zainstalować bibliotekę przejdź do Sketch > Include Library > Manage Libraries…Poczekaj aż Library Manager pobierze indeks bibliotek i zaktualizuje listę zainstalowanych bibliotek.
Filtruj wyszukiwanie wpisując 'ds18b20′. Powinno pojawić się kilka wpisów. Poszukaj DallasTemperature by Miles Burton. Kliknij na ten wpis, a następnie wybierz Install.
Ta biblioteka Dallas Temperature jest biblioteką specyficzną dla sprzętu, która obsługuje funkcje niższego poziomu. Musi być sparowana z biblioteką One Wire Library, aby można było komunikować się z dowolnym urządzeniem jednoprzewodowym, nie tylko z DS18B20. Zainstaluj także tę bibliotekę.
KodArduino
Poniższy szkic pozwoli Ci w pełni zrozumieć, jak odczytywać temperaturę z czujnika temperatury DS18B20 i może służyć jako podstawa do bardziej praktycznych eksperymentów i projektów.
#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);}
Tak wygląda wyjście w monitorze szeregowym.
Kod objaśniający:
Szkic rozpoczynamy od włączenia bibliotek OneWire.h i DallasTemperature.h oraz zadeklarowania pinu Arduino, do którego podłączony jest pin sygnałowy czujnika.
#include <OneWire.h>#include <DallasTemperature.h>#define ONE_WIRE_BUS 2
Następnie tworzymy obiekt OneWire, przekazując pin sygnałowy czujnika do jego konstruktora. Ten obiekt one-wire pozwala nam na komunikację z dowolnym urządzeniem one-wire, nie tylko z DS18B20. W celu komunikacji z czujnikiem DS18B20, musimy utworzyć obiekt biblioteki DallasTemperature i przekazać referencję obiektu one-wire jako parametr.
OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);
Po utworzeniu obiektu DallasTemperature, możemy wydać poniższe proste polecenia do interakcji z czujnikiem.
-
begin()
funkcja wyszukuje podłączone czujniki na magistrali i ustawia rozdzielczość bitową (12 bitów) dla każdego z nich. -
requestTemperatures()
funkcja wysyła polecenie do wszystkich czujników na magistrali, aby dokonały konwersji temperatury. -
getTempCByIndex(deviceIndex)
funkcja odczytuje i zwraca odczyt temperatury z czujnika.deviceIndex
to nic innego jak lokalizacja czujnika na magistrali. Jeżeli używasz tylko jednego czujnika DS18B20 na magistrali, ustaw go na 0.
Inne przydatne funkcje w bibliotece DallasTemperature.h
Istnieje kilka przydatnych funkcji, które można wykorzystać z obiektem DallasTemperature. Kilka z nich wymieniono poniżej:
-
setResolution()
funkcja ustawia rozdzielczość wewnętrznego przetwornika analogowo-cyfrowego DS18B20 na 9, 10, 11 lub 12 bitów, co odpowiada przyrostom odpowiednio o 0,5°C, 0,25°C, 0,125°C i 0,0625°C. -
bool getWaitForConversion()
funkcja zwraca wartość flagi waitForConversion. Może być przydatna, gdy chcemy sprawdzić, czy konwersja temperatury została zakończona. -
setHighAlarmTemp()
&setLowAlarmTemp()
funkcja ustawia wewnętrzne alarmy wysokiej & niskiej temperatury dla urządzenia w stopniach Celsjusza. Ważny zakres to -55 do 125°C -
bool hasAlarm()
funkcja zwraca wartość true, jeżeli urządzenie ma stan alarmowy, gdy temperatura przekracza ustawioną temperaturę wysokiego & niskiego alarmu.