[MBED] Stacja pogodowa na STM32 [4]. Pierwsze kroki z mbed – obsługa higrometru HTS221

Pierwszą część kursu publikujemy pod adresem.

Drugą część kursu publikujemy pod adresem.

Trzecią część kursu publikujemy pod adresem.

Pomiar wilgotność względnej powietrza jest wykorzystywany w stacjach meteorologicznych, urządzeniach AGD (np. lodówkach) czujnikach wentylatorów łazienkowych, sterownikach klimatyzacji, układów automatyki domowej itp.

Umieszczony na płytce KA-NUCLEO-WEATHER czujnik HTS221 mierzy wilgotność w zakresie od 20% do 80% rH z dokładnością +/-4,5%. Pomiar może być wykonywany z częstotliwością od 1 pomiaru na sekundę do 25 pomiarów na 2 sekundy. Oprócz pomiaru wilgotności czujnik mierzy temperaturę od -40oC do +120oC z dokładnością +/-0,5oC w zakresie od +15oC do +40oC , oraz +/-1oC w zakresie 0oC do +60oC. Schemat blokowy układu został pokazany na rysunku 15.

 

Rys. 15. Schemat blokowy czujnika HTS221

 

Podstawowym elementem toru pomiaru wilgotności jest sensor pojemnościowy. Jego pojemność zmienia się w zależności od wilgotności otoczenia. Konwersja zmiany pojemności na sygnał napięciowy jest wykonywana we wzmacniaczu Charge OpAmp. Sygnały napięciowe z tego wzmacniacza, lub z czujnika napięciowego są konwertowane na postać cyfrową przez 16-bitowy przetwornik analogowo cyfrowy. Do komunikacji z mikrokontrolerem hostem może być wykorzystany interfejs I2C lub SPI. Jak już wcześniej wspomniałem we wszystkich czujnikach zamontowanych na płytce jest uaktywniony interfejs I2C. Tak jest tez w przypadku HTS221. Układ nie ma wyprowadzeń adresowych i adres slave ma jedna wartość równą 0xBE dla zapisu danych i 0xBF dla odczytu danych.

Projekt testowy został zrealizowany na płytce KA-NUCLEO-WEATHER firmy KAMAMI.pl.

Podobnie jak w przypadku pozostałych czujników konfiguracja parametrów pracy i odczytywanie mierzonych wartości odbywa się przez zapisywanie i odczytywanie wewnętrznych rejestrów. Standardowo będziemy potrzebować dwu funkcji: odczytania zawartości rejestru o podanym adresie i zapisania rejestru o podanym adresie.

Zapisanie rejestru rozpoczyna się od wysłania przez mikrokontroler sekwencji START, a po niej adresu Slave 0xBE. Potwierdzenia adresu przez HTS221 pozwala na wysłanie przez mikrokontroler adresu rejestru, a po nim zapisywanej danej – rysunek 16.

 

Rys. 16. Sekwencja zapisania rejestru HTS221

 

Na listingu 13 pokazano procedurę zapisywania rejestru z dwoma argumentami:

addr – adres rejestru i

data – dane do zapisania.

 

List. 13. Zapisanie rejestru HTS221

Odczytanie rejestru rozpoczyna się od wysłania sekwencji START i adresu Slave z bitem R/W=0 (zapis) i bajt adresu rejestru. Potem jest wysyłana powtórna sekwencja START, adres Slave z bitem R/W=1, a po nim odczytywany jest jeden bajt zawartości zaadresowanego rejestru – rysunek 17.

 

Rys. 17. Sekwencja odczytania rejestru HTS221

 

Funkcja HTS221ReadReg z listingu 14 odczytuje i zwraca zawartość rejestru, którego adres jest umieszczony w argumencie addr.

 

List. 14. Odczytanie rejestru HTS221

Zestawienie rejestrów sterujących i rejestrów wyników pomiarów zostało pokazano w tabeli poniżej.

Rejestr ADRES hex POR Funkcja
WHO_AM_I 0F 0xBC ID układu
AV_CONF 10 0x7A Rejestr konfiguracji rozdzielczości
CTRL_REG1 20 0 Rejestr kontrolny 1
CTRL_REG2 21 0 Rejestr kontrolny 2
CTRL_REG3 22 0 Rejestr kontrolny 3
STATUS_REG 27 0 Rejestr statusu
HUMIDITY_OUT_L 28 0 Młodsza cześć rejestru mierzonej wilgotności
HUMIDITY_OUT_H 29 0 Starsza cześć rejestru mierzonej wilgotności
TEMP_OUT_L 2A 0 Najstarsza cześć rejestru mierzonego ciśnienia
TEMP_OUT_H 2B 0 Najmłodsza cześć rejestru mierzonej temperatury

 

