problème lecture sonde DHT22

Bonjour j'ai un petit souci je suis en cours de réalisation de mon code ainsi que du montage de mon projet et actuellement je bloque sur la lecture d'une des deux sonde de température ( la DHT22 HUMIDITÉ et LA TEMPÉRATURE ) j'ai des valeur erroné je ne comprend pas d'ou sa viens j'ai essayer plusieurs solution mais sans résultat ( j'ai même essaye de changer de sonde pareil ) je vous joint une photos avec les valeur donnée et ainsi que le code si quelqu'un peut me donnée un coup de pouce :wink: merci d'avance

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "RTClib.h"
#include <DallasTemperature.h>
#include <DHT.h>

#define VERSION "version 0.0.3"

//DS18B20
OneWire oneWire(3); //Bus One Wire sur la pin 3 de l'arduino
DallasTemperature sensors(&oneWire); //Utilistion du bus Onewire pour les capteurs
DeviceAddress sensorDeviceAddress; //Vérifie la compatibilité des capteurs avec la librairie

// DHT22
// @todo :
#define DHT_PIN 2
#define DHTTYPE DHT22

DHT dht(DHT_PIN, DHTTYPE);

// Create RTC object
RTC_DS1307 RTC;

// Init liquid crystal (I2C)
LiquidCrystal_I2C lcd(0x27,16,2);

void setup() {
// Init serial
Serial.begin(9600);
Serial.println("Aquarium start");
Serial.println(VERSION);

// Init lcd
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Aquarium start");
lcd.setCursor(0,1);
lcd.print(VERSION);

// Wait 5s before continue programme
delay(5000);

// Init I2C
Wire.begin();

// Init RTC (DS3132)
RTC.begin();
if (! RTC.isrunning()) {
Serial.println("Can't init RTC");
lcd.setCursor(0,0);
lcd.print("Can't init RTC");
delay(2000);
}

lcd.setCursor(0,0);
lcd.print("Nous sommes le :");

// Init dht
dht.begin();
}

void loop() {
// Get time and display (lcd and serial)
displayTime();

// Get temperature
getTemperature();

// Get humidity
getHumidityAndTemperature();

// attend 100ms
delay(100);
}

void displayTime()
{
// Get DateTime
DateTime now = RTC.now();

// Transformation de la date et de l'heure en chaine de caractère
char buffer[200] = {0, };
snprintf(buffer, 199, "%02d/%02d/%02d %02d:%02d ", now.day(),
now.month(), now.year(), now.hour(), now.minute(), now.second());

// Afficher DateTime
lcd.setCursor(0, 1);
lcd.print(buffer);

// Imprimer DateTime en série
Serial.println(buffer);
}

void getTemperature()
{
sensors.requestTemperatures(); //Demande la température aux capteurs
Serial.print("La température est: ");
Serial.print(sensors.getTempCByIndex(0)); //Récupération de la température en celsius du capteur n°0
Serial.println(" C°");
}

void getHumidityAndTemperature()
{
// Get humidity
float humidity = dht.readHumidity();

// Get temperature (in Celsius)
float temperature = dht.readTemperature();

if (isnan(humidity) || isnan(temperature) ) {
Serial.println("Failed to read from DHT sensor!");
return;
}

char buffer[200] = {0, };
snprintf(buffer, 199, "Humidity : %d -- Temperature : %d°C",
humidity, temperature);

Serial.println(buffer);
}

Je pense que votre problème vient du fait que "humidity" et "temperature" sont des float et que vous voulez les imprimer comme des entiers ( snprintf(buffer, 199, "Humidity : %d -- Temperature : %d°C", humidity, temperature); )

Il faut utiliser %e ou %f ou %g avec la syntaxe qui va bien.

Cordialement.

Pierre

Salut ChPr j'ai tenté de changer mais toujours sans résultat

Dans votre procédure : "void getHumidityAndTemperature()" si vous faites :

Serial.println(humidity);
Serial.println(temperature);

Vous obtenez quoi ?

Cordialement.

Pierre.

ChPr j'ai remplace il m'indique de bonne valeur. c'est quoi qui n’allais pas avec mon :

char buffer[200] = {0, };
snprintf(buffer, 199, "Humidity : %d -- Temperature : %d°C",
humidity, temperature);

?

en tous cas merci

bryan94400:
... j'ai remplace il m'indique de bonne valeur ...

Pas compris votre phrase, vous avez remplacé quoi par quoi ?

Cordialement.

Pierre

désoler j’étais trop enthousiaste au fait que sa marche.

je disais : j'ai remplacé par ce que vous m'avez proposé :

Serial.println(humidity);
Serial.println(temperature);

cela fonctionne très bien. c'est quoi qui n’allais pas avec mon code? :

char buffer[200] = {0, };
snprintf(buffer, 199, "Humidity : %d -- Temperature : %d°C",
humidity, temperature);

De mémoire, il me semble que sur Arduino, la fonction snprintf ne fonctionne pas avec des float. Pour le vérifier, remplacer votre procédure "void getHumidityAndTemperature()" par celle-ci :

void getHumidityAndTemperature()
{
    // Get humidity
    int humidity = int(dht.readHumidity());

    // Get temperature (in Celsius)
    int temperature = int(dht.readTemperature());

    if (isnan(humidity) || isnan(temperature) ) {
        Serial.println("Failed to read from DHT sensor!");
        return;
    }

    char buffer[200] = {0, };
    snprintf(buffer, 199, "Humidity : %d -- Temperature : %d°C",
           humidity, temperature);

    Serial.println(buffer);
}

Vous allez perdre la précision à l'affichage, mais c'est juste pour vérifier que le problème vient de snprintf avec les float.

Cordialement.

Pierre

alors voici mes relevé :

21/01/2018 19:36
La température est: 25.62 C°
Humidity : 38 -- Temperature : 25°C

Le problème vient donc bien de la fonction snprintf avec les float.

Il va vous falloir jongler avec la fonction dtostre pour convertir les float en char[] et la fonction strcat pour concaténer les différentes chaînes de caractères. Je vous laisse chercher un peu.

Cordialement.

Pierre

merci ChPr j'ai regarder sur internet tout ce que je pouvais trouvé sur dtostre et strcat mais j'ai beaucoup de mal a comprendre c'est deux fonction

bonjour j'utilise le DHT22 sans problème.
Ilfaut le lire comme cà:

void LireDHT22() { //Lecture du taux d'humidité
        float TH = dht.readHumidity();
        // Lecture de la température en Celcius
        float TDHT = dht.readTemperature();
        // Pour lire la température en Fahrenheit
        float f = dht.readTemperature(true);
        TempC= (TDHT+CorrecteurTemperatureDHT);
        HRAA = TH;
       //Stop le programme et renvoie un message d'erreur si le capteur ne renvoie aucune mesure
       if (isnan(TH) || isnan(TDHT) || isnan(f)) {
       Serial.println("Echec de lecture !");
       return;
       }
        delay (500); 
        TacheDemandeDeTCFaite = true;
}

voilà ensuite il faut l'écrire ainsi:
Serial.print("valeur lue:");Serial.println(TempC);
bonnes mesures