[SHT11] Pomiar temperatury i wilgotności

Pozostałe układy mikrokontrolerów, układy peryferyjne i inne, nie mieszczące się w powyższych kategoriach.
Awatar użytkownika
gaweł
Expert
Expert
Posty: 614
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

[SHT11] Pomiar temperatury i wilgotności

Postautor: gaweł » poniedziałek 05 lut 2018, 21:38

Układ SHT11 - pierwsze starcie

IMG_6613.JPG


Prace nad softem wypełniała taka nuta:
Libiamo - aria z opery "Traviata", gdzie A. wyznaje miłość i prosi o rękę W.
Pomimo, że chwilowo nie mogą być razem, Alfredo nie traci nadziei,
że stworzy w Wiolettą trwały związek.
https://www.youtube.com/watch?v=hjB3fOjidT4


Trochę technologii z żółtych kredensów. W niektórych modelach był stosowany układ SHT11 jako miernik wilgotności wewnątrz kredensu. Postanowiłem zbadać ten układ: co można z niego wycisnąć.

Układ SHT11 mierzy temperaturę i wilgotność względną. Wyniki oddaje w postaci cyfrowej. Wymiana danych (odczyt danych jak i zapis poleceń) odbywa się poprzez interfejs szeregowy zrealizowany na dwóch pinach. Jeden jest zegarem taktującym (jest zawsze jako wejście do układu SHT11), drugi przenosi dane (linia dwukierunkowa w zależności od aktualnych potrzeb). Nie jest to klasyczny SPI, więc trzema samemu zrealizować handling sygnałami.

Do aplikacji układ SHT11 wymaga 4 "drutów", Dwa z nich doprowadzają zasilanie, dwa pozostałe tworzą interfejs komunikacyjny. Środowiskiem eksperymentu jest "minikit M32" (opis modułu M32). Do komunikacji wykorzystane są dwa piny portu C [PORTC.0 i PORTC.1]. Odczytane i przetworzone dane są transmitowane via serial do komputera PC, gdzie można obejrzeć to, co przychodzi.
IMG_6612.JPG

Funkcje do obsługi sprzętowej komunikacji z ukłądem SHT11 odtwarzają przebiegi opisane w dokumentacji układu.

Kod: Zaznacz cały

static void SHTResetConnection ( void )
{
  uint8_t Loop ;
  /*-------------------------------------------------------------------------*/
  SetSHTDAsOutput ;
  SetSHTDHigh ;
  for ( Loop = 0 ; Loop < 9 ; Loop ++ )
  {
    SetSHTCHigh ;
    nop ( ) ;
    nop ( ) ;
    nop ( ) ;
    nop ( ) ;
    nop ( ) ;
    SetSHTCLow ;
    nop ( ) ;
    nop ( ) ;
    nop ( ) ;
    nop ( ) ;
    nop ( ) ;
  } /* for */ ;
} /* SHTResetConnection */


static void TransmissionStart ( void )
{
  /*-------------------------------------------------------------------------*/
  SetSHTDAsOutput ;
  SetSHTDHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  SetSHTCHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  SetSHTDLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  SetSHTCLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  SetSHTCHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  SetSHTDHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  SetSHTCLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
} /* TransmissionStart */


static uint8_t SHTWrite ( uint8_t Command )
{
  uint8_t Loop ;
  uint8_t Mask ;
  uint8_t PortData ;
  /*-------------------------------------------------------------------------*/
  TransmissionStart ( ) ;
  SetSHTDAsOutput ;
  for ( Loop = 0 ; Loop < 8 ; Loop ++ )
  {
    Mask = ( uint8_t ) 1 << ( 7 - Loop ) ;
    if ( Command & Mask )
    {
      SetSHTDHigh ;
    } /* if ... */
    else
    {
      SetSHTDLow ;
    } /* if ... else */ ;
    nop ( ) ;
    nop ( ) ;
    nop ( ) ;
    SetSHTCHigh ;
    nop ( ) ;
    nop ( ) ;
    nop ( ) ;
    SetSHTCLow ;
    nop ( ) ;
    nop ( ) ;
    nop ( ) ;
  } /* for */ ;
  SetSHTDAsInput ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  SetSHTCHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  PortData = GetSHTDPin ;
  SetSHTCLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  if ( ! PortData )
    return ( TRUE ) ;
  else
    return ( FALSE ) ;
} /* SHTWrite */


