Gwałtowny rozwój Internetu Rzeczy jest spowodowany w dużej mierze przez szybki rozwój scalonych czujników różnych parametrów fizycznych: temperatury, ciśnienia, wilgotności, oświetlenia, koloru, ruchu, stężenia gazów i pyłów w powietrzu oraz wielu innych. Szczególnie szybki rozwój nastąpił w dziedzinie pomiarów jakości powietrza w pomieszczeniach. Różne rodzaje czujników gazów oraz stosowane technologie pomiaru zostały opisane w artykule „Cyfrowe czujniki gazu” [1].
CO2 jest kluczowym wskaźnikiem jakości powietrza w pomieszczeniach (IAQ), ponieważ wysokie jego stężenie wpływa negatywnie na sprawność poznawczą i samopoczucie człowieka. Czujniki CO2 na bazie techniki niedyfrakcyjnej podczerwieni NDIR oferują wysoką czułość i dokładność pomiaru stężenia gazu (np. SCD30 firmy Sensirion), jednak do ich wad należą dość spore rozmiary i wysoka cena. Na rynku pojawiają się także czujniki wykonane z użyciem nowych technologii, jak STC31-C firmy Sensirion (działający na zasadzie pomiaru przewodnictwa cieplnego, co zapewnia doskonałą powtarzalność i długoterminową stabilność).
Czujnik CO2 typu SCD41 marki Sensirion
W połowie roku 2020 firma Sensirion wprowadziła na rynek SCD40 – pierwszy zminiaturyzowany czujnik CO2 na bazie technologii PAS (Photoacoustic Spectroscopy), opisanej szerzej w [1].
Cechy czujnika SCD41 [6]:
- zakres pomiarowy CO2: 400...5000 ppm,
- dokładność (400…2000 ppm): ±50 ppm,
- powtarzalność: ±10 ppm,
- czas odpowiedzi (skok 400...2000 ppm): 60 s,
- zakres pomiaru wilgotności: 0…100%,
- zakres pomiaru temperatury: –10…60°C,
- zasilanie: 2,4…5,5 V (typ. 3,3 V lub 5 V),
- pobór prądu: pik (typ./maks.) – 175/205 mA, średni @ 3,3 V – (pomiar co 5 s/30 s/5 min): 15/3,2/0,45 mA, w trybie bezczynności – 200 μA,
- czas rozruchu (> 2,25 V): 30 ms (maks.),
- czas pojedynczego pomiaru (maks.): CO2 + RHT: 5000 ms, RHT: 50 ms,
- komunikacja: I²C (400 kHz maks.), adres 0x62.
Napięcie zasilania czujnika powinno być pozbawione tętnień lub spadków napięcia przekraczających 30 mV. SCD4x komunikuje się z użyciem protokołu opartego na specyfikacji magistrali I²C firmy NXP. Szyny SDA i SCL wymagają dołączenia rezystorów podciągających. Dane wysyłane do czujnika i odbierane z niego składają się z sekwencji 16-bitowych poleceń i/lub 16-bitowych słów (każde z nich należy interpretować jako liczbę całkowitą bez znaku, przy czym najbardziej znaczący bajt jest przesyłany jako pierwszy). Każde słowo danych jest od razu uzupełniane 8-bitową sumą kontrolną CRC. W kierunku zapisu obowiązkowe jest przesłanie sumy kontrolnej. SCD41 oferuje cztery różne typy sekwencji poleceń I²C: odczyt sekwencji, zapis sekwencji, wysyłanie polecenia oraz sekwencje wysłania polecenia i pobrania wyniku.
Po starcie zasilania układ przechodzi w stan bezczynności. SCD41 oferuje trzy tryby pomiaru: okresowy, okresowy o niskim poborze mocy oraz pojedynczy.
Typowa sekwencja komunikacji w trybie pomiaru okresowego wygląda następująco:
- Czujnik jest włączany do stanu bezczynności.
- Urządzenie nadrzędne (master) I²C wysyła polecenie start_periodic_measurement. Automatycznie wykonywane są pomiary. Interwał aktualizacji sygnału wynosi 5 s.
- Master I²C okresowo odczytuje dane za pomocą polecenia read_measurement.
- Gdy czujnik ma przestać okresowo wykonywać pomiary, master wysyła polecenie stop_periodic_measurement, aby przywrócić czujnik do trybu bezczynności (500 ms).
SCD41 oferuje tryb okresowego pomiaru o niskim poborze mocy z interwałem aktualizacji wyniku wynoszącym około 30 sekund. Opisywany tryb jest inicjowany za pomocą polecenia start_low_power_periodic_measurement i odczytywany w podobny sposób, jak pomiar okresowy przy użyciu polecenia read_measurement.
Czujnik oferuje dodatkowo tryb pomiaru pojedynczego (na żądanie):
- Układ jest włączany poleceniem wake_up, jeśli wcześniej został wyłączony poleceniem power_down.
- Master I²C wysyła polecenie measure_single_shot i czeka na wskazany maksymalny czas trwania polecenia (5000/50 ms).
- Master odczytuje dane poleceniem read_measurement.
- Kroki 2 i 3 są powtarzane zgodnie z wymaganiami aplikacji.
- W razie potrzeby wyłączenie czujnika jest możliwe przy użyciu polecenia power_down.
Najkrótszy możliwy interwał próbkowania w trybie pomiarów pojedynczych wynosi 5 sekund. Aby jeszcze bardziej zmniejszyć zużycie energii, można zastosować kluczowanie zasilania czujnika pomiędzy pomiarami albo użyć poleceń power_down/wake_up.
SCD41 udostępnia dwie funkcje kalibracji terenowej: wymuszoną ponowną kalibrację (FRC) i autokalibrację (ASC).
Należy pamiętać, że białej membrany zabezpieczającej przed kurzem i wodą, znajdującej się na górze nasadki czujnika, nie wolno zdejmować.
Moduł SEK-SCD41
Moduł SEK-SCD41 firmy Sensirion zawiera tylko czujnik SCD41, gniazdko JST PH 2,0 mm oraz dwa rzędy padów do wlutowania listew goldpin udostępniających zasilanie i sygnały szyny I²C (na płytce brakuje natomiast rezystorów podciągających linie interfejsu). W zestawie dostarczane są dwa kable: jeden zakończony wtykami goldpin, a drugi – wtykiem RJ45, umożliwiającym dołączenie modułu do mostka SEK-SensorBridge, umożliwiającego – wraz z oprogramowaniem ControlCenter – natychmiastową pracę z czujnikami firmy Sensirion. Główną funkcjonalnością ControlCenter jest wykonywanie i wizualizacja pomiarów na żywo z różnych czujników. Dokładniejszy opis pracy z tym zestawem znajduje się w artykule „Moduł czujników środowiska SEN5x firmy Sensirion” [3].
Moduł BME688 Breakout Board firmy pi3g
Czujnik BME688 firmy Bosch został dokładnie opisany w artykule pt. „Czujnik gazu Bosch BME688 ze Sztuczną Inteligencją” [2]. Moduł BME688 Breakout Board firmy pi3g zawiera układ BME688 fabrycznie skonfigurowany do pracy z szyną I²C [8].
Płytka Enviro Weather (PIM628)
Widok płytki Enviro Weather (PIM628) pokazano na fotografii tytułowej. Na dolnej stronie płytki jest bezpośrednio wlutowana płytka Raspberry Pi Pico W, udostępniająca gniazdko microUSB oraz przycisk BOOTSEL. Zestaw był już wielokrotnie opisywany w artykułach publikowanych w poprzednich wydaniach „Elektroniki Praktycznej”, dlatego też zainteresowanych Czytelników zachęcamy do zapoznania się z poprzednimi odcinkami niniejszego cyklu.
Czujnik ciśnienia, temperatury i wilgotności BME280
Układ scalony BME280 firmy Bosch wykonuje pomiary ciśnienia (300...1100 hPa, 18/20 bitów), temperatury (–40°C...+85°C, 18/20 bitów) oraz wilgotności względnej (0...100%, 16 bitów) w technologii pojemnościowej [11]. Udostępnia on pomiary wilgotności względnej w zakresie 0...100% z rozdzielczością 0,008% RH/LSB oraz dokładnością ±3% RH (w zakresie 20...80% RH). Czas odpowiedzi wynosi (τ0...63%) 1 s, dryft długoterminowy (20...80% RH) 0,5% RH/rok, a histereza ±1% RH. Na płytce Enviro Weather układ BME280 jest skonfigurowany do pracy ze standardem komunikacji I²C i zasilaniem 3,3 V.
Czujnik światła otoczenia LTR-559
Układ LTR-559 firmy LiteOn to scalony czujnik światła otoczenia (ALS, Ambient Light Sensor) oraz czujnik zbliżeniowy (PS, Proximity Sensor). Układ ma dwa kanały pomiarowe o charakterystyce spektralnej zbliżonej do oka ludzkiego (bez podczerwieni oraz z uwzględnieniem pasma IR). Pomiar jest wykonywany w liniowym zakresie 0,01...64 000 lx z rozdzielczością 16 bitów. Sensor został dokładniej opisany w artykule [4].
Układ scalony PCF85063A – zegar RTC
Układ scalony PCF85063A firmy NXP to zegar czasu rzeczywistego (RTC) i kalendarz zoptymalizowany pod kątem niskiego zużycia energii [4]. Na płytce Enviro Weather układ PCF8563A jest zasilany napięciem z szyny V+_A0 (3,3 V). Dokładniejszy opis implementacji zegara można znaleźć w [4].
Pico Inky Pack – moduł z wyświetlaczem e-paper
Pico Inky Pack (PIM634) firmy Pimoroni to moduł z czarno-białym wyświetlaczem e-paper o przekątnej 2,9” i rozdzielczości 296×128 pikseli, przeznaczony do użycia z Raspberry Pi Pico oraz Raspberry Pi Pico W. Ma wbudowany kontroler z interfejsem SPI oraz trzy mikroprzyciski. Jest zasilany z szyny 3V3 modułu Pico.
Pico Graphics to zunifikowana biblioteka graficzna opracowana przez Pimoroni i umożliwiająca sterowanie wyświetlaczami z poziomu płytki RPi Pico w języku MicroPython.
Dołączanie czujników do płytki Enviro Weather
Moduły z czujnikami zostały dołączone do ekspandera z zastosowaniem standardowych kabelków IDC (fotografia tytułowa). Zasilanie modułu BME688 Breakout Board dołączono do szyny 3V3 na płytce Pico W modułu Enviro Weather, a zasilanie modułu SEK-SCD41 – do wyjścia LDO typu LT3045, ustawionego na 3,3 V i dołączonego do szyny VSYS. Linie I²C obu modułów pracują na wspólnej szynie czujników modułu Enviro Weather (GP4 – SDA, GP5 – SCL). Dokładny opis organizacji zasilania płytki Raspberry Pi Pico W oraz Enviro Waether został już omówiony w artykule pt. „Optymalizacja poboru mocy urządzenia IoT z płytką Raspberry Pi Pico W” [5].
Praca czujników z modułem Enviro Weather
Cała procedura wpisywania do płytki Enviro Weather najnowszej wersji firmowego pliku obrazu (uf2) oraz aplikacji Enviro została dokładnie omówiona w poprzednich odcinkach niniejszego cyklu. Tym razem do pamięci trzeba dodatkowo wpisać pliki aplikacyjne z pobranego pliku Enviro_SCD41_BME688.zip (https://tiny.pl/cm34mp4b). Podmieniane są jedynie skrypty main.py i config.py.
Obsługa programowa czujników jest realizowana za pomocą driverów firmy Pimoroni dostarczanych w pliku obrazu MicroPythona.
Podczas wykonywania bloku pomiarowego cała aplikacja (w pliku main.py) uruchamiana jest tylko raz. Dlatego każdorazowo należy zainicjalizować czujniki, a potem odczyt danych pomiarowych. Po wystartowaniu oprogramowania błyska jeden raz biała dioda LED (ACTIVITY). Na początku kodu z pliku const.txt wczytywane są dane wilgotności bazowej (HUM_BASE) i czasu usypiania układu (SLEEP_TIME). Następnie wykonywana jest detekcja obecności wszystkich układów na szynie I²C. Aktywowany jest także dostęp do czujników BME280, BME688 i LTR-599. Potem następuje wysłanie komend zatrzymania pomiarów, inicjalizacji czujnika SCD41 oraz – finalnie – startu pomiaru okresowego.
Następnie odczytywane są poprzednie dane pomiarowe z pliku buf.txt, potrzebne do tego, aby na wyświetlaczu dorysować prostokąt sygnalizujący początek wykonywania pomiaru.
Po odczycie danych pomiarowych z czujników BME280, BME688 oraz LTR-559 w pętli sprawdzany jest znacznik gotowości danych układu SCD41 i trwa oczekiwanie na jego ustawienie (ok. 5 s). Wtedy dane pomiarowe zostają odczytane (rysunek 1), po czym następuje komenda zatrzymania pomiaru okresowego.
Do pomiarów szyny I²C zastosowano oscyloskop DSO-X 3204A firmy Keysight z zainstalowanym programowym modułem pomiarowym analizy protokołu I²C [12]. W sposób niemalże intuicyjny pozwala on na analizę zdarzeń na szynie. W pomiarach zostało zastosowane wyzwalanie wpisem na szynie I²C pod adresem SCD41 (czyli 0x62).
Czujniki BME280 i BME688 mierzą ciśnienie, BME280, BME688 i SCD41 – temperaturę i wilgotność, zaś SCD41 – poziom CO2. Sensor BME688 zwraca ponadto poziom gazów w postaci wartości rezystancji, na podstawie której wyliczany jest indeks jakości powietrza IAQ, wzorowany na analogicznym obliczeniu realizowanym przez driver Pimoroni [11]. Wszystkie wyniki pomiarów i obliczeń są pokazywane na wyświetlaczu e-paper i zapisywane w pliku buf.txt. Na koniec wywoływana jest firmowa funkcja enviro.sleep, programująca RTC na wybudzenie procesora oraz wprowadzająca procesor na pewien czas (np. 1 min) w stan uśpienia. Podczas zasilania z wejścia BAT wyłączane jest zasilanie całej płytki Enviro Weather oraz wszystkich dołączonych czujników, z wyjątkiem układu RTC. Sygnał alarmu z RTC wymusza reset procesora.
Przykład pomiaru parametrów środowiska został pokazany na fotografii tytułowej. Wielkości mierzone przez kilka czujników są pokazywane w jednym wierszu, od lewej BME280, BME688 i SCD41.
Oprogramowanie było uruchamiane w środowisku Thonny. Na listingu 1 pokazano okno Shell po wystartowaniu aplikacji pomiarowej. Różne informacje są wyprowadzane przez aplikację pomiarową oraz przez firmową aplikację Enviro (poprzedzone znacznikiem czasu, nieaktualizowanym). Pozwalają one na dosyć dokładne zorientowanie się w postępach pracy oprogramowania.
Do dynamicznego pomiaru prądu zasilania bardzo dobrze nadaje się zestaw Power Profiler Kit II (PPK2) firmy Nordic Semiconductor. Jest to samodzielny układ, który bez zewnętrznego sprzętu może mierzyć i dostarczać prądy od poniżej μA do 1 A. Praktyka pokazuje, że zakres pracy rozciąga się do ok. 2 A – wymaga to jednak dołączenia dodatkowego portu USB do drugiego gniazdka PPK2. Dokładny opis PPK2 jest zamieszczony w artykule „Profilowanie mocy z zastosowaniem Power Profiler Kit II” [10].
Na rysunku 2 został pokazany pomiar poboru prądu płytki Enviro Weather podczas dwóch cykli pomiarowych, po podaniu zasilania na wejście BATT (4,2 V) z zestawu Power Profiler Kit II (PPK2). Pomiary parametrów środowiska są wykonywane co ok. 1 min. Procesor podczas pracy pobiera ok. 50 mA prądu.
Płytka Enviro Weather w stanie wyłączenia zasilania (uśpienia) pobiera ok. 30 μA prądu (zasilane jest tylko RTC), zaś po podaniu zasilania na wejście BATT impuls prądu ma wartość 89 mA – potem startuje tylko sam układ RTC, migając słabo czerwoną diodą LED (ok. 0,6 mA). Dopiero przyciśnięcie przycisku POKE powoduje impulsowy pobór prądu ok. 1,4 A (ok. 600 μs) i start aplikacji. W następnych cyklach pomiarowych nie jest potrzebne dalsze przyciskanie klawisza POKE. Jednak przy każdym ponownym włączeniu zasilania procesora (po sygnale przerwania z układu RTC) występuje tak samo wysoki pik prądu rozruchowego, co bardzo zwiększa wymagania dotyczące wydajności prądowej źródła zasilania układu.
Średni pobór prądu podczas pomiaru wynosi ok. 39 mA, a w całym okresie – ok. 6,9 mA (rysunek 2). Wartość ta drastycznie maleje po zwiększeniu odstępów pomiędzy pomiarami. Podczas pracy SCD41 pobór maksymalny wynosi ok. 252 mA i średni ok. 85 mA. Prąd pobierany jest skokowo w postaci regularnych impulsów 200 mA. Przy wymaganiu stabilności napięcia zasilania układu SCD41 na poziomie lepszym niż 30 mV stawia to wysokie wymagania wobec obwodu zasilania.
Podczas zasilania płytki Enviro Weather z gniazdka USB procesor, zamiast wchodzić w stan uśpienia, aktywnie odczytuje w pętli znacznik przerwania układu RTC. Dopiero po jego ustawieniu wymusza reset procesora. Średni pobór prądu płytki (@ 5 V) podczas pomiaru wynosi 39 mA, maksymalny ok. 290 mA (rysunek 3). W trakcie oczekiwania pobór prądu wynosi ok. 36 mA. Niski prąd średni wynika z braku szpilek prądowych przy restarcie procesora.
Podsumowanie
Doskonała płytka Enviro Weather, udostępniająca wiele czujników środowiska, została ponownie uzupełniona o podłączenie sensorów kolejnych parametrów, np. SCD41 i BME688. Pomimo pomiaru tych samych wielkości przez kilka czujników, wyniki nieznacznie się różniły. Wynika to z różnic w sposobie pomiaru i czasie reakcji na zmiany. Jednocześnie taka redundancja pozwala na weryfikację pomiarów o wątpliwej wartości użytkowej.
Pomiar wilgotności wykonywany przez czujnik BME688 wykazywał wyraźnie wyższą wartość niż dane z pozostałych czujników. Inny egzemplarz działał poprawnie. W zaleceniach producenta jest podane, że nie wolno dotykać palcem układu scalonego – tłuszcz ze skóry pozostanie na powierzchni czujnika, co wydłuży czas jego odgazowywania, a to spowoduje błędy w danych pomiarowych. W celu zwiększenia dokładności pomiaru CO2 można w bloku pomiarowym odczytać kilka wyników z czujnika SCD41 (wykonywanych automatycznie co 5 s) i uśrednić je.
Przykład pomiaru parametrów środowiska, pokazany na fotografii tytułowej, uwidacznia typowe parametry środowiska w pomieszczeniu w trakcie końca lata.
Zastosowanie środowiska uruchomieniowego Thonny daje łatwość rozpoczęcia pracy z procesorem RP20240 w języku MicroPython i możliwość wykorzystania wielu przykładowych projektów. Wadą jest praktycznie brak wspomagania w postaci debuggera. Już po pierwszym wykonaniu aplikacji następuje reset procesora i utrata komunikacji środowiska Thonny z płytką Enviro Weather. Oznacza to brak możliwości podglądu informacji wysyłanych przez aplikację. Nie pomaga ponowne dołączenie środowiska do działającej płytki, ponieważ powoduje to zatrzymanie działania aplikacji. Również wystąpienie błędu powoduje zatrzymanie działania programu, bez możliwości zasygnalizowania problemu.
Realizacja oprogramowania bazuje na projekcie „Pomiar indeksu jakości powietrza we wnętrzach, w tym IAQ oraz poziomu CO2” wykonanego w ramach przedmiotu „Systemy wbudowane i oprogramowanie” na Wydziale Elektroniki i Technik Informacyjnych Politechniki Warszawskiej przez zespół w składzie: Filip Zawadzki, Tomasz Koźmiński, Wojciech Kryński i Krzysztof Dobosz.
Henryk A. Kowalski
Instytut Informatyki
Politechnika Warszawska
Literatura:
[1] Systemy dla Internetu Rzeczy (35): Cyfrowe czujniki gazu, Henryk A. Kowalski, EP 3/2020, https://tiny.pl/czkh1
[2] Systemy dla Internetu Rzeczy (54): Czujnik gazu Bosch BME688 ze Sztuczną Inteligencją, EP 11/2021, https://tiny.pl/cspv8
[3] Moduł czujników środowiska SEN5x firmy Sensirion, EP 3/2024, https://tiny.pl/d0fyfcy5
[4] Stacja pogodowa Enviro Weather firmy Pimoroni, EP 4/2024, https://tiny.pl/d93r1
[5] Optymalizacja poboru mocy urządzenia IoT z płytką Raspberry Pi Pico W, EP 5/2024, https://tiny.pl/d59hg
[6] SCD41, Sensirion, https://sensirion.com/products/catalog/SCD41
[7] SEK-SCD41, Sensirion, https://tiny.pl/nmdwsjrw
[8] ME688 breakout board Bosch air quality sensor, pi3g, https://tiny.pl/gvvvfb1c
[9] Enviro MicroPython firmware, Pimoroni, https://tiny.pl/dt49f
[10] Profilowanie mocy z zastosowaniem Power Profiler Kit II, EP 5/2022, https://tiny.pl/d93rd
[11] BME680, https://github.com/pimoroni/bme680-python
[12] DSOX3024A Oscilloscope: 200 MHz, 4 Channels, https://tiny.pl/b-m1ykyt
[13] Enviro MicroPython firmware, Pimoroni, https://tiny.pl/dt49f