Skip to Content

Tutoriel Arduino : Capteur de température Si7021

Tutoriel Arduino : Capteur de température Si7021

Dans ce tutoriel, vous allez apprendre à mesurer la température et l’humidité relative à l’aide du capteur Si7021 et d’un Arduino.

Le capteur Si7021 est un choix populaire pour mesurer la température et l’humidité dans les projets DIY. C’est un capteur fiable et précis qui communique via I2C, ce qui le rend facile à intégrer avec des microcontrôleurs comme Arduino et ESP32. Avec une large plage de fonctionnement et une faible consommation d’énergie, le Si7021 convient à de nombreuses applications, comme les stations météo, les objets connectés pour la maison et les systèmes de surveillance environnementale. Sa petite taille et son interface simple en font un excellent choix aussi bien pour les débutants que pour les makers expérimentés souhaitant ajouter des fonctionnalités de mesure environnementale à leurs projets.

Commençons par la liste des composants nécessaires.

Composants nécessaires

Évidemment, il vous faudra un capteur de température et d’humidité Si7021. En général, on n’achète pas le capteur brut, mais une carte breakout qui intègre quelques composants supplémentaires pour faciliter la connexion du capteur.

Il vous faudra également un microcontrôleur. J’ai utilisé un Arduino Uno pour ce projet, mais n’importe quel autre Arduino ou un ESP32/ESP8266 conviendra aussi.

Enfin, nous voulons afficher les données de température et d’humidité mesurées. J’ai choisi un écran OLED, mais vous pouvez aussi utiliser un LCD display .

Capteur de température & d’humidité Si7021

Arduino

Arduino Uno

USB Data Sync cable Arduino

Câble USB pour Arduino UNO

Dupont wire set

Jeu de fils Dupont

Half_breadboard56a

Breadboard

OLED display

Écran OLED

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Le capteur de température & d’humidité Si7021

Le Si7021 est un capteur de température et d’humidité très compact, à faible consommation, avec électronique intégrée. Il est calibré en usine pour des mesures précises et communique via une interface I2C. L’image ci-dessous montre le schéma fonctionnel du Si7021 :

Functional Block Diagram of Si7021
Schéma fonctionnel du Si7021 ( source )

Comme vous pouvez le voir, il contient les éléments de capteur d’humidité et de température, un convertisseur analogique-numérique (ADC), la logique de contrôle avec une mémoire pour stocker les facteurs d’étalonnage, et l’électronique pour l’interface I2C.

Caractéristiques techniques

L’élément capteur de température du Si7021 peut mesurer des températures de –10 à 85 °C avec une précision de ±0,4 °C. Le capteur d’humidité mesure l’humidité relative de 0 à 80% RH avec une précision de ±3% RH.

Le capteur fonctionne de 1,9 à 3,6 V et consomme 150μA en fonctionnement (60nA en mode veille).

Une caractéristique unique du capteur est l’élément chauffant intégré, qui peut être utilisé pour augmenter la température du capteur afin d’éliminer la condensation, ou pour réaliser des mesures du point de rosée. Notez que l’activation du chauffage augmente la consommation jusqu’à 94,20mA (à 3,3V). Pour plus de détails, consultez la datasheet :

Schéma d’application typique

Pour utiliser le Si7021 dans une application réelle, il faut généralement ajouter des résistances de tirage pour l’interface I2C et un condensateur pour stabiliser l’alimentation. L’image ci-dessous montre le schéma d’application typique :

Typical Application Circuit of Si7021
Schéma d’application typique du Si7021 ( source )

Dans la plupart des cas, cependant, il est préférable d’utiliser une carte breakout qui intègre déjà ces composants.

Carte breakout pour SI7021

L’image ci-dessous montre une carte breakout typique pour le SI7021. Elle ajoute les résistances de tirage mentionnées et un régulateur de tension, ce qui permet d’alimenter la carte en 3,3V ou 5V.

Front & Back of Si7021 breakout board
Face avant & arrière de la carte breakout Si7021

Notez que de nombreuses cartes breakout sont étiquetées « SI7021 » mais contiennent en réalité un autre capteur similaire. Dans l’exemple ci-dessus, vous pouvez voir l’étiquette « SI7021 » sur la carte et les mentions « HTU21 » et « SHT21 » juste en dessous du capteur.

