Dans le monde de l'électronique DIY, la création d'appareils personnalisés offre une satisfaction unique, mêlant apprentissage et utilité. Ce projet vous guide pas à pas dans la réalisation d'un thermomètre et hygromètre d'intérieur piloté par Arduino, intégrant un capteur DHT22 et un écran OLED i2c bicolore. Il s'adresse particulièrement aux débutants, cherchant une application concrète et didactique des capteurs et des afficheurs. L'objectif n'est pas de concurrencer les produits du commerce, mais d'acquérir les compétences nécessaires pour concevoir et assembler soi-même un objet fonctionnel et esthétique, potentiellement logé dans un boîtier imprimé en 3D.
Ce thermomètre Arduino se veut un outil pédagogique, démontrant de manière accessible la mise en œuvre de composants électroniques courants. Bien que conçu pour les novices, sa fonctionnalité en fait un appareil utile pour le suivi des conditions ambiantes dans une pièce de vie, comme le salon.
Dans sa forme la plus simple, ce projet consiste en un thermomètre/hygromètre Arduino en forme de cube ajouré. Plus précisément, il est capable de réaliser les fonctions suivantes :
Ce projet, à visée principalement didactique, met en œuvre :
Le fonctionnement est conçu pour être intuitif : une fois l'alimentation branchée, le dispositif démarre automatiquement sans nécessiter de configuration ou d'intervention manuelle. Il s'agit donc d'un produit autonome.
La seule connexion externe requise est celle de l'alimentation, fournie par un bloc secteur de 7,5 volts et 1 ampère, via un connecteur DC standard (Ø5,5 mm extérieur, Ø2,1 mm intérieur).
L'ensemble des composants électroniques est logé dans un boîtier imprimé en 3D, conférant au projet une finition soignée et une apparence conviviale. Les schémas et fichiers nécessaires à la réalisation, tant pour la partie électronique que pour la fabrication du boîtier, sont disponibles en fin d'article.

Avant de plonger dans les détails du câblage électronique, un schéma fonctionnel permet de visualiser l'architecture globale du projet et les interactions entre les différents modules.
Le système se décompose en trois blocs principaux :
Un quatrième bloc sur ce schéma met en évidence la nécessité d'une alimentation externe pour l'ensemble du système.
Cette décomposition en blocs fonctionnels rend le projet particulièrement facile à appréhender. Le schéma électronique qui suit est tout aussi clair, tandis que le code de programmation Arduino, bien que plus conséquent, est structuré pour faciliter la compréhension.
Le schéma électronique reprend les quatre blocs fonctionnels présentés précédemment. Une caractéristique notable de ce projet est le nombre réduit de composants, ce qui le rend idéal pour les débutants. Cette simplicité est rendue possible par l'intégration de nombreuses fonctionnalités au sein de chaque composant principal.

Le projet est alimenté par un bloc secteur délivrant une tension de 7,5 volts. La section alimentation se compose principalement des éléments suivants :
La tension d'entrée de 7,5 volts, après la chute de tension de la diode, fournit environ 7,2 volts. Cette tension est idéale pour la broche Vin de l'Arduino Nano, qui accepte une plage de 7 à 12 volts. Les régulateurs de tension intégrés à l'Arduino Nano se chargeront ensuite de convertir cette tension en +5V et +3,3V pour alimenter le reste du montage.
Le capteur DHT22 est le cœur de la mesure. Son câblage est extrêmement simple, nécessitant seulement :
Le modèle de DHT22 utilisé intègre nativement une résistance de pull-up pour la ligne de données et un condensateur de filtrage, éliminant ainsi le besoin de composants externes supplémentaires. Pour plus de détails sur ce capteur, un tutoriel dédié est disponible.
L'affichage des données est confié à un écran OLED monochrome bicolore de 0,96 pouce, offrant une résolution de 128x64 pixels. Sa particularité réside dans sa division en deux zones de couleur :
La communication entre l'Arduino Nano et l'écran OLED s'effectue via le bus I2C, utilisant les broches SCL et SDA respectives. Comme pour le DHT22, cet écran intègre tous les composants nécessaires à son interfaçage, simplifiant grandement le schéma électronique. Un tutoriel plus approfondi sur les écrans OLED i2c est également référencé.
L'Arduino Nano orchestre l'ensemble du projet. Ses rôles sont multiples :
La ligne de données du DHT22 est connectée à la broche A1 de l'Arduino Nano pour des raisons pratiques de routage du PCB. Toute autre broche digitale (D0 à D12) aurait pu être utilisée, à l'exception de D0 et D1 qui sont réservées à la communication série (RX/TX).
L'écran OLED i2c est piloté via les broches SDA et SCL. Comme l'écran est déporté du PCB principal, un connecteur à 4 broches est représenté sur le schéma électronique pour formaliser ce déport, le raccordement final se faisant par une nappe électrique.
L'alimentation de l'Arduino Nano se fait via la broche Vin, recevant le +7,2V approximatif de l'alimentation externe. Le régulateur de tension intégré de l'Arduino Nano génère ensuite le +5V nécessaire pour alimenter le capteur DHT22 et l'écran OLED i2c.

