Piloter un ventilateur en PWM selon l’humidé avec un Arduino
Description :
Ce projet consiste à concevoir un système autonome de régulation de l’humidité basé sur un microcontrôleur Arduino. Il mesure en temps réel la température et l’humidité ambiante à l’aide d’un capteur haute précision, affiche ces données sur un écran couleur, et pilote automatiquement un ventilateur (via un signal PWM) pour faire baisser l’humidité si celle-ci dépasse un seuil critique.
Prérequis :
- 1 x Carte Arduino Uno
- 1 x DHT22
- 1 x résistance 4.7KΩ à 10KΩ
- 1 x 2.0 inch TFT Display OLED LCD GMT020-02 240×320
- 1 x Module IRF520
- 1 x Moteur 5V DC
- 1 x Condensateur 470μf 16v
- 1 x Breadboard
Version IDE :
- Arduino IDE 2.3.5
Bibliothèque :
- DHT.h (version: 1.4.6 par Adafruit)
- Adafruit_Sensor.h (version: 1.1.15 par Adafruit)
- Adafruit_GFX.h (version: 1.12.0 par Adafruit)
- Adafruit_ST7789.h (version: 1.11.0 par Adafruit)
- Adafruit BusIO (version: 1.17.4 par Adafruit)
Vidéo de démonstration :
Schéma de câblage :


Code :
Code Arduino :
#include "DHT.h"
#include <Adafruit_GFX.h>
#include <Adafruit_ST7789.h>
#include <SPI.h>
// Définition des broches et du type de capteur DHT
#define DHTPIN 2
#define DHTTYPE DHT22
// Définition de couleurs personnalisées pour l'écran TFT (au format RGB565)
#define ST77XX_DARKGREY 0x7BEF
#define ST77XX_LIGHTGREY 0xC618
#define FAN_PIN 6 // Broche PWM pour le contrôle du ventilateur
// Seuils d'humidité pour le déclenchement du ventilateur (hystérésis)
const float HUMIDITY_ON = 68.0; // Seuil haut pour allumer le ventilateur
const float HUMIDITY_OFF = 65.0; // Seuil bas pour éteindre le ventilateur
// Initialisation de l'objet capteur DHT
DHT dht(DHTPIN, DHTTYPE);
// Définition des broches pour l'écran TFT ST7789
#define TFT_CS 10
#define TFT_RST 8
#define TFT_DC 9
// Initialisation de l'écran TFT
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
// Variables d'état du ventilateur
bool fanState = false; // État actuel (allumé/éteint)
int fanSpeed = 0; // Vitesse PWM (0 à 255)
void setup() {
// Initialisation de la liaison série pour le débogage
Serial.begin(9600);
Serial.println(F("Station Meteo DHT22 - Ventilateur PWM"));
// Démarrage du capteur DHT
dht.begin();
// Configuration de la broche du ventilateur en sortie et mise à l'arrêt initial
pinMode(FAN_PIN, OUTPUT);
analogWrite(FAN_PIN, 0);
// Initialisation de l'écran TFT (résolution 240x320) et orientation
tft.init(240, 320);
tft.setRotation(2);
tft.fillScreen(ST77XX_BLACK); // Efface l'écran en noir
// Affichage du titre principal
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(2);
tft.setCursor(10, 10);
tft.println("Deshumidificateur");
// Affichage statique des seuils d'humidité configurés
tft.setTextSize(2);
tft.setTextColor(ST77XX_LIGHTGREY, ST77XX_BLACK);
tft.setCursor(10, 150);
tft.print("Seuil ON :>");
tft.print((int)HUMIDITY_ON);
tft.print("%");
tft.setCursor(10, 175);
tft.print("Seuil OFF:<");
tft.print((int)HUMIDITY_OFF);
tft.print("%");
}
void loop() {
// Pause de 2 secondes entre chaque lecture (recommandé pour le DHT22)
delay(2000);
// Lecture de l'humidité et de la température
float h = dht.readHumidity();
float t = dht.readTemperature();
// Vérification si les lectures du capteur ont échoué
if (isnan(h) || isnan(t)) {
Serial.println(F("Echec de la lecture du capteur DHT!"));
tft.setTextSize(2);
tft.setCursor(10, 280);
tft.setTextColor(ST77XX_RED, ST77XX_BLACK);
tft.println("Erreur Capteur !");
return; // Arrête l'itération actuelle de la boucle si échec
}
// Efface le message d'erreur précédent sur l'écran si la lecture réussit
tft.setTextSize(2);
tft.setCursor(10, 280);
tft.setTextColor(ST77XX_BLACK, ST77XX_BLACK);
tft.print(" ");
// Logique de contrôle du ventilateur (Hystérésis + Vitesse variable PWM)
if (h > HUMIDITY_ON) {
fanState = true;
// Calcule la vitesse PWM proportionnelle à l'humidité (entre 60 et 255)
fanSpeed = map(h, HUMIDITY_OFF, 100, 60, 255);
if (fanSpeed > 255) fanSpeed = 255; // Sécurité pour ne pas dépasser le max PWM
} else if (h < HUMIDITY_OFF) {
fanState = false;
fanSpeed = 0; // Arrêt complet du ventilateur
}
// Application de la vitesse PWM sur la broche du ventilateur
analogWrite(FAN_PIN, fanSpeed);
// Affichage des données sur le moniteur série
Serial.print(F("Humidité: "));
Serial.print(h);
Serial.print(F("% Temp: "));
Serial.print(t);
Serial.print(F("°C Ventilateur PWM: "));
Serial.println(fanSpeed);
// --- Affichage dynamique sur l'écran TFT ---
// Affichage de la température
tft.setTextSize(3);
tft.setCursor(10, 55);
tft.setTextColor(ST77XX_RED, ST77XX_BLACK);
tft.print("Tmp:");
tft.print(t, 1);
tft.print("C ");
// Ligne de séparation
tft.drawFastHLine(10, 90, 220, ST77XX_WHITE);
// Affichage de l'humidité
tft.setCursor(10, 110);
tft.setTextColor(ST77XX_CYAN, ST77XX_BLACK);
tft.print("Hum:");
tft.print(h, 1);
tft.print("% ");
// Ligne de séparation
tft.drawFastHLine(10, 205, 220, ST77XX_WHITE);
// Titre de la section ventilateur
tft.setTextSize(2);
tft.setCursor(10, 235);
tft.setTextColor(ST77XX_GREEN, ST77XX_BLACK);
tft.print("Ventilateur:");
// Affichage de l'état du ventilateur et de son pourcentage PWM
tft.setCursor(10, 260);
if (fanState) {
tft.setTextColor(ST77XX_GREEN, ST77XX_BLACK);
tft.print("ON (PWM ");
tft.print(map(fanSpeed, 0, 255, 0, 100)); // Conversion PWM en pourcentage (0-100%)
tft.print("%) ");
} else {
tft.setTextColor(ST77XX_DARKGREY, ST77XX_BLACK);
tft.print("OFF (0%) ");
}
}
