- pomiar temperatury w zakresie –40…+125°C,
- wyświetlanie wyniku z rozdzielczością 0,1°C w zakresie –9,9…99,9°C oraz 1°C poza nim,
- trzycyfrowy, czytelny wyświetlacz LED,
- załączanie wyświetlacza po dotknięciu odpowiedniego pola,
- regulowany czas załączenia: od 50 ms do 2 s,
- możliwość kalibracji wskazań,
- pobór prądu około 0,2 μA w stanie spoczynku i do 35 mA podczas wyświetlania,
- zasilanie napięciem stałym 1,8…4 V,
- wbudowane gniazdo baterii CR2032.
Termometry mogą mieć różne wcielenia, lecz większość dostępnych na rynku produktów jest albo energooszczędna, albo czytelna. Pierwsza grupa urządzeń zazwyczaj ma wbudowany siedmiosegmentowy wyświetlacz ciekłokrystaliczny, a druga grupa ma wyświetlacz LED lub nawet OLED. Ale co w sytuacji, gdy musimy dysponować układem, który jednocześnie pobiera mało energii i dysponuje czytelnym ekranem do prezentacji wyniku? Wtedy zaczynają się przysłowiowe schody.
W zaprezentowanym układzie zastosowano jedną z prostych, acz wygodnych w eksploatacji sztuczek: wyświetlacz włącza się po zbliżeniu ręki do odpowiedniego pola, będącego w rzeczywistości anteną. Po wyświetleniu aktualnego wyniku pomiaru cyfry gasną i układ wraca do stanu uśpienia. Brak fizycznego przycisku, którym zwiera styki, umożliwia hermetyczne i estetyczne obudowanie układu.
Budowa i działanie
Schemat ideowy omawianego układu znajduje się na rysunku 1. Głównym podzespołem, sterującym jego pracą, jest mikrokontroler typu ATmega88PA-PU z 8-bitowym rdzeniem AVR. Ma wystarczającą liczbę konfigurowalnych wyprowadzeń, więc nie zachodzi potrzeba stosowania dodatkowych układów pośredniczących.
Mikrokontroler przez większość czasu znajduje się w stanie uśpienia, z którego wybudza go przerwanie od zmiany stanu na wyprowadzeniu PD7. Nie realizuje zadań krytycznych czasowo, wobec czego częstotliwość zegara jest stabilizowana przez wbudowany układ oscylatora RC. Rezystor R1 podciąga wejście zerujące do dodatniego potencjału zasilania, co zmniejsza ryzyko samoczynnego zerowania się układu spowodowanego ładunkami elektrostatycznymi.
Pomiar temperatury odbywa się poprzez pomiar spadku napięcia na zaciskach termistora NTC1. Element ten jest włączony jako jeden z rezystorów dzielnika oporowego. Drugim elementem tego dzielnika są, połączone szeregowo, rezystor R2 i potencjometr P1.
Ustawienie P1 w połowie daje rezystancję wypadkową zbliżoną do 10 kΩ, natomiast zmiana położenia ślizgacza P1 umożliwia skalibrowanie układu – uwzględniając, na przykład, rozrzut rezystancji R2 i tolerancję samego termistora. Kondensator C6 wstępnie filtruje uzyskane napięcie i zawęża tym samym pasmo szumowe. Mikrokontroler wprowadza dodatkowe uśrednianie, co zostanie wyjaśnione dalej.
Drugim parametrem wejściowym dla układu jest czas załączenia wyświetlacza LED po wybudzeniu mikrokontrolera. Ustawia się to potencjometrem P2, włączonym do układu jako dzielnik napięcia zasilającego. A dokładniej – napięcia pochodzącego z wyjścia PD2. Im wyższe napięcie między masą a ślizgaczem P2, tym dłużej będzie się świecił wyświetlacz. Na czas pomiaru temperatury i czasu załączenia wyświetlacza załączane jest zasilanie części analogowej. Kiedy wyprowadzenie PD2 przyjmuje stan wysoki, jego potencjał niemal zrównuje się z napięciem zasilającym układ. Po wystawieniu logicznego „zera” ta część układu przestaje pobierać jakikolwiek prąd. To sprzyja energooszczędności, na której nam w tym układzie zależy.
Napięcie zasilające układ powinno wynosić około 3 V. Jego źródłem może być zarówno bateria CR2032, na którą zostało przewidziane miejsce na płytce drukowanej, jak i zewnętrzny zasilacz lub komplet bardziej pojemnych baterii, na przykład w rozmiarze AA. W układzie zastosowano kondensatory foliowe (MKT) i tantalowe, aby zmniejszyć prąd upływu elementów odsprzęgających zasilanie i jeszcze bardziej zredukować natężenie pobieranego przez układ prądu.
Wejście wyzwalające pomiar jest odseparowane od mikrokontrolera za pośrednictwem tranzystora unipolarnego T1. Zbliżenie palca do wyprowadzenia PAD3 wywołuje nagłą zmianę jego potencjału, spowodowaną chociażby wpływem zewnętrznego pola elektromagnetycznego, jak również zgromadzonymi na powierzchni naszego ciała ładunkami elektrostatycznymi. To powoduje chwilowe podniesienie potencjału bramki T1 względem potencjału jego źródła, co otwiera T1 i powoduje pojawienie się zbocza opadającego na wejściu PD7. Aby zabezpieczyć izolator podbramkowy tranzystora T1 przed zniszczeniem, zostały dodane diody D1 i D2, które ograniczają dopuszczalny potencjał bramki względem jego źródła. Rezystor R4 ogranicza prąd tych diod i spowalnia przeładowywanie pojemności wejściowej układu, dając tym diodom czas na reakcję.
Całość jest uzupełniona przez trzycyfrowy, siedmiosegmentowy wyświetlacz LED. Anody poszczególnych cyfr są załączane przez tranzystory bipolarne typu BC556, zaś katody segmentów są zasilane wprost z wyjść mikrokontrolera. Rezystory 220 Ω, ograniczające prąd segmentów, wymuszają przepływ prądu o natężeniu około 7 mA. W ten sposób świecą się one dostatecznie jasno, a pobór prądu przez układ nie jest w tym czasie zbyt wysoki.
Montaż i uruchomienie
Układ został zmontowany na jednostronnej płytce drukowanej o wymiarach 45×75 mm, której schemat został pokazany na rysunku 2. W odległości 3 mm od krawędzi płytki znalazły się cztery otwory montażowe, każdy o średnicy 3,2 mm. Montaż proponuję rozpocząć od elementów o najmniejszej wysokości obudowy, czyli rezystorów, diod i jednej zworki z cienkiego drutu, której miejsce jest pod układem US1. Pod mikrokontroler proponuję zastosować podstawkę, aby ułatwić jego programowanie oraz wymianę w razie uszkodzenia.
Zmontowany układ można zobaczyć na fotografii tytułowej. Koszyk na baterię CR2032 należy wlutować od drugiej strony płytki, po zakończeniu montażu wszystkich innych podzespołów i upewnieniu się co do poprawności ich przylutowania. Służą do tego dwa pola lutownicze, oznaczone symbolami „+” i „–”. Koszyk należy włożyć w otwory w tych polach, po czym cienkim grotem, prowadzonym równolegle do powierzchni laminatu, należy przylutować jego wyprowadzenia do pól miedzi. Są one w pewnym oddaleniu od krawędzi koszyka, ale można to zrobić bez uszkodzenia tworzywa sztucznego. Koszyk po przylutowaniu wygląda jak na fotografii 1.
Na etapie uruchamiania konieczne jest zaprogramowanie pamięci Flash mikrokontrolera dostarczonym wsadem oraz zmiana jego bitów zabezpieczających. Oto ich nowe wartości:
Low Fuse = 0xE2
High Fuse = 0xDF
Szczegóły są widoczne na rysunku 3, który zawiera widok okna konfiguracji bitów z programu BitBurner. W ten sposób zostanie wyłączony dzielnik częstotliwości wbudowanego generatora sygnału zegarowego. Nie będzie załączony obwód BOD, ponieważ jego bezustanna praca pochłania dodatkowe, cenne mikroampery.
Poprawnie zaprogramowany układ jest gotowy do działania po podłączeniu zasilania do zacisków złącza J1 lub włożeniu baterii typu CR2032 do koszyka. Napięcie zasilające, o ile będzie pochodziło z zewnętrznego zasilacza, nie powinno przekraczać wartości 4 V i na pewno powinno być dobrze filtrowane, a najlepiej stabilizowane. Układ był projektowany do współpracy z napięciem o wartości około 3 V i w tych warunkach zmierzono pobór prądu: około 200 nA w stanie uśpienia i do 35 mA po wybudzeniu, w zależności od aktualnej zawartości wyświetlacza. Minimalnym napięciem, przy którym układ działa, jest 1,8 V – wynika to z dokumentacji użytego mikrokontrolera.
Jednorazowe zbliżenie palca do pola PAD3 (oraz połączonego z nim polem miedzi) powoduje wybudzenie mikrokontrolera, wykonanie 5 pomiarów temperatury w odstępach 1 ms i uśrednienie wyników. Następnie zmierzona wartość jest konwertowana na gotową do wyświetlenia postać i załącza się wyświetlacz. Potem układ sprawdza, jaki czas świecenia ekranu został ustawiony i po jego upływie wraca do stanu uśpienia. Kolejne wybudzenie to kolejny pomiar, wyniki nie są zapamiętywane ani odświeżane w trakcie świecenia.
Czas świecenia może wynosić od około 50 ms do około 2 s.
Dla uzyskania jak najlepszej dokładności układ można skalibrować poprzez przekręcenie ślizgacza potencjometru P1. Jeżeli dokładność wskazań nie jest krytyczna, można zostawić P1 ustawiony w połowie. Użyty w prototypie czujnik ma trzy charakterystyczne cechy: rezystancję R25 wynoszącą 10 kΩ, stałą B=3977 K i tolerancję 1%. Można użyć innego czujnika, ale jego nominalna rezystancja i stała B muszą być takie same – w przeciwnym razie wyniki będą konwertowane na niewłaściwą temperaturę.
Dla dociekliwych
Pomiar temperatury został zrealizowany przy użyciu termistora NTC, ponieważ może działać bardzo szybko – nie wymaga czasu na konwersję jak cyfrowy DS18B20 – oraz ma szeroką tolerancję napięcia zasilającego. Został włączony jako dzielnik napięcia zasilającego.
Rodzi to jednak pewien problem. Otóż jego charakterystyka zależności rezystancji w funkcji temperatury jest silnie nieliniowa, a dokładniej: wykładnicza. Jeżeli do tego dołoży się zakrzywienie wynikające z funkcji opisującej działanie dzielnika napięciowego, w którym aktualna rezystancja czujnika znajduje się zarówno w mianowniku ułamka, jak i w jego liczniku, to uzyskany twór może silnie odbiegać od jakiejkolwiek znanej i prostej funkcji.
Na rysunku 4 znajduje się wykres temperatury czujnika w funkcji wartości na wyjściu 10-bitowego przetwornika ADC. Jak uzyskano ten wykres? Czujnik o stałej materiałowej B wynoszącej 3977 K i nominalnej rezystancji R25=10 kΩ będzie miał określoną rezystancję w danych temperaturach, co można obliczyć. Te wartości rezystancji zostały przeliczone na wartości zmierzone przetwornikiem analogowo-cyfrowym przy założeniu, że „górny” rezystor dzielnika napięcia ma rezystancję 10 kΩ. Ten wykres umożliwia odtworzenie aktualnej temperatury na podstawie wyniku pomiaru.
Jak jednak opisać matematycznie taki twór i to z odpowiednio dużą dokładnością? Użyto wielomianu, którego współczynniki zostały dobrane metodą najmniejszych kwadratów. Okazało się, że sensowne odwzorowanie (odchyłka poniżej 0,5°C) zapewnia wielomian stopnia... 15. Oto on:
y=
4,13391442063126E–40 · x^15
+3,39622652463852E–37 · x^14
–1,093413325268E–32 · x^13
+3,20090227096586E–29 · x^12
–3,71652843111709E–26 · x^11
+1,29479188429878E–23 · x^10
+4,32751133804944E–21 · x^9
+1,25412176023941E–17 · x^8
–3,59327944845412E–14 · x^7
+3,58076429844174E–11 · x^6
–1,99046057179117E–8 · x^5
+6,87145833865221E–6 · x^4
–0,00151805740016192 · x^3
+0,215379935581082 · x^2
–20,4663074304033 · x^1
+1736,25120148175
Rodzi się pytanie: w jaki sposób zmusić tak prosty mikrokontroler do wykonywania takich obliczeń, o takiej dokładności? Redukcja dokładności współczynników bardzo wpływa na wynik, więc precyzję trzeba bezwzględnie zachować. Na szczęście ATmega88 ma 8 kilobajtów pamięci Flash, więc wyniki zostały obliczone w komputerowym arkuszu kalkulacyjnym, a następnie zapisane w postaci tablicy. Tablica zawiera 1024 elementy o adresach od 0 do 1023, co odpowiada wartościom na wyjściu ADC. Wartości w tej tablicy mają postać liczb całkowitych, a na każdą zostało zarezerwowane 16 bitów. Uzyskany program jest więc o 2 kilobajty większy, za to konwersja wyniku na temperaturę odbywa się w zaledwie kilku taktach zegara prostego mikrokontrolera.
Michał Kurzela, EP
- R1, R4, R5: 220 kΩ
- R2: 9,1 kΩ
- R3: 10 MΩ
- R6…R8: 2,2 kΩ
- R9…R16: 220 Ω
- P1: 2 kΩ montażowy leżący
- P2: 100 kΩ montażowy leżący
- C1, C5: 22 μF 10 V raster 2,54 mm tantalowy
- C2…C4, C6: 100 nF raster 5 mm MKT
- D1, D2: 1N4148
- DISP1: LED-AT5636BMR
- T1: BS170
- T2…T4: BC556
- US1: ATmega88PA-PU (DIP28)
- J1, J2: ARK2/500
- NTC1: TT7-10KC3-11 (opis w tekście)
- jedna podstawka DIP28 wąska
- koszyk baterii CR2032 THT leżący (KOSZYK BAT 6)