Valeur 0 pour capteur DHT 11

Bonjour à tous, je suis en train d'essayer d'inclure un capteur de température à mon projet .
Mais voila, la valeur renvoyé est toujours de 0,00
J'ai pourtant bien inclus la librairie DHT, bien connecté mes fils ( broche de gauche sur 5V, 2eme broche connecté à une résistance 6 k puis au 5V, 2 eme broche également à la pin digital 34 de ma méga, la 3 ème broche n'est pas connectée, et la dernière au GND. Ou est le problème ? le capteur est HS ?

voici mon code

// ---------------------------------------------------------------------------------------------------------
// zimmermann frédéric
// Arduino + ethernet shield control by iOS
// Mai 2015
// ----------------------------------------------------------------------------------------------------------

#include <LiquidCrystal.h>
#include <Ethernet.h>
#include <SPI.h>
#include <DHT.h>
  
#define DHTPIN 34 
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);



// Ethernet shield settings
// Change the MAC in hex, your IP, Gateway, subnet mask and webport
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};        // MAC
byte ip[] = {192, 168, 0, 254};                         // Shield IP
byte gateway[] = {192, 168, 0, 1};                      // Gateway
byte subnet[] = {255, 255, 255, 0}; // Subnet mask
byte dnsserver[] = {213, 166, 201, 3};
int port = 85;                                                        // Webport

// ---------------------------------------------------------------------

EthernetServer server(port);
LiquidCrystal lcd(9, 8, 5, 4, 3, 2);
EthernetClient client2;


int Cloture1 = 30;
int led = 22;
int bouton = 6;
int etatbouton ;

int val = 0;
int precedetat = 0;
long previousMillis = 0;
long interval = 250;

boolean pushenvoi = true;
boolean cloture1Allume = true;
boolean clotureOFFiphone;

boolean lastConnected = false;

char DEVID1[] = "v1F51D72F4A163BD";  //sénario cloture 1 allumé
char DEVID2[] = "v7F928A69AAD2196";  //sénario cloture 1 éteinte
char DEVID3[] = "v10DB6F8487D22F0";  //sénario cloture 2 allumé
char DEVID4[] = "vDEDA46A8C5E4D79";  //sénario cloture 2 éteinte
char serverName[] = ("api.pushingbox.com");


// Serial speed
int speedSerial = 9600;

// Buffer size
int sizeString = 80;
String stringInput = String(sizeString);

