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

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.

32 réflexions au sujet de « Domotique DIY – Partie 4 – Capteur de Température et Humidité – DHT11 433MHz »

  1. 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

  2. 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

          • 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

          • 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.

  3. 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

    • 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 😉

  4. 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 ?

  5. Ping : Domotique DIY – Partie 4 – Capteur de Température et Humidité – DHT11 433MHz | RoboTechno

Laisser un commentaire