Przygotowując na prośbę znajomego „ogrodnika” sterownik podlewania w szklarni szukałem małego i taniego czujnika temperatury i wilgotności powietrza. Po krótkim przeszukaniu Internetu mój wybór padł na moduł KAmodHTS221. Moduł zbudowano z wykorzystaniem układu HTS221 firmy STMicroelectronics. Układ ten jest przystosowany do pracy z napięciem 3,3 V, co nie jest zbyt wygodne w moich zastosowaniach, gdyż w większości projektów wykorzystuję logikę 5 V. Na szczęście moduł KAmodHTS221 ma wbudowany konwerter napięć, więc można go bezpośrednio dołączyć np. do Arduino Uno.
Podstawowe dane modułu KAmodHTS221:
- Zakres pomiarowy: 0 – 100% RH (wilgotność) / 0 – 60°C (temperatura)
- Dokładność pomiaru wilgotności: ± 6% (0 – 100% RH) / ± 4.5% (20 – 80% RH)
- Dokładność pomiaru temperatury: ± 1°C (0 – 60°C) / ± 0.5°C (15 – 40°C)
- Napięcie zasilania: 2,5 – 5,5 V
- Rozdzielczość przetwornika ADC: 16 bitów
- Interfejs komunikacyjny: SPI / I2C
- Wymiary modułu (bez złącza): 24 mm x 15 mm x 3 mm
Pierwsze próby z płytką rozpocząłem od uruchomienia dostarczonego przez producenta przykładu. Sposób dołączenia modułu KAmodHTS221 z mikrokontrolerem STM32 z zestawu ZL27ARM jest następujący:
ZL27ARM (pin złącza JP5) | KAmodHTS221(pin złącza JP1) |
---|---|
PB0(1) | CS(7) |
PB1(2) | DRDY(8) |
PB6(7) | SCL(5) |
PB7(8) | SDA(4) |
GND(19) | GND(3) |
+3,3V(20) | +Vin(2) |
Pierwotnie połączenia wykonałem z wykorzystaniem płytki stykowej.
Kolejnym zadaniem jest inicjalizacja i wyczyszczenie wyświetlacza alfanumerycznego, włączenie wszystkich diod LED zestawu ZL27ARM oraz napisanie komunikatu o nieprawidłowym stanie linii CS.
1 2 3 4 5 |
LCD_Initialize(); LCD_WriteCommand(HD44780_CLEAR); LCD_WriteTextXY("TEST KAmodHTS221\0",0,0); LCD_WriteTextXY("Blad, CS=0 (SPI)\0",0,1); GPIO_SetBits(GPIOB, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); |
Program sprawdza stan linii CS do momentu, aż wystąpi logiczne „1”. W przeciwnym razie informacja na temat błędu na LCD nie zmieni się, a program nie będzie wykonywał kolejnych kroków.
1 |
while (!GPIO_ReadInputDataBit(HTS221_I2C_GPIO, HTS221_I2C_CS)); |
Jeśli linia CS jest w odpowiednim stanie (logiczne „1” – czujnik pracuje w magistrali I2C), zmieniony zostaje opis wskazujący tym razem na usterkę magistrali I2C:
1 |
LCD_WriteTextXY(" Blad I2C \0",0,1); |
Jeżeli inicjalizacja czujnika mająca na celu zapisanie i weryfikację odpowiednich danych w rejestrach, a tym samym przeprowadzająca test magistrali zakończy się powodzeniem program kontynuuje działanie. Prócz ustawienia odpowiednich parametrów pracy układu HTS221 w funkcji inicjalizacyjnej HTS221_I2C_Init() jest sprawdzany także numer ID układu (HTS221_I2C_Who_Am_I()). Jeśli magistrala byłaby sprawna, a czujnik zgłosił by inny numer identyfikacyjny niż nadany przez producenta, program zmieni odpowiednio opis błędu i wstrzyma działanie.
1 2 3 4 5 |
if(HTS221_I2C_Init()) { LCD_WriteTextXY("I2C OK - zly ID \0",0,1); while(1); } |
Dopiero po tych czynnościach, które nie są krytyczne dla systemu, a mają na celu tylko i wyłącznie sprawdzenie poprawności połączeń oraz samego czujnika, program przechodzi do funkcji odczytującej i odpowiednio formatującej rejestry konfiguracyjne MEMS-a o nazwie HTS221_I2C_Calib(). Zawierają one szereg istotnych danych zdefiniowanych przez producenta umożliwiających poprawne przeliczanie danych z rejestrów temperatury i wilgotności tak, aby wynik był dokładny i zrozumiały dla człowieka.
W następnej kolejności wyłączone zostają wszystkie diody LED zestawu ZL27ARM sygnalizujące wcześniej błędy, a na wyświetlaczu pojawi się napis informujący o teście linii DRDY.
1 2 |
LCD_WriteTextXY(" Test DRDY \0",0,1); GPIO_ResetBits(GPIOB, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14); |
Jako że czujnik dokonuje pomiaru i aktualizuje rejestry wyjściowe co 1 sekundę, program czeka w pętli na zgłoszenie przez czujnik zakończenia pomiarów (DRDY – Data Ready). W przypadku gdyby po ok 1,5 s zgłoszenie nie nastąpiło, sygnalizowany jest błąd DRDY i zapalane są wszystkie diody LED zestawu ZL27ARM. Następnie program „zawiesza się” w nieskończonej pętli (while(1)).
1 2 3 4 5 6 7 8 9 10 11 12 |
while(!GPIO_ReadInputDataBit(HTS221_I2C_GPIO,HTS221_I2C_DRDY)) { i++; if(i==2000000) { LCD_WriteTextXY("TEST KAmodHTS221\0",0,0); LCD_WriteTextXY(" Blad DRDY \0",0,1); GPIO_SetBits(GPIOB, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); while(1); } } i=0; |
Przy poprawnej pracy, po zgłoszeniu gotowości danych (DRDY), mikrokontroler wykonuje program zawarty w funkcji HTS221_I2C_Read_Temp_Humi(&tempCelsius, &humi), która sprawdza status rejestrów temperatury i wilgotności. Ma to na celu upewnienie się, że dane w nich zawarte są aktualne i nie zmienią się przed najbliższym odczytem. Następnie mikrokontroler odczytuje dane z rejestrów temperatury i wilgotności powietrza, na których przeprowadza interpolację liniową bazując na wcześniej uzyskanych danych kalibracyjnych i wreszcie zwraca wartość temperatury wraz z wilgotnością powietrza. Gdyby mierzone wartości przekraczały wartości graniczne czujnika, funkcja w takim przypadku zwróci graniczne wartości temperatury oraz wilgotności.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
void HTS221_I2C_Read_Temp_Humi( float *pTemp , float *pHumi) { unsigned char sensor_data[4]; short H_OUT; short T_OUT; sensor_data[0]=0; while(!(sensor_data[0]&0x03)) { HTS221_I2C_Register_Read(HTS221_STATUS_REG, &sensor_data[0], 1); } HTS221_I2C_Register_Read(HTS221_HUMIDITY_OUT_L, &sensor_data[0], 4); H_OUT = (sensor_data[1] << 8) + sensor_data[0]; T_OUT = (sensor_data[3] << 8) + sensor_data[2]; if (H_OUT&0x8000) H_OUT = -(0x8000-(0x7fff&H_OUT)); if (T_OUT&0x8000) T_OUT = -(0x8000-(0x7fff&T_OUT)); *pTemp = HTS221_I2C_Linear_Interpolation(T0_OUT, T0_DegC_cal, T1_OUT, T1_DegC_cal, T_OUT); *pHumi = HTS221_I2C_Linear_Interpolation(H0_T0_OUT, H0_RH_cal, H1_T0_OUT, H1_RH_cal, H_OUT); if ((int)*pHumi>HTS221_MaxHumi-1 | (int)*pHumi==-72) *pHumi = HTS221_MaxHumi; if ((int)*pHumi<HTS221_MinHumi ) *pHumi = HTS221_MinHumi; if ((int)*pTemp>HTS221_MaxTemp-1) *pTemp = HTS221_MaxTemp; if ((int)*pTemp<HTS221_MinTemp ) *pTemp = HTS221_MinTemp ; } |
Na zakończenie w funkcji main() jest dokonywana zamiana zmiennych typu float na ciąg znaków w tablicy oraz jego wyświetlenie na wyświetlaczu alfanumerycznym. Obsługiwana jest także jedna dioda LED zestawu ZL27ARM, która mrugając sygnalizuje poprawną pracę modułu KAmodHTS221.
1 |
HTS221_I2C_Read_Temp_Humi(&tempCelsius, &humi); |
i w zmiennych &tempCelsius i &humi mamy odczytane i przeliczone do „ludzkiej postaci” wartości mierzonych parametrów.
Płytkę KAmodHTS221 dostarczył sklep internetowy dla elektroników Kamami.pl.