Come utilizzare sensore DHT11

Ciao Ragazzi, mi è arrivato a casa il sensore di umidità e temperatura DHT11.

Ho collegato il PIN del sensore VCC ai 5V di Arduino
il PIN del sensore GND al GND di Arduino
il PIN del sensore DATA alla porta Analogica 0 di Arduino

lo sketch che ho trovato in rete è il seguente:

#define DHT11_PIN 0 // ADC0  
byte read_dht11_dat()
{ byte i = 0;
  byte result=0;
  for(i=0; i< 8; i++)
  {    
      while(!(PINC & _BV(DHT11_PIN))); // wait for 50us delayMicroseconds(30);  
      if(PINC & _BV(DHT11_PIN)) result |=(1<<(7-i));
      while((PINC & _BV(DHT11_PIN))); // wait '1' finish    
   }
   return result;
}    
 
void setup()
{
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);  
Serial.begin(9600);  
Serial.println("Ready");
}
 
void loop()
{
 byte dht11_dat[5];
 byte dht11_in;
 byte i; // start condition
 // 1. pull-down i/o pin from 18ms
 PORTC &= ~_BV(DHT11_PIN);
 delay(18);
 PORTC |= _BV(DHT11_PIN);
 delayMicroseconds(40);
 DDRC &= ~_BV(DHT11_PIN);
 delayMicroseconds(40);
 dht11_in = PINC & _BV(DHT11_PIN);
 if(dht11_in)
 {
   Serial.println("dht11 start condition 1 not met");
   return;
  }
 delayMicroseconds(80); 
 dht11_in = PINC & _BV(DHT11_PIN); 
 if(!dht11_in)
 {
   Serial.println("dht11 start condition 2 not met");
   return;
 }
 delayMicroseconds(80); // now ready for data reception
 for (i=0; i<5; i++)
   dht11_dat[i] = read_dht11_dat();  
 DDRC |= _BV(DHT11_PIN);
 PORTC |= _BV(DHT11_PIN);
 byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];
 if(dht11_dat[4]!= dht11_check_sum)
 {
  Serial.println("DHT11 checksum error");
 }  
 Serial.print("Current humdity = ");
 Serial.print(dht11_dat[0], DEC);
 Serial.print(".");
 Serial.print(dht11_dat[1], DEC);
 Serial.print("% ");
 Serial.print("temperature = ");
 Serial.print(dht11_dat[2], DEC);
 Serial.print(".");
 Serial.print(dht11_dat[3], DEC);
 Serial.println("C ");
 delay(2000);
}

Quello che però mi esce è questo nel monitor seriale

DHT11 checksum error
Current humdity = 255.255% temperature = 255.255C

dove sbaglio?

Manca una resistenza di pullup. Tutorial su Adafruit. C'e' anche una loro libreria. http://learn.adafruit.com/dht/connecting-to-a-dhtxx-sensor

però mi pare strano perchè dovrebbe già esserci io ho acquistato questo sensore qui

Quindi hai una board preparata. Prova a usare la libreria di Adafruit. A me quella non ha mai dato problemi.

Mi sapresti dare qualche esempio perchè non riesco in nessuno modo a far funzionare questo sensore.

Ho provato anche questo ma sembra non andare…

/* YourDuino.com Example Software Sketch
   DHT11 Humidity and Temperature Sensor test
   Credits: Rob Tillaart
   http://arduino-direct.com/sunshop/index.php?l=product_detail&p=162
   terry@yourduino.com */
   
/*-----( Import needed libraries )-----*/
#include <dht11.h>

/*-----( Declare objects )-----*/
dht11 DHT11;

/*-----( Declare Constants, Pin Numbers )-----*/
#define DHT11PIN 0

void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);
  Serial.println("DHT11 TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT11LIB_VERSION);
  Serial.println();
}/*--(end setup )---*/

void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  Serial.println("\n");

  int chk = DHT11.read(DHT11PIN);

  Serial.print("Read sensor: ");
  switch (chk)
  {
    case 0: Serial.println("OK"); break;
    case -1: Serial.println("Checksum error"); break;
    case -2: Serial.println("Time out error"); break;
    default: Serial.println("Unknown error"); break;
  }

  Serial.print("Humidity (%): ");
  Serial.println((float)DHT11.humidity, 2);

  Serial.print("Temperature (oC): ");
  Serial.println((float)DHT11.temperature, 2);

  Serial.print("Temperature (oF): ");
  Serial.println(Fahrenheit(DHT11.temperature), 2);

  Serial.print("Temperature (K): ");
  Serial.println(Kelvin(DHT11.temperature), 2);

  Serial.print("Dew Point (oC): ");
  Serial.println(dewPoint(DHT11.temperature, DHT11.humidity));

  Serial.print("Dew PointFast (oC): ");
  Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity));

  delay(2000);
}/* --(end main loop )-- */

/*-----( Declare User-written Functions )-----*/
//
//Celsius to Fahrenheit conversion
double Fahrenheit(double celsius)
{
        return 1.8 * celsius + 32;
}

//Celsius to Kelvin conversion
double Kelvin(double celsius)
{
        return celsius + 273.15;
}

// dewPoint function NOAA
// reference: http://wahiduddin.net/calc/density_algorithms.htm 
double dewPoint(double celsius, double humidity)
{
        double A0= 373.15/(273.15 + celsius);
        double SUM = -7.90298 * (A0-1);
        SUM += 5.02808 * log10(A0);
        SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
        SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
        SUM += log10(1013.246);
        double VP = pow(10, SUM-3) * humidity;
        double T = log(VP/0.61078);   // temp var
        return (241.88 * T) / (17.558-T);
}

// delta max = 0.6544 wrt dewPoint()
// 5x faster than dewPoint()
// reference: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double celsius, double humidity)
{
        double a = 17.271;
        double b = 237.7;
        double temp = (a * celsius) / (b + celsius) + log(humidity/100);
        double Td = (b * temp) / (a - temp);
        return Td;
}

/* ( THE END ) */

la libreria l ho trovata e importata nell IDE e non mi da errori in fase di compilazione però come risultato finale ho questo:

Read sensor: Time out error
Humidity (%): 0.00
Temperature (oC): 0.00
Temperature (oF): 32.00
Temperature (K): 273.15
Dew Point (oC): nan
Dew PointFast (oC): nan

Ragazzi ci sono riuscito in pratica ricordavo che nella descrizione della mia shield diceva che il sensore era digitale, ho semplicemente collegato il PIN digitale 4 invece che quello analogico ed ha magicamente iniziato a funzionare tutto :D