Après avoir exploré la partie matérielle, nous nous penchons sur la logique logicielle, qui constitue le cœur du projet. Le diagramme fonctionnel ci-dessous résume les opérations principales du programme Arduino :
Le programme s'articule autour de trois actions répétitives :
Les autres éléments du diagramme visent à sécuriser le fonctionnement, comme la gestion des erreurs de mesure du capteur, et à agrémenter l'expérience utilisateur. Cette structure rend le programme relativement simple à comprendre.
Le code ci-dessous est essentiel au bon fonctionnement du projet. Il a été conçu pour interagir avec deux composants clés :
La ligne de données du DHT22 est connectée à la broche A1 de l'Arduino Nano, une décision prise pour des raisons pratiques de routage du PCB. D'autres broches digitales (D2 à D12) auraient également convenu.
Pour une présentation plus agréable, une police de caractères spéciale a été importée pour le message de bienvenue, ainsi qu'une autre police pour les titres "TEMPERATURE" et "HYGROMETRIE". L'intégration d'images directement dans le code Arduino pour un affichage sur écran OLED i2c est également possible et documentée dans un article lié.
Deux blocs de données sont intégrés au code pour représenter les images utilisées :
// Inclusion des bibliothèques nécessaires#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_SSD1306.h>#include <DHT.h>// Définition de la taille de l'écran OLED#define SCREEN_WIDTH 128 // Largeur OLED en pixels#define SCREEN_HEIGHT 64 // Hauteur OLED en pixels// Initialisation de l'objet d'affichage OLED// Le premier paramètre est l'adresse I2C (généralement 0x3C ou 0x3D)// Les deux suivants sont la largeur et la hauteur, respectivement.Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);// Définition de la broche de connexion du capteur DHT22 et de son type#define DHTPIN A1 // Broche à laquelle le DHT22 est connecté#define DHTTYPE DHT22 // Type de capteur DHT22// Initialisation de l'objet DHTDHT dht(DHTPIN, DHTTYPE);// Définition des polices de caractères (exemple)// Pour utiliser des polices personnalisées, il faut les générer et les inclure.// Ici, nous utiliserons les polices par défaut et quelques exemples.// Polices intégrées (par exemple)// Vous pouvez en trouver d'autres ou en créer.// Par exemple, pour une police plus petite :// const GFXfont *font = &FreeSans9pt7b;void setup() { Serial.begin(9600); // Initialisation de la communication série pour le débogage // Initialisation de l'écran OLED if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Adresse I2C 0x3C Serial.println(F("Erreur d'allocation SSD1306")); for(;;); // Boucle infinie en cas d'échec } display.display(); // Affichage initial de l'écran delay(1000); // Petite pause // Nettoyage de l'écran display.clearDisplay(); // Affichage du message de bienvenue (exemple avec une police par défaut) display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F("Bienvenue !")); // Affichage d'une image (exemple : un thermomètre) // Les données d'image doivent être au format bitmap et converties. // Pour simplifier, nous allons sauter l'inclusion d'images complexes ici // et nous concentrer sur le texte. display.display(); // Afficher le message de bienvenue delay(2000); // Pause pour lire le message display.clearDisplay(); // Nettoyer l'écran avant les mesures // Initialisation du capteur DHT dht.begin();}void loop() { // Pause entre les lectures (minimum 2 secondes recommandées pour le DHT22) delay(7000); // Pause de 7 secondes comme indiqué dans le diagramme // Lecture de l'humidité float h = dht.readHumidity(); // Lecture de la température en Celsius float t = dht.readTemperature(); // Vérification si les lectures ont échoué if (isnan(h) || isnan(t)) { Serial.println(F("Erreur de lecture du capteur DHT!")); display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F("Erreur Capteur!")); display.display(); return; // Sortir de la fonction loop pour éviter d'afficher des données invalides } // Conversion de température en Fahrenheit (optionnel) // float f = dht.readTemperature(true); // float hif = dht.computeHeatIndex(f, h); // --- Affichage de la Température --- display.clearDisplay(); // Nettoyer l'écran avant d'afficher // Affichage du titre "TEMPERATURE" display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F("TEMPERATURE")); // Affichage de la valeur de température display.setTextSize(3); // Taille de police plus grande pour la valeur display.setTextColor(SSD1306_YELLOW); // Couleur jaune pour la partie température display.setCursor(0, 16); // Position du curseur display.print(t); // Afficher la valeur de température display.print(F(" ")); // Espace display.write(byte(247)); // Symbole de degré (peut varier selon la police) display.print(F("C")); // Unité Celsius // Ajout d'une icône simple pour la température (optionnel) // Dans une implémentation réelle, vous utiliseriez des données bitmap. // Ici, nous simulons une petite icône avec des caractères. display.setCursor(SCREEN_WIDTH - 20, 16); // Position pour une icône à droite display.setTextSize(2); display.setTextColor(SSD1306_YELLOW); display.print(F("o")); // Symbole approximatif de degré display.display(); // Afficher les données de température delay(7000); // Pause de 7 secondes avant de passer à l'humidité // --- Affichage de l'Humidité --- display.clearDisplay(); // Nettoyer l'écran // Affichage du titre "HYGROMETRIE" display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F("HYGROMETRIE")); // Affichage de la valeur d'humidité display.setTextSize(3); // Taille de police plus grande pour la valeur display.setTextColor(SSD1306_BLUE); // Couleur bleue pour la partie humidité display.setCursor(0, 16); // Position du curseur display.print(h); // Afficher la valeur d'humidité display.print(F(" %")); // Symbole de pourcentage // Ajout d'une icône simple pour l'humidité (optionnel) display.setCursor(SCREEN_WIDTH - 20, 16); // Position pour une icône à droite display.setTextSize(2); display.setTextColor(SSD1306_BLUE); // Symbole approximatif de goutte d'eau display.print(F("~")); display.display(); // Afficher les données d'humidité}Ce code, une fois téléversé sur l'Arduino Nano, permet de réaliser les mesures et de les afficher sur l'écran OLED. L'utilisation de bibliothèques comme Adafruit_SSD1306 et DHT simplifie grandement l'interaction avec les composants. Des commentaires sont inclus pour faciliter la compréhension de chaque section du programme.
La réalisation physique du projet implique la fabrication d'un circuit imprimé (PCB) et son intégration dans un boîtier imprimé en 3D.
Le fichier "Gerber" pour la fabrication de ce PCB monocouche double face est disponible en fin d'article. Le PCB présente un plan de masse sur la face des composants et les pistes cuivrées à l'arrière, pour les soudures.
Le positionnement des composants a été pensé pour optimiser l'assemblage et le fonctionnement :