static uint16_t SHTRead ( void )
{
  uint8_t PortData ;
  uint16_t RetV ;
  uint8_t Loop ;
  /*-------------------------------------------------------------------------*/
  RetV = 0 ;
  SetSHTDAsInput ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  for ( Loop = 0 ; Loop < 4 ; Loop ++ )
  {
    SetSHTCHigh ;
    nop ( ) ;
    nop ( ) ;
    nop ( ) ;
    SetSHTCLow ;
    nop ( ) ;
    nop ( ) ;
    nop ( ) ;
  } /* for */ ;
//--- 11
  SetSHTCHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  PortData = GetSHTDPin ;
  if ( PortData )
    RetV |= 0x0800 ;
  SetSHTCLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
//--- 10
  SetSHTCHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  PortData = GetSHTDPin ;
  if ( PortData )
    RetV |= 0x0400 ;
  SetSHTCLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
//--- 9
  SetSHTCHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  PortData = GetSHTDPin ;
  if ( PortData )
    RetV |= 0x0200 ;
  SetSHTCLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
//--- 8
  SetSHTCHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  PortData = GetSHTDPin ;
  if ( PortData )
    RetV |= 0x0100 ;
  SetSHTCLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
//-- ACK
  SetSHTDAsOutput ;
  SetSHTDLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  SetSHTCHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  SetSHTCLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  SetSHTDAsInput ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
//--- 7
  SetSHTCHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  PortData = GetSHTDPin ;
  if ( PortData )
    RetV |= 0x0080 ;
  SetSHTCLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
//--- 6
  SetSHTCHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  PortData = GetSHTDPin ;
  if ( PortData )
    RetV |= 0x0040 ;
  SetSHTCLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
//--- 5
  SetSHTCHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  PortData = GetSHTDPin ;
  if ( PortData )
    RetV |= 0x0020 ;
  SetSHTCLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
//--- 4
  SetSHTCHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  PortData = GetSHTDPin ;
  if ( PortData )
    RetV |= 0x0010 ;
  SetSHTCLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
//--- 3
  SetSHTCHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  PortData = GetSHTDPin ;
  if ( PortData )
    RetV |= 0x0008 ;
  SetSHTCLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
//--- 2
  SetSHTCHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  PortData = GetSHTDPin ;
  if ( PortData )
    RetV |= 0x0004 ;
  SetSHTCLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
//--- 1
  SetSHTCHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  PortData = GetSHTDPin ;
  if ( PortData )
    RetV |= 0x0002 ;
  SetSHTCLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
//--- 0
  SetSHTCHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  PortData = GetSHTDPin ;
  if ( PortData )
    RetV |= 0x0001 ;
  SetSHTCLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
//-- NACK
  SetSHTDAsOutput ;
  SetSHTDHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  SetSHTCHigh ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  SetSHTCLow ;
  nop ( ) ;
  nop ( ) ;
  nop ( ) ;
  return ( RetV ) ;
} /* SHTRead */

Po zaprogramowaniu procka AVR, do kompa transmitowane są następujące wyniki:
Witaj gosciu z http://www.microgeek.eu
Temp=7.7

Wilg=25.19 24.87
Temp=20.5

jak nachuchałem na czujnik to zaczęło przychodzić:
Wilg=66.42 65.63
Temp=20.5

Wilg=66.42 65.63
Temp=20.5

Wilg=66.42 65.63
Temp=20.5

Wilg=74.04 73.16
Temp=20.5

Wilg=74.04 73.16
Temp=20.5

Wilg=74.04 73.16
Temp=23.0

Wilg=74.04 73.65
Temp=23.0


Niby działa, ale coś mi nie bardzo pasuje, będę musiał jeszcze nad tym popracować.
Soft "Ćwiczebny":
SHT11.zip
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

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

