Domotique DIY – Partie 4 – Capteur de Température et Humidité – DHT11 433MHz

Module Temp/Hum

Maintenant nous commandons aisément nos différentes appareilles grâce a nos prises 433 MHz. Mais nous voudrons savoir quelle est la température et le taux d’humidité dans les différents pièces de notre appartement / maison.

Mais pourquoi faire ????

Bennnn….., simplement pour pouvoir effectuer  des différentes scénarios.

Par exemples envoyer un message d’alerte:

  • module placé dans notre frigo: si la température dépasse 7°C.
  • module placé dans votre chambre a coucher: si la température est supérieure a 18°C ou inférieur à 16°C.
  • module placé dans votre cave: si le taux d’humidité dépasse 85%.
  • etc…. les possibilités sont infinie.

Cahier des charges:

Nous voulons que notre futur module envoi la température et taux d’humidité a un intervalle régulier.
Nous voulons garder un historique dans une base de donnée pour une analyse futur.
Nous voulons afficher la dernière température et le taux d’humidité dans l’interface de Domoticz.

Matériels.

Nous allons besoins de:

Émetteur 433MHz

RF433MHz
RF433MHz

DHT11

DHT11
DHT11

arduino nano

arduino-nano
arduino-nano

Pile ou alimentation 5V

 

piles AAalimentation

Création de module

Comme nous pouvons voir le branchement est très simple, il suffit de bien regarder le dessin et le tableau.

Module Temp/Hum
Module Temp/Hum

ArduinoDHT11XY-MK-5V
5V5V5V
GndGndGnd
A0DataN.C.
D12N.C.Data

Lecture et Envoie des données

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include ‹dht.h› //inclusion de la librairie dht
#include <VirtualWire.h> // inclusion de la librairie VirtualWire
#define dht_dpin A0 //pin Arduino où est branché le "data" du capteur 
dht DHT;
char *P = "cuisine"; // Tableau avec le nom  de la pièce
char *msg; // Tableau msg
void setup(){
Serial.begin(9600);
delay(300); //Temps de démarrage du système
delay(700);//delai avant l'accès des valeurs (ne pas mettre moins de 700ms)
Serial.begin(9600); // Initialisation du port série pour avoir un retour sur le serial monitor
Serial.println("Sensor DHT11"); // Petit message de bienvenue
vw_setup(2000);// initialisation de la librairie VirtualWire à 2000 bauds
}
 
void loop(){
DHT.read11(dht_dpin); //lecture des données du capteur
Serial.print("Humidite = "); //texte à afficher avant la valeur
Serial.print(DHT.humidity); //affiche la valeur de l'humidité
Serial.print("% \n"); //texte qui suit la valeur, soit son unité
Serial.print("Temperature = ");
Serial.print(DHT.temperature); //affiche la valeur de la temperature
Serial.println("C \n"); //unité
*msg = *P + " " + DHT.temperature + " " + DHT.humidity;
vw_send((uint8_t *)msg, strlen(msg)); // On envoie le message
vw_wait_tx(); // On attend la fin de l'envoi
delay(3600000); //temps en milisecondes ici 1H 
}
#include ‹dht.h› //inclusion de la librairie dht
#include <VirtualWire.h> // inclusion de la librairie VirtualWire
#define dht_dpin A0 //pin Arduino où est branché le "data" du capteur 
dht DHT;
char *P = "cuisine"; // Tableau avec le nom  de la pièce
char *msg; // Tableau msg
void setup(){
Serial.begin(9600);
delay(300); //Temps de démarrage du système
delay(700);//delai avant l'accès des valeurs (ne pas mettre moins de 700ms)
Serial.begin(9600); // Initialisation du port série pour avoir un retour sur le serial monitor
Serial.println("Sensor DHT11"); // Petit message de bienvenue
vw_setup(2000);// initialisation de la librairie VirtualWire à 2000 bauds
}

void loop(){
DHT.read11(dht_dpin); //lecture des données du capteur
Serial.print("Humidite = "); //texte à afficher avant la valeur
Serial.print(DHT.humidity); //affiche la valeur de l'humidité
Serial.print("% \n"); //texte qui suit la valeur, soit son unité
Serial.print("Temperature = ");
Serial.print(DHT.temperature); //affiche la valeur de la temperature
Serial.println("C \n"); //unité
*msg = *P + " " + DHT.temperature + " " + DHT.humidity;
vw_send((uint8_t *)msg, strlen(msg)); // On envoie le message
vw_wait_tx(); // On attend la fin de l'envoi
delay(3600000); //temps en milisecondes ici 1H 
}

