Podobno każdy szanujący się elektronik musi kiedyś zbudować wzmacniacz audio, zegarek i termometr. Pamiętam swój pierwszy wzmacniacz na UL1481, zegarek na poczciwym 8051, ale jakoś nigdy nie mogłem się zabrać za termometr. Wychodziłem z założenia, że jak budować termometr, to z czujnikiem dołączanym bezprzewodowo, do czego dawniej po prostu brakowało podzespołów. Były one dostępne, ale tylko producentom OEM. Współcześnie każdy może nabyć moduł lub tzw. procesor radiowy z zaimplementowanym stosem Wi-Fi za rozsądną cenę. Otwiera to drogę do budowania wielu interesujących, niepowtarzalnych urządzeń. Od czegoś jednak trzeba zacząć.
Zaprojektowałem stację, która wyświetla ciśnienie, wilgotność i temperaturę panujące w pomieszczeniu, w którym jest zainstalowana oraz temperaturę zewnętrzną zmierzoną za pomocą czujnika z interfejsem bezprzewodowym Wi-Fi. Stacja bazowa pracuje w trybie AP i nie potrzebuje do działania rutera z Wi-Fi. Po załączeniu zasilania stacja automatycznie rozpoznaje typ współpracujących z nią czujników. Oprogramowanie obsługuje czujniki ciśnienia: BMP085, BMP180 i BMP280 oraz czujnikami wilgotności: DHT11, DHT22, HTU21D. Z założenia termometr miał mieć możliwe nieskomplikowaną budowę i możliwość zaprogramowania oraz uruchomienia bez potrzeby posiadania specjalnego wyposażenia. Udało się to osiągnąć, ponieważ jedyne, co jest potrzebne, to przejściówka USB/UART pracująca przy napięciu zasilającym 3,3 V.
W projekcie zastosowano moduły z zamontowanymi czujnikami ciśnienia i wilgotności, co zwalnia z konieczności bardzo trudnego do wykonania w warunkach domowych lutowania elementów SMD w obudowach LGA. Dodatkowo, zastosowany moduł Wi-Fi oraz mikrokontroler z rodziny STM32F103 można zaprogramować z użyciem taniej przejściówki USB/UART.
Stacja bazowa – wskaźnik termometru
Schemat ideowy stacji pokazano na rysunku 1. Zastosowanie gotowych modułów z czujnikami ciśnienia i wilgotności sprawia, że budowa urządzenia jest nieskomplikowana i w zasadzie ogranicza się do wykonania zasilacza na napięcie 3,3 V, mikrokontrolera oraz kilku układów peryferyjnych, w tym wyświetlacza LCD i modułu Wi-Fi.
Cała funkcjonalność urządzenia jest zawarta w mikrokontrolerze STM32F103C8T6, który pracuje z użyciem wewnętrznego generatora HSI. Pierwotnie miał on być taktowany za pomocą rezonatora zewnętrznego, ale ostatecznie podczas prób okazało się, że generator HSI ma stabilność wystarczającą dla tej aplikacji. Do wyświetlenia danych z czujników użyto wyświetlacza graficznego wykonanego w technologii COG o rozdzielczości 128×64 piksele ze sterownikiem ST75765R, który był już opisywany na łamach EP. Pozostaje mi jedynie dodać, że jest to jeden z lepszych wyborów pod względem jakości, możliwości i ceny. Dzięki metalowym pinom jest on również bardzo łatwy do przylutowania. Układ podświetlenia wykonano na 1 diodzie LED, która przy prądzie 15 mA daje dosyć światła, aby nawet oświetlić pomieszczenie, w którym jest umieszczone urządzenie. Stacja ma czujnik natężenia oświetlenia zewnętrznego i dostosowuje poziom podświetlenia LCD do warunków panujących w pomieszczeniu.
Jako moduł Wi-Fi zastosowano niedrogi WROOM-02, którego „sercem” jest układ ESP8266. Taki sam moduł ma również czujnik temperatury zewnętrznej. Wykorzystano bardzo dużą zaletę tych modułów – możliwość wgrania oprogramowania użytkownika sterującego pracą modułu. Pełną specyfikację modułu można bez problemu znaleźć w Internecie. Moduł ESP-WROOM-02 jest certyfikowany (FCC, CE, TELEC), co stanowi gwarancję, że nie będzie zakłócał pracy innych urządzeń. Jego obudowa ma wymiary 18 mm×20 mm i wyprowadzenia w postaci 18 pinów rozmieszczonych na krawędziach płytki drukowanej. Aby uprościć uruchomienie stacji, zastosowano złącze JP6, które służy do przełączania sygnałów RX/TX pomiędzy modułem Wi-Fi, a mikrokontrolerem za pomocą zworek.
Jak wspomniano, do budowy stacji można użyć gotowych modułów z czujnikami ciśnienia i wilgotności. Na płytce PCB jest miejsce przeznaczone do dołączenia modułów z czujnikami ciśnienia i temperatury typu GY-65, GY-68 oraz modułu z czujnikiem wilgotności HTU21D. Oprogramowanie wykrywa i obsługuje również nowszy typ czujnika ciśnienia BMP280, jednak nie przewidziano dla niego złącza. Należy dołączyć go za pomocą przewodów do złącza SV1 lub SV2.
Czujniki BMP085, BMP180 oraz BMP280 są wysokiej klasy czujnikami ciśnienia firmy Bosch. Charakteryzują się dużą dokładnością pomiaru ciśnienia i temperatury. Dwa pierwsze komunikują się za pomocą interfejsu I2C, a BMP280 umożliwia wybranie SPI lub I2C (wyboru dokonuje się dołączając wejście CSB do masy lub napięcia zasilania; w naszym wypadku do VCC, co powoduje aktywowanie interfejsu I2C). W zasadzie czujnik BMP180 jest zamiennikiem starszego modelu BMP085 – w tych samych rejestrach ma współczynniki kalibracyjne, a obsługa programowa jest niemal identyczna. W tabeli 1 wymieniono i porównano parametry czujników BMP180 i BMP280 (źródło – BMP280 Data sheet).
Jak wynika z tab. 1, nowszy czujnik BMP280 ma lepsze parametry. Dodatkowo, za pomocą rejestrów wewnętrznych jest możliwe wybranie trybu pracy, rozdzielczości pomiaru, ustawienie dodatkowego filtru IIR itp. Szczegóły można znaleźć w dokumentacji.
Czujnik HTU21D to wysokiej klasy czujnik wilgotności i temperatury firmy Measurement Specialties. Zakres pomiarowy temperatury -40…+125°C (rozdzielczość 0,01°C), a wilgotności 0…100% (rozdzielczość 0,04%). Za pomocą rejestrów wewnętrznych można wybrać rozdzielczość pomiaru, tryb pracy lub wykryć niski poziom napięcia zasilania czujnika. Jeśli nie zależy nam na dokładności i szybkości pomiaru, to możemy zastosować tańsze czujniki wilgotności DHT11 lub DHT22 dołączane do złącza oznaczonego „DHT22”. Ja zastosowałem HTU21D, który kosztuje niewiele więcej, a reaguje nawet na bardzo małe zmiany.
Rozróżnienie typu współpracujących czujników następuje podczas uruchomienia programu. W wypadku czujników ciśnienia procesor odczytuje ID układu, który dla czujnika BMP180 jest równy 0x55, natomiast dla BMP280 – 0x58. Jeśli nie odczyta id=0x58, to oznacza, że dołączono jeden z czujników BMP085/180. Z czujnikami wilgotności jest troszkę inaczej. Jeśli na wejściu PB0 mikrokontrolera będzie poziom niski, to oznacza, że mamy do czynienia z czujnikiem HTU21D, jeśli wysoki – jednym z czujników DHT. Jeśli mamy czujnik HTU21D, to zwieramy piny 1 i 3 złącza JP3 („DHT22”). Jeśli będzie przyłączony któryś z czujników DHT, to wejście PB0 będzie ustawione, a program będzie się starał taki sensor obsłużyć. Po identyfikacji program przechodzi do konfigurowania parametrów wybranych czujników.
Odczyt parametrów zmierzonych przez czujniki, lokalnie i zdalnie, odbywa się w pętli głównej, co 5 sekund. Temperatura wewnątrz pomieszczenia jest odczytywana z czujnika ciśnienia. Dodatkowo, w dolnym prawym rogu jest wyświetlany czas w sekundach, który upłynął od ostatniego odczytu danych z czujnika zewnętrznego.
Moduł zewnętrznego czujnika temperatury
W czujniku zewnętrznym pracuje dobrze znany sensor DS18B20. Schemat ideowy modułu zewnętrznego pokazano na rysunku 2 Jak widać ogranicza się on do modułu WiFi, czujnika temperatury i zworki umożliwiającej zaprogramowanie układu. Dioda D1 zabezpiecza układ przed odwrotnym podłączeniem zasilania. Dzięki możliwości zaprogramowania układu ESP8266, nie musimy stosować dodatkowych mikrokontrolerów odczytujących temperaturę i sterujących pracą modułu.
Całość jest zasilania z dwóch baterii AAA. Moduł w trybie uśpienia pobiera około 20 mA. Płytkę drukowaną zaprojektowano pod kątem umieszczenia jej w obudowie Z32J, która ma miejsce na baterię 6F22 (9 V), jednak bardzo dobrze mieści się tam również koszyk z bateriami 2×AAA. Ponieważ pomiar temperatury jest wykonywany co 5 minut, to baterie starczają na około pół roku pracy.
Oprogramowanie
Oprogramowanie układu STM32 napisano w języku C za pomocą darmowej wersji kompilatora Atollic TrueSTUDIO. Oprogramowanie dla modułów WROOM-02 pracujących w trybie AP w stacji oraz w trybie Client w czujniku zewnętrznym napisano za pomocą Arduino IDE.
W trybie AP, moduł po inicjalizacji przechodzi do uruchomienia punktu dostępowego i oczekuje na dane. W trybie Client układ po wybudzeniu próbuje zalogować się do AP. Po zalogowaniu się mierzy temperaturę oraz siłę odbieranego sygnału RSSI, przesyła je do AP i przechodzi w stan głębokiego uśpienia. Dzięki pomiarowi siły sygnału mamy na wyświetlaczu obok temperatury zewnętrznej informację w postaci graficznej o poziomie sygnału Wi-Fi dochodzącego z sensora do stacji bazowej. Pozwoli to na optymalne umieszczenie czujnika, tak aby zawsze był w zasięgu sieci stacji. Średni czas pracy od wybudzenia do uśpienia to 10 sekund, a pobór prądu to 80 mA. Gdyby modułowi nie udało się w ciągu 30 sekund zalogować do AP, to przechodzi do trybu głębokiego uśpienia i po 5 minutach ponownie podejmuje próbą zalogowania się i przesłania danych.
Montaż
Schemat montażowy stacji bazowej pokazano na rysunku 3, a zdalnego sensora na rysunku 4. Montaż rozpoczynamy od przylutowania elementów zasilacza i sprawdzenia jego napięcia wyjściowego. W tym celu zasilamy układ ze źródła napięcia – najlepiej stabilizowanego – z zakresu 5…7 V. Wyższe napięcie będzie powodowało grzanie się stabilizatora i może wpływać na fałszowanie wyników pomiaru temperatury z czujnika BMP. Jeśli napięcie za stabilizatorem wynosi 3,3 V, to możemy przystąpić do przylutowania mikrokontrolera STM32. Następnie lutujemy moduł WROOM-02, a dopiero na koniec wszystkie pozostałe elementy po stronie BOTTOM, łącznie z goldpinami. Teraz odwracamy płytkę na stronę TOP, montujemy kondensatory C1…C9 i w zależności od potrzeb – rezystory R6 i R7. Są to rezystory zasilające szynę I2C. Jeśli te rezystory są zamontowane na modułach czujników, to montaż R6 i R7 można pominąć.
Dopiero teraz możemy przystąpić do montażu podświetlenia LCD. Należy dość mocno rozchylić na boki końcówki diody LED i je przylutować, a następnie delikatnie przyłożyć sam wyświetlacz i również przylutować. Podobnie postępujemy z modułem czujnika zewnętrznego – zaczynamy od modułu Wi-Fi, a następnie pozostałe elementy. Po sprawdzeniu, czy nie ma zwarć, układ jest gotowy do zaprogramowania.
Uruchomienie
Do uruchomienia stacji potrzebna będzie tabelka z konfiguracją zworek – pokazano ją na rysunku 5. Taka sama tabelka jest nadrukowana na warstwie BOTTOM płytki drukowanej.
Uruchomienie stacji bazowej rozpoczynamy od zaprogramowania mikrokontrolera STM32. W tym celu wyłączamy zasilanie modułu i za pomocą zworek łączymy piny 4-6 i 1-3 złącza JP6 (konfiguracja STM32 programming). Zdejmujemy zworkę ze złącza STM32_BOOT. Włączamy zasilanie modułu i do złącza JP1 przyłączamy przejściówkę USB/UART – pin RX do RX, TX do TX a GND z masą. Następnie, uruchamiamy program Flash Loader Demonstrator i programujemy mikrokontroler. Dokładny opis procedury programowania można znaleźć w EP 7/2008, w artykule „Programowanie pamięci Flash mikrokontrolerów STM32 – Flash Load Demonstrator”. Artykuł jest dostępny w darmowym, otwartym archiwum Elektroniki Praktycznej, dostępnym na jej stronie internetowej.
Po zaprogramowaniu odłączamy zasilanie układu, zakładamy zworkę na złącze STM32_BOOT i włączamy zasilanie. Od teraz powinien działać odczyt parametrów z czujników temperatury, wilgotności i ciśnienia. Jeśli na wyświetlaczu ukażą nam się pomiary, możemy przejść do programowania układu WROOM-02. W tym celu odłączamy zasilanie modułu i łączymy piny 3-5 oraz 2-4 za pomocą zworek w złączu JP6 (konfiguracja WROOM-02 programming). Zakładamy zworkę na piny złącza ESP_BOOT, włączamy zasilanie i uruchamiamy program Nodemcu Firmware Programmer – można pobrać go z Internetu. Aby go odnaleźć, należy w wyszukiwarce wpisać nazwę nodemcu flasher. W zakładce Operation należy wybrać port COM, do którego mamy dołączoną przejściówkę. W zakładce Advanced ustawiamy: Baudrate – 115200, Flash size – 2Mbyte, Flash speed 40MHz, SPI Mode – DIO. Przechodzimy do zakładki Config i wybieramy ścieżkę dostępu do programu do wgrania. Po lewej stronie zaznaczamy „x” w niebieskim małym kwadracie, po prawej – wybieramy adres 0x0000. Prawidłowe ustawienia pokazano na rysunku 6. Gdy wszystko jest ustawione, przechodzimy do zakładki Operation i klikamy przycisk START. Po chwili powinny zostać wyświetlone adresy MAC dla trybów AP i STA oraz rozpocząć się programowanie modułu. Po zakończeniu wyłączamy zasilanie stacji, zdejmujemy zworkę ze złącza ESP_BOOT, odłączamy przejściówkę i wpinamy zworki w złączu JP6 do trybu pracy NORMAL WORK (łączymy piny 1-2 i 5-6). Po włączeniu zasilania na wyświetlaczu powinny być wyświetlone wartości odczytane z czujników.
W taki sam sposób programujemy moduł W-iFi w module czujnika zewnętrznego. Do złącza JP2 przyłączamy przejściówkę USB/UART (Uwaga! TX przejściówki do RX w złączu JP2 i RX przejściówki do TX złącza JP2) i przełączając zworkę na złączu JP1 ESP_BOOT programujemy układ. Po zaprogramowaniu zdejmujemy zworkę, odłączamy programator i włączamy zasilanie. Po kilku sekundach na wyświetlaczu stacji bazowej powinna być wyświetlona temperatura z czujnika zewnętrznego. Może się zdarzyć sytuacja, że po pierwszym uruchomieniu pojawi się tylko ikonka siły odbieranego sygnału – wtedy rozłączamy zasilanie czujnika zewnętrznego, odczekujemy 20 sekund i ponownie włączamy zasilanie. Każdy kolejny pomiar będzie już prawidłowo wyświetlany. Jest to spowodowane „zaśmieceniem” bufora odbiorczego przez układ WROOM-02 przed ustabilizowaniu parametrów w stacji, który czyści się po drugim prawidłowo odebranym pakiecie danych.
Możliwość rozbudowy
Na koniec kilka słów o możliwościach rozbudowy urządzenia. Oczywiście, można podłączyć więcej czujników zewnętrznych – osobiście testowałem z 12 rozmieszczonymi w całym domu i wszystko pracowało prawidłowo. Istnieje również możliwość dołączenia do modułu zewnętrznego innych czujników np. wilgotności, nasłonecznienia, można dokonywać pomiaru napięcia itp. Ograniczeniem jest tylko wyobraźnia konstruktora. Moduł WROOM-02 dzięki IDE Arduino programuje się tak samo, jak zwykły układ z mikrokontrolerem, a dzięki wielu darmowym bibliotekom praktycznie nie ma ograniczeń w zastosowaniach układu. Zachęcam do budowy własnych urządzeń z zastosowaniem tego modułu.
Grzegorz Burzyński
sp5ein@gmail.com