// Setup
void setup()  {

  Serial.begin(speedSerial);

  lcd.begin(16, 2);

  // Digital Pins 10, 11, 12 , 13 utilisé par le shield ethernet
  pinMode(Cloture1, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(bouton, INPUT);

  // Start ethernet shield webserver


  Ethernet.begin(mac, ip, dnsserver, gateway, subnet);
  Serial.println (Ethernet.localIP ());

 dht.begin();

  server.begin();


}


void loop()  {


 float t = dht.readTemperature();


  val = digitalRead (bouton);

  Serial.print("CLOTURE");
  Serial.print(" ");
  Serial.println(cloture1Allume);
  delay(500);
  Serial.print("bouton");
  Serial.print(" ");
  Serial.println(etatbouton);
 Serial.print("Temperature: "); 
  Serial.println(t);
  //------------------------------ GESTION DE L'APPUI SUR LE BOUTON DE LA CLOTURE 1--------------------------------

  if (val == HIGH && precedetat == LOW) {
    etatbouton = !etatbouton;
    delay(10);
  }
  precedetat = val;


  if (etatbouton == 0 && cloture1Allume == true) { // si bouton n'a pas encore été appuyé et cloture allumée

    lcd.setCursor(0, 0);
    lcd.print("Clot1. ON.Bouton ");
  }



  if (etatbouton == 1 && cloture1Allume == true) { // si bouton appuyé et cloture allumée
    cloture1Allume = false;
    lcd.setCursor(0, 0);
    lcd.print("Clot1.OFF.Bouton ");
  }                      // alors on éteint

  if (etatbouton == 0 && cloture1Allume == false) {   //  si  bouton pas appuyé et cloture éteinte
    cloture1Allume = true;
    lcd.setCursor(0, 0);
    lcd.print("Clot1. ON.Bouton ");      // alors on allume

  }

  if (etatbouton == 0 && cloture1Allume == true && clotureOFFiphone == true) {  // si bouton pas appuyé, cloture allumé et iphone Off
    cloture1Allume = false;
    lcd.setCursor(0, 0);
    lcd.print("Clot1.OFF.Iphone ");
  }                 // alors on éteint


 if(cloture1Allume == false && clotureOFFiphone == true && etatbouton == 1){ // si bouton appuyé, alors que l'iphone a éteint, on peut rien faire
   
   lcd.setCursor(0, 0);
    lcd.print("Manip.impossible");
    delay(1000);
    etatbouton = 0;
 }
  //---------------------------------CONNEXION AU SERVEUR-------------------------




  EthernetClient client = server.available();
  if (client)  {

    boolean currentLineIsBlank = true;
    stringInput = "";

    if (client.connected())  {
      while (client.available())  {

        char c = client.read();

        if (stringInput.length() < sizeString)  {
          stringInput.concat(c);

        }

        if (c == '\n' && currentLineIsBlank)  {

          digitalRead(Cloture1);


          client.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");

          client.println("<agridomotique>");

          // Pin 30 Cloture1

          client.print("<Pin>");
          client.print("<namePin>CLOTURE 1</namePin>");
          client.print("<digitalPin>");
          // Digital pin to control

          client.print("</digitalPin>");
          client.print("<Etat>");
          if (cloture1Allume == 1) {
            client.print ("  ALLUMEE");
          }
          if (cloture1Allume == 0) {
            client.print (" ETEINTE");
          }
          client.print("</Etat>");
          client.print("</Pin>");





          client.println("</agridomotique>");
          break;
        }

        if (c == '\n')  {

          Serial.print(stringInput);
          Serial.println();

          if (stringInput.indexOf("GET") != -1)  {



            // si iphone ON
            if (stringInput.indexOf("Cloture1=ON") != -1) {
              cloture1Allume = true;
              clotureOFFiphone = false;
              lcd.setCursor(0, 0);
              lcd.print("Clot1. ON.Iphone ");




            }
            // si off iphone
            if ((stringInput.indexOf("Cloture1=OFF") != -1) && (cloture1Allume == true)) {
              cloture1Allume = false;
              clotureOFFiphone = true;
              lcd.setCursor(0, 0);
              lcd.print("Clot1.OFF.Iphone ");



            }



          }
          currentLineIsBlank = true;
          stringInput = "";
        }
        else if (c != '\r')  {

          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();

  }


//----------------------------------------- COMMMANDE ET PUSH DE LA Cloture 1 --------------------------------------------

  if (cloture1Allume == true ) {                       // ON ALLUME LA CLOTURE1
    digitalWrite (Cloture1, HIGH);
    digitalWrite (led, HIGH);

  }

  if (cloture1Allume == false ) {                  // ON ETEINT LA CLOTURE1
    digitalWrite (Cloture1, LOW);
    digitalWrite (led, LOW);
  }

  if ( cloture1Allume == true && pushenvoi == true ) {   // si la cloture1 est allumé on envoi un push
    // On envoi un push allumé
    sendToPushingBox(DEVID1);
    pushenvoi = false;
  }

  if ( cloture1Allume == false && pushenvoi == false ) {  // si la cloture1 est éteinte en onvoi un push
    // On envoi un push éteint
    sendToPushingBox(DEVID2);
    pushenvoi = true;

  }



}
//---------------------------------Fonction permettant d'envoyer un push PushingBox---------------------

void sendToPushingBox(char devid[]) {

  //demarre connexion ethernet
  ;

  Serial.println("connecting...");
  if (client2.connect(serverName, 80)) {

    Serial.println("connected");

    Serial.println("sendind request");

    client2.print("GET /pushingbox?devid=");
    client2.print(devid);
    client2.println(" HTTP/1.1");

    client2.print("Host: ");
    client2.println(serverName);
    client2.println("User-Agent: Arduino");
    client2.println("Connection: close");
    client2.println();

    while (client2.connected ())
      if (client2.available ())
        Serial.write(client2.read());

    client2.stop ();

    Serial.println("succes");


  }


  else {
    Serial.println("connection failed");
  }

  client2.stop();
}
/code]

Fredericzim:
Bonjour à tous, je suis en train d'essayer d'inclure un capteur de température à mon projet .
Mais voila, la valeur renvoyé est toujours de 0,00
J'ai pourtant bien inclus la librairie DHT, bien connecté mes fils ( broche de gauche sur 5V, 2eme broche connecté à une résistance 6 k puis au 5V, 2 eme broche également à la pin digital 34 de ma méga, la 3 ème broche n'est pas connectée, et la dernière au GND. Ou est le problème ? le capteur est HS ?

bonsoir
avant d'integrer ça dans un code plus lourd
test d'abord ton capteur avec un programme plus simple/leger
essaie le code ci-dessous
ton cablage est bon
juste un point : tu es sur de la valeur de ta resistance ?
6K ce n'est pas exactement une valeur standard
teste avec 4.7K comme sur les bus 1W

//
//    FILE: dht11_test.ino
//  AUTHOR: Rob Tillaart
// VERSION: 0.1.00
// PURPOSE: DHT library test sketch for DHT11 && Arduino
//     URL:
//
// Released to the public domain
//

#include <dht.h>

dht DHT;

#define DHT11_PIN 34

void setup()
{
  Serial.begin(115200);
  Serial.println("DHT TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT_LIB_VERSION);
  Serial.println();
  Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}

void loop()
{
  // READ DATA
  Serial.print("DHT11, \t");
  int chk = DHT.read11(DHT11_PIN);
  switch (chk)
  {
    case DHTLIB_OK:  
		Serial.print("OK,\t"); 
		break;
    case DHTLIB_ERROR_CHECKSUM: 
		Serial.print("Checksum error,\t"); 
		break;
    case DHTLIB_ERROR_TIMEOUT: 
		Serial.print("Time out error,\t"); 
		break;
    default: 
		Serial.print("Unknown error,\t"); 
		break;
  }
  // DISPLAY DATA
  Serial.print(DHT.humidity, 1);
  Serial.print(",\t");
  Serial.println(DHT.temperature, 1);

  delay(2000);
}
//
// END OF FILE
//

Merci pour ta réponse, en effet la resistance n'est pas tout juste de 6k, mais 6, je ne sais plus combien !
Tu as raison, je vais d'abord tester ça seul !

Fredericzim:
Merci pour ta réponse, en effet la resistance n'est pas tout juste de 6k, mais 6, je ne sais plus combien !
Tu as raison, je vais d'abord tester ça seul !

surement 6.8K (serie E12)
le DHT11 a besoin d'une R (theorique) de 5K
la valeur simple la plus proche etant 4.7K

Bon alors je viens de tester le code seul et ca ne fonctionne pas, le serial me renvoi constament ce message :
Failed to read from DHT sensor!

voici mon code :

#include <DHT.h>

#define DHTPIN 34     // what pin we're connected to

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11 
#define DHTTYPE DHT11   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);
// NOTE: For working with a faster chip, like an Arduino Due or Teensy, you
// might need to increase the threshold for cycle counts considered a 1 or 0.
// You can do this by passing a 3rd parameter for this threshold.  It's a bit
// of fiddling to find the right value, but in general the faster the CPU the
// higher the value.  The default for a 16mhz AVR is a value of 6.  For an
// Arduino Due that runs at 84mhz a value of 30 works.
// Example to initialize DHT sensor for Arduino Due:
//DHT dht(DHTPIN, DHTTYPE, 30);

void setup() {
  Serial.begin(9600); 
  Serial.println("DHTxx test!");
 
  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit
  float f = dht.readTemperature(true);
  
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Compute heat index
  // Must send in temp in Fahrenheit!
  float hi = dht.computeHeatIndex(f, h);

  Serial.print("Humidity: "); 
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hi);
  Serial.println(" *F");
}[code]

Qu'elle bibliothèque ?
Prend la dernière sur le playground (de R Tillaert), il y en existe des fantaisistes celle là c'est sûr elle fonctionne.
Résistance de 4,7 k : de plus en plus souvent on la trouve déjà incorporée dans le module. Donc 4.7/2 ~=2,4 k c'est peut-être trop faible.

J'ai trouvé une bibliotheque sur un site qui proposait des tutos, je vais tester avec la tienne ! Merci

Alors voila, j'ai la derniere librairie DHT et voila ce que je reçois du serial :

DHT TEST PROGRAM
LIBRARY VERSION: 0.1.20

Type, status, Humidity (%), Temperature (C)
DHT11, Unknown error, 0.0, 0.0
DHT11, Unknown error, 0.0, 0.0
DHT11, Unknown error, 0.0, 0.0
DHT11, Unknown error, 0.0, 0.0
DHT11, Unknown error, 0.0, 0.0
DHT11, Unknown error, 0.0, 0.0
DHT11, Unknown error, 0.0, 0.0
DHT11, Unknown error, 0.0, 0.0
DHT11, Unknown error, 0.0, 0.0
DHT11, Unknown error, 0.0, 0.0

bonsoir
tu a verifié à l'ohmetre si tu n'avais pas une R déjà intégré ~ 5K ?
tu a fait tes test avec une 4.7K ?

Cher dfgh, un débutant se serait déjà fait rabroué : le code c'est entre balises
"["code"]" et non pas entre balises "["quote"]" :grin:

Les balises code c'est (maintenant) la 1ère icone à gauche </>

--> il va falloir refaire le message : " Les balises "Code" c'est ici "

hello
merci de cette précision. j'ai déjà fait une demande d'explication mais pour moi, la réponse n'était pas claire
maintenant, elle semble l'être
merci encore
je viens de virer le post en question et je l'ai remis plus bas avec les balises "code"
et ho joie, ça marche...............

❝/** Broche "DATA" du DHT11 */
const byte DHT11_PIN = A5;
 
/** Code d'erreur de la fonction readDHT11() */
enum {
  DHT11_SUCCESS, //!< Pas d'erreur
  DHT11_TIMEOUT_ERROR, //!< Temps d'attente dépassé
  DHT11_CHECKSUM_ERROR //!< Données reçues erronées
};
 
/** Fonction setup() */
void setup() {
    
  /* Initialisation du port série */
  Serial.begin(57600);
  Serial.println(F("DHT11 DEMO"));
}
 
/** Fonction loop() */
void loop() {
 
  /* Variables d'usage */
  byte temperature, humidity;
 
  /* Lecture de la température et de l'humidité + gestion des erreurs */
  switch (readDHT11(DHT11_PIN, &temperature, &humidity)) {
  case DHT11_SUCCESS: 
     
    /* Affichage de la température et du taux d'humidité */
    Serial.print(F("Humidite (%): "));
    Serial.println((int) humidity);
    Serial.print(F("Temperature (^C): "));
    Serial.println((int) temperature);
    break;
 
  case DHT11_TIMEOUT_ERROR: 
    Serial.println(F("Temps d'attente depasse !")); 
    break;
 
  case DHT11_CHECKSUM_ERROR: 
    Serial.println(F("Erreur de checksum !")); 
    break;
  }
   
  /* Pas besoin de rafraichir l'affichage très souvent */
  delay(2000);
}
 
/**
 * Lit la température et le taux d'humidité capté par un capteur DHT11
 *
 * @param pin Broche sur laquelle est câblé le capteur
 * @param temperature Pointeur vers la variable stockant la température
 * @param humidity Pointeur vers la variable stockant le taux d'humidité
 * @return DHT11_SUCCESS si aucune erreur, DHT11_TIMEOUT_ERROR en cas de timeout, ou DHT11_CHECKSUM_ERROR en cas d'erreur de checksum
 */
byte readDHT11(byte pin, byte* temperature, byte* humidity) {
 
  /* data[] -> buffer contenant les données du cpateur
   * counter -> compteur permettant de savoir quel bit est reçu (bitwise)
   * index -> compteur permettant de savoir quel octet est reçu (bitwise)
   * timeout -> compteur pour le timeout
   */
  byte data[5] = { 0 }, counter = 7, index = 0;
  unsigned int timeout;
 
  /* Conversion du numéro de broche Arduino en ports/masque binaire "bas niveau" */
  /* Utiliser les registres du microcontrôleur est bien plus rapide que digitalWrite() */
  //uint8_t bit = digitalPinToBitMask(pin);
  //uint8_t port = digitalPinToPort(pin);
  
  uint16_t bit = digitalPinToBitMask(pin);
  uint8_t port = digitalPinToPort(pin);
  volatile uint8_t *ddr = portModeRegister(port); // Registre MODE (INPUT / OUTPUT)
  volatile uint8_t *out = portOutputRegister(port); // Registre OUT (écriture)
  volatile uint8_t *in = portInputRegister(port); // Registre IN (lecture)
 
  /* Réveil du capteur */
  *ddr |= bit; // OUTPUT
  *out &= ~bit; // LOW
  delay(18); // Temps d'attente à LOW causant le réveil du capteur
  *out |= bit; // HIGH
  delayMicroseconds(40);
  *ddr &= ~bit; // INPUT
 
  /* Attente de la réponse du capteur */
  timeout = 0;
  while(!(*in & bit)) /* Attente d'un état LOW */
    if (++timeout == 10000)
      return DHT11_TIMEOUT_ERROR;
  timeout = 0;
  while(*in & bit) /* Attente d'un état HIGH */
    if (++timeout == 10000)
      return DHT11_TIMEOUT_ERROR;
 
  /* Lecture des données du capteur (40 bits) */
  for (byte i = 0; i < 40; ++i) {
 
    /* Attente d'un état LOW */
    timeout = 0;
    while(!(*in & bit))
      if (++timeout == 10000)
        return DHT11_TIMEOUT_ERROR;
 
    /* Mise en mémoire du temps courant */
    unsigned long t = micros();
 
    /* Attente d'un état HIGH */
    timeout = 0;
    while(*in & bit)
      if (++timeout == 10000)
        return DHT11_TIMEOUT_ERROR;
 
    /* Si le delta Temps est supérieur à 40µS c'est un "1", sinon c'est un "0" */
    if ((micros() - t) > 40)
      data[index] |= (1 << counter); // "1"
    // Le tableau data[] est initialisé à "0" par défaut <span title=";)" class="wp-smiley emoji emoji-wink">;)</span>
 
    /* Si le compteur de bits atteint zéro */
    if (counter-- == 0) {
      counter = 7; /* On passe à l'octet suivant */
      ++index;
    }
  }
 
  /* Format des données :
   * ◦ = humidité en %

   * [1] = zéro
   * [2] = température en degrés Celsius
   * [3] = zéro
   * [4] = checksum (humidité + température)
   */
  *humidity = data[0]; 
  *temperature = data[2]; 
 
  /* Vérifie la checksum */
  if (data[4] != (data[0] + data[2]))
    return DHT11_CHECKSUM_ERROR; /* Erreur de checksum */
  else
    return DHT11_SUCCESS; /* Pas d'erreur */
}

@Artouste: j'ai bien mis une resistance de 4,7k et je dispose uniquement du capteur, ce n'est pas le module avec resistance intégré

Merci

as tu testé le code que je t'ai posté ( juste au dessus de ta réponse

Unknown error

Peut-tu joindre le code du programme "simplifié" suggéré par Artouste.
As tu un autre exemplaire pour tester ?
"Au repos" la tension au bormes du DHT11 est-elle correcte ?

Avec ce produit il faut un code "véloce" qui suive l'électronique du DHTxx, sinon on va droit dans le mur des TIMEOUTs.
Quand j'avais testé un DHT22 il subsistait encore quelques rares erreurs TIMEOUT. Un peu pour le plaisir, j'avais remplacé tous les digitalRead() par une lecture directe des registres et là plus aucune erreur.
Mais comme tu as une "Uknown Error" ce n'est pas du à un TIMEOUT qui est correctement géré par la librairie.

Je joins 2 datasheets "pas trop mauvaises", avec ce produit il ne faut pas être exigeant.

Remarque : pour un petit peu plus cher il existe le DHT22(AM2302) qui est beaucoup plus performant.

DHT11.pdf (466 KB)

AM2302.pdf (570 KB)

Oui, merci pour vos reponses, en effet, j'ai vu que le DHT11 ne pouvait pas donner de températures négatives, jai donc commandé un module DHT22.
Je vous tiens au courant quand je le recevrai

Encore merci !