Pomiary wilgotności i temperatury mogą być wykonywane na żądanie, po wysłaniu polecenia (one shot) lub w sposób ciągły z określoną częstotliwością. Do programowania częstotliwości pomiarów jest przeznaczony rejestr CTRL_REG1 o adresie 0x20 pokazany poniżej.

 

B7 B6 B5 B4 B3 B2 B1 B0
PD res res res res BDU ODR1 ODR2

PD Power Down PD=0 power down, PD=1 tryb aktywny

BDU – odświeżanie rejestru wyjściowego BDU=0 dane odświeżane ciągle, BDU=1 dane odświeżane po odczycie rejestrów ciśnienia i temperatury

ODR1:ODR1 – częstotliwość odczytywania danych wyjściowych

00 – pomiar na żądanie One Shot

01 – 1Hz

10 – 7Hz

11 – 12,5Hz

 

Bit PD trego rejestru jest przeznaczony do wprowadzania układu w stan obniżonego poboru mocy, a bit BDU określa czy rejestr z danymi wyjściowymi wilgotności i temperatury ma być odświeżany automatycznie po wykonaniu pomiarów, czy tez po odczytaniu przez mikrokontroler 8 starszych bitów wyniku poprzedniego pomiaru. Po właczeniu zasilania bit PD jest wyzerowany i żeby można było wykonywac pomiary trzeba do PD wpisać jedynkę.

Wyzerowanie bitów ODR1 i ODR2 wprowadza układ w tryb pomiaru na żądanie. Żeby wyzwolić taki poomiar trzeba ustawić bit ONE_SHOT w rejestrze CTRL_REG2 (poniżej).

B7 B6 B5 B4 B3 B2 B1 B0
BOOT res res res res res HEATER ONE_SHOT

BOOT – ustawienie tego bitu powoduje przepisanie ustawień kalibracyjnych z wewnętrznej pamięci FLASH do rejestrów kalibracyjnych

HEATER – ustawienie tego bitu włącza wewnętrzne podgrzewanie w celu usunięcia wilgoci z kondensacji pary wodnej zna czujniku wilgotności. Wyzerowanie bitu powoduje wyłączenie podgrzewania.

ONE_SHOT – ustawienie tego bitu inicjuje jednokrotny pomiar wilgotności i temperatury. Po wykonaniu pomiaru ONE_SHOT jest sprzętowo zerowany

Po wyzwoleniu pomiaru, ale też w trybie pomiaru ciągłego trzeba testować, czy wynik pomiaru został zapisany do rejestrów wyjściowych. Żeby to zrobić trzeba odczytać zawartość rejestru statusowego STATUS_REG. Ustawienie bitu H_DA (bit b1 STATUS_REG) oznacza, że wynik pomiaru wilgotności został zapisany do rejestrów wyjściowych HUMIDITY_OUT_L i HUMIDITY_OUT_H, a ustawienie bitu T_DA (bit b0 STATUS_REG) oznacza, że wynik pomiaru temperatury został wpisany do rejestrów pomiaru temperatury.

W czasie testów czujnika skonfigurowałem układ do pracy z wyzwalaniem na żądanie i z ustawionym bitem BDU. Procedura inicjalizacyjna została pokazana na listingu 15.

 

List. 15. Inicjalizacja higrometru

W poprzednio opisywanych czujnikach wartości odczytywane z wyjściowych rejestrów pomiarów trzeba było przekonwertować z formatu U2, ewentualnie przeskalować lub dodać offset. W przypadku HTS221 jest inaczej. Pierwszą zasadniczą różnicą jest umieszczenie w pamięci układu szeregu dodatkowych rejestrów kalibracji. Każdy układ w procesie produkcyjnym jest kalibrowany i w nieulotnej pamięci Flash są zapisywane dane do kalibracji. W czasie sekwencji włączania zasilania układu dane kalibracyjne są przepisywane z pamięci Flash do rejestrów kalibracyjnych pokazanych poniżej.

