[PROJEKT] Wielokanałowy termometr i termostat z wyświetlaczem OLED [1]
Druga część artykułu jest dostępna tu.
Wydawałoby się, że nie ma bardziej banalnego projektu niż termometr elektroniczny. Sam kilka zaprojektowałem i wykonałem. Jednak do skonstruowania kolejnego termometru skłoniła mnie potrzeba. Potrzebowałem kilkukanałowego termometru z możliwością dołączania różnej liczby czujników. Dodatkowo wymagana była funkcja termostatu z programowaną histerezą i progiem zadziałania elastycznie podłączana do jednego z dostępnych kanałów pomiarowych.
Wybór czujnika temperatury
Pierwsza rzeczą jaką należało zrobić był wybór czujników temperatury. Ponieważ termometr miał być wielokanałowy, to trzeba było zapewnić możliwość podłączenia kilku – na przykład czterech czujników do portów mikrokontrolera. Ilość wykorzystywanych czujników można sobie zaprogramować, ale lepiej gdyby termometr sam potrafił automatycznie wykryć ile kanałów pomiarowych jest aktywnych. Na rynku jest olbrzymia ilość elektronicznych czujników temperatury z cyfrowymi interfejsami. Są one łatwe w implementacji i mają wykonaną kalibrację w procesie produkcyjnym. Ponadto są wyposażone w cyfrowy interfejs przeznaczony do przesyłania zmierzonej temperatury do mikrokontrolera.
Wiele z dostępnych czujników spełniało założenia projektu, ale jeden z nich dał się zastosować szczególnie łatwo – popularny czujnik DS18B20. Unikalna magistrala komunikacyjna 1-wire pozwala dołączyć wiele czujników do jednej linii portu mikrokontrolera. Każdy z tych czujników identyfikuje się na magistrali za pomocą unikalnego 64-bitowego numeru seryjnego zapisanego w każdym czujniku. Można napisać procedurę, która w czasie inicjowania programu sterownika termometru wykryje i zidentyfikuje automatycznie wszystkie dołączone czujniki. W trakcie eksploatacji termometru możliwe jest dołączanie i odłączanie czujników. Wystarczy po zmianie ich ilości wyłączyć i włączyć termometr by automatycznie została zweryfikowana liczba aktywnych czujników.
Sensor DS18B20 jest umieszczany miedzy innymi w popularnej „tranzystorowej” obudowie TO-92. Termometr wymaga tylko 3 połączeń: masy, plusa zasilania i linii DQ dwukierunkowej magistrali 1-wire. W wersji uproszonej można układ zasilić z linii DQ – wtedy potrzebne są tylko 2 przewody.
Oczywiście układ ma tez swoje wady. Uproszczona magistrala wymaga skomplikowanej obsługi z koniecznością odmierzania w miarę precyzyjnie czasów rzędu kilku mikrosekund. Zazwyczaj obsługa 1-wire blokuje mikrokontroler i nie jest możliwe wykonywanie w trakcie odczytywania pomiarów wykonywanie innych czynności. W szybkich mikron trolerach 16- i 32-bitowych można napisać program obsługi magistrali będący automatem stanu wykonywanym w obsłudze przerwań, ale jest on bardziej skomplikowany i trudny do uruchomienia. W termometrach wykonujących tylko pomiar temperatury nie jest problemem i można stosować klasyczne procedury blokujące czas procesora.
Sterownik i wyświetlacz
Schemat elektryczny termometru pokazano na rysunku 1.
Do budowy prototypu termometru wybrałem 16 bitowy mikrokontroler PIC24FJ64GA002 w obudowie do montażu przewlekanego. 16 –bitowa jednostka jest wystarczająco szybka i ma wystarczającą pamięć programu do realizacji urządzenia. Ja potem zobaczymy wbrew pozorom program sterujący jest dość rozbudowany, a zastosowanie co prawda małego, ale jednak graficznego wyświetlacza z trzema różnymi wielkościami czcionek wymaga sporej pamięci i określonej szybkości działania. Szybkość ta jest niezbędna do płynnego wyświetlania informacji na ekranie.
Rdzeń mikrokontrolera jest taktowany częstotliwością 32MHz z wewnętrznego oscylatora RC o częstotliwości 8MHz powielonej przez 4 w układzie PLL i zasilany napięciem +2,5V. Żeby można było zasilać mikrokontroler wyższym typowym napięciem +3,3V w strukturę układu wbudowano wewnętrzny regulator (stabilizator) +2,5V. Ten regulator jest włączany stanem wejścia DISVREG. Wymuszenie stanu niskiego na DISVREG powoduje włączenie stabilizatora. Do wyprowadzenia VCAP/VCORE trzeba dołączyć kondensator o pojemności 10uF i niskim ESR. Jeżeli DSVREG będzie miał stan wysoki, to do wejścia VCAP/VCORE trzeba podłączyć źródło napięcia +2,5V zasilające rdzeń mikrokontrolera. Ja oczywiście zasiliłem mikrokontroler napięciem +3,3V i wykorzystałem wbudowany stabilizator.
Pamięć mikrokontrolera można programować w układzie wykorzystując do tego celu złącze ICSP z wyprowadzeniami zgodnymi z programatorem/debugerem PICKit3. Ponieważ mikrokontroler nie ma wbudowanej pamięci nieulotnej przeznaczonej dla użytkownika, to do zapisywania nastaw termometru wykorzystałem tanią i bardzo popularną pamięć EEPROM typu 24C04 z interfejsem komunikacyjnym I2C. Komunikację mikrokontrolera pracującego jako master magistrali z pamięcią zapewnia sprzętowy interfejs I2C2 (linie SCL2 i SDA2). Rezystory R6 i R7 realizują wymagane przez standard I2C podciąganie do plusa zasilania linii danych i zegarowej.
W interfejsie użytkownika przeznaczonym do odczytu temperatur i ustawiania termostatu zastosowałem mały graficzny wyświetlacz OLED i obrotowy enkoder (impulsator) ze stykiem zwieranym po wciśnięciu ośki. Wyświetlacz jest zasilany napięciem +3,3V i komunikuje się z mikrokontrolerem poprzez magistralę SPI uzupełnioną o linię CD. Impulsator ma standardowe 2 styki A (port RB15) i B (port RB14). Linie A i B są podciągane do plusa zasilania przez rezystory R5 i R8. Styk zwierny impulsatora jest połączony z linią RB13. Kiedy styk nie jest zwarty to na RB13 jest stan wysoki wymuszony przez rezystor R9. Po zwarciu styku (wciśnięciu ośki) na RB13 jest wymuszany stan niski.
Układem wykonawczym termostatu jest przekaźnik typu AZ822 z cewką na napięcie 5VDC. Po wystawieniu stanu wysokiego na linii RA0 tranzystor Q1 przechodzi w stan nasycenia i zadziała przekaźnik R1. AZ822 ma 2 pary styków przełączanych wyprowadzonych na listwę J1. Zależnie od potrzeb można wykorzystać styki zwarte lub rozwarte w czasie kiedy termostat załącza przekaźnik.
Cały układ jest zasilany ze stabilizatora LM1117 3.3V. Na płytce nie przewidziano mostka prostowniczego i kondensatorów filtrujących. Całość powinna być zasilana z zasilacza o napięciu +5V. Można do tego celu wykorzystać nie potrzebną ładowarkę do telefonu komórkowego. Starsze ładowarki maja napięcie wyjściowe ok. +7..8V, nowsze zazwyczaj +5V. Ja wykorzystałem ładowarkę od starego telefonu Alcatel, w której zamontowałem stabilizator 78L05. Można oczywiście zasilić układ napięciem wyższym, ale trzeba dobrać do niego napięcie cewki przekaźnika R1.
Wyświetlacz OLED
Prezentacja wyników kilku pomiarów temperatury wymaga zastosowania wyświetlacza. Początkowo rozważałem użycie standardowego wyświetlacza alfanumerycznego ze sterownikiem HD44780. Jednak potrzebowałem takiego o rozmiarze przynajmniej 4×16 linii, a taki był za duży. Zastosowałem mały stosunkowo tani wyświetlacz graficzny o przekątnej 1,3cala i rozdzielczości 128×64 piksele wykonany w technologii OLED. Mimo niewielkich rozmiarów okazało się, że matryca OLED zapewnia bardzo dobra czytelność nawet z większej odległości. Konieczne jest wtedy stosowanie czcionek o większych rozmiarach. Wyświetlacz składa się z matrycy OLED i sterownika SH1106 umieszczonych na płytce szklanej z wyprowadzeniami elektrycznymi w formie elastycznej taśmy.
Całość została przymocowana na stałe do płytki drukowanej, na której umieszczono wszystkie niezbędne dodatkowe elementy: pola lutownicze do przylutowania taśmy wyświetlacza, stabilizator LDO napięcia +3,3V, oraz goldpiny do podłączenia zasilania i sygnałów magistrali SPI przeznaczonej do podłączenia mikrokontrolera – hosta.
SH1106 jest specjalizowanym układem przeznaczonym do sterowania matryc OLED/PLED o maksymalnym rozmiarze 132×64 piksele. Wbudowany driver steruje 132 segmentami i 64 kolumnami matrycy typu Common Cathode. Sterownik oferuje tryb oszczędzania energii Steep mode z poborem prądu nie przekraczającym 5uA i szerokim zakresem temperatur pracy od -40 C do +85C.
Do komunikacji z mikrokontrolerem można wybrać równoległą 8 bitowa magistralę mogącą pracować w przemysłowych trybach z godnych z Intel8080, lub Motorola 6800 lub dwie magistrale szeregowe: SPI i I2C. Wyboru aktywnej magistrali dokonuje się przez wymuszenie stanów logicznych na wejściach konfiguracyjnych IM0…IM2. W naszym przypadku na stałe ustawiono magistralę SPI i innej możliwości nie ma.
Magistrala sterująca składa się z linii:
- Danych wyjściowych MOSI (z punktu widzenia mikrokontrolera)
- Zegara taktującego transmisją CLK
- Wyboru układu na magistrali CS
Dodatkowo interfejs został uzupełniony o linie sterującą C/D. Dane są przesyłane od najstarszego bitu i wpisywane do wyświetlacza narastającym zboczem sygnału zegarowego CLK. Linia !CS musi być wtedy w stanie niskim. Stan linii CD określa czy dane trafią do pamięci obrazu (C/D=1), czy do rejestrów sterujących (C/D=0).