Termometr DS18b20

Jaka jest jedna z pierwszych informacji które chcemy usłyszeć po przebudzeniu? Oczywiście temperatura za oknem. Dzięki temu wiemy co na siebie włożyć. W przypadku np. akwarystyki temperatura jest bardzo istotną rzeczą (zwłaszcza przy bardziej wymagających rybach / krewetkach itp). Do sprawdzania temperatury w akwarium służy termometr DS18b20.

Takie termometry (DS18b20) można kupić na wszelkiego rodzaju aukcjach i są dostępne w dwóch wersjach. Pierwsza to wersja do wlutowania w płytkę (można ją spokojnie zmontować np. w obudowie sterownika, żeby monitorować w nim temperaturę.

DS18b20Wersja ta która została przedstawiona powyżej średnio nadaje się do kontaktu z wilgocią. Można to jednak zrobić izolując nóżki rurkami termokurczliwymi oraz nakładając na całość długą rurkę termokurczliwą tak, żeby wystawał tylko sam koniec termometru. Można tez użyć metalowej rurki i żywicy – zabezpieczy to kabel i piny przed zwarciem. Poniższe zdjęcie pokazuje właśnie taki termometr.

Drugim znacznie łatwiejszym sposobem jest użycie termometru DS18b20 w już zrobionej obudowie wodoodpornej. Także na aukcjach bez problemu dostępny – minimalnie droższy ale licząc czas potrzebny na uszczelnienie połączeń oraz kabel jest to wydatek jak najbardziej rozsądny. są one dostępne w kilku długościach (nawet do 10m) więc bez problemu można dopasować długość do potrzeb.

ds18b20

Do połączenia potrzeba 3 kabli oraz jednego rezystora 4,7kOhm.  Sposób podłączenia przedstawia poniższy schemat.

DS18b20

Jak widać sposób podłączenia do arduino jest prosty (tak jak większość rzeczy związanych z Arduino). Skoro mamy podłączone wszystko wypadało by zainstalować program, biblioteki oraz wgrać przykładowy skrypt. Biblioteki i program dostępne są w dziale programy. Natomiast sposób grywania skryptu do programu jest dostępny tutaj. Poniższy skrypt jest jednym z krótszych i łatwiejszych.

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup()
  {
    Serial.begin(9600);
    sensors.begin();
  }
void loop()
  { 
    sensors.requestTemperatures();
    Serial.print(sensors.getTempCByIndex(0)); 
    Serial.println("C"); 
    delay(1000);
    //site mn-tech.pl
    //youtube https://www.youtube.com/user/mntechpl
    //facebook https://www.facebook.com/mntechpl
  }

Powyższy program wyświetla informacje o aktualnej temperaturze na serial monitorze w odstępach co około sekundę. Dokładność pomiaru w tym przypadku wynosi 2 miejsca po przecinku. W przypadku serial monitora nie ma problemu jeśli chodzi o miejsce. Czasem jednak chcemy wyświetlić temperaturę na małym wyświetlaczu gdzie każda kratka jest cenna. Czasami także nie ma potrzeby wyświetlania temperatury z 1 czy też dwoma miejscami po przecinku. Można skrócić informacje wyświetlane za pomocą jednej (dobrej 😛 ) zmiany.

W linijce poniżej

  Serial.print(sensors.getTempCByIndex(0)); 

trzeba dopisać tylko ,X gdzie x to ilość miejsc po przecinku. Będzie wyglądało to następująco:

  Serial.print(sensors.getTempCByIndex(0),1); 

dla jednego miejsca po przecinku (domyślnie są dwa) oraz:

  Serial.print(sensors.getTempCByIndex(0),0); 

dla braku miejsc po przecinku. Oczywiście możemy napisać nawet ,20 i wtedy będziemy mieli 20 miejsc po przecinku. Pytanie tylko po co?

Kilka termometrów

Zdarza się także, że mając duży zbiornik albo kilka miejsc w których chcemy monitorować temperaturę istnieje potrzeba podłączenia kilku czujników. Wbrew pozorom nie potrzeba wtedy używać dodatkowych pinów. Jako że każdy z termometrów jest adresowalny można w jeden szereg wpiąć dodatkowy termometr DE18b20 (termometry) i wszystko działa tak jak do tej pory. Połączenie wygląda następująco:

DS18b20

Natomiast kod sam w sobie praktycznie się nie zmienia. Poniższy kod jest dostosowany dla schematu pokazanego powyżej. 

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup()
  {
    Serial.begin(9600);
    sensors.begin();
  }
void loop()
  { 
    sensors.requestTemperatures();
    Serial.print(sensors.getTempCByIndex(0)); 
    Serial.print("C "); 
    Serial.print(sensors.getTempCByIndex(1)); 
    Serial.println("C "); 
    delay(1000);
    //site mn-tech.pl
    //youtube https://www.youtube.com/user/mntechpl
    //facebook https://www.facebook.com/mntechpl
  }

Pogrubione wiersze zostały dopisane / zmienione. Można porównać je z kodem pokazanym na początku. W ten sposób dopisując kolejne linijki:

    Serial.print(sensors.getTempCByIndex(X)); 
    Serial.print("C "); 

(gdzie X to kolejny numer termometru) możemy dopinać kolejne termometry.

Warto pamiętać że dołożenie kolejnego czujnika może zmienić ich kolejność (mają różne adresacje i mogą się zmienić kolejnością). Więc jeśli macie urządzenia (przekaźniki itp) działające z danymi termometrami trzeba to sprawdzić. Najłatwiej najpierw podłączyć wszystkie termometry a dopiero potem dopinać pod dane odczyty inne moduły.

Oczywiście istnieją inne sketche, które pozwalają na odczyt adresu termometru i ich identyfikację. Ma to zastosowanie zwłaszcza, jeśli zaistniała by potrzeba użycia kilkunastu / kilkudziesięciu czujników. W przypadku, kiedy mamy 1 albo 2 termometry zaraz obok nas łatwo można zidentyfikować który jest który i odpowiednio je umiejscowić. Poza tym poradniki te są pisane dla osób, które są początkujące a nie dla zaawansowanych użytkowników.

Za pomocą termometru można w prosty sposób zbudować termostat który został dokładnie opisany w artykule na stronie.

Film pokazujący działanie termostatu