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 Uno

Câble USB pour Arduino UNO

Jeu de fils Dupont

Breadboard

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

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 :

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.

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 :

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.

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.

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.

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.

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 !
où 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.

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 :

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 :

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.

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.
- DHT11/DHT22 Sensor with Arduino Tutorial (2 Examples)
- Interfacing Arduino To An NTC Sensor
- AM2320 I2C Temperature and Humidity Sensor Arduino …
- LM35 Temperature Sensor Arduino Tutorial (3 Examples)
- DS18B20 Temperature Sensor Arduino Tutorial (4 Examples)
- TMP36 Temperature Sensor Arduino Tutorial (2 Examples)
- How To Use BME280 Pressure Sensor With Arduino
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.
- Interfacing ESP32 And LM35 Temperature Sensor
- Interfacing ESP32 And DS18B20 Digital 1-wire Thermometer
- Interfacing ESP32 And LM35 Temperature Sensor
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 ; )

