Budowa układu
Układ zbudowany został w oparciu o mikrokontroler jednoukładowy PIC16F876A, którego większość wyprowadzeń steruje siedmiosegmentowym wyświetlaczem LCD 3 i 1/2 cyfry. Schemat układu znajduje się na rysunku 1.
Przy założeniu, że ostatnia pozycja wyświetla znak C (stopnie Celsjusza), taka architektura wyświetlacza pozwala pokazać maksymalnie liczbę 199 (tylko liczby całkowite). To w zupełności wystarcza, jeśli weźmie się pod uwagę fakt, że użyty czujnik DS18B20 mierzy temperaturę maksymalnie do +125°C.
Oczywiście zastosowanie graficznego wyświetlacza LCD umożliwiłoby stworzenie grafiki nieporównanie estetyczniejszej, ale układ z założenia miał być zasilany baterią 3 V typu CR2032 i pobór prądu okazał się czynnikiem decydującym przy wyborze wyświetlacza. Pod tym względem siedmiosegmentowy panel LCD jest nie do pokonania.
Poza wyświetlaczem do mikrokontrolera podłączony jest przycisk push-button, w którym jako rezystor podciągający zastosowany został wewnętrzny pull-up mikrokontrolera. Ponadto zastosowano sygnalizator piezoelektryczny bez wbudowanego generatora. Równolegle do sygnalizatora podłączony został natomiast rezystor, który „łagodzi” charakter pojemnościowy tego obciążenia i stanowi element opcjonalny – przy niektórych typach sygnalizatorów nie jest konieczny.
Osobnego omówienia wymaga linia resetująca układ – obwód RC podłączony do portu MCLR mikrokontrolera wykonany wg noty katalogowej Microchip. Z tym wejściem wiąże się pewien problem: przy zasilaniu napięciem 3 V nie działa poprawnie wewnętrzny układ POR (Power On Reset) mikrokontrolera i dopiero dołączenie R2, R3 oraz C6 zapewnia poprawny start układu w chwili włączenia napięcia zasilania.
Zewnętrzny, hermetyczny czujnik temperatury typu DS18B20 podłączony jest przez gniazdo tak, aby w łatwy sposób można go było odłączyć np. do mycia. Mikrokontroler ma zaimplementowaną programowo obsługę szyny komunikacyjnej 1-Wire na pinie 5. Jeśli ktoś korzystał jedynie z gotowych bibliotek do Arduino dla takiego czujnika temperatury, proponuję pochylić się nieco nad jego protokołem transmisji danych, co pozwoli bardziej docenić pracę wykonywaną przez „anonimowych” twórców bibliotek. Jak to zwykle bywa: fakt, że coś wydaje się proste, może okazać się dowodem, jak bardzo nie doceniamy danego zagadnienia. Dość ścisłe wymagania czasowe obsługi portu 1-Wire oraz różnorodność wyboru instrukcji sterujących czujnikiem DS18B20 mogą stanowić wyzwanie dla wielu początkujących programistów. Przy budowaniu własnych systemów warto się z tymi tematami zapoznać.
Linia danych czujnika podciągnięta została do poziomu wysokiego przez rezystor R1 (4,7 kΩ). Na płytce PCB znalazło się miejsce na ten rezystor, ale ja proponuję zamontować go we wtyczce czujnika, tak aby mikrokontroler w łatwy sposób mógł wykrywać obecność czujnika temperatury. Zasilanie wspomnianego sensora podłącza się przez tranzystor T1, który z kolei jest sterowany z poziomu mikrokontrolera przez port RA2. Chodzi o to, aby nie tracić energii z baterii. Czujnik zasilany jest periodycznie. Tuż przed pomiarem temperatury zasilanie ulega załączeniu, natomiast po odczytaniu zmierzonej wartości mikrokontroler ponownie odcina je od czujnika.
Wyświetlacz LCD (rysunek 2) podłączony jest do mikrokontrolera, który steruje jego pracą. Należy pamiętać, że jest to wyświetlacz bez wbudowanego sterownika, stąd trzeba zapewnić na jego wyprowadzeniach odpowiednie sygnały. W przypadku tego typu wyświetlaczy są to przebiegi prostokątne występujące zarówno na poszczególnych elektrodach segmentowych (rysunek 3), jak i na wyprowadzeniu wspólnym wszystkich segmentów (COM – pin nr 1 wyświetlacza).
Na segmentach, które nie są aktywne, powinien znajdować się taki sam przebieg, jak na wejściu COM (w fazie), a na segmentach aktywnych (np. segmentach 3A, 3D, 3E, 3F tworzących literę C – stopnie Celsjusza) musi znaleźć się przebieg z portu COM w odwróconej fazie (rysunek 4). Nieco „ekwilibrystyki” wymaga zapewnienie, aby statycznie wyświetlana wartość na wyświetlaczu miała odpowiednie przebiegi o częstotliwości „niewidzialnej” dla oka ludzkiego. Wszystkie nieużywane segmenty wyświetlacza (dwukropek, AC itp.) są połączone wspólnie do pinu COM. Pozostawienie ich „w powietrzu” mogłoby spowodować aktywowanie segmentu na skutek gromadzenia się ładunku elektrostatycznego.
Układ włączany jest przełącznikiem bistabilnym SW1, odcinającym całkowicie baterię od układu. Kondensator C5, podłączony do baterii przed włącznikiem, przejmuje na siebie „udar” prądowy włączanego urządzenia.
Układ pracujący w trybie minutnika pobiera z baterii około 620 μA, co – przy założeniu, że bateria ma około 200 mAh pojemności – powinno wystarczyć na 322 godziny pracy układu. W trybie pracy termometru sytuacja nieco się komplikuje z uwagi na periodyczne zmiany pobieranego prądu, związane z włączaniem czujnika temperatury i transmisją danych. Wystarczy spojrzeć na przebieg prądu umieszczony na rysunku 5. Zadając sobie nieco trudu, można wyliczyć, że średni prąd wynosi w tym przypadku około 900 μA, co wystarcza na 222 godziny pracy przy zastosowaniu takiej samej baterii.
Program
Program napisany został w asemblerze. Używa on przerwań od timera, w których generuje przebiegi niezbędne do odświeżania wyświetlacza LCD – zgodnie z dokonanym pomiarem temperatury. Przerwanie od timera występuje co 40 ms. Jest to wartość graniczna uwzględniająca bezwładność oka ludzkiego i powinna być nieco wyższa, jednak wybór właśnie tej częstotliwości podyktowany był poszukiwaniem wartości wygodnej do obliczeń wskazań minutnika oraz najniższą z możliwych częstotliwości. Obniżenie częstotliwości przerwań sprzyja bowiem redukcji poboru prądu z baterii.
Po włączeniu zasilania i restarcie mikrokontrolera testowany jest port RA3 (szyna 1-Wire). Jeśli wykryty zostaje stan niski (brak podłączonego czujnika temperatury) – układ przechodzi do trybu pracy minutnika. Jeśli natomiast na porcie RA3 procesor wykryje stan wysoki – układ będzie pracował w trybie termometru. Wystarczy więc odpiąć od gniazda czujnik temperatury wraz ze znajdującym się we wtyczce rezystorem R1 i układ „wstanie” jako minutnik.
Następnie testowany jest przycisk KEY (push-button). Jeśli po włączeniu układu zostanie on przyciśnięty, urządzenie przejdzie do trybu programowania ustawień. Wtedy wyświetli się wartość 100, która będzie zmniejszać się do chwili zwolnienia przycisku. Urządzenie zapamięta wówczas tę wartość i zacznie pracę. Jeśli wybraliśmy tryb pracy termometru i zaprogramowaliśmy np. 90°C, to zacznie on wyświetlać bieżącą temperaturę czujnika (odświeżaną co 1 sekundę), a w chwili przekroczenia zaprogramowanego progu (90°C) włączy sygnalizator dźwiękowy BUZ. Po wyłączeniu napięcia zasilania i ponownym włączeniu bez programowania (tzn. gdy przycisk jest zwolniony w chwili włączenia zasilania), temperatura progowa wywołująca włączenie alarmu będzie wartością ostatnio zaprogramowaną, pobraną z pamięci EEPROM. Jeśli więc zazwyczaj jest to wartość stała, nie ma konieczności programowania jej każdorazowo.
Gdy urządzenie pracuje jako minutnik, nie wyświetla symbolu stopni Celsjusza (C). Po ustawieniu wartości czasu zacznie odliczać, zmniejszając co minutę wskazanie wyświetlacza, a po osiągnięciu zera włączy alarm dźwiękowy z użyciem sygnalizatora piezoelektrycznego.
W chwili włączenia alarmu przestawiany jest czas przerwania timera i nie następuje już ono co 40 ms, a co 500 μs, co w efekcie daje dźwięk o częstotliwości 2 kHz. Oczywiście w tej sytuacji drastycznie wzrasta pobór prądu w układzie, dlatego dobrze jest wyłączyć urządzenie jak najszybciej po zgłoszeniu alarmu, aby zaoszczędzić energię baterii.
Graf działania programu pokazano na rysunkach 6...10.
Montaż
Układ zmontowany został na dwustronnej płytce PCB o wymiarach 80 mm x 40 mm, przy użyciu elementów SMD i THT. Najwygodniej byłoby wgrać program do mikrokontrolera przed montażem, ale to wymaga specjalistycznej, drogiej podstawki. Można więc wlutować niezaprogramowany układ na płytkę PCB, a następnie czterema przewodami podłączyć nasz mikroprocesor do programatora, używając pól lutowniczych ścieżek podłączonych do mikrokontrolera (GND, MCLR – pin rezystora R2, RB6 i RB7 – pola lutownicze przeznaczone do przycisku i pinu 9 wyświetlacza). Po zaprogramowaniu mikrokontrolera należy odlutować przewody, wlutować pozostałe elementy SMD, a następnie THT. Do podłączenia wyświetlacza dobrze jest użyć podstawki – można w tym celu zastosować podstawkę do układów scalonych w obudowie DIP40 (odcinając dwa rzędy wyprowadzeń od łączących je poprzeczek), tak aby dało się ją wlutować do PCB. Nieużywane piny wyświetlacza – oznaczone jako NC – nie są podłączone do układu. Należy spod tych pinów usunąć złącza podstawki (brak odpowiednich otworów w PCB wynika z umieszczenia w tym obszarze innych ścieżek).
Gniazdo do podłączenia czujnika temperatury podłączyłem za pomocą przewodów. Zastosowałem 3-pinowe, okrągłe gniazdo M8, ale można wykazać się tu inwencją. Wygodnym rozwiązaniem byłoby też złącze mini-jack stereo, choć należałoby pamiętać o tym, aby wyjmować i wkładać wtyk przy wyłączonym zasilaniu. Na końcu, po sprawdzeniu poprawności montażu (mikrokontroler wymaga zwrócenia szczególnej uwagi na ewentualne zwarcia wyprowadzeń), należy włożyć wyświetlacz w podstawkę, zachowując przy tym ostrożność: jest to szklany element i łatwo go uszkodzić. Jeśli z jakiegoś powodu zajdzie konieczność zdemontowania wyświetlacza, to w żadnym wypadku nie należy podważać go śrubokrętem- metalowy przedmiot łatwo uszczerbi szkło. Lepsza w tym celu okaże się drewniana wykałaczka lub patyczek po lodach.
Grzegorz Mazur
- R1: 4,7 kΩ
- R2: 1 kΩ
- R3: 10 kΩ
- R4: 220 Ω
- C1, C2: 33 pF
- C3, C4: 100 nF
- C5: 1 μF
- C6: 1 μF/10 V (THT)
- T1: BSS84 (SOT-23)
- IC1: PIC16876A (SO-28)
- IC2: DS18B20 (opis w tekście)
- BAT: bateria CR2023 wraz z podstawką DS1092-04-B6P lub podobną
- BUZ: buzzer THT typu CFD-02
- KEY: przycisk TACTS60H150B250 lub podobny
- LCD: wyświetlacz LCD typu DE114
- SW1: przełącznik suwakowy SW-S12N20E06 lub podobny
- Q1: kwarc 4,000 MHz HC49S
- Podstawka pod LCD (DIP40) – opis w tekście