draft
DraftBooster logo

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.

Présentation Générale du Projet

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 :

  • Affichage de la température ambiante : avec une précision d'environ ± 0,5 °C.
  • Affichage du taux d'humidité ambiant : avec une précision d'environ ± 2 %.

Ce projet, à visée principalement didactique, met en œuvre :

  • Un écran OLED 0,96″ i2c pour l'affichage des mesures. Cet écran se distingue par sa capacité bicolore : une partie supérieure jaune et une partie médiane/inférieure bleue.
  • Un capteur DHT22 pour les mesures de température et d'hygrométrie.
  • Un Arduino Nano comme microcontrôleur central pour la gestion de l'ensemble.

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.

Schéma fonctionnel d'un thermomètre/hygromètre Arduino

Schéma Fonctionnel : Comprendre l'Architecture du Système

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 :

  1. Capteur DHT22 : Ce composant est responsable de la mesure de la température et du taux d'humidité de l'air ambiant, à la demande.
  2. Arduino Nano : Le microcontrôleur interroge le capteur DHT22 à intervalles réguliers. Il traite ensuite les données reçues avant de les envoyer à l'écran OLED, après une mise en forme graphique appropriée.
  3. Afficheur OLED : Cet écran reçoit les instructions de l'Arduino et affiche les données mesurées, ainsi que d'autres éléments graphiques, de manière lisible.

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.

Schéma Électronique : Les Connexions Détaillées

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.

Schéma électronique du thermomètre/hygromètre Arduino

L'Alimentation : Stabilité et Protection

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 :

  • Diode de protection anti-retour : Une diode Schottky est utilisée pour prévenir toute inversion de polarité. Son choix est motivé par sa faible chute de tension (environ 0,3 V), minimisant ainsi l'échauffement interne qui pourrait fausser les mesures de température. Le bloc secteur étant une alimentation à découpage, il peut générer des parasites haute fréquence, d'où l'importance de cette protection et d'un filtrage adéquat.

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 : Mesure de Température et d'Humidité

Le capteur DHT22 est le cœur de la mesure. Son câblage est extrêmement simple, nécessitant seulement :

  • Une alimentation (+5V / GND).
  • Une ligne de données digitale, ici connectée à la broche A1 de l'Arduino Nano (les broches D2 à D12 auraient également convenu).

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'Afficheur OLED i2c : Clarté et Couleurs

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 :

  • Une partie supérieure de 16 pixels de hauteur, affichée en jaune.
  • Une partie médiane et inférieure de 48 pixels de hauteur, affichée en bleu.

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

Le Cœur du Montage : L'Arduino Nano

L'Arduino Nano orchestre l'ensemble du projet. Ses rôles sont multiples :

  • Interroger le capteur DHT22 pour collecter les données de température et d'humidité.
  • Envoyer des instructions d'affichage à l'écran OLED i2c pour présenter les informations de manière claire et attrayante.

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.

Diagramme fonctionnel du processus logiciel Arduino

Diagramme Fonctionnel : Le Flux du Programme

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 :

  1. Interrogation du capteur DHT22 par l'Arduino.
  2. Affichage de la température sur l'écran OLED, suivi d'une pause de 7 secondes.
  3. Affichage du taux d'humidité sur l'écran OLED, suivi d'une nouvelle pause de 7 secondes avant de recommencer la boucle.

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.

Programme Arduino : Le Code Source

Le code ci-dessous est essentiel au bon fonctionnement du projet. Il a été conçu pour interagir avec deux composants clés :

  • Le capteur DHT22 pour la mesure de la température et de l'humidité.
  • L'écran OLED i2c bicolore de 0,96 pouce (128x64 pixels, chipset SSD1306).

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 :

  • Un symbole de thermomètre pour illustrer la température.
  • Un symbole de goutte d'eau pour illustrer l'humidité.
// 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.

Fabrication et Assemblage dans le Boîtier

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 Circuit Imprimé (PCB)

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 :

  • Espace central libre : Permet le passage des câbles d'alimentation et éloigne l'Arduino du capteur de température, minimisant ainsi l'influence de la chaleur du microcontrôleur sur les mesures.
  • Bornes de connexion de l'écran OLED à l'avant : Facilite le montage dans le boîtier.
  • Capteur DHT22 positionné derrière les ouïes de ventilation : Assure une bonne capture de la température et de l'humidité ambiante tout en limitant les variations trop rapides grâce à une légère inertie.

Vue du PCB côté composants

Le Boîtier Imprimé en 3D

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.

Prototype du thermomètre/hygromètre Arduino dans son boîtier 3D

Le Capteur DHT22 : Caractéristiques et Utilisation

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.

Comparaison DHT11 vs DHT22

Caractéristiques Techniques du DHT22

  • Plage de mesure de température : -40 °C à +80 °C.
  • Précision de mesure de température : ± 0,5 °C.
  • Résolution d'affichage température : 0,1 °C.
  • Plage de mesure d'humidité relative : 0 % à 100 %.
  • Précision de mesure d'humidité : ± 2 à 5 %.
  • Résolution d'affichage humidité : 0,1 %.
  • Tension d'alimentation : 3,3 V à 6 V (typiquement 5 V).
  • Consommation : 1 à 1,5 mA en mesure, 40 à 50 µA au repos.
  • Fréquence d'échantillonnage maximale : 0,5 Hz (une mesure toutes les 2 secondes).

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

Branchement et Câblage

Le DHT22 nécessite un câblage minimal :

  • Alimentation (VCC) : Connectée au +5V.
  • Masse (GND) : Connectée à la masse.
  • Données (DATA) : Connectée à une broche digitale de l'Arduino (ici A1).

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.

Schéma de câblage du DHT22 à l'Arduino

Utilisation avec Arduino et Bibliothèques

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.

Mesurer la température et l'humidité avec le capteur DHT11 | ARDUINO #30

L'Écran OLED i2c : Affichage Dynamique et Visuel

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.

Communication I2C

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.

Configuration et Programmation

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() :

  • L'initialisation de la communication I2C (Wire.begin()).
  • L'initialisation de l'objet Adafruit_SSD1306 avec l'adresse I2C appropriée (souvent 0x3C ou 0x3D) et les dimensions de l'écran.
  • Un nettoyage initial de l'écran (display.clearDisplay()).

Dans la fonction loop() :

  • Utilisation de 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é.

Exemple d'affichage sur un écran OLED bicolore

Améliorations et Extensions Possibles

Bien que ce projet soit complet pour un usage didactique, de nombreuses améliorations sont envisageables pour les utilisateurs plus avancés :

  • Connectivité sans fil : Intégration de modules Wi-Fi (ESP8266, ESP32) ou Bluetooth pour envoyer les données à un serveur, une application mobile, ou un autre appareil.
  • Stockage de données : Utilisation d'une carte SD pour enregistrer les mesures sur le long terme, créant ainsi une base de données météorologiques personnelles.
  • Horloge temps réel (RTC) : Ajout d'un module RTC pour horodater précisément les mesures enregistrées.
  • Capteurs supplémentaires : Intégration de capteurs de pression atmosphérique, de qualité de l'air (CO2, VOC), de luminosité, etc., pour créer une station météorologique plus complète.
  • Interface utilisateur : Ajout de boutons pour naviguer entre différents modes d'affichage, consulter des historiques, ou ajuster des paramètres.
  • Gestion d'alimentation : Optimisation de la consommation pour un fonctionnement sur batterie, avec des modes de veille intelligents.
  • Boîtier personnalisé : Exploration de designs de boîtiers plus complexes ou fonctionnels, intégrant par exemple des supports pour d'autres modules.

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

Articles populaires: