Strona 1 z 1

[SHT11] Pomiar temperatury i wilgotności

: poniedziałek 05 lut 2018, 21:38
autor: gaweł
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 https://srv86266.seohost.com.pl/phpbb2test
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

Re: [SHT11] Pomiar temperatury i wilgotności

: poniedziałek 05 lut 2018, 22:23
autor: Antystatyczny
Chętnie ujrzałbym jakieś krótkie porównanie odczytów. Masz może na stanie jakiś DHT11?

Re: [SHT11] Pomiar temperatury i wilgotności

: poniedziałek 05 lut 2018, 22:38
autor: gaweł
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.

Re: [SHT11] Pomiar temperatury i wilgotności

: poniedziałek 05 lut 2018, 22:41
autor: Antystatyczny
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... :)

Re: [SHT11] Pomiar temperatury i wilgotności

: poniedziałek 05 lut 2018, 22:45
autor: gaweł
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ą.

Re: [SHT11] Pomiar temperatury i wilgotności

: poniedziałek 05 lut 2018, 23:22
autor: gaweł
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.

Re: [SHT11] Pomiar temperatury i wilgotności

: wtorek 06 lut 2018, 23:04
autor: gaweł
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 https://srv86266.seohost.com.pl/phpbb2test
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