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
DHT11
arduino nano
Pile ou alimentation 5V
Création de module
Comme nous pouvons voir le branchement est très simple, il suffit de bien regarder le dessin et le tableau.
Arduino | DHT11 | XY-MK-5V |
---|---|---|
5V | 5V | 5V |
Gnd | Gnd | Gnd |
A0 | Data | N.C. |
D12 | N.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é”
piece value date cuisine 20 13/04/2014 20:00:00 salon 22 13/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.
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
Bonsoir Flow.
Je vous envoie le fichier sql dès la semaine prochaine.
Merci
Ok super, merci pour tout.
Bonsoir
joli tuto !
pensez vous que je peux ajouter le projet a jeedom ?
Cordialement
Bonsoir,
Biens-sur, rien n’est impossible.
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.
Bonjour,
Vous voulez dire RFXCOM, si c’est le cas vous ne pouvez pas “marier” RFXCOM avec XY-MK-5V.
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
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 ()
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
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
Bonjour.
Je te publie un exemple apres mon retour la semaine prochaine 😉
Bonjour,
Ok ca marche
Amuse toi bien 😉
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
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
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
bonjour
je n’ai pas de message
le pin 11 correspond t’il au GPIO17 ?
merci
pierre
Oui GPIO17 = PIN11
Bonjour
merci d’une réponse rapide
comment vous faire parvenir mes codes Arduino et Raspberry
je ne trouve pas l’anomalie
merci
Pierre
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
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.
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
Oui y a plus simple si tu utilises un rxfcom.
Mais j’ai pas testé.
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.
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 😉
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 ?
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
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.
[…] Lien vers le site ici […]
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 ?