Les SI7021, HTU21 et SHT21 sont interchangeables en termes de spécifications et de protocoles de communication, et ont même la même adresse I2C ( 0x40 ). Cependant, ils stockent leur numéro de série dans un format différent, ce qui pose un petit souci lors de l’utilisation des bibliothèques Adafruit_Si7021 ou SparkFun_Si7021 . Nous y reviendrons plus tard.

Enfin, sachez que les SHT21, HTU21 et Si7021 existent avec ou sans membrane de protection PTFE sur l’élément de détection. Voir l’image suivante pour les deux types :

Si7021 Sensor with or without a protective membrane
Capteur Si7021 avec ou sans membrane de protection

Connexion du Si7021 à l’Arduino

Grâce à l’interface I2C, connecter le capteur Si7021 à un Arduino est très simple. Commencez par relier les broches SCL et SDA de la carte breakout Si7021 aux broches correspondantes de l’Arduino, comme indiqué ci-dessous. Ensuite, connectez la masse et le VIN.

Wiring of Si7021sensor with Arduino
Câblage du capteur Si7021 avec Arduino

La carte breakout fonctionne en 5V ou 3,3V, vous pouvez donc utiliser l’une ou l’autre tension pour VIN. Dans le schéma ci-dessus, j’utilise 3,3V pour VIN.

Passons maintenant à un peu de code pour tester le fonctionnement du capteur Si7021.

Code pour lire les données du Si7021

Avant de pouvoir lire les données de température et d’humidité du capteur Si7021, il faut installer une bibliothèque. Deux choix courants sont Adafruit_Si7021 ou SparkFun_Si7021 . Je vais utiliser la bibliothèque Adafruit_Si7021 .

Ouvrez le Library Manager, cherchez « Si7021 » et install la bibliothèque Adafruit_Si7021 comme ci-dessous.

Adafruit_Si7021 library installed in  Library Manager
Bibliothèque Adafruit_Si7021 installée dans le Library Manager

Nous pouvons maintenant écrire un petit code de test. On commence par inclure la bibliothèque Adafruit_Si7021 et créer l’objet capteur. Dans la fonction setup() , on initialise le capteur via sensor.begin() , et dans la fonction loop on lit et affiche l’humidité et la température mesurées.

#include "Adafruit_Si7021.h"

Adafruit_Si7021 sensor = Adafruit_Si7021();

void setup() {
  Serial.begin(9600);
  sensor.begin();
}

void loop() {
  Serial.print("Hum:");
  Serial.println(sensor.readHumidity(), 2);
  Serial.print("Temp:");
  Serial.println(sensor.readTemperature(), 2);
  delay(1000);
}

Si vous téléversez et exécutez ce code, vous devriez voir la sortie suivante sur le Serial Monitor. Vérifiez que le débit est bien réglé sur 9600 bauds.

Output of Si7021 measurements on Serial Monitor
Sortie des mesures Si7021 sur le Serial Monitor

Vous pouvez aussi ouvrir le Serial Plotter et souffler sur le capteur. Vous devriez voir l’humidité mesurée augmenter, ainsi qu’une légère hausse de la température. Sur l’image ci-dessous, la ligne bleue montre l’humidité atteignant 100% et la ligne rouge une légère augmentation de température.

Output of Si7021 measurements on Serial Plotter
Sortie des mesures Si7021 sur le Serial Plotter

Si le capteur ne fonctionne pas, vérifiez qu’il est correctement câblé et qu’il est bien détecté comme périphérique I2C. Vous pouvez le vérifier en lançant un scanner I2C.

#include "I2CScanner.h"

I2CScanner scanner;

void setup() {
  Serial.begin(9600);
  while (!Serial) {};

  scanner.Init();
}

void loop() {
  scanner.Scan();
  delay(5000);
}

Si vous téléversez et exécutez le code ci-dessus, il devrait afficher la sortie suivante sur le Serial Monitor

--- Scan started ---
I2C device found at address 0x40  !

0x40 est l’adresse I2C par défaut du capteur Si7021. Si vous ne voyez pas cela, soit le câblage est incorrect, soit votre capteur est défectueux, soit il a une adresse I2C différente, ce qui ne devrait pas être le cas.

