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