SHT31 et TM1637

10 octobre 2021

1 – Le module humidité et température – SHT31


Grove – I2C High Accuracy Temp&Humi Sensor (SHT31)

Type de connexion: I2C


1.1 – Description

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.


1.2 – Installation de la librairie

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.


1.3 – Utilisation de la classe SHT31

1.3.1 – Librairie et déclaration et d’un objet de type SHT31

// 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)

1.3.2 – Initialiser un objet de type SHT31, la méthode begin()

 sht31.begin();

1.3.3 – Obtenir des valeurs de lecture de la température, la méthode getTemperature()

float temperature = sht31.getTemperature();

1.3.4 – Obtenir des valeurs de lecture de l’humidité, la méthode getHumidity();

float hum = sht31.getHumidity();

1.3.5 – Laboratoire

É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é.

1.3.6 – Laboratoire

Reprendre le labo précédent en y ajoutant l’affichage sur LCD.


1.4 – Lecture de la température sous Wokwi

1.4.1a – Code source

#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);
}

1.4.1b – Code source – Anglais/Français

#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);
}

1.4.2 – Schéma électronique Wokwi

{
  "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


1.5 – Utilisation d’une macro pour remplacer une fonction.

#include "SHT31.h"
SHT31 sht31;   

#ifdef ...
  #define lectureTemperature()    getTemperature()
#else
  #define lectureTemperature()    readTemperature()
#endif

void setup() {
   sht31.begin;
   float temperature = sht31.lectureTemperature();
}

1.6 – Labo: Application universelle (Arduino IDE/Wokwi)

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


2 – Le module 4-Digit Display – TM1637

Type de connexion: digitale (2 gpio)


2.1 – Description

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.

2.2 – Installation des librairies

ATTENTION: Ne pas installer cette version de la librairie mais plutôt celle qui est proposée à l’étape 2.2.2.

Lien vers la librairie

Tester avec l’exemple infoVE2CUY


2.2.1 – Installation manuelle d’une librairie

2.2.1.1 – Localiser, télécharger et installer une librairie

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:


2.2.2 – Installer la librairie TM1637V2 adaptée par VE2CUY

Lien vers la librairie


2.3 – Utilisation de la classe TM1637V2

2.3.1 -Utilisation de la librairie et déclaration d’un objet de type TM1637V2

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


2.3.2 – Initialiser un objet de type TM1637 et renseigner l’intensité

// 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);

2.3.3. – Afficher un nombre sur le module 4-Digit, la méthode displayNum()

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);

2.3.4 – Afficher les multiples de 2, par multiplication

#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

2.3.5 – Afficher les multiples de 2, par décalage des bits vers la gauche

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);
}

2.4 – Afficher des chaines de caractères, la méthode displayStr()

#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);
}

2.5 – Laboratoire (40 minutes)

T-99c — H: 99p

Astuces

Défi facultatif supplémentaire (20 minutes)

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


2.6 – TM-1637 sur Wokwi

// 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);
}