Go Down

Topic: problème lecture sonde DHT22 (Read 1 time) previous topic - next topic

bryan94400

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 ;) merci d'avance


Quote
#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);
}

ChPr

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
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

bryan94400

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

ChPr

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

Code: [Select]
Serial.println(humidity);
Serial.println(temperature);


Vous obtenez quoi ?

Cordialement.

Pierre.
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

bryan94400

ChPr j'ai remplace il m'indique de bonne valeur. c'est quoi qui n'allais pas avec mon : 
Quote
char buffer[200] = {0, };
    snprintf(buffer, 199, "Humidity : %d -- Temperature : %d°C",
           humidity, temperature);
?

en tous cas merci

ChPr

... j'ai remplace il m'indique de bonne valeur ...
Pas compris votre phrase, vous avez remplacé quoi par quoi ?

Cordialement.

Pierre
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

bryan94400

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

je disais : j'ai remplacé par ce que vous m'avez proposé :
Quote
Serial.println(humidity);
Serial.println(temperature);
cela fonctionne très bien. c'est quoi qui n'allais pas avec mon code? :

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

ChPr

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 :

Code: [Select]
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
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

bryan94400

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

ChPr

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
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

bryan94400

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

AIRPOPCIE

bonjour j'utilise le DHT22 sans problème.
Ilfaut le lire comme cà:
 
Code: [Select]
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

Go Up