XIX. Projet 11 : construire une station météo▲
Objectif : utiliser un capteur température/humidité et afficher les données sur un écran LCD.
Ce projet est la synthèse des inputs analogiques, avec comme bonus l'utilisation d'un écran pour l'affichage des données.
Connaître la température et l'humidité est une information utile pour vivre confortablement, pour stocker des aliments ou du matériel, pour des prévisions météo… Avec ce projet nous apprendrons comment mesurer ces deux données et à les afficher sur un écran LCD.
Avec les projets précédents, nous avons appris à mesurer des valeurs (intensité lumineuse et température) avec des capteurs analogiques grâce aux entrées analogiques de la carte Arduino qui sont munies d'un composant qui transforme les valeurs analogiques mesurées en valeurs numériques. Mais il existe aussi de nombreux capteurs qui transforment eux-mêmes, les valeurs analogiques mesurées en valeurs digitales exploitables par des moyens informatiques. C'est le cas d'un capteur de température et d'humidité très répandu et bon marché, le DHT11 que l'on va utiliser pour ce projet.
Le capteur DHT11 est fourni avec de nombreux kits pour Arduino, autrement on peut l'acheter pour quelques francs. Le DHT11 ne mesure que des températures positives, entre 0 °C et 50 °C avec une précision de ±2 °C et des taux d'humidité relative de 20 à 80 % avec une précision de ±5 %. Pour des besoins plus pointus ou s'il s'agit de mesurer aussi des températures négatives, il faut se munir de son grand frère, le DHT22, deux fois plus onéreux, mais dont la plage de mesure s'étend de -50 °C à +125 °C, avec une précision de 0,5 °C et de 0 à 100 % (précision ±2 %) pour la mesure de l'humidité relative.
Circuit 15 |
Utilisation du capteur de température et d'humidité |
XIX-A. Code 21 : acquérir les données du capteur et les afficher▲
L'objectif de ce code est d'acquérir via l'une des broches digitales de l'Arduino, les données de température et d'humidité transmises par le capteur DHT11, puis de les afficher sur l'écran de l'ordinateur. Pour communiquer avec le capteur, il faut dans un premier temps télécharger et installer la bibliothèque spécifique à ce capteur (ou plutôt l'une des bibliothèques pour ce capteur, car il y en a plusieurs versions). Les bibliothèques sont des ensembles de fonctions qui s'ajoutent aux fonctions de base du logiciel Arduino.IDE. Certaines bibliothèques sont préinstallées, par exemple celle intitulée LiquidCrystal dont nous aurons besoin plus tard pour l'affichage sur l'écran LCD, d'autres doivent être installées par l'utilisateur au fur et à mesure de ses besoins. La bibliothèque DHTLib que nous allons utiliser pour ce projet fait partie de cette dernière catégorie et doit donc être installée « à la main ».
Depuis la version 1.6.0 de l'IDE Arduino, un gestionnaire de bibliothèque a permis de grandement simplifier l'installation et la mise à jour des bibliothèques. Le gestionnaire est accessible via le menu Croquis → Inclure une bibliothèque → Gérer les bibliothèques. Une fenêtre de gestion des bibliothèques apparaît dans laquelle il est possible de rechercher une nouvelle bibliothèque en tapant son nom dans le champ de recherche en haut à gauche ou de faire des mises à jour des bibliothèques existantes.
Ci-dessus, en tapant « dht » dans le champ de recherche, on obtient en seconde position la bibliothèque DHTLib que nous allons utiliser. Il ne reste plus qu'à l'installer en cliquant sur le bouton qui apparaît sur la droite quand on la sélectionne.
Une autre solution pour installer une bibliothèque consiste à télécharger le fichier .zip de la bibliothèque désirée, puis de l'installer via le menu Croquis → Inclure une bibliothèque → Ajouter une bibliothèque.zip.
La bibliothèque DHTLib peut être téléchargée ici : http://www.circuitbasics.com/wp-content/uploads/2015/10/DHTLib.zip.
Note : sur les postes élèves, les bibliothèques supplémentaires sont installées dans le dossier personnel de l'utilisateur et ne seront donc accessibles que pour ce seul utilisateur, il faut disposer d'un accès administrateur pour installer une bibliothèque pour tous les utilisateurs d'un ordinateur.
Attention, pour que la bibliothèque nouvellement installée soit utilisable, il faut quitter puis relancer Arduino.
La bibliothèque ad hoc étant maintenant installée, on peut passer au code :
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.
/*
Code 21 - Edurobot.ch, destiné à l'Arduino
Objectif: Afficher la température et l'humidité sur un écran
*/
//***** EN-TÊTE DÉCLARATIF *****
#include
<dht.h>
// on charge la bibliothèque
dht DHT; // on crée l'objet du capteur DHT11
#define DHT11_PIN 7
// on définit le Pin qui sera utilisé pour recevoir les données
void
setup() // début de la fonction setup()
{
Serial
.begin(9600
); // Pour une fois, l'ouverture du port série et la définition de
// sa vitesse en bauds est utile, même indispensable puisque l'on
// va utiliser ce port pour afficher les valeurs du capteur.
}
//***** FONCTION LOOP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et une seule fois, au démarrage du programme
void
loop() // début de la fonction loop()
{
int
chk =
DHT.read11(DHT11_PIN); // on lit l'état du capteur
Serial
.print("Temperature = "
); // on écrit le mot Température sur le moniteur
Serial
.println(DHT.temperature); // on affiche sur la même ligne la température lue
Serial
.print("Humidite = "
); // on écrit le mot Humidité sur le moniteur
Serial
.println(DHT.humidity); // on affiche sur la même ligne l'humidité lue
delay
(1000
); // on fait une pause de 1 seconde entre 2 interrogations du capteur
}
Pour visualiser les données transmises par le capteur, il faut encore ouvrir une fenêtre du moniteur série sur votre ordinateur : Menu Outils → Moniteur série.
Circuit 16 |
Affichage des valeurs mesurées sur un écran LCD
Afficher le résultat des mesures sur le moniteur série est bien sympathique, mais si l'on veut faire une installation de mesure permanente et autonome, cette solution ne convient pas, car il faut que l'ordinateur soit en permanence allumé et branché à la carte. L'affichage sur un petit écran LCD est une solution bien plus élégante et pratique. L'un des écrans LCD les plus répandu dans le monde Arduino et qui est souvent fourni avec les kits de base est le modèle dit 16x2 LCD (il est capable d'afficher deux lignes de 16 caractères chacun). À l'achat un tel écran coûte entre 7 et 15 €.
Note : le but final étant d'afficher la température et l'humidité transmise par le capteur DHT11, il est conseillé de laisser le circuit 9 en place (sur un côté ou une extrémité de la breadboard , autrement il faudra le recâbler plus tard. Les images ci-dessous ne comprennent volontairement pas le DHT11, toujours branché à la Pin7 afin d'améliorer leur lisibilité.
Liste des composants :
- 1 écran LCD 2x16 ;
- 1 potentiomètre (résistance variable) ;
- 1 résistance de 220 Ω ;
- 1 capteur DHT11 (déjà câblé depuis le circuit 9).
Il existe une grande variété de modèles d'écran LCD, certains forts pratiques ayant déjà des pins qui dépassent à la face inférieure et qui s'encastrent directement dans la breadboard, d'autres nécessitant l'usage de connecteurs mâle-mâle pour pouvoir se connecter à la breadboard ou directement à la carte Arduino via des câbles de liaisons.
Tous les modèles d'écran LCD sont dotés de 16 Pins dont le câblage est le suivant :
- Les deux premiers pins tout à gauche servent à l'alimentation de l'écran. Pôle négatif ou GND pour le premier et pôle positif (5 V) pour le 2e
- Le 3epin est connecté à un potentiomètre et sert à régler le contraste de l'écran LCD
- Le 4e, noté RS pour Register Select, est connecté au pin 12 de l'Arduino. Il sert à sélectionner la zone mémoire de l'écran LCD dans laquelle nous allons écrire
- Le 5e doit être connecté au ground (GND)
- Le 6e, noté E pour Enable, est connecté au pin 11 de l'Arduino. Il permet de lancer ou non l'écriture dans les zones mémoire
- Les quatre suivants (7, 8, 9 et 10e) sont reliés au ground (GND)
- Les quatre qui suivent (11e à 14e, notés 5, 4, 3, 2 sur le schéma ci-dessus, car ils se connectent sur les Pins 5, 4, 3, 2 de l'Arduino. Ils servent pour la transmission des données à afficher
- Les deux pins tout à droite (15 et 16e) servent pour alimenter la LED du rétroéclairage de l'écran LCD. Attention, l'avant-dernier (pôle positif 5 V) doit impérativement être protégé par une résistance d'environ 220 Ω. Le dernier est relié au pôle négatif (GND)
Une fois le montage effectué et l'Arduino branché au port USB de l'ordinateur, vous pouvez tourner le potentiomètre et vous verrez le contraste de l'écran se modifier.
XIX-B. Code 22 : afficher les données sur l'écran LCD▲
Contrairement à la bibliothèque « DHTLib » utilisée auparavant, la bibliothèque « LiquidCrystal » est incluse avec le logiciel Arduino IDE, mais il faut tout de même l'installer avant de pouvoir l'utiliser.
Menu : Croquis → Inclure une bibliothèque → Gérer les bibliothèques.
Dans l'onglet de recherche, tapez : « LiquidCrystal ». Si la bibliothèque est déjà installée, vous verrez noté « INSTALLED » à côté de son nom, autrement cliquez sur Install.
Attention, pour que la bibliothèque nouvellement installée soit utilisable, il faut quitter puis relancer Arduino IDE.
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.
/*
Code 22 - Edurobot.ch, destiné à l'Arduino
Objectif: Afficher la température et l 'humidité sur un écran LCD
*/
//***** EN-TÊTE DÉCLARATIF *****
#include
<dht.h>
// on inclut la bibliothèque pour le capteur DHT11
#include
<LiquidCrystal.h>
// on inclut la bibliothèque pour l'écran LCD
LiquidCrystal lcd(12
, 11
, 5
, 4
, 3
, 2
); // on crée l'objet LCD et on définit les Pins utilisés
dht DHT; // on crée l'objet du capteur DHT11
#define DHT11_PIN 7
// on définit le Pin utilisé pour les données du DHT11
void
setup(){
lcd.begin(16
, 2
); // on initialise la communication avec l'écran LCD
}
void
loop()
{
int
chk =
DHT.read11(DHT11_PIN); // on lit les données du capteur DHT
lcd.setCursor(0
,0
); // on place le curseur de l'écran LCD au début de la 1ère ligne
lcd.print("Temp: "
); // on écrit le mot "Temp: " à l'emplacement du curseur
lcd.print(DHT.temperature,1
); // on écrit la température lue par le capteur, avec 1 chiffre derrière la virgule
lcd.print((char
)223
); // on ajoute le symbole ° après la valeur de la température
lcd.print("C"
); // on ajoute la lettre C pour degré Celsius
lcd.setCursor(0
,1
); // on déplace le curseur de l'écran LCD au début de la 2eligne
lcd.print("Humidity: "
); // on écrit le mot "Hum. rel: " à l'emplacement du curseur
lcd.print(DHT.humidity,1
); // on écrit l'humidité relative lue par le capteur, avec 1 chiffre derrière la virgule
lcd.print("%"
); // on ajoute le symbole "%" après la valeur de l'humidité
delay
(1000
); // on attend une seconde avant de procéder à la lecture suivante
}