Réception et enregistrement

Dans cette partie nous allons récupérer les données envoyées par notre module à base d’arduino puis nous allons les insérer dans une table. Nous parton de principe que vous avez préalablement installé MySql, phpMyadmin et Python. Et oui après C++, PHP nous nous attaquons au Python…..

au préalable:

  • créer via phpMyadmin une table “température” et une “humidité”
    piecevaluedate
    cuisine2013/04/2014 20:00:00
    salon2213/04/2014 20:01:00
  • Télécharger et placer dans le même répertoire que votre script Python le fichier vm.py (de Joan)
  • Installer la bibliothèque pigpio dans votre RPi
    1
    2
    3
    4
    5
    
    wget abyz.co.uk/rpi/pigpio/pigpio.zip
    unzip pigpio.zip
    cd PIGPIO
    make
    make install
    wget abyz.co.uk/rpi/pigpio/pigpio.zip
    unzip pigpio.zip
    cd PIGPIO
    make
    make install

Voici notre script Python, /!\ attention il doit se trouver dans le même répertoire que votre fichier vm.py /!\

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import time
import MySQLdb
import pigpio
import vw
#!/usr/bin/env python
# -*- coding: latin-1 -*-
 
RX=11 # on deffinie la reception sur le pin 11
BPS=2000  # initialisation de la librairie VirtualWire à 2000 bauds
 
pi = pigpio.pi() 
rx = vw.rx(pi, RX, BPS) 
 
#extraction des données reçues
msg = rx.get()
listd = msg.split
piece = listd[0]
temp = listd[1]
hum = listd[2]
date = time.time()
 
#connexion a la bdd MySQL
conn = MySQLdb.connect(host= "localhost",
                  user="root",
                  passwd="password",
                  db="database")
x = conn.cursor()
 
#Enregistrement des données
try:
   x.execute("""INSERT INTO temperature VALUES (piece, temp, date)""")
   x.execute("""INSERT INTO humidite VALUES (piece, hum, date)""")
   conn.commit()
except:
   conn.rollback()
conn.close() 
rx.cancel() 
pi.stop()
import time
import MySQLdb
import pigpio
import vw
#!/usr/bin/env python
# -*- coding: latin-1 -*-
 
RX=11 # on deffinie la reception sur le pin 11
BPS=2000  # initialisation de la librairie VirtualWire à 2000 bauds
 
pi = pigpio.pi() 
rx = vw.rx(pi, RX, BPS) 

#extraction des données reçues
msg = rx.get()
listd = msg.split
piece = listd[0]
temp = listd[1]
hum = listd[2]
date = time.time()

#connexion a la bdd MySQL
conn = MySQLdb.connect(host= "localhost",
                  user="root",
                  passwd="password",
                  db="database")
x = conn.cursor()

#Enregistrement des données
try:
   x.execute("""INSERT INTO temperature VALUES (piece, temp, date)""")
   x.execute("""INSERT INTO humidite VALUES (piece, hum, date)""")
   conn.commit()
except:
   conn.rollback()
conn.close() 
rx.cancel() 
pi.stop()

pour l’exécuter:

1
2
sudo pigpiod
python TempHum433.py
sudo pigpiod
python TempHum433.py

Voila votre module de température et humidité est pleinement fonctionnel. Dans la prochaine partie nous verrons comment l’exploiter les données avec Domoticz.

Si vous souhaitez partager vos réalisations et expériences sur Domotique-Home.fr, n’hésitez pas a me contacter.

Articles Similaires

