KKM: DS18B20 VODOOTPORNI DIGITALNI TERMOMETAR

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