[KAmodHTS221] Opis i uruchomienie czujnika.

Tutaj zamieszczamy wyniki i recenzje z testowanych zestawów / podzespołów, jakie będą dostępne dla użytkowników forum
Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

[KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: Antystatyczny » niedziela 25 cze 2017, 13:02

kamodhts221-modul-czujnika-wilgotnosci-temperatury-z-ukladem-hts221.jpg


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.

Schemat ideowy modułu KAmodHTS221.PNG


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:

Podstawowe podłączenie.PNG


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:

Podłączenie z wykorzystaniem pinu DRDY.PNG


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.

HTS221_interpolacje.PNG
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
matty24
User
User
Posty: 333
Rejestracja: sobota 31 paź 2015, 20:11
Lokalizacja: Małopolska

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: matty24 » niedziela 25 cze 2017, 23:03

Bardzo skrupulatnie opisany moduł. Wszystkie niuanse wyjaśnione w klarowny sposób. Teraz tylko czekam na dalszą relację z uruchomienia czujnika i testów praktycznych.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: Antystatyczny » niedziela 25 cze 2017, 23:06

Celowo zaczekałem z resztą, żeby każdy miał szanse samemu popróbować. Do komunikacji z czujnikiem weź dowolny mikrokontroler z rozsądną ilością flasha i ramu. W razie problemów śmiało pytaj. Kody też się niebawem ukażą.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

StaryAnoda

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: StaryAnoda » poniedziałek 26 cze 2017, 21:33

Podoba mi się w tym moduliku to, że nie posiada żadnych elementów emitujących światło mowa o jakiś diodach sygnalizujących obecność zasilania i tym podobnych, dzięki temu można go zostawiać uruchomionego w nocy, i nikogo nie razi po oczach ;)

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: Antystatyczny » poniedziałek 26 cze 2017, 21:36

Zamontowany na module stabilizator ma wydajność prądową na poziomie 50mA, więc pakowanie tam ledów byłoby trochę ryzykowne. Należy pamiętać, że samo włączenie grzałki powoduje zwiększenie poboru prądu o 33mA.Do tego pobór prądu samego czujnika, rezystory podciągające...
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

StaryAnoda

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: StaryAnoda » poniedziałek 26 cze 2017, 21:39

No tak tak, chciałem zwórcić tylko uwagę na pewną sprawę :)

StaryAnoda

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: StaryAnoda » poniedziałek 26 cze 2017, 21:41

A możesz mi podać kolego Twoje wyniki pomiarów jeżeli masz już jakikolwiek soft gadający z czujnikiem. Bo chciałbym porównać jaka pogoda panuję u Ciebie ?

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: Antystatyczny » poniedziałek 26 cze 2017, 21:48

pogoda.PNG
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

StaryAnoda

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: StaryAnoda » poniedziałek 26 cze 2017, 22:10

