×

Uwaga

No Images or Galleries Found

Spis treści

Przygody z mikrokontrolerami ciąg dalszy. Przy okazji przedstawię inny ciekawy układ scalony - cyfrowy termometr DS18B20.

Układ DS18B20 to scalony cyfrowy sensor służący do pomiaru temperatury. Analogowe termometry elektroniczne są trudne do stosowania głównie ze względu na uciążliwą konieczność ich kalibracji, konieczne jest zastosowanie temperatur odniesienia 0 i 100 oC. Cyfrowy termometr DS18B20 nie wymaga żadnej kalibracji, wystarczy podłączyć go do komputera lub mikrokontrolera i z zastosowaniem odpowiednich poleceń można odczytywać temperaturę w zakresie od -55 do +125 oC z rozdzielczością 9 do 12 bitów.
Kolejną ważną zaletą tego czujnika jest sposób komunikacji z układem nadrzędnym. Wykorzystywany jest tu standard opracowany przez firmę Dallas Semiconductor, standard ten nosi nazwę 1-wire i jak sama nazwa wskazuje do transmisji danych wykorzystywany jest tylko jeden przewód. Do magistrali 1-wire możemy podłączyć praktycznie nieograniczoną ilość układów podrzędnych z których możemy odczytywać informacje. Każdy układ DS18B20 jak i inne układy tego typu ma unikalny 64-bitowy adres seryjny dzięki któremu po podłączeniu nawet kilkunastu układów do jednej magistrali możemy selektywnie odczytywać temperaturę z dowolnego czujnika.


Zdjęcie powyżej przedstawia wspomniany układ z przylutowanymi i zabezpieczonymi przewodami. Jak widać cały skomplikowany układ termometru został umieszczony w malutkiej obudowie TO-92 i wygląda zupełnie jak zwykły tranzystor. Jego trzy wyprowadzenia to: zasilanie, masa i oczywiście linia danych.


Zanim zacznę o sposobie podłączenia termometru do naszego mikrokontrolera powiem trochę więcej o interfejsie 1-wire. Interfejs ten został opracowany przez firmę Dallas Semiconductor (obecnie Maxim) i jest on przeznaczony do przesyłania informacji pomiędzy układem nadrzędnym master (mk) i układami podrzędnymi slave (np. termometry, układy identyfikacji, pamięci SRAM i EEPROM, programowalne klucze). Transmisja odbywa się w obu kierunkach z wykorzystaniem jednego przewodu sygnałowego (oprócz masy), który jednocześnie może być wykorzystany do zasilania układów do niego podłączonych. Dane przesyłane są z prędkością od bliskiej 0 do 16,3 kbps w trybie standard oraz do 115 kbps w trybie overdrive.

Każde z urządzeń podłączonych do magistrali musi mieć wyjście typu otwarty dren, a linia sygnałowa DQ jest połączona do zasilania przez rezystor podciągający o wartości około 5k. Zatem w stanie bezczynności linia DQ jest w stanie wysokim Proces odczytu wartości temperatury z DS18B20 nie jest niestety natychmiastowy, po wysłaniu przez mikrokontroler polecenia odczytu potrzeba 750 ms na dokonanie tzw. konwersji przez układ. W tym czasie linia danych jest bezczynna i jest w stanie wysokim, w czasie konwersji układ potrzebuje także najwięcej prądu. I tu pojawia się pewne rozwiązanie dla osób które chciały by zmniejszyć liczbę przewodów prowadzących do czujnika z trzech do dwóch.

Możemy pozbyć się przewodu zasilającego i bezkarnie podkradać prąd z linii danych. w tym celu musimy po prostu przy czujniku zewrzeć nóżkę zasilania z masą. Niestety w czasie konwersji prądu na linii danych może zabraknąć, by do tego nie dopuścić stosuje się tzw. strong pull up. Potrzeba wtedy zająć dodatkowy port mikrokontrolera i w momencie gdy dokonuje się konwersja za jego pomocą włączać tranzystor który mocno podciągnie linię danych do potencjału zasilania. Obrazuje to rysunek powyżej.

Myślę, że na razie wystarczy teorii, bierzemy płytkę testową z mikrokontrolerem ATtiny2313, nasz czujniczek i ładujemy program pozwalający odczytywać temperaturę z kostki i wyświetlać ją na wyświetlaczu LCD.

Termometr podłączyłem na początek zgodnie z pierwszym schematem, czyli stosując trzy przewody. Program napisany w języku Bascom z obszernymi komentarzami można pobrać poniżej:

Termometr jednopunktowy.bas

Niestety zmian do programu już raczej nie da się wprowadzić, gdyż zajmuje praktycznie całą dostępną w mikrokontrolerze ATtiny2313 przestrzeń pamięci. Niestety polecenia odczytu z magistrali 1-wire są bardzo rozbudowane i zżerają mnóstwo pamięci. Gdybyśmy chcieli żeby nasz mikrokontroler robił coś jeszcze poza odczytem temperatury musieli byśmy po prostu zamienić go na model z większą pamięcią programu. Niestety ogranicza nas jeszcze (przynajmniej mnie) darmowa wersja kompilatora środowiska Bascom, która nie pozwala załadować programu wynikowego większego od 2 kB.

Na szczęście program odczytujący z jednej kostki oraz procedura obsługi wyświetlacza LCD mieszczą się w dostępnej przestrzeni pamięci więc możemy się trochę pobawić.

Koniecznie trzeba też sprawdzić jak termometr mierzy w drugą stronę, trochę lodu z solą obniża nam temperaturę poniżej zera. Inną ciekawostką w tym projekcie jest zastosowanie pozytywowego wyświetlacza LCD, moim zdaniem ten typ jest dużo bardziej efektowny. W wyświetlaczu negatywowym (jak w projekcie obrotomierza) świeci tło a wyświetlane znaki przesłaniają światło, w rozwiązaniu pozytywowym świecą znaki a tło jest ciemne - super efekt zwłaszcza w nocy.

Mój termometr będę chciał na stałe zamontować w kuchni do mierzenia temperatury na zewnątrz budynku, w tym celu wykonam nową płytkę PCB i wszystko umieszczę w uniwersalnej obudowie. Nie będę publikował schematu elektrycznego całości bo jest on identyczny jak w poprzednim projekcie ze zmianą polegającą na podłączeniu do portu PD.5 mikrokontrolera linii DQ czujnika z zastosowaniem rezystora podciągającego, wszystko wg. schematu powyżej. Zmianie uległo też zasilanie, do płytki PCB dołożyłem mostek prostowniczy wraz z kondensatorem filtrującym tak by płytkę można było zasilać bezpośrednio z transformatora sieciowego.

A powyżej nowa mozaika ścieżek dla płytki PCB, w którą wlutujemy wszystkie elementy, przygotowałem też projekt gotowy do wydruku w pliku .pdf do pobrania poniżej:

Termometr1p.pdf


Na zdjęciu powyżej przygotowana metodą termotransferową płytka w kąpieli trawiącej, więcej informacji na temat wykonywania płytek drukowanych znajdzie się w dziale Warsztat elektroniki.