Did not find Si7021 sensor

Si vous essayez d’exécuter l’exemple si7021.ino fourni avec la bibliothèque Adafruit_Si7021 , vous pouvez voir le message d’erreur « Did not find Si7021 sensor! ». Cette erreur est générée par le code suivant dans la fonction setup() :

void setup() {  
  ...
  if (!sensor.begin()) {
    Serial.println("Did not find Si7021 sensor!");
    while (true)
      ;
  }
  ...
}

Vous verrez ce message même si le scan I2C confirme que le capteur Si7021 est détecté à l’adresse 0x40 et fonctionne correctement.

J’ai examiné de plus près l’initialisation code du capteur, et l’erreur est causée par l’appel de la fonction _readRegister8() dans le code ci-dessous.

bool Adafruit_Si7021::begin() {
  if (!i2c_dev->begin())
    return false;

  reset();
  if (_readRegister8(SI7021_READRHT_REG_CMD) != 0x3A)
    return false;

  readSerialNumber();
  _readRevision();

  return true;
}

La raison est que beaucoup de cartes breakout étiquetées « Si7021 » utilisent en réalité un capteur SHT21 ou HTU21. Ces capteurs sont comparables au Si7021 mais stockent apparemment le numéro de série dans un format/adresse différent, ce qui provoque cette erreur.

La solution la plus simple est d’appeler la fonction begin() mais d’ignorer la valeur de retour, comme je l’ai fait dans l’exemple ci-dessus. Le capteur et le reste du code fonctionnent très bien, mais vous ne pourrez pas afficher le numéro de série ou la version du capteur.

J’ai aussi essayé la bibliothèque SparkFun_Si7021 et elle a le même problème. Si vous ne souhaitez utiliser aucune de ces deux bibliothèques et corriger ce souci, vous pouvez implémenter la fonctionnalité vous-même. Ce n’est pas compliqué. Le billet de blog Bare Si7021 temperature/relative humidity sensor explique comment faire.

Pour une application pratique, vous voudrez sûrement afficher les données de température et d’humidité sur un écran plutôt que sur le Serial Monitor. C’est ce que nous allons faire dans la section suivante : nous ajoutons un écran OLED et affichons les données du capteur dessus.

Ajouter un écran OLED pour afficher les données du Si7021

Comme l’OLED est aussi un périphérique I2C, le branchement est simple. Il suffit de connecter SDA et SCL sur les mêmes broches que le capteur Si7021. L’OLED fonctionnant en 3,3V, on peut aussi partager les lignes d’alimentation. L’image ci-dessous montre le câblage complet.

Connecting OLED and Si7021 with Arduino
Connexion de l’OLED et du Si7021 avec Arduino

Si vous avez des difficultés avec l’OLED, consultez le tutoriel How to Interface the SSD1306 I2C OLED Graphic Display With Arduino . L’image ci-dessous montre le câblage complet sur une breadboard réelle :

Wiring of OLED and Si7021 with Arduino
Câblage de l’OLED et du Si7021 avec Arduino

Code pour afficher les données du Si7021 sur l’OLED

Dans cette section, nous écrivons le code pour afficher la température et l’humidité mesurées par le capteur Si7021 sur un écran OLED. Pour écrire sur l’OLED, nous utiliserons la bibliothèque Adafruit_SSD1306 . Vous pouvez install it via the Library Manager comme d’habitude :

Adafruit_SSD1306 library installed in Library Manager
Bibliothèque Adafruit_SSD1306 installée dans le Library Manager

Le code ci-dessous lit les mesures du capteur Si7021 et affiche la température et l’humidité sur l’OLED. Regardez d’abord le code complet, puis nous détaillerons son fonctionnement.

#include "Adafruit_Si7021.h"
#include "Adafruit_SSD1306.h"

Adafruit_Si7021 sensor = Adafruit_Si7021();
Adafruit_SSD1306 oled(128, 64, &Wire, -1);

void oled_init() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
}

void centered(const char* text, int y) {
  int16_t x1, y1;
  uint16_t w, h;
  oled.getTextBounds(text, 0, 0, &x1, &y1, &w, &h);
  oled.setCursor(64 - w / 2, y);
  oled.print(text);
}