Re: [SHT11] Pomiar temperatury i wilgotności

Postautor: Antystatyczny » poniedziałek 05 lut 2018, 22:23

Chętnie ujrzałbym jakieś krótkie porównanie odczytów. Masz może na stanie jakiś DHT11?
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
gaweł
Expert
Expert
Posty: 614
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [SHT11] Pomiar temperatury i wilgotności

Postautor: gaweł » poniedziałek 05 lut 2018, 22:38

Niestety nie mam. Kiedyś gdzieś walało mi się SHT71, ale chyba nie znajdę tego w moim śmietniku. Mam ewentualnie jeszcze coś takiego
IMG_6614.JPG
ale to wymaga dorobienia całej otoczki z przetwarzaniem.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

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

Re: [SHT11] Pomiar temperatury i wilgotności

Postautor: Antystatyczny » poniedziałek 05 lut 2018, 22:41

Chodziło mi głównie o porównanie SHT11 z jego tańszym bratem (być może klonem). Mam dwa DHT11 i każdy zwraca nieco inne dane... :)
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
gaweł
Expert
Expert
Posty: 614
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [SHT11] Pomiar temperatury i wilgotności

Postautor: gaweł » poniedziałek 05 lut 2018, 22:45

Antystatyczny pisze:Chodziło mi głównie o porównanie SHT11 z jego tańszym bratem (być może klonem). Mam dwa DHT11 i każdy zwraca nieco inne dane... :)

Właśnie popatrzyłem na cenę tego DHT11, :o szok, SHT11 jest tak z 10 razy droższy. Mam tych SHT więcej niż jeden, postaram się porównać w kwestii powtarzalności pomiarów. Może różnica w cenie jest odpowiedzią.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Expert
Expert
Posty: 614
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [SHT11] Pomiar temperatury i wilgotności

Postautor: gaweł » poniedziałek 05 lut 2018, 23:22

Dodałem na linii danych rezystor podciągający do +5V.
IMG_6615.JPG

Wyniki zrobiły się znacząco lepsze (przy tym samym sofcie). Wcześniej zdarzały się w serii pomiarów takie wartości, które były ni z gruchy ni z pietruchy (przykładowo nagły skok temperatury z 20 stopni na 7 stopni i po chwili powrót do normalności, to tak jakby czujnik zgłupiał i po chwili rozum mu wracał). Teraz nie dostrzegam takich nagłych odchyłów. Chyba rozum mu wrócił, oby na zawsze.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Expert
Expert
Posty: 614
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [SHT11] Pomiar temperatury i wilgotności

Postautor: gaweł » wtorek 06 lut 2018, 23:04

Dwa czujniki jednocześnie

IMG_6618.JPG


Nuta wspierająca tworzenie softu.
https://www.youtube.com/watch?v=7PJWRKkMpHM


Zmontowałem drugi czujnik (troszkę inne PCB). Do czujnika został przewidziany odpowiedni filtr.
IMG_6616.JPG
IMG_6617.JPG

Drugi czujnik został przyłączony do kolejnych pinów portu C. Soft został zmodyfikowany w ten sposób, że pogania praktycznie jednocześnie oba czujniki.
Zmierzone dane przedstawiają się następująco:
Witaj gosciu z http://www.microgeek.eu
Temp1=19.5 Wilg1=46.97 46.30
Temp2=19.8 Wilg2=47.17 46.52

Temp1=19.5 Wilg1=47.17 46.49
Temp2=19.8 Wilg2=47.10 46.45

Temp1=19.5 Wilg1=47.13 46.45
Temp2=19.7 Wilg2=47.42 46.77

Temp1=19.5 Wilg1=47.04 46.36
Temp2=19.8 Wilg2=47.23 46.58

Temp1=19.5 Wilg1=47.01 46.33
Temp2=19.7 Wilg2=47.13 46.48

Temp1=19.5 Wilg1=47.04 46.35
Temp2=19.7 Wilg2=47.17 46.51


Soft dla AVR (ATMEGA32):
SHT11-2.zip
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse


Wróć do „Inne mikroklocki, również peryferyjne”

Kto jest online

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