KKM: DS18B20 VODOOTPORNI DIGITALNI TERMOMETAR

Početnik si s Dasduinom. 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 tvrtke soldered 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 Dasduinom 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 Dasduina 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);
}