No u mnie niestety upał :(

Temperatura.png
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: Antystatyczny » niedziela 02 lip 2017, 11:25

"Nie wiem od czego zacząć..."


Przede wszystkim należy zacząć od przejrzenia dokumentacji. Trzeba ustalić, jakimi funkcjami dysponuje czujnik, które są niezbędne, a które będzie można pominąć w driverze. Spoglądam w dokumentację układu HTS221, patrzę w mapę rejestrów oraz ich poszczególne bity i wygląda na to, że na pewno będą potrzebne następujące funkcje:

  • Sterowanie zasilaniem układu (bit PD w rejestrze CTRL_REG1).
  • Sterowanie zintegrowaną grzałką (bit HEATER w rejestrze CTRL_REG2).
  • Wyzwalanie cyklu pomiarów (bit ONE_SHOT w rejestrze CTRL_REG2).
  • Test flag informujących o wpisaniu nowych danych do rejestrów wyjściowych (bity H_DA i T_DA w rejestrze STATUS_REG).
  • Odczyt temperatury w stopniach Celsjusza.
  • Odczyt wilgotności względnej w procentach.
Oprócz spraw niezbędnych, można zaimplementować następujące funkcje:

  • Wymuszenie ponownego wpisania danych kalibracyjnych do rejestrów układu.
  • Odczyt numeru identyfikacyjnego układu.
  • Zmiana ilości próbek służących do uśredniania wyniku pomiaru temperatury.
  • Zmiana ilości próbek służących do uśredniania wyniku pomiaru wilgotności.
  • Konfiguracja pinu DRDY.
  • Konfiguracja częstotliwości dokonywania pomiarów temperatury i wilgotności.
  • Konfiguracja sposobu wpisywania nowych danych do rejestrów wyjściowych.

Oczywiście trzeba też przygotować funkcje komunikacyjne, czyli HTS221_WriteReg i HTS221_ReadReg. Zawartość ich ciał będzie zależała od wybranego trybu (I2C lub SPI) oraz od platformy sprzętowej, na którą pisany jest driver. A teraz czas przygotować strukturę na dane kalibracyjne:

Kod: Zaznacz cały

static struct
{
   int16_t T0_degC;
   int16_t T1_degC;
   int16_t T0_out;
   int16_t T1_out;
   uint8_t H0_rH;
   uint8_t H1_rH;
   int16_t H0_T0_out;
   int16_t H1_T0_out;
}CalData;


A teraz należy wypełnic pola odpowiednimi danymi:

Kod: Zaznacz cały


uint8_t tmp_H, tmp_L;

/* Get calibration data. */

/* T0_degC calculation. */
if(HTS221_ReadReg(HTS221_T0_DEGC_X8, sizeof(tmp_L), &tmp_L) != HTS221_OK)
{
   return HTS221_ERROR;
}

if(HTS221_ReadReg(HTS221_T1_T0_MSB, sizeof(tmp_H), &tmp_H) != HTS221_OK)
{
   return HTS221_ERROR;
}

CalData.T0_degC = ((((uint16_t) tmp_H & 0x03) << 8)|(uint16_t) tmp_L) >> 3;

/* T1_degC calculation. */
if(HTS221_ReadReg(HTS221_T1_DEGC_X8, sizeof(tmp_L), &tmp_L) != HTS221_OK)
{
   return HTS221_ERROR;
}

CalData.T1_degC =  ((((uint16_t)tmp_H & 0x0C) << 6)|(uint16_t)tmp_L) >> 3;

/* T0_out calculation. */
if(HTS221_ReadReg(HTS221_T0_OUT_L, sizeof(tmp_L), &tmp_L) != HTS221_OK)
{
   return HTS221_ERROR;
}

if(HTS221_ReadReg(HTS221_T0_OUT_H, sizeof(tmp_H), &tmp_H) != HTS221_OK)
{
   return HTS221_ERROR;
}

CalData.T0_out =  (((uint16_t)tmp_H << 8) | (uint16_t)tmp_L);


/* T1_out calculation. */
if(HTS221_ReadReg(HTS221_T1_OUT_L, sizeof(tmp_L), &tmp_L) != HTS221_OK)
{
   return HTS221_ERROR;
}

if(HTS221_ReadReg(HTS221_T1_OUT_H, sizeof(tmp_H), &tmp_H) != HTS221_OK)
{
   return HTS221_ERROR;
}

CalData.T1_out =  (((uint16_t)tmp_H << 8) | (uint16_t)tmp_L);


/* H0_rH calculation. */
if(HTS221_ReadReg(HTS221_H0_RH_X2, sizeof(tmp_L), &tmp_L) != HTS221_OK)
{
   return HTS221_ERROR;
}

CalData.H0_rH = (tmp_L >> 1);

/* H1_rH calculation. */
if(HTS221_ReadReg(HTS221_H1_RH_X2, sizeof(tmp_L), &tmp_L) != HTS221_OK)
{
   return HTS221_ERROR;
}

CalData.H1_rH = (tmp_L >> 1);

/* H0_T0_out calculation. */
if(HTS221_ReadReg(HTS221_H0_T0_OUT_L, sizeof(tmp_L), &tmp_L) != HTS221_OK)
{
   return HTS221_ERROR;
}

if(HTS221_ReadReg(HTS221_H0_T0_OUT_H, sizeof(tmp_H), &tmp_H) != HTS221_OK)
{
   return HTS221_ERROR;
}

CalData.H0_T0_out =  ((uint16_t)tmp_H << 8) | (uint16_t)tmp_L;


/* H1_T0_out calculation. */
if(HTS221_ReadReg(HTS221_H1_T0_OUT_L, sizeof(tmp_L), &tmp_L) != HTS221_OK)
{
   return HTS221_ERROR;
}

if(HTS221_ReadReg(HTS221_H1_T0_OUT_H, sizeof(tmp_H), &tmp_H) != HTS221_OK)
{
   return HTS221_ERROR;
}

CalData.H1_T0_out = (((uint16_t)tmp_H << 8) | (uint16_t)tmp_L);



Nie ma tu żadnej magii, wszystkie pozornie dziwne operacje na liczbach są wykonane zgodnie z dokumentacją układu HTS221. Widać trochę jawnych rzutowań, które dodałem na wszelki wypadek, gdy szukałem błędów w obliczeniach. Dociekliwi na pewno będą mogli nieco uprościć kod.

No dobra, struktura wypełniona... Można zacząć coś mierzyć, ale o tym w kolejnej części.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
matty24
User
User
Posty: 333
Rejestracja: sobota 31 paź 2015, 20:11
Lokalizacja: Małopolska

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: matty24 » niedziela 09 lip 2017, 23:42

Demo na arduino:

Screenshot 2017-07-09 23-41-33.jpg
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: Antystatyczny » niedziela 09 lip 2017, 23:46

No i pięknie działa. Mogę jedynie poddać w wątpliwość sens prezentacji ułamków, bo dokładność czujnika jest w sumie niewielka. Dla temperatury jest to w najlepszym razie 0.5°C, a dla wilgotności 4.5%rH. Będziesz próbował własnych sił, czy wystarczy Ci biblioteka arduino?
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
matty24
User
User
Posty: 333
Rejestracja: sobota 31 paź 2015, 20:11
Lokalizacja: Małopolska

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: matty24 » niedziela 09 lip 2017, 23:49

Będę próbować. Póki co chciałem sprawdzić czy działa.

W przykładowym kodzie dla arduino jest drobny błąd i od razu nie działa. Trzeba tylko zmienić dwie nazwy:
data na wilogotnosc
data1 na temperatura

Po tym zabiegu daje wynik jak powyżej.

Awatar użytkownika
matty24
User
User
Posty: 333
Rejestracja: sobota 31 paź 2015, 20:11
Lokalizacja: Małopolska

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: matty24 » poniedziałek 10 lip 2017, 19:01

Dzisiejszy pomiar. Wilgotność wzrosła ale to przez przelotne opady na zewnątrz i otwarte okno.
P70710-133502.jpg
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: Antystatyczny » poniedziałek 10 lip 2017, 19:01

Na czyim to jest sofcie?
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: Antystatyczny » piątek 14 lip 2017, 00:36

Witam ponownie.

Ostatnio zakończyłem na wypełnieniu struktury z danymi kalibracyjnymi. Tym razem pokuszę się o napisanie funkcji przeliczających dane z czujnika na temperaturę oraz wilgotność. Nie ma tu w zasadzie żadnej filozofii. Wystarczy odczytać dane z dwóch 16 bitowych rejestrów, podstawić pod wzór i obliczyć, oczywiście pamiętając o zasadach prowadzenia obliczeń na danych o różnej szerokości słowa (głównie chodzi o zmienne ze znakiem). Przypomnę jeszcze kształt struktury:

Kod: Zaznacz cały

static struct
{
   int16_t T0_degC;
   int16_t T1_degC;
   int16_t T0_out;
   int16_t T1_out;
   uint8_t H0_rH;
   uint8_t H1_rH;
   int16_t H0_T0_out;
   int16_t H1_T0_out;
}CalData;


Ok, a teraz funkcje odczytujące oraz obliczające temperaturę i wilgotność. Najpierw wilgotność:

Kod: Zaznacz cały

HTS221_ErrorType HTS221_GetHumidity(uint16_t *value)
{
   uint8_t tmp_H, tmp_L;
   int16_t h_out;

   if(HTS221_ReadReg(HTS221_HUMIDITY_OUT_L, sizeof(tmp_L), &tmp_L) != HTS221_OK)
   {
      return HTS221_ERROR;
   }

   if(HTS221_ReadReg(HTS221_HUMIDITY_OUT_H, sizeof(tmp_H), &tmp_H) != HTS221_OK)
   {
      return HTS221_ERROR;
   }

   h_out =  ( ( (uint16_t) tmp_H << 8 ) | (uint16_t) tmp_L );

   int32_t temp_upper = ((int32_t) (CalData.H1_rH - CalData.H0_rH)) *
         ((int32_t)((int32_t)h_out - CalData.H0_T0_out));

   int32_t temp_lower = ((int32_t) (CalData.H1_T0_out - CalData.H0_T0_out));
   *value =   (temp_upper / temp_lower) +   CalData.H0_rH;

   if(*value > 100)
   {
      *value = 100;
   }
   if(*value < 0)
   {
      *value = 0;
   }
   return HTS221_OK;
}


A teraz temperatura:

Kod: Zaznacz cały

HTS221_ErrorType HTS221_GetTemperature(int16_t *value)
{
   uint8_t tmp_H, tmp_L;
   int16_t t_out;


   if(HTS221_ReadReg(HTS221_TEMP_OUT_L, sizeof(tmp_L), &tmp_L) != HTS221_OK)
   {
      return HTS221_ERROR;
   }

   if(HTS221_ReadReg(HTS221_TEMP_OUT_H, sizeof(tmp_H), &tmp_H) != HTS221_OK)
   {
      return HTS221_ERROR;
   }

   t_out = (  ( (uint16_t) tmp_H << 8 ) | (uint16_t) tmp_L  );

   int32_t temp_upper = ((int32_t)(CalData.T1_degC - CalData.T0_degC)) *
         ((int32_t)(t_out - CalData.T0_out));

   int32_t temp_lower = (int32_t)(CalData.T1_out - CalData.T0_out);

   *value =  (int16_t)(temp_upper / temp_lower) + CalData.T0_degC;

   if(*value > 100) *value = 100;

   return HTS221_OK;
}


W obu przypadkach (jak widać) najpierw następuje odczyt dwóch 8 bitowych rejestrów w celu połączenia danych w jedną zmienną int16_t, a następnie podstawienie pod wzór danych kalibracyjnych oraz danych wyjściowych z czujnika. Obliczenie podzieliłem na osobne wiersze i najpierw obliczam górną część ułamka, a następnie dolną. Taki sposób uznałem za bardziej czytelny. W przypadku funkcji obliczającej wilgotność widać na końcu ograniczenie wyniku do przedziału od 0% do 100%. Taki zabieg jest konieczny, ponieważ czujnik potrafi wyjść poza zakres (jest o tym wzmianka w dokumentacji).

No dobra, na dziś tyle. Gdyby ktoś chciał kompletny driver do tego czujnika, proszę śmiało wołać, a będzie mu/jej dane.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
Grzegorz...
User
User
Posty: 450
Rejestracja: piątek 09 paź 2015, 18:57

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: Grzegorz... » niedziela 16 lip 2017, 12:06

To czas na mnie.
Ja z kolei pobawiłem się z czujnikiem HTS221 w połączeniu z płytką Wemos D1 czyli ESP8266.
Poniżej efekty wraz z wyświetleniem na OLED SSD1306 podpiętym pod to samo I2C co czujnik.
Teraz zrobię jeszcze serwer WWW do podglądu i ustawiania jaką temperaturę chcę mieć w pokoju (czujniki mają tworzyć sieć i sterować centralnym ogrzewaniem) choć docelowo ma to nie być sterowane przez stronę, a z apki na Androida.

Oprogramowanie dla testów przygotowane w środowisku Arduino, więc teraz czas zrobić to w LUA albo jeszcze lepiej w C.

20170716_115132.jpg


20170716_115140.jpg
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

StaryAnoda

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: StaryAnoda » niedziela 16 lip 2017, 12:17

O fajnie widać ruch w temacie :)

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: Antystatyczny » niedziela 16 lip 2017, 12:22

