Gruino : DIY – Relever la température et l’humidité avec Arduino et DHT22

Bonjour à  tous,

Maintenant que nous avons vu dans un précédent article comment communiquer avec la carte Arduino il serai bien que cette dernière nous servent à  quelque chose et que le projet commence enfin à  prendre forme non ? !

C’est justement l’objet de cet article. Nous allons voir ici comment demander à  la carte Arduino de réaliser des relevés de températures et d’humidité par le biais d’un capteur DHT22 et d’une librairie récupérée sur internet et réalisée par Adafruit.

unnamed2

Le DHT 22 en place

Les infos techniques sur le DHT22 sont trouvables un peu partout sur internet, la description donnée pas adafruit est visible ici

Connecter le DHT22 à  la carte Arduino :

Le schéma de cablage est disponible également sur le site de Adafruit : visible ici

J’en redessinerai peut être un quand j’aurai du temps libre pour en garder une trace et être sur de ne pas perdre l’information mais de manière générale pleins de sites on repris les schéma de Adafruit et je préfère rendre à  Adafruit ce qui appartient à  Adafruit 🙂

unnamed

Ici on voit le fil bleue (données) aller sur le port 2 de la carte arduino

Télécharger la librairie :

Elle est disponible encore une fois chez Adafruit ici

Téléchargez le fichier .cpp et le .h

Installer la librairie :

Il suffit de copier les deux fichiers téléchargés dans un dossier nommé « DHT » et de placer celui ci dans le répertoire « libraries » qui se trouve dans le répertoire de l’outil de développement Arduino et de relancer l’application.

Un peu de programmation :

Mise en place et initialisation :

Pour utiliser la librairie il faut tout d’abord dire à  notre programme qu’on souhaite l’utiliser. Pour cela on va utiliser le mot clé « include ». Il se place au tout début du programme et se présente comme ceci :

#include <DHT.h>

Ensuite il faut paramétrer la librairie. Cela se fait avec deux constantes et une fonction d’initialisation :

#define DHTPIN 2 
#define DHTTYPE DHT22 

DHT dht(DHTPIN, DHTTYPE);

#define permet de dire au logiciel que le mot clé qui suit sera une constante.

Pour ceux que ça intéresse en C et en C++ le compilateur replace le premier terme par le deuxième. Donc en gros partout ou le compilateur verra « DHTPIN » il remplacera lors de la compilation « DHTPIN » par 2. C’est très pratique, si par exemple vous utilisez DHTPIN un peu partout et que vous souhaitez changer le capteur de port il vous suffit de remplacer 2 par le nouveau port à  un seul endroit et le compilateur se chargera pour vous de mettre la bonne valeur la ou il faut lors de la compilation.

Revenons à  nos moutons :

DHTPIN sert à  définir le port sur lequel le fil de données du capteur sera connecté, ici le port 2.

DHTTYPE sert à  définir le type de capteur car la librairie gère le DHT11 et le DHT22. Il s’agit dans mon cas du DHT22.

DHT dht(DHTPIN, DHTTYPE); sert à  initialiser le capteur.

Lecture de la température et de l’humidité :

Pour garder un minimum de lisibilité nous allons créer des petites fonctions. Cela facilitera également la mise à  jour du programme si besoin 😉

voici les deux fonctions :

float Temperature()
{
   float t = dht.readTemperature();

   if (isnan(t)) 
   {
       return -99;
   } 
   else 
   {
       return t;
   }
}

float Humidite()
{
   float h = dht.readHumidity();

   if (isnan(h)) 
   {
       return -99;
   } 
   else {
       return h;
   }
}

En gros on à  une fonction « Temperature » de type float (qui retourne un nombre à  virgule) et sans paramètres (il n’y à  rien à  lui fournir). Le contenue de celle ci se trouve entre deux accolades.  On définie dans cette fonction une variable « t » de type float (nombre à  virgule) et on lui donne le retour de « dht.ReadTemperature() » qui est une fonction de la librairie de tout à  l’heure qui demande au capteur la température qu’il capte. Voila tout l’intérêt d’utiliser une librairie, ne pas avoir à  programmer sois même l’interrogation du capteur !!

Le principe est le même pour la fonction humidité.

Il est très important pour ne pas être embeter par l’appel des fonction de rajouter leur nom juste sous l’initialisation des constantes. Cela permet de les appeller depuis n’importe ou dans le programme. On rajoute donc ces deux lignes sous l’initialisation des constantes :

float Temperature();
float Humidite();

Appel des fonctions :

Dans la fonction lire() que nous avions écrit dans l’article précédent nous allons simplement ajouter deux cas :

case 't':
               float t;
               t = Temperature();
               if(t != -99)
               {
                     Serial.println(t); 
               }
               else
               {
                   Serial.println("erreur de lecture du DHT");
               }
               break;
case 'h':
               float h;
               h = Humidite();
               if(t != -99)
               {
                     Serial.println(h); 
               }
               else
               {
                   Serial.println("erreur de lecture du DHT");
               }
               break;

Ainsi quand le module Arduino recevra un t il renverra par la liaison la température. et quand il recevra h il renverra l’humidité perçut par le capteur.

Code complet :

#include <DHT.h>

#define DHTPIN 2 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)

DHT dht(DHTPIN, DHTTYPE);

float Temperature();
float Humidite();
void lire();

void setup()
{
   pinMode(13, OUTPUT);
   digitalWrite(13, LOW);

   Serial.begin(9600);
   dht.begin();
}

void loop()
{
  lire();
}

void lire()
{
   if(Serial.available() > 0)
   {
       switch(Serial.read())
       {
           case 'e':
               digitalWrite(13, LOW);
               break;

           case 'm':
               digitalWrite(13, HIGH);
               break;
           case 't':
               float t;
               t = Temperature();
               if(t != -99)
               {
                     Serial.println(t); 
               }
               else
               {
                   Serial.println("erreur de lecture du DHT");
               }
               break;
           case 'h':
               float h;
               h = Humidite();
               if(t != -99)
               {
                     Serial.println(h); 
               }
               else
               {
                   Serial.println("erreur de lecture du DHT");
               }
               break;
       }
   }
}
float Temperature()
{
   float t = dht.readTemperature();

   if (isnan(t)) 
   {
       return -99;
   } 
   else 
   {
       return t;
   }
}

float Humidite()
{
   float h = dht.readHumidity();

   if (isnan(h)) 
   {
       return -99;
   } 
   else {
       return h;
   }
}

Voila, j’espère avoir été claire et que tout cela vous aidera dans vos développement.  Si vous avez des questions n’hésitez surtout pas ! 🙂

3 Commentaires

  1. Adrien

    Bjr, y a t-il moyen de vous contacter par mail?
    Je vous remercie

    Répondre
    1. loizo (Auteur de l'article)

      Je préfèrerais ici comme ça ça permettrait de partager les questions / réponses avec tout le monde, peut être que d’autres ont les mêmes interrogations 🙂

      Répondre
    2. loizo (Auteur de l'article)

      Je t’ai envoyé un mail comme ça tu as les deux au besoin

      Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *