#include #include #include #define _XTAL_FREQ 10000000 // external oscillator frequency of 10MHz #define LOOP_DELAY 1 // Loop-Delay in ms (milliseconds) #define WARN_LED LATBbits.LATB0 #define SENSOR PORTBbits.RB1 uint8_t Read_DHT ( uint8_t *data ); void setup ( void ) { OSCCON = 0b01111000; // use external oscillator ANSELB = 0x00; // PORTB to digital TRISBbits.TRISB0 = 0; // LED as OUTPUT TRISBbits.TRISB1 = 0; // Sensor as output WARN_LED = 0; // LED off } void loop ( void ) { uint8_t data[5] = { 0 }; uint8_t result = Read_DHT( data ); // Breakpoint is here 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 > 1 ) { WARN_LED = 1; } else { WARN_LED = 0; } } } void main ( void ) { setup( ); while ( 1 ) { loop( ); __delay_ms( LOOP_DELAY ); } } uint8_t Read_DHT ( uint8_t *data ) { TRISBbits.TRISB1 = 0; // Sensor as output LATBbits.LATB1 = 0; __delay_ms( 25 ); LATBbits.LATB1 = 1; __delay_us( 30 ); TRISBbits.TRISB1 = 1; // Sensor a n s input uint16_t timeout = 10000; while ( SENSOR == 1 ) { if ( --timeout == 0 ) { return 0xFA; } } timeout = 10000; while ( SENSOR == 0 ) { if ( --timeout == 0 ) { return 0xFB; } } timeout = 10000; while ( SENSOR == 1 ) { if ( --timeout == 0 ) { return 0xFC; } } for ( uint8_t i = 0; i < 5; i++ ) { for ( int8_t j = 7; j >= 0; j-- ) { timeout = 10000; while ( SENSOR == 0 ) { if ( --timeout == 0 ) { return 0xFD; } } uint8_t signal_counter = 0; timeout = 10000; while ( SENSOR == 1 ) { signal_counter++; __delay_us( 1 ); if ( signal_counter > 100 ) { return 0xFE; } } if ( signal_counter > 30 ) { data[i] |= (1 << j); } } } if ( ( uint8_t ) (data[0] + data[1] + data[2] + data[3]) != data[4] ) { return 0xFF; } return 0; }