Ruch jest, ale póki co arduino jest na topie... Obsługa tego układu jest w sumie prosta i trochę się dziwię, że ludzie rezygnują z przyjemności programowania na rzecz gotowców :)
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
Grzegorz...
User
User
Posty: 450
Rejestracja: piątek 09 paź 2015, 18:57

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: Grzegorz... » niedziela 16 lip 2017, 16:42

Ja nie aspiruję na programistę, a po prostu chcę zbudować ciekawą sieć urządzeń i nie przeszkadza mi to, że mogę je poskładać z gotowych klocków.
Po prostu skupiam się na oprogramowaniu założonej funkcjonalności, a nie na odkrywaniu już kilka razy odkrytej ameryki :).

Awatar użytkownika
Grzegorz...
User
User
Posty: 450
Rejestracja: piątek 09 paź 2015, 18:57

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: Grzegorz... » niedziela 16 lip 2017, 21:35

Mi chodzi o coś takiego jak w filmiku.
Czujniki tego typu będą rozmieszczone w pokojach (pomiar temperatury i wilgotności) i jeden na zewnątrz (pomiar temperatury, wilgotności, ciśnienia i kto wie czego jeszcze ;)), a jednostka centralna będzie sterować kotłem, synchronizować całość danych i "podawać je dalej" do otoczenia.

