Showing posts with label virtualwire. Show all posts
Showing posts with label virtualwire. Show all posts

Tuesday, 19 October 2010

DHT11 Arduino with VirtualWire

By some reason when using VirtualWire library and using vw_setup(2000) caused the readings from humidity sensor to fail (dht11 start condition 1 not met). I looked at datasheet and changed a the times how the MCU starts to talk with the sensor.

The code is based from this post

Here is the the fixed code:

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;
}