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);
}