https://youtu.be/Hzp_yEUuotU

Nie dziwcie się, że temperatura i wilgotność wewnętrzna i zewnętrzna są takie same, bo po prostu podaję tą samą co wewnątrz ponieważ czekam na kolejne czujniki :). Chciałem jedynie przedstawić ideę jak to ma dla mnie wyglądać.
Ostatnio zmieniony niedziela 16 lip 2017, 21:57 przez Grzegorz..., łącznie zmieniany 1 raz.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: Antystatyczny » niedziela 16 lip 2017, 21:59

Eeee....fajowe! A najbardziej podoba mi się to logo WIFI :D
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
Grzegorz...
User
User
Posty: 450
Rejestracja: piątek 09 paź 2015, 18:57

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: Grzegorz... » niedziela 16 lip 2017, 22:10

Antystatyczny pisze:Eeee....fajowe! A najbardziej podoba mi się to logo WIFI :D

To nie moja "produkcja", jedynie "podkradłem" z jakiejś Arduinowej biblioteki :lol:.
Generalnie miałem dziś mało czasu na zabawy, a Ardu + ESP8266 mnie rozwaliło - taką zabawkę (łącznie z gadaniem z innym ESP po wifi) zrobisz łącznie w kilkadziesiąt minut dostosowując ewentualnie biblioteki Arduino aby współdziałały z ESP.

