[KAmodHTS221] Opis i uruchomienie czujnika.
: niedziela 25 cze 2017, 13:02
Wielu z nas ma na swym koncie rozmyślania o własnej domowej stacji pogodowej. Czasem nie poprzestajemy na tym i próbujemy zbudować własne urządzenie. Do jego budowy potrzebny będzie jakiś czujnik temperatury, wilgotności względnej, ciśnienia atmosferycznego. Można również dorzucić wiatromierz, miernik nasłonecznienia oraz pobawić się w pomiar ilości opadów. W prezentacji zebranych danych panuje dość duża dowolność. Można skorzystać z wyświetlacza ledowego lub ciekłokrystalicznego, można przesłać dane przewodowo lub bezprzewodowo, by następnie wyświetlić je na ekranie monitora, a można po prostu zebrać dane w pliku na karcie pamięci i potem robić z nimi, co tylko komu przyjdzie do głowy. Obecny rynek oferuje szeroki wybór analogowych i cyfrowych czujników, spośród których każdy wybierze coś interesującego. W moim przypadku wybór padł na cyfrowy czujnik temperatury oraz wilgotności względnej HTS221 firmy STMicroelectronics, który zakupiłem w sklepie KAMAMI. Oferowany jest jako samotny układ oraz w postaci modułu z wyprowadzonymi goldpinami. Oto garść informacji na temat układu:
- Zasilanie od 1.7V do 3.6V.
- Bardzo niskie zapotrzebowanie na prąd. 1µA przy cosekundowych pomiarach.
- Możliwy jest wybór częstotliwości pojawiania się nowych wyników. 1Hz, 7Hz i 12.5Hz.
- Małe wymiary, czyli 2mm x 2mm x 0.9mm.
- Dokładność pomiaru temperatury wynosi 0.5ºC w zakresie od 15ºC do 40ºC.
- Dokładność pomiaru wilgotności wynosi 4.5% rH w zakresie od 20% rH do 80% rH.
- Fabryczna kalibracja każdego egzemplarza układu.
- Wsparcie dla komunikacji I2C oraz SPI (3-wire).
Cóż tu dużo mówić, układzik całkiem zgrabny do domowych (i nie tylko) zastosowań. Przygotowany przez KAMAMI moduł posiada dodatkowo stabilizator napięcia, układ dopasowania poziomów napięć na liniach SCL/SPC i SDA/SDO/SDI oraz rezystor podciągający pin CS do poziomu 3.3V. Pin DRDY, służący jako wyjście układu informujące o obecności nowych pomiarów, został podłączony do złącza goldpin modułu bez żadnych dodatkowych elementów. Mogłoby się wydawać, że nastąpiło tu pewne niedopatrzenie, ale możliwość pracy tego pinu w różnych trybach uwalnia konstruktora od stosowania dopasowania poziomów czy też rezystorów podciągających.
Tak spreparowany moduł umożliwia pracę również w środowisku zasilanym napięciem 5V.
Dodatkowe parametry modułu, dokumentacja techniczna oraz kody źródłowe programów dostępne są na stronie Kamami.pl-Wiki.
Podłączenie modułu do mikrokontrolera.
Najprostsze połączenie wymaga dostarczenia zasilania oraz linii SDA i SCL. Nie jest wymagane korzystanie z pinu DRDY, ale warto to rozważyć. Jego użycie zapewni nam informację o obecności nowych danych do odczytania z czujnika, a to uchroni program przed ciągłym sprawdzaniem flag w jednym z rejestrów modułu. Minimalne podłączenie prezentuje poniższy schemat:
Jak widać podłączenie jest banalne. Nie trzeba dodawać do układu nawet rezystorów podciągających linie sygnałowe SDA i SCL, ponieważ znajdują się one na module. Jak już wcześniej wspomniałem, warto skorzystać z pinu DRDY. Moduł poinformuje system, że posiada dane, które leżą gotowe do odczytu. Nie trzeba ciągle męczyć szyny I2C lub SPI sprawdzaniem flag w rejestrze STATUS (0x27). Tak to mniej więcej wygląda:
Pin DRDY został podłączony do dowolnego pinu. Oczywiście można podłączyć się pod pin z przerwaniem INT/PCI/EXTI… Nazwy zewnętrznych przerwań różnią się w zależności od zastosowanego mikrokontrolera. Sposób działania tego pinu wymaga kilku słów wyjaśnienia. Moduł w żaden sposób go nie buforuje, a to oznacza, że napięcie na nim nie może przekroczyć napięcia zasilania układu + 0.3V (nie mylić z napięciem zasilania modułu), a to wynosi 3.3V.
3.3V + 0.3V daje nam 3.6V, tego poziomu nie wolno przekroczyć. Tuż pod tabelą określającą maksymalne i minimalne wartości napięć i temperatur (patrz dokumentacja układu) producent układu dopisał, że napięcie zasilania na żadnym z pinów nie powinno nigdy przekraczać 4.8V. Wygląda to na pewną nieścisłość w tekście, więc bezpieczniej jest trzymać się tego, co zawiera tabela. Z tych wszystkich danych wynika, że jeśli chcemy podłączyć do tego pinu rezystor podciągający, musimy podłączyć go do zasilania o takim samym poziomie, jakim zasilany jest układ. A teraz trochę o możliwościach tego pinu. DRDY potrafi pracować w trybie „push/pull” oraz „open drain”, czyli odpowiednio jako źródło/ujście oraz jako otwarty dren. Pracując w pierwszym trybie, pin potrafi samodzielnie wymusić stan wysoki i niski, zaś pracując w drugim, wymagany jest rezystor podciągający do napięcia zasilania układu, ponieważ pin potrafi wymusić jedynie stan niski. Oprócz sposobu pracy samego wyjścia możemy decydować o poziomie, który będzie uważany za aktywny. Można ustawić „active high”, czyli na pinie będzie się pojawiał stan wysoki, gdy układ poinformuje o nowych danych oraz „active low”, gdy zechcemy, by układ wystawiał stan niski.
Drugim pinem sterującym jest CS. Decyduje on o sposobie komunikacji z układem HTS221. Gdy pin CS jest w stanie wysokim, należy rozmawiać z układem przy pomocy I2C, a gdy pin jest w stanie niskim, obowiązuje SPI (3-wire). Pin jest podciągnięty rezystorem do 3.3V, który znajduje się na module. W przypadku korzystania z I2C pin pozostaje niepodłączony. Mała uwaga: W przypadku wykorzystania tego modułu w systemie zasilanym napięciem 5V, wyjście mikrokontrolera sterujące pinem CS należy ustawić albo w tryb otwartego drenu, albo po każdej transmisji przełączać w kierunek wejściowy. Pod żadnym pozorem nie wolno wystawiać stanu wysokiego z mikrokontrolera, bo to spowoduje pojawienie się napięcia 5V na pinie CS układu HTS221.
Pin SCL/SPC służy do podania nań sygnału zegarowego, a pin SDA/SDI/SDO do wymiany bitów. Oba są wykorzystywane zarówno podczas komunikacji I2C, jak i SPI. Oba są buforowane, więc można śmiało je podłączać do systemu zasilanego napięciem 5V.
Uruchomienie.
Prawidłowo podłączony i zasilony układ nie podejmuje pracy automatycznie, ponieważ znajduje się on w trybie „power down”. Aby uruchomić czujnik, należy przede wszystkim ustawić bit o nazwie PD w rejestrze konfiguracyjnym CTRL_REG1 (0x20). Przy okazji warto rzucić okiem na pozostałe trzy bity tego rejestru. Jeden z nich, o nazwie BDU, decyduje o sposobie wpisywania wyników pomiarów do rejestrów czujnika. Gdy bit nie jest ustawiony, czujnik ma prawo wpisywać nowe dane w każdej chwili, a gdy bit jest ustawiony, czujnik nie ma prawa wpisać nowych danych, dopóki nie odczytamy poprzednich (a konkretnie rejestrów zawierających starsze bajty danych pomiarowych). Tutaj dodam, że w przypadku wykonywania automatycznych pomiarów, warto ustawić bit BDU, by nie doszło do sytuacji, w której odczytane wyniki będą zawierały dane z dwóch różnych cykli pomiarowych. Pozostałe dwa bity to ODR0 i ODR1. Służą one do wyboru częstotliwości dokonywania pomiarów przez czujnik. Dostępne są częstotliwości 1Hz, 7Hz, 12.5Hz oraz wyzwalanie ręczne, które jest domyślnie ustawione. Pozostałe ustawienia można znaleźć w rejestrach CTRL_REG2 (0x21), CTRL_REG2(0x22) oraz AV_CONF (0x10) . W rejestrze CTRL_REG2 znajduje się bit BOOT, który służy do wymuszenia ponownego skopiowania danych kalibracyjnych z wewnętrznej pamięci nieulotnej układu do jego rejestrów. Nie jest konieczne każdorazowe wywoływanie tej operacji, bo czujnik dokonuje kopiowania po każdym włączeniu zasilania. Oprócz BOOT znaleźć można bit HEATER służący do włączenia lub wyłączenia zintegrowanej z czujnikiem grzałki (gdyby zaszła potrzeba usunięcia skondensowanej pary z wnętrza czujnika) oraz bit ONE_SHOT służący do ręcznego wyzwalania jednego cyklu pomiarów. CTRL_REG3 służy do konfiguracji pinu DRDY. Do dyspozycji mamy bit DRDY_H_L, którym wybiera się stan aktywny pinu, bit PP_OD, którym wybiera się tryb pracy pinu oraz bit DRDY_EN, który służy do włączenia tegoż pinu. W rejestrze AV_CONF znajdują się bity służące do wyboru ilości zbieranych próbek pomiarów. Służą one do uśredniania wyników pomiarów wpisywanych do rejestrów wyjściowych. Domyślne ustawienie to 16 próbek dla temperatury oraz 32 próbki dla wilgotności. Tabela wyszczególniająca możliwe do wyboru ilości próbek znajduje się w dokumentacji układu. STATUS_REG służy do sprawdzenia, czy czujnik wpisał już wyniki pomiarów do rejestrów wyjściowych. Nie jest konieczne odczytywanie tego rejestru, gdy korzystamy z dobrodziejstw pinu DRDY.
Niezależnie od konfiguracji czujnika, zawsze można odczytać jego ID, czyli ustalony przez producenta kod układu. Wystarczy po włączeniu zasilania całego systemu odczytać rejestr WHO_AM_I (0x0F). Jeśli odczytana wartość wynosi 0xBC, można mieć pewność, że komunikacja została zestawiona poprawnie i można przystąpić do dalszych działań.
Kolejnym etapem jest odczyt danych kalibracyjnych znajdujących się w rejestrach od adresu 0x30 do 0x3F. Dane te należy obrobić, by mogły posłużyć do dalszych obliczeń:
- H0_RH_X2 oraz H1_RH_X2 należy podzielić przez 2.
- T0_DEGC_X8 należy połączyć z bitami 0 i 1 rejestru T1_T0_MSB tak, by powstała 10 bitowa wartość.
- T1_DEGC_X8 należy połączyć z bitami 2 i 3 rejestru T1_T0_MSB tak, by powstała 10 bitowa wartość.
- Obie powstałe wartości 10 bitowe należy podzielić przez 8.
- Pary rejestrów H0_T0_OUT, H1_T0_OUT, T0_OUT i T1_OUT należy umieścić w zmiennych int16_t.
Po tych kilku zabiegach można rozpocząć odczyty surowych wartości temperatury i wilgotności pochodzących z wbudowanych w czujnik przetworników ADC. Obie wartości są 16 bitowe ze znakiem, czyli należy je umieszczać w zmiennych o typie int16_t. Surowa wartość temperatury znajduje się w rejestrach T_OUT_L (0x2A) i T_OUT_H (0x2B), a surowa w rejestrach H_OUT_L (0x28) i H_OUT_H (0x29). Ostatnim etapem jest podstawienie pod podany w dokumentacji wzór odpowiednich wartości, co zaowocuje otrzymaniem gotowych odczytów temperatury i wilgotności.