Raspberry – Thermomètre connecté avec une sonde DHT22

Bonjour à tous ! Aujourd'hui nous allons aborder un projet qui traîne depuis un certain temps pour moi, la réalisation d'un thermomètre connecté avec un Raspberry Pi et une sonde DHT22.

Cette sonde nous permettra de récupérer la température et l'humidité

Ce type de thermomètre peut-être utile si vous voulez monitorer la température de votre maison par exemple et exécuter des actions en cas de température élevée ou faible pour allumer le chauffage ou la climatisation.

Il peut également permettre de surveiller une salle serveur par exemple, en envoyant des alertes en cas de température élevée comme dans le cas que nous verrons.

Matériel

Tout d'abord le matériel utilisé pour ce thermomètre :

Attention, si vous achetez une sonde DHT22 il en existe plusieurs modèles, certaines sont pré-assemblées comme celle que j'ai choisie. Les branchements et les matériaux peuvent être différents.

Je présenterais les branchements pour les deux cas que j'ai vu, avec la sonde du lien et avec une sonde « nue ».

Dans le cas d'une sonde nue il faut rajouter :

Branchement

Comme indiqué au-dessus, voici les deux sondes DHT22 :

Avec une sonde pré-assemblée

Nous avons donc seulement 3 pin sur ce modèle qu'il faut brancher de la manière suivante (ne faite pas attention à la sonde sur l'illustration, nous utilisons bien une DHT22 et pas une 11) :

Le PIN 1 de la sonde est relié au PIN 2 du rapsberry qui correspond à l'alimentation 5V.

Le PIN 2 de la sonde est relié à la masse sur le PIN 6 du raspberry.

Le PIN 3 de la sonde est relié au PIN 7 du raspberry afin de permettre les échanges d'informations.  

Dans mon cas je n'utilise pas de plaque d'essai, je branche directement la sonde au raspberry :

Avec une sonde nue

Avec une sonde nue il faut donc rajouter une résistance et une plaque d'essai pour réaliser un branchement comme celui-là :

Le 3ème PIN de la sonde n'est pas utilisé, sinon les autres sont reliés aux mêmes PIN sur le raspberry, l'alimentation, la masse et le PIN 7 pour les données.

Fonctionnement

Pour récupérer les informations de la sonde une librairie a été développée par Adafruit, personnellement j'utilise la librairie Python compatible avec 2.7 et Python 3.

Pour installer cette librairie, plusieurs possibilités sont possibles, de mon côté j'ai procédé de la façon suivante :

1git clone https://github.com/adafruit/Adafruit_Python_DHT.git
2cd Adafruit_Python_DHT
3sudo python setup.py install
4
5#### Avec Python 3.x ####
6sudo python3 setup.py install

Vous pouvez ensuite vérifier le fonctionnement de votre sonde avec les commandes suivantes :

1cd examples
2python AdafruitDHT.py 22 4

Le script doit normalement vous renvoyer la température et l'humidité de la sonde. Les paramètres 22 et 4 correspondent respectivement à la sonde utilisée (DHT22) et au PIN utilisé (GPIO4, le 7 du raspberry).

La sonde est maintenant installée et fonctionnelle.

Pour aller plus loin

De mon côté ce que je voulais faire c'était réaliser un dashboard Web pour consulter la température et l'humidité d'une pièce avec éventuellement des alertes si la température est trop élevée.

Pour cela j'ai repris la librairie fournie par Adafruit et j'ai développé un script Python qui renvoi la température et l'humidité dans deux fichiers CSV différents avec une date au format timestamp. Pour automatiser le script j'utilise simplement un cron.

Pour l'affichage j'ai utilisé la librairie CanvasJS qui permet de réaliser des graphiques facilement depuis les données d'un fichier CSV.

Une option a également été rajoutée pour être alerté en cas de température trop élevée.

Voici le script en question :

 1#!/usr/bin/python
 2
 3import sys
 4import datetime
 5import Adafruit_DHT 
 6import time
 7import calendar
 8import smtplib
 9
10#Configuration du type de sonde et du PIN
11sensor = 22
12pin = 4
13
14humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
15
16#Récupération du temps
17ts = str(calendar.timegm(time.gmtime())) + "000"
18
19if str(sys.argv[1]) == 'temperature':
20    if temperature is not None:
21        print(ts + ',' '{0:0.1f}'.format(temperature))
22    else:
23        print('Err.')
24        sys.exit(1)
25
26elif str(sys.argv[1]) == 'humidity':
27    if humidity is not None:
28        print(ts + ',' + '{0:0.1f}'.format(humidity))
29    else:
30        print('Err.')
31        sys.exit(1)
32
33elif str(sys.argv[1]) == 'alert':
34        if temperature > 20 :
35            from email.MIMEMultipart import MIMEMultipart
36            from email.MIMEText import MIMEText
37            fromaddr = "exemple@gmail.com"
38            toaddr = "exemple@exemple.com"
39            msg = MIMEMultipart()
40            msg['From'] = fromaddr
41            msg['To'] = toaddr
42            msg['Subject'] = "Temperature is high !"
43            body = "Temperature is high ! Temp : " + str(temperature)
44            msg.attach(MIMEText(body, 'plain'))
45            server = smtplib.SMTP('smtp.gmail.com', 587)
46            server.starttls()
47            server.login(fromaddr, "xxxx")
48            text = msg.as_string()
49            server.sendmail(fromaddr, toaddr, text)
50            server.quit()                                                                                                                                                                                                 

Les paramètres possibles sont donc :

J'ai ensuite rajouté tout ça dans le fichier cron pour que le script soit exécuté toutes les heures :

10 * * * * python /chemin_vers_le_script/DHT22.py temperature >> /var/www/html/temperature.csv
20 * * * * python /chemin_vers_le_script/DHT22.py humidity >> /var/www/html/humidity.csv
30 * * * * python /chemin_vers_le_script/DHT22.py alert

Voici un exemple de mail reçu :

Dans mon cas l'adresse d'envoi utilisée est une adresse Gmail.

Et pour finir voici le dashboard réalisé avec CanvasJS :

Le code du dashboard n'est pas présent ici car il rendrait l'article illisible. Il est présent sur le Fork Github du projet que j'ai réalisé pour stocker l'ensemble des fichiers. Il est à placer à la racine du serveur Web.

Pour récupérer les informations depuis la page Web je renvoie l'ensemble des résultats du script avec le cron à la racine du serveur Web dans deux fichiers, temperature.csv et humidity.csv.

Le serveur utilisé dans mon cas est Apache2.

CanvasJS est une librairie avec une licence commerciale, il reste tout de même possible de l'utiliser gratuitement si c'est dans un cadre scolaire, personnel. Tout est expliqué ici.

Lien du projet complet sur Github.

Voilà, nous avons maintenant notre dashboard pour suivre l'évolution de la température et les alertes par mail.

J’espère que cet article vous aura plu, si vous avez des questions ou des remarques sur ce que j’ai pu écrire n’hésitez pas à réagir avec moi par mail ou en commentaire !

Merci pour votre lecture et à bientôt !

MRigonnaux