Rejestr Adres hex
H0_rH_x2 30
H1_rH_x2 31
T0_degC_x8 32
T1_degC_x8 33
T1/T0 msb 35
H0_T0_OUT 36
37
H1_T1_OUT 3A
3B
T0_OUT 3C
3D
T1_OUT 3E
3F

 

W trakcie inicjalizacji układu mikrokontroler musi odczytać dane kalibracyjne, po to by je potem wykorzystać przy każdorazowym odczycie wilgotności i temperatury. Procedura odczytu rejestrów kalibracyjnych została pokazana na listingu 16.

 

List. 16. Odczytanie rejestrów kalibracyjnych

W wyniku działania tej funkcji są zapisane zmienne globalne pokazane na listingu 17.

Te zmienne w połączeniu z 16-bitowymi danymi wyjściowymi będą służyły do wyliczenia mierzonej wartości. W przypadku temperatury wartości T0_cal, T1_cal, T0_degC i T1degC są współrzędnymi wyznaczającymi prostą kalibracji – pokazano to na rysunku 18.

 

Rys. 18. Prosta kalibracji i wyliczanie temperatury w oC

 

Do zmiennej Treg jest wpisana 16-bitowa wartość odczytana z rejestrów TEMP_OUT_L i TEMP_OUT_H. Mając wartości odczytane z rejestrów kalibracji i wartość Treg wyliczamy wartość temperatury w stopniach Celsjusza według zależności:

T_C = (Treg – T0_cal))/(T1_cal – T0_cal) * (T1_degC – T0_degC) + T0_degC;

Na listingu 18 pokazano kompletną procedurę wyzwolenia pojedynczego pomiaru, wyliczenia i wyświetlenia zmierzonej temperatury. Wartości kalibracyjne zostały jednokrotnie pobrane z rejestrów i wpisane do zmiennych w momencie inicjalizacji układu i nie ma potrzeby ich pobierać przy każdym pomiarze.

 

List. 18. Odczytanie, obliczenie i wyświetlenie temperatury

Podobnie wygląda sposób postępowania w przypadku odczytywania, przeliczania i wyświetlania wilgotności.

 

Rys. 19. Prosta kalibracji i wyliczanie wilgotności w %

 

Wilgotność jest wyliczana z zależności (rysunek 19):

H_rh = (((H_T – H0_cal))/(H1_cal – H0_cal) * (H1_rh – H0_rh) + H0_rh

Procedura odczytywania przeliczania i wyświetlania wilgotności została pokazana na listingu 19.

 

List. 19. Odczytanie, obliczenie i wyświetlenie wilgotności

Wynik działania tej procedury został pokazany na fotografii 20.

 

Fot. 20. Wyświetlone wyniki pomiarów z wszystkich odczytywanych czujników zintegrowanych na płytce KA-NUCLEO-WEATHER

 

Podsumowanie

Przetestowałem zestaw NUCLEO z płytką rozszerzeń KA-NUCLEO-WEATHER, na której umieszczono cztery czujniki przeznaczone do mierzenia parametrów meteorologicznych: temperatury, ciśnienia atmosferycznego i wilgotności. Przykładowe procedury pozwalają na odczytywanie pomiarów, ich konwersję i wyświetlanie na ekranie wyświetlacza.

Używanie wirtualnego środowiska mbed znacznie uprościło i przyspieszyło programowanie obsługi czujników. Nie bez znaczenia jest fakt zastosowania jednego interfejsu komunikacyjnego I2C do komunikacji ze wszystkimi testowanymi czujnikami i wyświetlaczem OLED. Pomimo początkowych oporów mbed okazał się prawie porównywalny z komercyjnymi środowiskami typu uVision. Prawie, bo niestety jest pozbawiony obsługi sprzętowego debugera. Można sobie z tym brakiem poradzić przez utworzenie konsoli znakowej łącząc płytkę NUCLEO z komputerem PC poprzez łącze RS232 i wysyłać komunikaty debugowania. Jest to wbrew pozorom bardzo skuteczny sposób debugowania, ale wymaga posiadania komputera z portem RS232, lub konwertera RS232/USB. Mimo to wsparcie w postaci bibliotek mbed, oraz gotowy bardzo tani modułu NUCLEO i płytki rozszerzeń, to idealne połączenie stanowiące gotowe rozwiązanie niezbędne do pierwszych eksperymentów, jak i do bardziej zaawansowanych testów.

Tomasz Jabłoński

Autor: