Utilisation DHT

Bonjour à tous.

Je suis tout nouveau dans le monde d'arduino et j'ai quelques bases en C. Bref...

J'avai pour "mini-Projet" de faire un système qui, à l'aide d'un DHT11, activerait une des 3 led (vert, jaune ou rouge) et ferait bipper un buzzer en fonction de la température. Seulement, les 3 leds clignotent (signe d'une mauvaise mesure du DHT11).

Code :

//inclusion des librairies
#include <DHT.h>
#define DHTPIN 8
#define DHTTYPE DHT11
DHT dht(DHTPIN,DHTTYPE);

//Déclaration des variables
int ledVerte = 1, ledJaune = 2, ledRouge = 3, buzzer = 5;
char led;

//Déclaration des fonctions
void eteindre();

void setup() {
  //Put your setup code here, to run once:
  
    pinMode(ledVerte, OUTPUT);
    pinMode(ledJaune, OUTPUT);
    pinMode(ledRouge, OUTPUT);
    pinMode(buzzer, OUTPUT);
    pinMode(8, INPUT_PULLUP) ; 
    dht.begin();
}

void loop() {
  //Put your main code here, to run repeatedly:

    float temperature = dht.readTemperature() ; 
    
    if(temperature <= 16)
    {
        if(led == 'V')  
       {
           tone(5, 550, 10);
           delay(2000);  
        }
        else
        {
            eteindre();
            led = 'V' ; 
            digitalWrite(ledVerte, HIGH);
         }
    }

//Si 16 < Temperature <= 20
if(temperature > 16 && temperature <= 20)
{
    if(led == 'J')
    {
        delay(2000);
    }
    else
    {
        eteindre();
        led = 'J' ; 
        digitalWrite(ledJaune, HIGH);
    }
}        
if(temperature > 20)
{
    if(led == 'R')
    {
        tone(buzzer, 550, 10);
        delay(2000);
    }
    else
    {
        eteindre();
        led = 'R';
        digitalWrite(ledRouge, HIGH);
    }
}
if(isnan(temperature))
{
    if(led == 'P')
        {
            tone(buzzer, 550, 10);
            delay(500);
        }
    else
        {
            eteindre();
            led = 'P';
            digitalWrite(ledVerte, HIGH);
            digitalWrite(ledJaune, HIGH);
            digitalWrite(ledRouge, HIGH);
        }
}
}

void eteindre()
{
    digitalWrite(ledVerte, LOW);
    digitalWrite(ledJaune, LOW);
    digitalWrite(ledRouge, LOW);
}

Merci pour votre temps consacré a mon probleme :slight_smile:
Je laisse le code source en piece jointe :smiley: !

Temperature.ino (1.72 KB)

Bonjour et bienvenue

Côté matériel:

  • avez vous mis des résistances de limitation de courant sur chaque LED ?
  • avez vous mis une résistance de 5kΩ à 10kΩ entre la pin data et la pin Vcc de votre DHT11 ?

Côté logiciel:

Quelle librairie DHT utilisez vous ?

Pourquoi la pin 8 n'a pas eu droit à un petit nom? pinMode([color=red]8[/color], INPUT_PULLUP) ; --> C'est louche surtout que quelques lignes au dessus vous déclarez

#define DHTPIN [color=red]8[/color]
#define DHTTYPE DHT11
DHT dht([color=red]DHTPIN[/color],DHTTYPE);

Ou avez vous lu qu'il fallait activer le pull up de la pin DHT? C'est pour remplacer le résistance des 10k ? Pas sûr que ce soit une bonne idée.. vous avez quoi comme arduino? (Le pull-up interne est de 20kΩ à 50kΩ donc loin de la spec qui dit 5kΩ)

Un dht.begin(); dans le setup() ne serait pas de trop... (c'est votre pb majeur je pense)


Sinon à part cela, votre code semble fonctionnel et pourrait être un peu amélioré:

Pour les pins évitez la (0 et) 1 qui correspond(ent) au port série qui vous permet de communiquer avec votre ordinateur - c'est utile pour débuguer avec Serial.print()

Les pins vaut mieux (usage mémoire) prendre l'habitude de les déclarer en const byte

Pourquoi la pin du buzzer a un joli petit nom que vous n'utilisez pas tone([color=red]5[/color], 550, 10); ?

La variable led n'est pas initialisée à une valeur pertinente avant de rentrer dans la loop(). (Elle vaut 0 comme variable globale). ça fonctionne dans votre cas mais pour la lisibilité vous pourriez rajouter un autre caractere pour dire "tout éteint" dans le setup().

Un caractere est OK pour faire cela, mais vous auriez pu aussi utiliser un enum pour avoir de jolis noms pour vos états

Vous pourriez utiliser if (t° <= 16) {} else if (t° <= 20) {} else {} pour gérer les intervalles, c'est plus lisible et évite de tester les autres une fois que vous avez trouvé là où vous situez

(Sinon une DHT22 est plus précise (±0,5°C) que la DHT11 qui offre ±2°C de précision)

Bonjour,

La première chose à faire lorsqu'un programme ne fonctionne pas correctement est d'afficher la valeur des variables avec un Serial.println(). En particulier la valeur de la température.

Pour cela comme l'a indiqué J-M-L il ne faut pas utiliser les pins 0 et 1 qui sont utilisées pour la transmission série.

Je n'ai pas trop compris l'intérêt de l'indicateur 'led'.

edit: J'avais survolé le message de J-M-L et je n'avais pas vu qu'il conseillait le Serial.print()

Merci pour toutes vos suggestions je les test et je vous dis les resultats :slight_smile:

J'ai trouvé la solution dans un forum anglo-saxon ! En fait les pins des DHT11 different en fonction des versions et le mien n'a pas le pin du signal au milieu mais a gauche.
Merci encore pour votre aide : )

Plus précisément :
les pins du composant DHT11 sont toujours à la même place. Les composants DHT11 répondent tous à la même datasheet.
Ce sont les "modules" DHT11 constitués d'un DHT11 reporté sur un morceau de circuit imprimé qui peuvent être différents.