KKM: DS18B20 vodootporni digitalni termometar

Početnik si s Croduinom. Ili s elektronikom? Za oko ti je zapeo određeni modul, ali ne znaš kako ga koristiti? Bez brige, tu je KKM! Kako Koristiti Module (KKM) je serija blog tutorijala e-radionice na kojoj ćeš pronaći sve što ti treba kako bi započeo rad sa svojim omiljenim modulom. Tutorijali obuhvaćaju: tehničke karakteristike, princip rada, upute kako povezati modul s Croduinom te osnovni kod. Sve ostalo prepuštamo tebi na maštu.

Uvod

 
U ovome tutorijalu pozabavit ćemo se vodootpornim digitalnim termometrom tvrtke Maxim Integrated koji je zbog svojih funkcionalnosti postao veoma popularan u Maker zajednicama diljem svijeta. Prethodno je kalibriran na Celzijusovu ljestvicu, a maksimalna pogreška temperature na opsegu od -10°C do +85°C je +/-0,5°C dok je maksimalni mjerni raspon između -55°C i +125°C. Osim dobre preciznosti i velikog mjernog raspona, ovaj termometar ima mogućnost mijenjanja rezolucije mjerenja, postavljanje alarma i parazitnog napajanja. Ovakav senzor najčešće se koristi u industriji, potrošačkoj elektronici i temperaturno osjetljivim sustavima.
 

 

Karakteristike:
Napon napajanja: 3,3-5V
Raspon mjerenja: -55°C do +125°C
Pogreška mjerenja: +/-0,5°C
Rezolucija mjerenja: 9-12 bita
Komunikacija: One-wire
Broj senzora na sabirnici: 127
Duljina žice: 100 cm

Kako radi?

 
Pogledamo li u datasheet ovog uređaja primijetit ćemo blok dijagram koji se čini nešto složenijim u odnosu na ostale temperaturne senzore, a razlog tome su dodatne funkcionalnosti.
 

 
Uređaj može imati posebno vanjsko napajanje ili se može napajati parazitnim putem pomoću podatkovne linije o čemu će biti više riječi u posebnom tutorijalu.
 
Budući da na istoj podatkovnoj liniji imamo više uređaja s kojima naš mikrokontroler može komunicirati, mora postojati način na koji ćemo osigurati da u svakom trenutku samo jedan uređaj "priča". Kako bi se osigurala pouzdana komunikacija koristi se One-Wire protokol zbog kojega svi uređaji koji ga koriste imaju jedinstvenu 64-bitnu adresu pomoću koje se adresira pojedini uređaj na sabirnici.
 
Preciznost mjerenja možemo podesiti na 9, 10, 11 ili 12 bita. Ovu vrijednost podesiti ćete ovisno o tome što vam je bitnije, brže očitanje temperature ili preciznost. Primjerice, odaberemo li 12 bita dobiti ćemo najveću preciznost, ali najsporije vrijeme očitanja, čak 750 milisekundi.
 
U blok dijagramu možemo još primijetiti dva registra predviđena za alarme u koje se upisuje granična vrijednost temperature. Jedan registar je za donji limit, a drugi za gornji. Ova mogućnost koristi se pri realizaciji zaštitnih funkcija. Primjerice, ako želite zaštititi neki uređaj od pregrijavanja u registar gornjeg limita upisati ćete maksimalnu temperaturu uređaja kojeg štitite. Ako vaš uređaj prijeđe navedenu temperaturu ovaj termometar će generirati alarm kojega će mikrokontroler detektirati i poduzeti određene mjere.
 
Kada mikrokontroler da naredbu za očitanje temperature, termometar se budi iz stanja mirovanja (idle) i započinje mjerenje. Po završetku mjerenja iznos temperature se sprema u memoriju (Scratchpad) i termometar odlazi u mirovanje kako bi smanjio potrošnju energije.
 

Kako povezati?

 
Povezivanje je vrlo jednostavno budući da trebamo povezati samo tri žice i jedan otpornik od 4,7kΩ. Crvenu žicu sa termometra spajamo na napajanje croduina od +5V, a crnu žicu spajamo na GND. Podatkovnu žicu možemo spojiti na bilo koji digitalni pin. Između podatkovne žice i +5V potrebno je spojiti pull up otpornik. Mi smo u ovom primjeru odabrali digitalni pin 1 kojega ćemo kasnije koristiti u programskom kodu. Shema spoja prikazana je sljedećom slikom.
 

 

Arduino kod

 
Kako se ne bismo zapetljali u programiranju One-Wire protokola koristit ćemo dvije biblioteke OneWire i DallasTemperature. Ukoliko ne znate kako instalirati biblioteku pročitajte naš tutorijal.
 

#include "OneWire.h"
#include "DallasTemperature.h"
#define ONE_WIRE_BUS 1 //digitalni pin na kojeg su spojeni senzori
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#define nu 1 //ako spajate više od jednog senzora potrebno je promijeniti broj
uint8_t deviceCount = 0;
struct
{
int id;
DeviceAddress addr;
} T[nu];
void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}
void setup(void)
{
Serial.begin(9600);
sensors.begin();
// provjerava koliko uređaja ima na sabirnici
deviceCount = sensors.getDeviceCount();
Serial.print("#uredaja: ");
Serial.println(deviceCount);
for (uint8_t index = 0; index < deviceCount; index++)
{
// prođi kroz sve senzore
sensors.getAddress(T[index].addr, index);
T[index].id = sensors.getUserData(T[index].addr);
}
for (uint8_t index = 0; index < deviceCount; index++)
{
Serial.println();
Serial.println(T[index].id);
printAddress(T[index].addr);
Serial.println();
}
Serial.println();
}
void loop(void)
{
Serial.println();
sensors.requestTemperatures();
Serial.println("\tDohvati temperature ");
for (int i = 0; i < nu; i++)
{
Serial.print("\t temp:\t");
Serial.println(sensors.getTempC(T[i].addr));
}
delay(1000);
}

2 thoughts on “KKM: DS18B20 vodootporni digitalni termometar”

  • Mihael

    Ja sam kopirao i sve spojio kako ste rekli, ali mi je output -127C

    Reply
    • David Zovko
      David Zovko 12.06.2018 at 10:13

      Pozdrav Mihael, molim te da postaviš pitanje na našem forumu pa tamo brzo stiže odgovor: http://forum.e-radionica.com/hr/viewforum.php?f=8

      Reply
Leave a Reply