Grove – I2C High Accuracy Temp&Humi Sensor (SHT31)
Le module SHT31 propose deux capteurs en un; un capteur de température et un capteur d’humidité relative.
Ce capteur peut-être utilisé pour lire en temps réel la température et l’humidité d’une pièce.
Note: Il ne doit pas être exposé directement aux aléas du climat extérieure.
Comme pour les autres modules complexes de Grove, il faut installer une librairie de support pour le capteur SHT31.
Cette librairie est disponible directement à partir de l’option librairie de l’IDE 2.0 d’Arduino.
// Inclure la librairie pour I2C (le capteur SHT31 est de type I2C) #include <Wire.h> // Inclure la librairie pour le capteur de température et d'humidité SHT31 #include "SHT31.h" // Déclarer un objet de type SHT31 pour pouvoir interagir avec le capteur à partir des méthodes // et des propriétés de la classe SHT31 SHT31 sht31; // Déclaration // NOTE: Il est aussi possible de déclarer un objet de la façon suivante: SHT31 sht31 = SHT31(); // déclaration et création (instanciation)
sht31.begin();
float temperature = sht31.getTemperature();
float hum = sht31.getHumidity();
Écrire un programme qui affiche la température et l’humidité, captées par le module SHT31, dans la console série.
L’affichage est actualisé à toutes les trois secondes.
Voici un exemple du résultat souhaité:
Début du programme ...
La température actuelle est de 23.79C
L'humidité est à 63.33%
Variation, la fonction round(unFloat) permet d’arrondir un nombre et de laisser tomber sa partie décimale. Modifier le programme du labo 3.5 pour afficher que la partie entière de la température et de l’humidité.
Reprendre le labo précédent en y ajoutant l’affichage sur LCD.
#include "DHT.h" #include <Streaming.h> #define DHTPIN 2 // Broche de connexion du capteur de température #define UN_TI_MOMENT 500 #define VITESSE_UART 9600 #define MSG_DEBUT "Début du programme de test de la DHT22" #define MSG_TEMPERATURE "Température = " #define MSG_HUMIDITE ", Humidité = " // variable de contrôle du capture temp/hum. DHT dht(DHTPIN, DHT22); void setup() { Serial.begin(VITESSE_UART); Serial << MSG_DEBUT; dht.begin(); } void loop() { Serial << MSG_TEMPERATURE << dht.readTemperature() << "c"; Serial << MSG_HUMIDITE << dht.readHumidity() << "%" << endl; // Attendre un ti moment ;-) delay(UN_TI_MOMENT); }
#define FRANCAIS 1 #define ANGLAIS 2 #define LANGUE FRANCAIS #include "DHT.h" #include <Streaming.h> #define DHTPIN 2 // Broche de connexion du capteur de température #define UN_TI_MOMENT 500 #define VITESSE_UART 9600 #if (LANGUE == FRANCAIS) #define MSG_DEBUT "Début du programme de test de la DHT22" #define MSG_TEMPERATURE "Température = " #define MSG_HUMIDITE ", Humidité = " #endif #if (LANGUE == ANGLAIS) #define MSG_DEBUT "Start of test program for the DHT22" #define MSG_TEMPERATURE "Temperature = " #define MSG_HUMIDITE ", Humidity = " #endif // variable de controle du capture temp/hum. DHT dht(DHTPIN, DHT22); void setup() { Serial.begin(VITESSE_UART); Serial << MSG_DEBUT; dht.begin(); } void loop() { Serial << MSG_TEMPERATURE << dht.readTemperature() << "c"; Serial << MSG_HUMIDITE << dht.readHumidity() << "%" << endl; // Attendre un ti moment ;-) delay(UN_TI_MOMENT); }
{ "version": 1, "author": "Alain Boudreault", "editor": "wokwi", "parts": [ { "type": "wokwi-arduino-uno", "id": "uno", "top": 121.17, "left": 11.36, "attrs": {} }, { "type": "wokwi-dht22", "id": "dht1", "top": -40.74, "left": 156.36, "attrs": {} } ], "connections": [ [ "dht1:VCC", "uno:5V", "red", [ "v0.44", "h-178.66", "v267.43", "h185.24" ] ], [ "dht1:GND", "uno:GND.1", "black", [ "v25.91", "h-76.58" ] ], [ "dht1:SDA", "uno:2", "green", [ "v17.8", "h67.11" ] ] ] }
Version Wokwi disponible ici
#include "SHT31.h" SHT31 sht31; #ifdef ... #define lectureTemperature() getTemperature() #else #define lectureTemperature() readTemperature() #endif void setup() { sht31.begin; float temperature = sht31.lectureTemperature(); }
Écrire une application universelle – C-A-D que l’application roule aussi bien sur Wokwi que sur Arduino IDE – qui affiche la température et l’humidité sur un LCD I2C 16×2.
Ce module permet un affichage alpha numérique à partir de 7 segments de type LED. Il est habituellement utilisé pour l’affichage des nombres de 0 à 9. Il peut aussi être employé pour présenter certain caractères alphabétiques.
Il faut habituellement 7 signaux digitaux pour contrôler un seul affichage 7 segments. Le module Grove en possède 4, ce qui amène le nombre de signaux à 14 (certains signaux sont réutilisés, par multiplexage, entre les affichages).
Étant donné le nombre restreint de GPIO disponible sur l’Arduino Uno, le module Grove 4-Digit display utilise la puce TM1637 pour réduire ce nombre à 2 GPIO. Il faudra donc installer une librairie pour piloter cette puce.
ATTENTION: Ne pas installer cette version de la librairie mais plutôt celle qui est proposée à l’étape 2.2.2.
Tester avec l’exemple infoVE2CUY
Localiser
Par exemple, librairie pour le module TH06
Télécharger
Installer
Décompresser le fichier Zip et déplacer dans le dossier ‘libraries‘ d’Arduino:
#include "TM1637V2.h" // Définitions des broches pour la TM1637 // La puce TM1637 nécessite deux broches pour fonctionner. // Note: Le connecteur D6 du Hat Grove donne accès aux broches 6 et 7 const int CLK = 6; // Broche utilisée pour la synchronisation entre TM1637 et Arduino const int DIO = 7; // Broche utilisée pour le transfert des données. // Création d'un objet de type TM1637 à partir du constructeur de la classe TM1637V2 tm1637(CLK, DIO);
NOTE: Il est possible d’utiliser tous les connecteurs D2..D8 du Hat de Grove. Ils proposent tous deux broches GPIO par connecteur. Il suffit de renseigner correctement les constantes CLK et DIO.
// Initialiser l'objet tm1637 tm1637.init(); // Ou bien .begin() disponible dans la version Ve2cuy de la librairie. // Renseigner l'intensité d'affichage // BRIGHT_TYPICAL = 2, BRIGHT_DARKEST = 0, BRIGHTEST = 7; // Ou bien ECRAN_FAIBLE, ECRAN_MOYEN, ECRAN_FORT dans la version V2. tm1637.set(ECRAN_FORT);
int unEntier = 123; float pi = 3.1415; // Afficher sans la partie décimale. tm1637.displayNum(pi); // Affiche: 3 delay(1500); // Afficher une décimale (sans point ou virgule). tm1637.displayNum(pi, 1); // Affiche: 31 delay(1500); // Afficher deux décimales - (affiche un ':' comme séparateur). tm1637.displayNum(pi, 2); // Affiche: 3:14 delay(1500); // Afficher un nombre négatif. tm1637.displayNum(unEntier * -1); delay(1500); // Afficher un nombre négatif sans signe. tm1637.displayNum(-555, 0, false);
#include "TM1637V2.h" const int CLK = 6, DIO = 7; TM1637V2 tm1637(CLK, DIO); void setup() { tm1637.init(); tm1637.set(7); // Intensité maximum } // setup void loop() { static int nombre = 2; tm1637.displayNum(nombre); nombre *= 2; if (nombre > 8192) { while(true); // Boucle sans fin ... } // if delay(500); } // loop
void loop() { static int nombre = 1; tm1637.displayNum(nombre); nombre <<= 1; // Décaler (shift) les bits de 'nombre' d'une position vers la gauche if (nombre > 8192) { nombre = 2; } delay(500); }
#include "TM1637V2.h" #define DELAI_ENTRE_LES_EXEMPLES 2000 #define DELAI_FIN 500 // Définition des broches pour la TM1637 const int CLK = 6, DIO = 7; TM1637V2 tm1637(CLK, DIO); void setup() { tm1637.init(); tm1637.set(BRIGHT_TYPICAL); tm1637.displayStr("toto"); delay(DELAI_ENTRE_LES_EXEMPLES); // loop tm1637.displayStr("Bonjour 420-1C4", 300); // 500 est la valeur par défaut delay(DELAI_ENTRE_LES_EXEMPLES); // ON tm1637.displayStr("0N"); delay(DELAI_ENTRE_LES_EXEMPLES); // OFF tm1637.displayStr("0FF"); delay(DELAI_ENTRE_LES_EXEMPLES); } void loop() { // Effacer l'affichage tm1637.clearDisplay(); delay(DELAI_FIN); tm1637.displayStr("Fin"); delay(DELAI_FIN); }
T-99c — H: 99p
Astuces
Le module 4-Digit ne supporte pas l’affichage de ‘.’ ou ‘,’ et la fonction sprintf d’Arduino ne supportent pas les float.
Il n’est donc pas possible d’afficher les décimales de la température ou de l’humidité.
Modifier l’application précédente pour afficher sur le rgb_lcd les informations suivantes:
Ligne 1: Temp. : 99,99c
Ligne 2: Humidite: 99,99%
Astuces
Par exemple,
char resultat[17]; // Longueur d'une ligne du LCD + 1
float humidite = 45.55;
char chaine[6]; // Variable pour convertir le float. 6 = Longueur totale de la chaine + 1
dtostrf(pi,5,2,chaine); // 5 = longueur du nombre incluant le point, 2 = le nombre de décimales
sprintf(resultat, "Humidite = %s%%", chaine); // Va produire: Humidite = 45.55%
Résultat
// Exemple d'un compteur TM1637 7 Segments sur Wokwi #include <TM1637.h>. // Grove 4-Digit Display à ajouter de le gestionnaire de lib. const int CLK = 2; const int DIO = 3; TM1637 tm(CLK, DIO); void setup() { tm.init(); tm.set(BRIGHT_TYPICAL); } unsigned int counter = 0; void loop() { tm.display(0, (counter / 1000) % 10); // Afficher les milliers tm.display(1, (counter / 100) % 10); // Afficher les centaines tm.display(2, (counter / 10) % 10); // Afficher les dizaines tm.display(3, counter % 10); // Afficher les unités counter++; if (counter == 10000) { counter = 0; } delay(100); }