The code is based from this post
void InitDHT() { pinMode(TEMP_RH_PIN, OUTPUT); delay(1000); digitalWrite(TEMP_RH_PIN,HIGH); } void ReadDHT() { bGlobalErr=0; byte dht_in; byte i; // see datasheet to understand this pinMode(TEMP_RH_PIN, OUTPUT); digitalWrite(TEMP_RH_PIN,HIGH); digitalWrite(TEMP_RH_PIN,LOW); delay(18); digitalWrite(TEMP_RH_PIN,HIGH); delayMicroseconds(22); pinMode(TEMP_RH_PIN,INPUT); delayMicroseconds(5); dht_in=digitalRead(TEMP_RH_PIN); if(dht_in) { bGlobalErr=1; Serial.println("<dht11 start condition 1 not met"); return; } delayMicroseconds(80); dht_in=digitalRead(TEMP_RH_PIN); if(!dht_in) { bGlobalErr=2; Serial.println("<dht11 start condition 2 not met"); return; } delayMicroseconds(80); //now ready for data reception... pick up the 5 bytes coming from the sensor for (i=0; i<5; i++) dht_dat[i] = read_dht_dat(); //Next: restore pin to output duties pinMode(TEMP_RH_PIN,OUTPUT); digitalWrite(TEMP_RH_PIN,HIGH); byte dht_check_sum = dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3]; /*Condition in following "if" says "if fifth byte from sensor not the same as the sum of the first four..."*/ if(dht_dat[4]!= dht_check_sum) { bGlobalErr=3; Serial.println("DHT11 checksum error"); } } byte read_dht_dat() { //Collect 8 bits from datastream, return them interpreted //as a byte. I.e. if 0000.0101 is sent, return decimal 5. //Code expects the system to have recently entered the //dataline low condition at the start of every data bit's //transmission BEFORE this function is called. byte i = 0; byte result=0; for (i=0; i< 8; i++) { //We enter this during the first start bit (low for 50uS) of the byte //Next: wait until pin goes high while(digitalRead(TEMP_RH_PIN)==LOW); delayMicroseconds(30); if (digitalRead(TEMP_RH_PIN)==HIGH)//Was: if(PINC & _BV(dht_PIN)) result |=(1<<(7-i)); while (digitalRead(TEMP_RH_PIN)==HIGH); //Was: while((PINC & _BV(dht_PIN))); } //end of "for.." return result; }