DS18B20 to bardzo popularny czujnik temperatury ze względu na cenę i prostotę użytkowania. Korzysta z magistrali 1-wire pozwalającej podłączyć wiele czujników do jednego PINu mikrokontrolera. Dodatkowo czujniki mogą być zasilane w trybie pasożytniczym co pozwala na zredukowanie liczby kabli połączeniowych do dwóch (sygnałowy 1-wire i GND) mimo tego, że czujniki posiadają 3 wyprowadzenia.
Czujnik może pracować z rozdzielczością 9 lub 12 bitów czyli z dokładnością do odpowiednio 0,5°C i 0,0625°C. Wydaje się jednak, że rozdzielczość 12 bitów jest raczej mało przydatna ze względu na dokładność pomiaru czujnika rzędu +/-0,5°C co oznacza, że wynik który otrzymamy może odbiegać od rzeczywitości o 0,5°C zarówno w górę jak i w dół. Prócz tego pomiar z rodzielczością 12 bitów trwa dłużej. Niestety zwykle błąd pomiaru takiego czujnika jest jeszcze większy więc trzeba mieć na uwadze, że średnio nadaje się do projektów gdzie ważny jest bardzo dokładny pomiar temperatury. Zalres temperatur w jakich czujnik może pracować to od -55° do 125°C przy czym dla temperatur z zakresu poza -10°C do +85°C dokładność pomiary wynosi +/- 2°C.

Ponieważ nóżka DQ jest wyjściem typu "otwarty dren" może nadawać albo sygnał "niski" albo "niepodłączony". By kontoler mógł widzieć różnicę między tymi stanami musimy sprawić by sygnał "niepodłączony" był sygnałem "wysokim". Osiągnąć to można poprzez podłączenie nóżki DQ przez rezystor podciągający (4,7kΩ) do zasilania. Rezystor sprawi, że jeżeli na przewodzie nie będzie stanu "niskiego", to od razu pojawi się stan "wysoki".
Przy połączeniu pasożytniczym należy połączyć VDD czujnika z GND czujnika. Nie ma potrzeby dołączania zasialania do VDD.
W przypadku kiedy do magistrali ma być podpięta większa ilość czujników lub długość kabla będzie większa niż kilka metrów, może zajść potrzeba zmniejszenia wartości rezystora odciągającego. Przy standardowych warunkach rezystor 4,7kΩ zapewnia przepływ prądu wynosił między 1mA a 4mA, dobierając inny należy kierować się tym by zapewnić właśnie taki przepływ.
Do jednej magistrali można podłączyć kilka czujników w związku z tym trzeba je jakoś odróżniać. Każdy czyjnik ma nadany przez producenta numer seryjny składający się z ośmiu bajtów. Numery seryjne podłączonych czujników można używając poniższego kodu.
#include<OneWire.h>
#define ONEWIRE_PIN = 3;
OneWire onewire(ONEWIRE_PIN);
void setup() {
while(!Serial);
Serial.begin(9600);
}
void loop() {
byte address[8];
onewire.reset_search();
while(onewire.search(address)) {
if(address[0] != 0x28)
continue;
if(OneWire::crc8(address, 7) != address[7]) {
Serial.println("Blad w sumie kontrolnej - problem z magistrala/czujnikami");
break;
}
for (byte i=0; i<8; i++) {
Serial.print("0x");
Serial.print(address[i], HEX);
if (i<7)
Serial.print(", ");
}
Serial.println();
}
while(1);
}
#include<OneWire.h>
#include<DS18B20.h>
#define ONEWIRE_PIN = 3;
// Adres czujnika
byte address[8] = {0x28, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1};
OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);
void setup() {
while(!Serial);
Serial.begin(9600);
// Inicajalizacja obiektu do obsługi czujników, 9 oznacza ustawienie rozdzielczości na 9 bitów.
sensors.begin(9);
// Wydanie poniższego polecenia zleca czujnikowi o zadanym adresie zmierzenie temperatury.
// Użycie request() bez adresu zleca pomiar wszystkim czujnikom.
sensors.request(address);
}
void loop() {
// Funkcja sensors.available() pozwala stwierdzić czy czujnik jest już gotowy do zwrócenia wyniku, jeśli nie jest to można dalej wykonywać program.
// Może to mieć znaczenie dla działania programu ponieważ sam pomiar temperatury może trwać nawet do 750ms.
if (sensors.available()) {
float temperature = sensors.readTemperature(address);
Serial.print(temperature);
Serial.println("C");
sernsors.request(address);
}
}