void display() {
  static char text[30];
  float temp = sensor.readTemperature();
  float hum = sensor.readHumidity();

  oled.clearDisplay();
  sprintf(text, "%.1f c", temp);
  centered(text, 12);
  sprintf(text, "%.1f %%", hum);
  centered(text, 38);
  oled.display();
}

void setup() {
  oled_init();
  sensor.begin();
}

void loop() {
  display();
  delay(1000);
}

Bibliothèques et initialisation de l’affichage

On commence par inclure les bibliothèques nécessaires pour le capteur Si7021 et l’écran OLED Adafruit SSD1306. On initialise ensuite l’écran OLED dans la fonction oled_init() . Cette fonction configure l’écran, l’efface, définit la taille et la couleur du texte.

#include "Adafruit_Si7021.h"
#include "Adafruit_SSD1306.h"

Adafruit_Si7021 sensor = Adafruit_Si7021();
Adafruit_SSD1306 oled(128, 64, &Wire, -1);

void oled_init() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
}

Notez que l’adresse I2C de l’écran OLED est définie à 0x3C dans oled.begin() . La plupart de ces petits OLED utilisent cette adresse, mais la vôtre peut être différente. Si rien ne s’affiche sur l’OLED, il y a de fortes chances que l’adresse I2C soit différente et il faudra la modifier dans oled.begin() . Si vous ne connaissez pas l’adresse I2C, consultez le tutoriel How to Interface the SSD1306 I2C OLED Graphic Display With Arduino .

Fonctions d’affichage

La fonction centered() permet d’afficher du texte centré sur l’écran OLED à une coordonnée y donnée. La fonction display() lit les données de température et d’humidité du capteur et les affiche sur l’écran OLED.

void centered(const char* text, int y) {
  // Function to center text on OLED
}

void display() {
  // Function to display temperature and humidity on OLED
}

Fonction Setup

Dans la fonction setup() , on initialise la communication série pour le débogage, on initialise l’écran OLED et on démarre la communication avec le capteur Si7021. Comme mentionné précédemment, si le capteur Si7021 n’est pas détecté, vérifiez le câblage, l’adresse I2C et ignorez la valeur de retour de sensor.begin() .

void setup() {
  oled_init();
  sensor.begin();
}

Fonction Loop

La fonction loop() appelle en continu la fonction display() pour mettre à jour et afficher les valeurs sur l’écran OLED. Elle attend ensuite 1 seconde (1000ms) avant la prochaine mise à jour.

void loop() {
  display();
  delay(1000);
}

Affichage sur l’OLED

Si vous téléversez et exécutez le code, vous devriez voir la température en Celsius et l’humidité relative en pourcentage affichées sur l’OLED.

Si7021Output on OLED
Affichage des données Si7021 sur l’OLED

Et voilà, vous avez un petit capteur environnemental sympa et fonctionnel !

Conclusions

Dans ce tutoriel, vous avez appris à utiliser le capteur de température et d’humidité Si7021, un écran OLED et un Arduino Uno pour réaliser un capteur environnemental.

Comme le Si7021 dispose d’un mode basse consommation et fonctionne en 3,3V, il est aussi adapté à la réalisation d’un capteur environnemental sur batterie avec un ESP32. Jetez un œil au Simple ESP32 Internet Weather Station , où nous utilisons par exemple un ESP32 sur batterie. Si vous souhaitez réduire encore la consommation, je recommande un écran e-Paper à la place d’un OLED. Le tutoriel Weather Station on e-Paper Display pourra vous être utile.

Notez qu’il existe de très nombreux autres capteurs de température (et d’humidité) que vous pouvez utiliser. Voici une liste de tutoriels où nous utilisons certains de ces capteurs.

Le plus comparable en termes de consommation, de facilité d’utilisation et de précision est probablement le capteur BME280 . Il y a un excellent comparison of Temperature/Humidity sensors , à lire absolument.

Enfin, si vous préférez l’ESP32 à l’Arduino, consultez les tutoriels suivants.

J’espère que vous vous êtes amusé à construire et tester ce projet. Si vous avez des questions, n’hésitez pas à les poser en commentaire.

Bon bricolage ; )