Le boîtier, conçu spécifiquement pour ce projet, intègre des ouïes de ventilation. Ces ouvertures sont cruciales pour permettre au capteur DHT22 de mesurer précisément les conditions ambiantes, tout en protégeant les composants électroniques.
L'assemblage final consiste à fixer le PCB dans le boîtier, à connecter l'écran OLED et l'alimentation. Le résultat est un appareil compact, fonctionnel et esthétiquement agréable.

La famille de capteurs DHT (DHT11, DHT22, etc.) est largement utilisée dans les projets électroniques, des stations météorologiques domestiques aux systèmes d'automatisation industrielle, grâce à leur simplicité et compacité. Le DHT22, plus précis et légèrement plus coûteux que le DHT11, est privilégié pour ce projet.

Il est important de noter la différence entre la résolution (le plus petit changement mesurable) et la précision (l'exactitude de la mesure). Par exemple, une mesure de température de 20,1 °C signifie que la température réelle se situe entre 19,6 °C et 20,6 °C.
Le DHT22 présente une dérive annuelle d'environ ± 0,5 % pour les mesures d'humidité.
Le DHT22 nécessite un câblage minimal :
Une résistance de pull-up (4,7 kΩ à 10 kΩ) est généralement nécessaire sur la ligne de données, ainsi qu'un condensateur de filtrage (100 nF) près du capteur. Cependant, les modules DHT22 montés sur PCB intègrent souvent ces composants, simplifiant le câblage.

Pour communiquer avec le DHT22, il est fortement recommandé d'utiliser une bibliothèque Arduino. La "DHT sensor library" d'Adafruit est une option populaire et efficace. Après installation via le gestionnaire de bibliothèques de l'IDE Arduino, elle permet d'accéder facilement aux fonctions de lecture de température et d'humidité.
Les fonctions clés incluent :
dht.begin() : Initialisation du capteur.dht.readTemperature() : Lecture de la température.dht.readHumidity() : Lecture de l'humidité.Il est crucial de respecter la fréquence d'échantillonnage maximale de 0,5 Hz (une lecture toutes les 2 secondes) pour éviter des lectures erronées ou la répétition de la dernière valeur valide.
L'écran OLED i2c, avec sa résolution de 128x64 pixels et son interface I2C, offre une solution d'affichage compacte et performante pour les projets Arduino. Son faible encombrement et sa faible consommation d'énergie en font un choix idéal.
Le protocole I2C (Inter-Integrated Circuit) permet à plusieurs périphériques de communiquer avec le microcontrôleur via seulement deux fils : SDA (Serial Data) et SCL (Serial Clock). La plupart des écrans OLED utilisent ce protocole, ainsi que de nombreux autres capteurs et modules.
Pour interagir avec l'écran OLED, les bibliothèques Wire.h, Adafruit_GFX.h (pour les primitives graphiques) et Adafruit_SSD1306.h (spécifique au contrôleur SSD1306 couramment utilisé dans ces écrans) sont nécessaires.
Dans la fonction setup() :
Wire.begin()).Adafruit_SSD1306 avec l'adresse I2C appropriée (souvent 0x3C ou 0x3D) et les dimensions de l'écran.display.clearDisplay()).Dans la fonction loop() :
display.setTextSize(), display.setTextColor(), et display.setCursor() pour définir l'apparence et la position du texte.display.print() et display.println() pour écrire du texte sur l'écran.display.write(byte(247)) peut être utilisé pour afficher des caractères spéciaux comme le symbole de degré (cela dépend de la police utilisée).display.display() est essentiel pour actualiser le contenu visible de l'écran après chaque modification.La capacité bicolore de l'écran permet de distinguer visuellement les informations de température (jaune) et d'humidité (bleu), améliorant la lisibilité.

Bien que ce projet soit complet pour un usage didactique, de nombreuses améliorations sont envisageables pour les utilisateurs plus avancés :
L'utilisation de la fonction millis() au lieu de delay() dans la boucle principale est une technique avancée permettant de gérer plusieurs tâches simultanément sans bloquer le programme, indispensable pour des projets avec des mises à jour à des fréquences différentes (par exemple, rafraîchir l'affichage plusieurs fois par seconde tout en enregistrant les données sur carte SD toutes les minutes).
Ce projet, en partant des bases, ouvre la porte à une multitude d'explorations dans le domaine de l'électronique DIY et de l'Internet des Objets (IoT).
tags: #horloge #humidite #temperature #arduino