33 Thoughts to “Domotique DIY – Partie 4 – Capteur de Température et Humidité – DHT11 433MHz”

  1. Flow

    Bonsoir,

    je suis très intéressé par votre tutoriel! Cependant je rencontre une difficulté dans la création de la table via phpmyadmin… pourrais-je avoir plus de détails sur la création de celle-ci?

    Bien cordialement

    1. R.Syrek

      Bonsoir Flow.
      Je vous envoie le fichier sql dès la semaine prochaine.
      Merci

      1. Flow

        Ok super, merci pour tout.

  2. ccost

    Bonsoir

    joli tuto !

    pensez vous que je peux ajouter le projet a jeedom ?

    Cordialement

    1. R.Syrek

      Bonsoir,
      Biens-sur, rien n’est impossible.

      1. ccost

        Bonsoir,

        dois je faire qqch en particulier pour intégrer ce module ? ajout du library? ou autre ligne de code ?

        en sachant que j’ai déjà mon module RFX433 de connecté sur mon jeedom.

        encore merci de votre aide.

        1. R.Syrek

          Bonjour,
          Vous voulez dire RFXCOM, si c’est le cas vous ne pouvez pas “marier” RFXCOM avec XY-MK-5V.

  3. x71

    Bonjour.
    Tout d’abord, merci pour ce tutoriel.

    Je me suis lancé dans l’expérimentation de celui-ci avec quelques variantes (on fait avec ce qui traine dans les placards).
    Arduino nano remplacé par un arduino uno.
    DHT11 remplacé par un DHT22 (ça c’est pour les specifications +).

    J’ai quelques soucis sur le sketch.

    Problème : #include ‹dht.h› -> #include expects “FILENAME” or
    Solution : j’ai donc téléchargé la dernière version de la bibliothèque chez GitHub /adafruit et remplacé par #include

    Il fallu ensuite adapter le code :
    Problème : dht DHT; -> ‘dht’ does not name a type
    Solution : remplacé par DHT dht(DHTPIN, DHTTYPE);

    Problème : ‘DHTPIN’ was not declared in this scope
    Solution : #define dht_dpin A0 remplacé par #define DHTPIN A0

    Problème : ‘DHTTYPE’ was not declared in this scope
    Solution : ajout de #define DHTTYPE DHT22

    Problème : expected unqualified-id before ‘.’ token
    Solution : remplacement de
    DHT.read11(dht_dpin);
    par
    float t = dht.readTemperature();
    float h = dht.readHumidity();
    Problème : actualisation des variables
    Solution : remplacement de
    Serial.print(DHT.humidity);
    par
    Serial.print(t);
    idem pour la température…

    Par contre, là je bloque.
    j’ai supprimé le delay pour accélérer l’affichage terminal.

    *msg = *P + ” ” + DHT.temperature + ” ” + DHT.humidity;
    me pose problème.
    J’ai bien tenté de remplacer par
    *msg = *P + ” ” + t + ” ” + h;
    invalid operands of types ‘const char*’ and ‘float’ to binary ‘operator+’
    Je me doute bien que c’est un problème de type de constantes, mais je n’arrive pas à convertir de float vers char ???

    En commentant cette partie du code, plus d’erreur et un affichage OK sur le moniteur série.

    Je continue donc mes recherches.

    Merci

    1. R.Syrek

      Bonjour x71,

      Je suppose que tua s utilisé la fonction sprintf() pour la conversion 😉
      mais avec Arduino elle ne fonctionne pas snif..
      Il faut utiliser la fonction dtostrf ()

      1. x71

        rahhhh… On ne nous dit pas tout 😉

        Merci R.Syrek. Je m’en vais tester cette solution.
        En attendant, comme j’ai reçu le pro mini, je vais avoir prochainement un deuxième banc de test.

        Merci

      2. steph_ero

        Bonjour à tous,

        J’ai le même soucis de conversion mais je suis débutant sur arduino et je ne comprend pas bien
        à quel endroit on utilise une conversion dans ce squetch ????

        Et donc je ne comprend pas comment y remédier

        Merci

        1. R.Syrek

          Bonjour.
          Je te publie un exemple apres mon retour la semaine prochaine 😉

          1. steph_ero

            Bonjour,

            Ok ca marche

  4. R.Syrek

    Amuse toi bien 😉

  5. fhenryco

    Bonjour,

    Je n’ai pas trouvé la suite de ce tuto expliquant comment récupérer tout cela dans domoticZ ?! mais peut etre ai je mal cherché (?) Pouvez vous me donner un lien pour cela ? merci

  6. sultan87

    Bonsoir
    Très bon tuto
    je me lance dans la domotique
    je suis un informaticien à la retraite
    sur mon arduino, j’arrive à envoyer
    en revanche sur mon raspberry, je ne recois rien
    pourqoi?
    cordialement

    1. R.Syrek

      Bonjour,
      Dsl pour la réponse tardive (je reviens de vacances)
      Il faut me dire un peu plus, as tu un msg, ou ça bloque ?
      merci

  7. sultan87

    bonjour
    je n’ai pas de message
    le pin 11 correspond t’il au GPIO17 ?
    merci
    pierre

    1. R.Syrek

      Oui GPIO17 = PIN11

      1. sultan87

        Bonjour
        merci d’une réponse rapide
        comment vous faire parvenir mes codes Arduino et Raspberry
        je ne trouve pas l’anomalie
        merci
        Pierre

  8. cubitusfr

    bonjour
    Après avoir acheté le matériel pour créer un capteur de température et d’humidité, je reste bloqué car je ne comprends pas la suite, je possède un raspberry avec domoticz vous indiquez dans le tuto que prochainement vous allez expliquer pour récupérer les infos dans domoticz, mais ou est il ?

    car j’en ai besoin au plus vite Merci de votre compréhension

    1. R.Syrek

      Bonjour cubitusfr,
      La solution la plus simple est de créer un module virtuel “dummy device” et de récupérer la dernière valeur enregistré dans ta base MySQL avec un script.

      1. cubitusfr

        bonjour
        base Mysql ?
        il n’est pas plus simple de récupérer directement les infos tout les 5s ?
        en ne se servant que du Arduino nano, l’emeteur, et la sonde dht ?

        et capteur les infos via le récepteur rxfcom ?

        amicalement

        1. R.Syrek

          Oui y a plus simple si tu utilises un rxfcom.
          Mais j’ai pas testé.

          1. cubitusfr

            Oui bah je ne suis pas aider là !!!

            déjà comment envoyer les informations ?
            a part faire une détection de module et de l’adapter, j’attends le reste des modules.

            mais pouvez vous m’aider, pour ceci :
            l’Arduino nano peux t’il commander un relais ? car j’ai acheter un module de 5 relais pour alimenter des fan de pc 12 v, sous la commande de l’Arduino nano, mais en lui indiquant que si l’humidité est supérieur a 80% de mettre en fonction le relais.

            pouvez vous aussi m’aider a rédiger le script a envoyer dans le nano ?

            Merci

          2. R.Syrek

            Bonjour,
            Oui le Nano peut commander un relais.
            Si on part de principe que ton relais est branché sur le meme nano que ton DHT alors il suffit de modifier ton loop:

            void loop(){
            DHT.read11(dht_dpin); //lecture des données du capteur
            if (DHT.humidity > 80)
            {
            // on active le relais branché sur le pin 5
            digitalWrite(5, HIGH);
            }
            Serial.print("Humidite = "); //texte à afficher avant la valeur
            Serial.print(DHT.humidity); //affiche la valeur de l'humidité
            Serial.print("% \n"); //texte qui suit la valeur, soit son unité
            Serial.print("Temperature = ");
            Serial.print(DHT.temperature); //affiche la valeur de la temperature
            Serial.println("C \n"); //unité
            *msg = *P + " " + DHT.temperature + " " + DHT.humidity;
            vw_send((uint8_t *)msg, strlen(msg)); // On envoie le message
            vw_wait_tx(); // On attend la fin de l'envoi
            delay(3600000); //temps en milisecondes ici 1H
            }

            Apres il faut de savoir ce que tu désire exactement.
            Je vais préparer un petit tuto sur la commande de relais avec le système Domotique DIY 😉
            Par contre je ne sais pas exactement quand car comme précisé j’écrit ce blog après mon travail ou sur mon temps libre.

  9. cubitusfr

    bonjour
    je te remercie pour ton engagement de m’aider, mais pour éviter les erreurs et les confusions, et les mauvaises compréhension, je vais expliquer au mieux ce que je désire faire.

    dans mon habitation comme tout le monde j’ai des chambres (4), mais pour éviter des moisissures sur les murs, je voudrai contrôler la température des pièces, et l’humidité.

    donc comme toutes les chambres possèdent une grille d’aération, je voudrai dessus brancher des Fan de pc en 12v pour accélérer la sortie de l’air intérieur, et un autre fan pour faire entrer l’air, pour cela j’ai acheté un module 433mhz avec une télécommande pour 4 relais, en supposant qu’un relais fonctionne pour une chambre.

    Possédant également un Raspberry ou la domotique “règle” la maison a l’origine, j’ai acheté des modules de températures, mais ne disposer pas de capteur d’humidité, donc ayant vu ton tuto et en me disant cela coutera moins cher, pourquoi ne pas essayer.

    donc en regardant ton tuto, j’ai voulu l’utiliser mais n’étant pas expert, je suis perdu. donc pour bien se mettre d’accord sur les possibilités,

    A vrai dire il y a deux possibilités :

    Soit que le nano commande le relais des fan, dans ce cas le Raspberry a l’aide de l’antenne rfxcom, peux simplement récolter les informations, température et humidité.

    Soit le Raspberry reçois les informations et commande les relais des que l’humidité est trop élevé, puisqu’il y a une télécommande 433mhz, dans ce cas le nano ne sert qu’a envoyé les informations.

    alors je me pose une question ?

    Si j’utilise le nano pour commander les relais en effet se serait plus simple mais étant extra novice, l’idée est la, mais pas la pratique.
    de même si j’utilise le Raspberry pour commander les relais, se serait la solution plus simple puisque tout compte fait il n’y aura que les info du nano a récolter, mais est-ce que le signal arrivera jusqu’à mon antenne ?

    donc voici ce que j’ai comme matériel :
    5 nanos
    5 capteurs de températures
    5 émetteur/récepteur 433mhz
    10 antennes 433mhz
    pour l alimentation j’hésite soit solaire avec pile rechargeable ou bloc pile, ou alimentation universelle (des avis ? )

    un module 4 relais
    https://www.amazon.de/BQLZR-433MHZ-Wireless-Control-Receiver/dp/B00SSWJ89Q

    et 8 fans pc 12v

    voila j’espère avoir été le plus concret et le plus précis.mais je crois que la deuxième solution serait la plus facile et la moins complexe afin je crois, tout en espérant que l’antenne RFXCOM reçoit les informations du nano et que la commande du relais fonctionne.

    aussi pour le branchement sur le nano peux t-on souder directement des fils aux composants ? ou les composants directement sur le nano ? ou est-il préférable par exemple sir je met un long câble ou est branché le DHT si je met un cable de 2m entre le nano et le dht ? fonctionnera – t-il ?

    Merci pour vos réponses.

    Amicalement

    1. R.Syrek

      Ouhaaaaaaaaaa….. Je comprend mieux maintenant 😉
      Alors, la gestion de tes DTH et relais est impossible via les modules 433MHz de ce type. Leurs portées est de quelque mètres 🙁
      Si tu veux impérativement utiliser le matérielle cité plus haut, alors il faut que tu gères ton relais avec ton nano en fonction de taux d’humidité.
      C’est à dire chaque pièce a une gestion interdépendante géré par son propre nano (plus besoins de module 433MHz).
      Dans ce cas la il faut que tu ajoutes une boucle qui vérifie a intervalle régulier (10 mins par exemple) le taux d’humidité et active/désactive ton relais en fonction.
      Mais un changement d’oblige de reprogrammer tes 4 nanos individuellement et tu n’as pas de suivie.
      La deuxième solution et pas trop chère est d’investir dans les ESP (environ 3€/unité) et gérer ton système avec un RPi comme box domotique et plus besoins de nano ni de module 433MHz. En plus tu pourras facilement ajouter d’autre modules et élargir ton réseau 😉

  10. cubitusfr

    bonjour

    donc si j’ai bien compris, je ne pourrai pas avoir les données du dht sur le Raspberry de domoticz ?

    et qu’il faut “programmer” le nano qui si humidité et de 80% mettre en route les relais 12v pour alimenter les fan ?

    ceux que je peux faire comme tu le disais faire un autre système indépendant :

    peux-t on refaire ceci avec des Arduino nano ?

    https://www.carnetdumaker.net/articles/communiquer-sans-fil-en-433mhz-avec-la-bibliotheque-virtualwire-et-une-carte-arduino-genuino/

    en supposant que l’on programme un pour émettre des info avec le DHT et l’autre recevoir les infos et en utilisant les relais pour les fans, également comme je n’aurai pas d’info visible de mettre un écran sur celui de réception.

    PS simple question, g acheter de oregon capteur de température,
    http://www.vandenborre.be/fr/station-meteo/oregon-scientific-thn132n?gclid=CMWu–iN2NACFckaGwodVkQMAQ

    ne peut t on pas les bidouiller en changeant le composant “capteur” par celui du DHT ?

    je pense que cela est possible !!!! qu’en pensez vous ?

  11. cubitusfr

    bonjour

    serait-il possible de me répondre si le lien que j’ai donné ci dessus peux se faire avec un ardruino nano au lieu d’un ardruino uno …

    Merci

    1. R.Syrek

      Bonsoir.
      Oui bien sûr c’est possible. Mais comme je disais avant pour tes besoins la porté n’est pas suffisante. Remplace le module 433MHz par ESP8266.
      Un exemple ici. Il suffit juste de l’adapter a tes besoins.

  12. Azertyuiop974

    Bjr je suis sur un projet comme cela mais moi je récupére les données via le port série sur le logicielle QT C++, mais comment je fais pour séparer la temperature et l’humitidé pour enregistrement SVP ?

Leave a Comment


La période de vérification reCAPTCHA a expiré. Veuillez recharger la page.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.