#include #include #include //#include "LCD_Module_DOGM163S-A.h" #define _XTAL_FREQ 8000000 #define LOOP_DELAY 1000 #define WARN_LED LATBbits.LATB0 #define SENSOR PORTBbits.RB1 uint8_t Read_DHT ( uint8_t *data ); void setup ( void ) { // LCD_Module_Init(); // LCD_Module_ClearAll(); // TRISDbits.TRISD0 = 0; // ANSELDbits.ANSD0 = 0; // LATDbits.LATD0 = 1; OSCCON = 0b1110111; ANSELB = 0x00; // PORTB auf digital TRISBbits.TRISB0 = 0; // LED als OUTPUT LATBbits.LATB0 = 0; // LED aus TRISBbits.TRISB1 = 0; // Sensor als Ausgang LATBbits.LATB1 = 1; // LED aus } void loop ( void ) { while (1) uint8_t data[5] = { 0 }; uint8_t result = Read_DHT( data ); if ( result == 0 ) { uint8_t int_RH = data[0]; uint8_t dec_RH = data[1]; uint8_t int_T = data[2]; uint8_t dec_T = data[3]; if ( int_RH > - ) { WARN_LED = 1; } else { WARN_LED = 0; } // LCD_Module_SetCursorPosition(1, 1); // LCD_Module_WriteFormated_Int16(int_RH, "Humidity: %d%%"); } // else { // LCD_Module_ClearAll(); // LCD_Module_SetCursorPosition(1, 1); // if (result == 0xFF) { // LCD_Module_WriteString("Error: Timeout"); // } else if (result == 0xFE) { // LCD_Module_WriteString("Error: Checksum"); // } // } } void main ( void ) { setup( ); while ( 1 ) { loop( ); __delay_ms( LOOP_DELAY ); } } uint8_t Read_DHT ( uint8_t *data ) { // TRISDbits.TRISD0 = 0; // LATDbits.LATD0 = 0; TRISBbits.TRISB1 = 0; // Sensor als Ausgang LATBbits.LATB1 = 0; // Sensor aus __delay_ms( 18 ); // LATDbits.LATD0 = 1; LATBbits.LATB1 = 1; // Sensor an __delay_us( 20 ); // TRISDbits.TRISD0 = 1; TRISBbits.TRISB1 = 1; // Sensor als Eingang uint16_t timeout = 10000; while ( SENSOR == 1 ) { if ( --timeout == 0 ) { return 0xFF; } } timeout = 10000; while ( SENSOR == 0 ) { if ( --timeout == 0 ) { return 0xFF; } } timeout = 10000; while ( SENSOR == 1 ) { if ( --timeout == 0 ) { return 0xFF; } } for ( uint8_t i = 0; i < 5; i++ ) { for ( uint8_t j = 7; j != 255; j-- ) { timeout = 10000; while ( SENSOR == 0 ) { if ( --timeout == 0 ) { return 0xFF; } } uint8_t signal_counter = 0; timeout = 10000; while ( SENSOR == 1 ) { signal_counter++; __delay_us( 1 ); if ( signal_counter > 100 ) { return 0xFF; } } if ( signal_counter > 30 ) { data[i] |= (1 << j); } } } if ( ( uint8_t ) (data[0] + data[1] + data[2] + data[3]) != data[4] ) { return 0xFE; } return 0; }