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.
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":