W dzisiejszej części kursu o Arduino dowiesz się jak odczytywać temperaturę z cyfrowego termometru DS18B20 firmy Dallas. Zapraszam
Co będziesz potrzebować do dzisiejszej części kursu:
- Ardunio
- Termometr Dallas DS18B20
- rezystor 4,7k ohm
- Wyświetlacz LCD HD44780 (opcjonalnie terminal)
- Buzzer 5V
- Zestaw przewodów połączeniowych
- Biblioteki dla termometru oraz OneWire
Dokładność odczytu
Z noty katalogowej tego czujnika/ termometru DS18B20 możemy się dowiedzieć, o takiej opcji jak wybór rozdzielczości (czyt. dokładnością) odczytu temperatury. Rozdzielczość możemy zmieniać w zakresie od 9-12bitów. Standardowo w tych bibliotekach ustawiona jest rozdzielczość 12-bitów.
W dużym skrócie oznacza to tyle, że dla Rozdzielczość 9-bitowa zwracałaby nam wartości z dokładnością 0,5*C :
- 0,0
- 0,5
Natomiast 12-bitowa z dokładnością 0.0625*C :
- 0,0
- 0,0625
- 0,125
- 0,1875
- 0,25
- 0,3125
- 0,375
- 0,4375
- 0,5
- 0,5625
- 0,625
- 0,6875
- 0,75
- 0,8125
- 0,875
- 0,9375
Ponadto sam czujnik mierzy z dokładnością +/- 0.5*C oznacza to tyle, że wartość otrzymanej temperatury może być 0,5 stopnia za duża albo za mała
Sposoby podłączenia czujnika do Arduino
Czujnik DS18B20 można podłączyć na dwa sposoby.
Pierwszy sposób, zwykły podłączenie czujnika do linii +5V, GND, DATA:
Drugi sposób, pasożytniczy, podłączenie czujnika za pomocą linii GND,DATA:
O ile pierwszy sposób jest zrozumiały o tyle w drugim warto wspomnieć na jakiej zasadzie działa wtedy czujnik. Jak każde urządzenie potrzebne jest zasilanie, aby mogło działać. W tym przypadku może się wydawać, że czujnik nie otrzymuje napięcia bo nie doprowadziliśmy linii +5V do niego. Nic bardziej mylnego, jakby to powiedział sławny youtuber. Napięcie ten czujnik, w takim połaczeniu pobiera z linii danych, dlatego jest to pasożytniczy sposób podłączenia.
Instalacja bibliotek
Zanim przystąpimy do jakichkolwiek prac to musimy do naszego środowiska Arduino wgrać dwie biblioteki: jedną obsługującą termometr oraz drugą obsługującą transmisję 1-Wire. Możesz je pobrać z punktu 6. Następnie rozpakuj paczkę i dwa foldery „Dallas” i „OneWire” wklej Arduino\libraries albo do folderu libraries ze wszystkimi szkicami (jeżeli nie masz takiego folderu to możesz go samemu stworzyć). Przedstawiłem ten sposób instalacji, ponieważ na nowszych wersjach Arduino, nie mogłem wgrać tych bibliotek po przez managera w Arduino IDE.
Gdy już mamy wgrane biblioteki to mogę przejść do opisu najważniejszych funkcji do obsługi naszego termometru.
Najważniejsze funkcje
Podstawowe funkcje
W tym punkcie przedstawię wszystkie funkcję, które będziemy potrzebować do uruchomienia czujnika.
Dołączenie bibliotek:
1 2 |
#include <OneWire.h> //dodaj biblitekę LiquidCrystal.h #include <DallasTemperature.h> //dodaj biblitekę LiquidCrystal.h |
Pierwsza biblioteka- OneWire służy do obsługi komunikacji 1-Wire. Jest ona uniwersalna dla wszystkich urządzeń korzystających z tego typu transmisji. Druga biblioteka DallasTemperature służy do odczytu danych z najpopularniejszych czujników firmy Dallas, m.in. DS18B20.
Wywołanie transmisji 1-Wire:
1 2 |
OneWire oneWire(pin); //wywołujemy transmisję 1-Wire na pinie 10 //pin- pin przy pomocy, którego chcemy utworzyć transmisję 1-Wire |
Przy pomocy tej funkcji jesteśmy w stanie poinformować Arduino, że chcemy korzystać z transmisji 1-Wire. W nawiasie podajemy numer pinu, bądź alias przy pomocy którego będzie realizowana owa transmisja.
Gdy już ustaliliśmy, że chcemy korzystać z 1-Wire to musimy również poinformować Arduino, że przy jego chcemy komunikować się z czujnikiem:
1 2 |
DallasTemperature sensors(&oneWire); //informujemy Arduino, ze przy pomocy 1-Wire //chcemy komunikowac sie z czujnikiem |
Konfiguracja czujnika gotowa. Teraz musimy rozpocząć transmisję danych z czujnika do Arduino przy pomocy 1-Wire. Z pomocą przychodzi nam funkcja:
1 |
sensors.begin(); //rozpocznij odczyt z czujnika |
Jak już nasz czujnik otrzymał informację, że chcemy się z nim komunikować to musimy jeszcze go poinformować, że chcemy aby wysyłał do nas dane. Aby tego dokonać to musimy użyć funkcji:
1 |
sensors.requestTemperatures(); //zazadaj odczyt temperatury z czujnika |
Teraz gdy już odebraliśmy naszą temperaturę to pozostało ją wyświetlić przy pomocy funkcji:
1 2 3 |
sensors.getTempCByIndex(nr_czujnika) //nr_czujnika- jeżeli masz jeden to wpisujesz 0, dla następnych //czujników 1,2,3... |
Jak widać cały proces jest dosyć blokowy. Rozpocznij transmisję > pobierz dane > Wyświetl dane.