A no i muszę dodać, że ESP8266 pięknie synchronizuje czas z serwerem NTP :D.
Niektórzy będą wiedzieć "do czego piję" ;)

Awatar użytkownika
dambo
Expert
Expert
Posty: 645
Rejestracja: czwartek 17 mar 2016, 17:12

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: dambo » niedziela 16 lip 2017, 22:25

ale chyba focha strzelił - pytasz o dzień tygodnia a on "Nie"!

A tak serio - realizacja czasu w jaki sposób zrobiona - timerek + synchronizacja, czy RTC?
Nowy blog o tematyce embedded -> https://www.embedownik.pl/

Awatar użytkownika
Grzegorz...
User
User
Posty: 450
Rejestracja: piątek 09 paź 2015, 18:57

Re: [KAmodHTS221] Opis i uruchomienie czujnika.

Postautor: Grzegorz... » niedziela 16 lip 2017, 22:57

Jak widać na zdjęciach (brak RTC), więc synchronizacja tylko po NTP i potem odliczanie przez ESP, bo i po co w takim układzie dodawać RTC jak można łatwo synchronizować czas z internetem.
To ma pokazywać czas, temperaturę i inne parametry na co dzień i nie musi działać po wybuchu bomby atomowej, bo i po co wówczas dom dogrzewać ;)


Wróć do „Jak to działa – czyli kącik testera”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 7 gości