W poprzednich częściach publikacji opracowaliśmy mobilny graficzny interfejs użytkownika z płytką Arduino i modułem BBMobile. Teraz, w ostatniej części cyklu, nadeszła pora na finalne prace zwieńczone powstaniem kompaktowego, bateryjnego urządzenia rejestrującego z interfejsem Bluetooth Low Energy.
Finalny interfejs mobilny
Na listingu 1 został pokazany kod JSON finalnego, graficznego interfejsu użytkownika dla naszego rejestratora. Jest on na tyle obszerny, że program Arduino IDE nie jest w stanie go przyjąć i przesłać do modułu BBMobile. Po prostu bufor aplikacji Serial Monitora Arduino jest zbyt mały. Tak więc nie uda nam się przetestować go poprzez wklejenie do górnego okna programu tak, jak robiliśmy to w poprzednich częściach cyklu. Wystarczy jednak użyć dowolnego programu terminala z odpowiednio dużym buforem, aby obejść tą niedogodność. Jak zrobić to w oparciu o TeraTerm SSH opisano na https://bit.ly/3rYI2R1.
{"ty":"lout","or":"V","img":"7","cs":[{
"ty":"lout","or":"H","cs":[
{"ty":"textview","n":"tn","tc":"0,0,0","ts":"40"},
{"ty":"textview","n":"rn","tc":"0,0,0","ts":"40"}]},
{"ty":"textview","te":"min\t\tavg\t\tmax","tc":"9,9,9"},
{"ty":"Button","en":"0","te":"24H","tc":"0,128,0","ts":"20","bg":"0,255,0"},
{"ty":"lout","or":"H","cs":[
{"ty":"textview","n":"t1","tc":"50,50,50","ts":"20"},
{"ty":"textview","n":"t2","tc":"0,0,0","ts":"25","bg":"0,255,0"},
{"ty":"textview","n":"t3","tc":"50,50,50","ts":"20"}]},
{"ty":"lout","or":"H","cs":[
{"ty":"textview","n":"r1","tc":"50,50,50","ts":"20"},
{"ty":"textview","n":"r2","tc":"0,0,0","ts":"25","bg":"0,255,0"},
{"ty":"textview","n":"r3","tc":"50,50,50","ts":"20"}]},
{"ty":"textview"},
{"ty":"Button","en":"0","te":"7 DAYS","tc":"0,128,0","ts":"20","bg":"0,255,0"},
{"ty":"lout","or":"H","cs":[
{"ty":"textview","n":"t4","tc":"50,50,50","ts":"20"},
{"ty":"textview","n":"t5","tc":"0,0,0","ts":"25","bg":"0,255,0"},
{"ty":"textview","n":"t6","tc":"50,50,50","ts":"20"}]},
{"ty":"lout","or":"H","cs":[
{"ty":"textview","n":"r4","tc":"50,50,50","ts":"20"},
{"ty":"textview","n":"r5","tc":"0,0,0","ts":"25","bg":"0,255,0"},
{"ty":"textview","n":"r6","tc":"50,50,50","ts":"20"}]},
{"ty":"textview"},
{"ty":"Button","en":"0","n":"b1","tc":"0,128,0","ts":"20","bg":"0,255,0"},
{"ty":"lout","or":"H","cs":[
{"ty":"textview","n":"t7","tc":"50,50,50","ts":"20"},
{"ty":"textview","n":"t8","tc":"0,0,0","ts":"25","bg":"0,255,0"},
{"ty":"textview","n":"t9","tc":"50,50,50","ts":"20"}]},
{"ty":"lout","or":"H","cs":[
{"ty":"textview","n":"r7","tc":"50,50,50","ts":"20"},
{"ty":"textview","n":"r8","tc":"0,0,0","ts":"25","bg":"0,255,0"},
{"ty":"textview","n":"r9","tc":"50,50,50","ts":"20"}]},
{"ty":"textview","n":"v","tc":"192,192,192","bg":"70,70,70"}]}
Na rysunku 1 został pokazany ten rozbudowany interfejs tak, jak prezentuje się na ekranie smartfona – z pierwszymi danymi pomiarowymi.
Analizując od góry w skład interfejsu wchodzą kolejno:
- Duże kontrolki textview o nazwach tn i rn prezentujące aktualne, chwilowe wartości temperatury i wilgotności (są zdefiniowane w wierszach 2...4 kodu JSON z listingu 1);
- Kontrolka textview wyświetlająca stałe napisy: min, avg, max (wiersz nr 5);
- Kontrolka button wyświetlająca stały napis „24H” (zdefiniowana w linii nr 6). Użycie w tym miejscu kontrolki button zamiast textview poprawiło estetykę interfejsu;
- Trzy kontrolki t1, t2, t3 w układzie horyzontalnym wyświetlające minimalne, średnie i maksymalne wartości temperatury zarejestrowane w ciągu poprzednich 24 godzin (zdefiniowane w wierszach 8, 9 i 10 wewnątrz layoutu opisanego w wierszu 7);
- Trzy kontrolki r1, r2, r3 w układzie horyzontalnym wyświetlające minimalne, średnie i maksymalne wartości wilgotności względnej zarejestrowane w ciągu poprzednich 24 godzin (zdefiniowane w wierszach 12...14 wewnątrz layoutu opisanego w wierszu 11);
- Siostrzany do opisanego w punktach 3...5 blok kontrolek wyświetlający minimalne, średnie i maksymalne wartości temperatury i wilgotności zarejestrowane w ciągu poprzednich 7 dni (zdefiniowany w wierszach 16...25);
- Kolejny podobny blok kontrolek, tym razem prezentujący minimalne, średnie i maksymalne wartości zarejestrowane w całym czasie pracy rejestratora – od momentu włączenia jego zasilania aż do chwili, w której dokonujemy odczytu danych (zdefiniowany jest w wierszach 26...34);
- Kontrolka o nazwie v pokazująca stan źródła zasilania i znajdująca się u samego dołu okna interfejsu (zdefiniowana w wierszu 35 listingu 1).
Pierwsza linia kodu JSON definiuje dodatkowo tło interfejsu. Wybrana została grafika numer 7 – „img”:„7”. Jasne tło wraz z dominującym limonkowym kolorem kontrolek tworzą czytelny interfejs o świetnym odbiorze.
Platforma sprzętowa
Zgodnie z założeniami, finalny rejestrator bazuje na mikrkontrolerze z interfejsem Bluetooth Low Energy: NRF51822. Jego schemat aplikacyjny dostarczony przez producenta został pokazany na rysunku 2. Dodatkowo do pinów P0.00 i P0.11 podłączone zostały linie magistrali I2C czujnika wilgotności i temperatury SHT20.
Na fotografii 1 pokazano umiejscowienie czujnika na płytce drukowanej.
Znajduje się tuż przy krawędzi – tam będzie miał najmniejszą bezwładność przy wykonywaniu pomiarów. Zareaguje w sekundę lub dwie nawet na podmuch ciepłego, wilgotnego powietrza z ust.
Zasilanie
Sensor SHT20 do poprawnej pracy potrzebuje napięcia zasilania z zakresu 2,1...3,6 V. Mikrokontroler NRF51822 działa już przy zasilaniu napięciem 1,8 V, do 3,6 V.
Cały projektu został opracowany tak, aby nasze urządzenie rejestrujące można było zasilić na kilka sposobów (rysunek 3):
- Przy pomocy baterii CR2032 o napięciu 3 V – gniazdo lutujemy do otworów 21(+) i 22(–);
- Dwoma szeregowo połączonymi bateriami lub akumulatorami typu AA lub AAA – plus łączymy z dowolnym padem w kolorze czerwonym, a minus do koloru niebieskiego;
- Ze źródła o wyższym napięciu, nawet do 36 V, po dodaniu stabilizatora 3,3 – w tej konfiguracji pady oznaczone jako VREG_IN, VREG_GND, VREG_OUT to odpowiednio wejście, masa i wyjście układu stabilizatora. Do wejścia HI_V_POWER podłączamy wówczas dodatni biegun źródła zasilania, a biegun ujemny łączymy z dowolnym padem koloru niebieskiego. Wejście HI_V_POWER jest zabezpieczone przed odwrotną polaryzacją. W tabeli 1 zestawiono różne rodzaje stabilizatorów typu low power w obudowie TO-92, które można bezpośrednio wlutować w płytkę PCB.
Na fotografii 2 pokazano kompilację różnych sposobów zasilania zastosowanych w praktyce.
Gdy brakuje energii
Przyglądnijmy się jeszcze uważnie zastosowanym w projekcie układom: NRF51822 i SHT20. Ten drugi ma znacznie węższy zakres napięć zasilających: 2,1...3,6 V w stosunku do mikrokontrolera: 1,8...3,6 V. Może zatem wystąpić sytuacja gdy napięcie zasilania spadnie np. do 2,0 V i wykonywanie pomiarów przez SHT20 będzie niemożliwe. Jak wówczas zachowa się rejestrator? Odpowiedź na to pytanie zawiera pewien szczegół widoczny na rysunku 1. W kontrolce na samym dole ekranu, obok aktualnego napięcia baterii, widoczny jest dodatkowy komunikat: „LO 4h”. Informuje on o tym, że od czterech godzin nie są wykonywane pomiary z powodu zbyt niskiego napięcia zasilania.
Finalne działanie
Dysponując urządzeniem mobilnym z systemem Android od wersji 4.4.2, które posiada chip Bluetooth Low Energy (Bluetooth od wersji 4.0) instalujemy aplikację BBMobile. Po uruchomieniu naciskamy START w prawym górnym rogu i jeśli nasz rejestrator jest włączony, to na liście dostępnych urządzeń pojawi się jego nazwa BB_TEMP (rysunek 4). Ostatnie cztery znaki nazwy to adres rejestratora.
Wybieramy go z listy i już po chwili na ekranie widnieje nasz zaprojektowany interfejs z interesującymi informacjami. Aby zakończyć połączenie z rejestratorem naciskamy przycisk STOP w prawym górnym rogu ekranu.
Rejestracja i prezentowanie danych
Trzy sekundy po włączeniu zasilania rejestrator wykonuje pierwszy pomiar. Kolejne próbki pobierane są co 60 minut. Dane w bloku „ALL DAYS” to maksymalne, minimalne i średnie wartości zarejestrowane od startu urządzenia. Dostępne są natychmiast po wykonaniu pierwszego pomiaru, tuż po włączeniu zasilania. Gdy połączymy się z rejestratorem kilka sekund po jego uruchomieniu. Informacje z ostatniej doby oraz tygodnia nie są wówczas jeszcze dostępne.
Po 24 godzinach od włączenia zasilania pojawiają się dane dobowe: maksymalna, średnia i minimalna temperatura oraz wilgotność. Wartości te uaktualniane są następnie co 60 minut, po wykonaniu każdego kolejnego pomiaru. Odczytując w dowolnej chwili z ekranu smartfona prezentowane wartości, mamy zawsze pewność, że są to najświeższe dostępne dane. Dokładnie z ostatnich 24 godzin.
Zarejestrowane wartości dobowe zapamiętywane są przez kolejnych siedem dni, aby po tym czasie możliwe było obliczenie i zaprezentowanie danych tygodniowych.
Na rysunku 5 został pokazany interfejs wypełniony po brzegi informacjami z rejestratora pracującego ponad 3 miesiące na południowej fasadzie budynku.
Nie tylko rejestrator
Gdy smartfon połączony jest z rejestratorem pomiary wykonywane są co 5 sekund. Aktualnie zmierzone wartości pokazywane są u góry ekranu, aby możliwe było śledzenie również bardziej dynamicznych zmian wilgotności i temperatury. Dzięki temu nasz rejestrator może być użyty, także jako termometr i higrometr o dużej precyzji i bardzo małej bezwładności. Te dodatkowe pomiary są brane pod uwagę tylko przy rejestracji maksymalnych i minimalnych wartości „ALL DAYS”. Nie są one uwzględniane przy obliczaniu średnich, a także maksymalnych oraz minimalnych dobowych i tygodniowych. Dynamiczny proces pomiarowy nie zakłóca zatem zbieranych co godzinę danych.
Mariusz Żądło