Premier envoie

This commit is contained in:
lucas.tirand 2026-05-06 13:45:59 +02:00
commit edde87fc96
20 changed files with 1181 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

View file

@ -0,0 +1,36 @@
#include <DHT.h>
#define brocheDeBranchementDHT 6 // Le DHT22 est branché sur le pin D6
#define typeDeDHT DHT22
DHT dht(brocheDeBranchementDHT, typeDeDHT);
void setup() {
// Moniteur série
Serial.begin(9600);
dht.begin();
}
void loop() {
// Lecture des données
float tauxHumidite = dht.readHumidity(); // Lecture du taux d'humidité (en %)
float tauxTemperature = dht.readTemperature(); // Lecture de la température (en °C)
// Vérification des données
if (isnan(tauxHumidite) || isnan(tauxTemperature)) {
Serial.println("Problème DHT");
delay(2000);
return;
}
// Affichage sur le moniteur série
Serial.print(tauxHumidite);
Serial.print(",");
Serial.print(tauxTemperature);
Serial.println();
delay(2000);
}

View file

@ -0,0 +1,61 @@
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define brocheDeBranchementDHT 6 // Le DHT22 est branché sur le pin D6
#define typeDeDHT DHT22
DHT dht(brocheDeBranchementDHT, typeDeDHT);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Le LCD peut afficher 16 caractères par ligne sur 2 lignes
// Définition du caractère "°" sur le LCD (tableau 5x8 en binaire)
byte Degres[] = {
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
B00000
};
void setup() {
lcd.init();
lcd.backlight();
lcd.createChar(0, Degres); // Création du caractère degrés
lcd.clear();
// Moniteur série
Serial.begin(9600);
dht.begin();
}
void loop() {
// Lecture des données
float tauxHumidite = dht.readHumidity(); // Lecture du taux d'humidité (en %)
float tauxTemperature = dht.readTemperature(); // Lecture de la température (en °C)
// Vérification des données
if (isnan(tauxHumidite) || isnan(tauxTemperature)) {
Serial.println("Problème dht");
delay(2000);
return;
}
// Affichage sur le LCD
lcd.setCursor(3, 0);
lcd.print(tauxHumidite);
lcd.print(" %RH");
lcd.setCursor(4, 1);
lcd.print(tauxTemperature);
lcd.print(" ");
lcd.write(0);
lcd.print("C");
delay(2000);
}

View file

@ -0,0 +1,63 @@
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define brocheDeBranchementDHT 4 // Le DHT22 est branché sur le pin 4
#define typeDeDHT DHT22
DHT dht(brocheDeBranchementDHT, typeDeDHT);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Le LCD peut afficher 16 caractères par ligne sur 2 lignes
// Définition du caractère "°" sur le LCD (tableau 5x8 en binaire)
byte Degres[] = {
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
B00000
};
void setup() {
Wire.begin(21, 22); // SDA = 21, SCL = 22 (pins par défaut du LCD sur un ESP32)
lcd.init();
lcd.backlight();
lcd.createChar(0, Degres); // Création du caractère degrés
lcd.clear();
// Moniteur série
Serial.begin(115200);
dht.begin();
}
void loop() {
// Lecture des données
float tauxHumidite = dht.readHumidity(); // Lecture du taux d'humidité (en %)
float tauxTemperature = dht.readTemperature(); // Lecture de la température(en °C)
// Vérification des données
if (isnan(tauxHumidite) || isnan(tauxTemperature)) {
Serial.println("Problème DHT");
delay(2000);
return;
}
// Affichage sur le LCD
lcd.setCursor(3, 0);
lcd.print(tauxHumidite);
lcd.print(" %RH");
lcd.setCursor(4, 1);
lcd.print(tauxTemperature);
lcd.print(" ");
lcd.write(0);
lcd.print("C");
delay(2000);
}

View file

@ -0,0 +1,81 @@
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHT1 4 // Le premier DHT22 est branché sur le pin 4
#define DHT2 18 // Le deuxième DHT22 est branché sur le pin 18
#define typeDeDHT DHT22
DHT premierdht(DHT1, typeDeDHT);
DHT deuxiemedht(DHT2, typeDeDHT);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Le LCD peut afficher 16 caractères par ligne sur 2 lignes
// Définition du caractère "°" sur le LCD (tableau 5x8 en binaire)
byte Degres[] = {
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
B00000
};
void setup() {
Wire.begin(21, 22); // SDA = 21, SCL = 22 (pins par défaut du LCD sur ESP32)
lcd.init();
lcd.backlight();
lcd.createChar(0, Degres); // Création du caractère degrés
lcd.clear();
// Moniteur série
Serial.begin(92160);
premierdht.begin();
deuxiemedht.begin();
}
void loop() {
// Lecture des données
float tauxHumidite1 = premierdht.readHumidity(); // Lecture du taux d'humidité du premier DHT22 (en %)
float tauxTemperature1 = premierdht.readTemperature(); // Lecture de la température du premier DHT22 (en °C)
delay(200); // Attente de 0.2 seconde car sinon les données des deux capteurs se chevauchent
float tauxHumidite2 = deuxiemedht.readHumidity(); // Lecture du taux d'humidité du deuxième DHT22 (en %)
float tauxTemperature2 = deuxiemedht.readTemperature(); // Lecture de la température du deuxième DHT22 (en °C)
// Vérification des données du premier DHT
if (isnan(tauxHumidite1) || isnan(tauxTemperature1)) {
Serial.println("Problème DHT1");
delay(3000);
return;
}
// Vérification des données du deuxième DHT
if (isnan(tauxHumidite2) || isnan(tauxTemperature2)) {
Serial.println("Problème DHT2");
delay(3000);
return;
}
// Affichage sur le LCD
lcd.setCursor(0, 0);
lcd.print(tauxHumidite1);
lcd.print(";");
lcd.print(tauxHumidite2);
lcd.print(" %RH");
lcd.setCursor(1, 1);
lcd.print(tauxTemperature1);
lcd.print(";");
lcd.print(tauxTemperature2);
lcd.write(0);
lcd.print("C");
delay(3000);
}

View file

@ -0,0 +1,94 @@
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define brocheDeBranchementDHT 6 // Le DHT22 est branché sur le pin D6
#define typeDeDHT DHT22
DHT dht(brocheDeBranchementDHT, typeDeDHT);
int fanPin = 9; // Le ventilateur est branché sur le pin D9
int fanSpeed = 0; // La vitesse du ventilateur est 0 par définition
LiquidCrystal_I2C lcd(0x27, 16, 2); // Le LCD peut afficher 16 caractères par ligne sur 2 lignes
// Définition du caractère "°" sur le LCD (tableau 5x8 en binaire)
byte Degres[] = {
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
B00000
};
// Variables pour gestion du temps
unsigned long dernierMajDHT = 0; // dernier moment où le DHT a été lu
const unsigned long IntervalleDHT = 2000; // Intervalle de lecture DHT en millisecondes
unsigned long dernierMajFan = 0; // Dernier moment où la vitesse du ventilateur a été mise à jour
const unsigned long IntervalleFan = 1000; // Intervalle de mise à jour du ventilateur en millisecondes
void setup() {
pinMode(fanPin, OUTPUT);
lcd.init();
lcd.backlight();
lcd.createChar(0, Degres); // Création du caractère degrés
lcd.clear();
// Moniteur série
Serial.begin(9600);
dht.begin();
}
void loop() {
unsigned long millisActuels = millis();
// Lecture DHT toutes les 2 sec
if (millisActuels - dernierMajDHT >= IntervalleDHT) {
dernierMajDHT = millisActuels;
// Lecture des données
float tauxHumidite = dht.readHumidity(); // Lecture du taux d'humidité (en %)
float tauxTemperature = dht.readTemperature(); // Lecture de la température (en °C)
// Vérification des données
if (isnan(tauxHumidite) || isnan(tauxTemperature)) {
Serial.println("Problème DHT");
return;
}
// Affichage sur le LCD
lcd.setCursor(3, 0);
lcd.print(tauxHumidite);
lcd.print(" %RH");
lcd.setCursor(4, 1);
lcd.print(tauxTemperature);
lcd.print(" ");
lcd.write(0);
lcd.print("C");
// Gestion ventilateur
if (tauxHumidite >= 30) { // Seuil pour activer le ventilateur (30% d'humidité)
// Augmentation progressive de la vitesse du ventilateur
if (millisActuels - dernierMajFan >= IntervalleFan) {
dernierMajFan = millisActuels;
if (fanSpeed < 255) {
fanSpeed += 100; // Augmentation de la vitesse par étapes de 100 (max 255 pour PWM)
if (fanSpeed > 255) fanSpeed = 255;
analogWrite(fanPin, fanSpeed);
}
}
} else {
fanSpeed = 0; // Humidité < 30%, ventilateur arrêté
analogWrite(fanPin, fanSpeed);
}
}
}

View file

@ -0,0 +1,94 @@
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define brocheDeBranchementDHT 4 // Le DHT22 est branché sur le pin 4
#define typeDeDHT DHT22
DHT dht(brocheDeBranchementDHT, typeDeDHT);
int fanPin = 18; // Le ventilateur est branché sur le pin 18
int fanSpeed = 0; // La vitesse du ventilateur est 0 par définition
LiquidCrystal_I2C lcd(0x27, 16, 2); // Le LCD peut afficher 16 caractères par ligne sur 2 lignes
// Définition du caractère "°" sur le LCD (tableau 5x8 en binaire)
byte Degres[] = {
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
B00000
};
// Variables pour gestion du temps
unsigned long dernierMajDHT = 0; // dernier moment où le DHT a été lu
const unsigned long IntervalleDHT = 2000; // Intervalle de lecture DHT en millisecondes
unsigned long dernierMajFan = 0; // Dernier moment où la vitesse du ventilateur a été mise à jour
const unsigned long IntervalleFan = 1000; // Intervalle de mise à jour du ventilateur en millisecondes
void setup() {
pinMode(fanPin, OUTPUT);
Wire.begin(21, 22); // SDA = 21, SCL = 22 (pins par défaut du LCD sur un ESP32)
lcd.init();
lcd.backlight();
lcd.createChar(0, Degres); // Création du caractère degrés
lcd.clear();
// Moniteur série
Serial.begin(115200);
dht.begin();
}
void loop() {
unsigned long millisActuels = millis();
// Lecture DHT toutes les 2 sec
if (millisActuels - dernierMajDHT >= IntervalleDHT) {
dernierMajDHT = millisActuels;
// Lecture des données
float tauxHumidite = dht.readHumidity(); // Lecture du taux d'humidité (en %)
float tauxTemperature = dht.readTemperature(); // Lecture de la température (en °C)
// Vérification des données
if (isnan(tauxHumidite) || isnan(tauxTemperature)) {
Serial.println("Problème DHT");
return;
}
// Affichage sur le LCD
lcd.setCursor(3, 0);
lcd.print(tauxHumidite);
lcd.print(" %RH");
lcd.setCursor(4, 1);
lcd.print(tauxTemperature);
lcd.print(" ");
lcd.write(0);
lcd.print("C");
// Gestion ventilateur
if (tauxHumidite >= 30) { // Seuil pour activer le ventilateur (30% d'humidité)
// Augmentation progressive de la vitesse du ventilateur
if (millisActuels - dernierMajFan >= IntervalleFan) {
dernierMajFan = millisActuels;
if (fanSpeed < 255) {
fanSpeed += 100; // Augmentation de la vitesse par étapes de 100 (max 255 pour PWM)
if (fanSpeed > 255) fanSpeed = 255;
analogWrite(fanPin, fanSpeed);
}
}
} else {
fanSpeed = 0; // Humidité < 30%, ventilateur arrêté
analogWrite(fanPin, fanSpeed);
}
}
}

View file

@ -0,0 +1,103 @@
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <PID_v1_bc.h>
#define brocheDeBranchementDHT 4 // Le DHT22 est branché sur le pin 4
#define typeDeDHT DHT22
DHT dht(brocheDeBranchementDHT, typeDeDHT);
int fanPin = 18; // Le ventilateur est branché sur le pin 18
LiquidCrystal_I2C lcd(0x27, 16, 2); // Le LCD peut afficher 16 caractères par ligne sur 2 lignes
// Définition du caractère "°" sur le LCD (tableau 5x8 en binaire)
byte Degres[] = {
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
B00000
};
// Variables pour gestion du temps
unsigned long dernierMajDHT = 0; // dernier moment où le DHT a été lu
const unsigned long IntervalleDHT = 2000; // Intervalle de lecture DHT en millisecondes
unsigned long dernierMajPID = 0; // dernier moment où le PID a été lu
const unsigned long IntervallePID = 300; // Intervalle de lecture PID en millisecondes
// Variable PID
double Setpoint = 50; // Humidité ciblée
double Input;
double Output;
double Kp = 2.5; // Proportionnel
double Ki = 4.38; // Intégral
double Kd = 0.16; // Dérivé
PID pid(&Input, &Output, &Setpoint, Kp, Ki, Kd, REVERSE);
void setup() {
pinMode(fanPin, OUTPUT);
Wire.begin(21, 22); // SDA = 21, SCL = 22 (pins par défaut du LCD sur un ESP32)
lcd.init();
lcd.backlight();
lcd.createChar(0, Degres); // Création du caractère degrés
lcd.clear();
// Moniteur série
Serial.begin(115200);
dht.begin();
pid.SetMode(AUTOMATIC);
pid.SetOutputLimits(0, 255); // PMW correspond à une valeur entre 0 et 255
}
void loop() {
unsigned long millisActuels = millis();
// Lecture DHT toutes les 2 sec
if (millisActuels - dernierMajDHT >= IntervalleDHT) {
dernierMajDHT = millisActuels;
// Lecture des données
float tauxHumidite = dht.readHumidity(); // Lecture du taux d'humidité (en %)
float tauxTemperature = dht.readTemperature(); // Lecture de la température (en °C)
// Vérification des données
if (!isnan(tauxHumidite) && !isnan(tauxTemperature)) {
Input = tauxHumidite;
// Affichage sur le LCD
lcd.setCursor(3, 0);
lcd.print(tauxHumidite);
lcd.print(" %RH");
lcd.setCursor(4, 1);
lcd.print(tauxTemperature);
lcd.print(" ");
lcd.write(0);
lcd.print("C");
}
}
// Lecture PID toutes les 300 ms
if (millisActuels - dernierMajPID >= IntervallePID) {
dernierMajPID = millisActuels;
pid.Compute(); // Calcule PID
analogWrite(fanPin, (int)Output);
Serial.print("Vitesse du ventilateur : ");
Serial.println(Output);
}
}

View file

@ -0,0 +1,263 @@
#include <WiFi.h>
#include <WebServer.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <PID_v1.h>
// Nom et mot de passe du Wifi
const char* ssid = "coh@bit";
const char* password = "lewifidecohabit";
WebServer server(80); // HTML correspond au port 80
#define brocheDeBranchementDHT 4 // Le DHT22 est branché sur le pin 4
#define typeDeDHT DHT22
DHT dht(brocheDeBranchementDHT, typeDeDHT);
float tauxHumidite = 0;
float tauxTemperature = 0;
float OutputRPM = 0;
int fanPin = 18; // Le ventilateur est branché sur le pin 18
LiquidCrystal_I2C lcd(0x27, 16, 2); // Le LCD peut afficher 16 caractères par ligne sur 2 lignes
// Définition du caractère "°" sur le LCD (tableau 5x8 en binaire)
byte Degres[] = {
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
B00000
};
// Variables pour gestion du temps
unsigned long dernierMajDHT = 0; // dernier moment où le DHT a été lu
const unsigned long IntervalleDHT = 2000; // Intervalle de lecture DHT en millisecondes
unsigned long dernierMajPID = 0; // dernier moment où le PID a été lu
const unsigned long IntervallePID = 300; // Intervalle de lecture PID en millisecondes
// Variables PID
double Setpoint = 50; // Humidité ciblée
double Input;
double Output;
double Kp = 1.5; // Proportionnel
double Ki = 1; // Intégral
double Kd = 0.16; // Dérivé
PID pid(&Input, &Output, &Setpoint, Kp, Ki, Kd, REVERSE);
void setup() {
pinMode(fanPin, OUTPUT);
Wire.begin(21, 22); // SDA = 21, SCL = 22 (pins par défaut du LCD sur un ESP32)
lcd.init();
lcd.backlight();
lcd.createChar(0, Degres); // Création du caractère degrés
lcd.clear();
// Moniteur série
Serial.begin(921600);
dht.begin();
pid.SetMode(AUTOMATIC);
pid.SetOutputLimits(0, 255); // PMW correspond à une valeur entre 0 et 255
// Connexion au Wifi local
WiFi.begin(ssid, password);
// Verification de la connexion
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.print("IP de la carte : ");
Serial.println(WiFi.localIP());
// Message de communication client/serveur
server.on("/", connexion_Serveur);
server.on("/dataDHT", donnees_DHT);
server.on("/dataRPM", donnees_RPM);
server.on("/setHumidity", donnees_Set_Humidite);
server.onNotFound(echec_Connexion);
server.begin();
}
void loop() {
server.handleClient();
OutputRPM = (Output / 255.0) * 4500.0;
unsigned long millisActuels = millis();
// Lecture DHT toutes les 2 sec
if (millisActuels - dernierMajDHT >= IntervalleDHT) {
dernierMajDHT = millisActuels;
// Lecture des données
tauxHumidite = dht.readHumidity(); // Lecture du taux d'humidité (en %)
tauxTemperature = dht.readTemperature(); // Lecture de la température (en °C)
// Vérification des données
if (!isnan(tauxHumidite) && !isnan(tauxTemperature)) {
Input = tauxHumidite;
// Affichage sur le LCD
lcd.setCursor(3, 0);
lcd.print(tauxHumidite);
lcd.print(" %RH");
lcd.setCursor(4, 1);
lcd.print(tauxTemperature);
lcd.print(" ");
lcd.write(0);
lcd.print("C");
}
}
// Lecture PID toutes les 300 ms
if (millisActuels - dernierMajPID >= IntervallePID) {
dernierMajPID = millisActuels;
pid.Compute(); // Calcule PID
analogWrite(fanPin, (int)Output);
}
}
// Création page HTML
void connexion_Serveur() {
// Style du texte
String html = "<!DOCTYPE html><html>";
html += "<head><meta charset=\"UTF-8\">";
html += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">";
html += "<style>";
html += "body {font-family: bauhaus 93, sans-serif; color: #000; text-align: center;}";
html += ".title {font-size: 30px; font-weight: bold; margin: 40px 0 30px;}";
html += ".temperature, .humidity, .vitesse {font-size: 40px; font-weight: 300; line-height: 1; margin-bottom: 20px;}";
html += ".temperature {color: #00b3ff;}";
html += ".humidity {color: #ff404d;}";
html += ".vitesse {color: #1eff1e;}";
html += ".unit {font-size: 20px; vertical-align: top;}";
// Style du slider et de la valeur
html += "#valeurHumidite {";
html += "font-size: 20px;";
html += "font-weight: bold;";
html += "margin-left: 10px;";
html += "color: #ff404d;";
html += "cursor: pointer;"; // valeur cliquable
html += "}";
html += "#sliderHumidite {";
html += "display: none;"; // Le slider est caché par défaut
html += "margin-top: 10px;";
html += "margin-left: 100px;";
html += "}";
html += "</style>";
html += "<script>";
// Température et humidité toutes les 2s
html += "setInterval(function(){";
html += "var xhttp = new XMLHttpRequest();";
html += "xhttp.onreadystatechange=function(){";
html += "if(this.readyState==4 && this.status==200){";
html += "document.getElementById('dht-container').innerHTML=this.responseText;";
html += "}};";
html += "xhttp.open('GET','/dataDHT',true);";
html += "xhttp.send();";
html += "},2000);";
// Vitesse ventilateur toutes les 300ms
html += "setInterval(function(){";
html += "var xhttp = new XMLHttpRequest();";
html += "xhttp.onreadystatechange=function(){";
html += "if(this.readyState==4 && this.status==200){";
html += "document.getElementById('rpm-container').innerHTML=this.responseText;";
html += "}};";
html += "xhttp.open('GET','/dataRPM',true);";
html += "xhttp.send();";
html += "},300);";
// Fonction pour mettre à jour l'humidité via le slider
html += "function updateHumidity() {";
html += "var humidity = document.getElementById('sliderHumidite').value;";
html += "document.getElementById('valeurHumidite').innerText = humidity + '%';"; // Mise à jour instantanée de l'affichage
html += "var xhttp = new XMLHttpRequest();";
html += "xhttp.open('GET', '/setHumidity?value=' + humidity, true);";
html += "xhttp.send();";
html += "}";
// Fonction pour basculer l'affichage du slider
html += "function toggleSlider() {";
html += "var slider = document.getElementById('sliderHumidite');";
html += "if (slider.style.display === 'none') {";
html += " slider.style.display = 'block';"; // Afficher le slider
html += "} else {";
html += " slider.style.display = 'none';"; // Cacher le slider
html += "}";
html += "}";
html += "</script>";
html += "</head><body>";
html += "<h1 class=\"title\">État de l'armoire</h1>";
html += "<div id='dht-container'></div>";
html += "<div id='rpm-container'></div>";
// Affichage de la valeur de l'humidité et du slider
html += "<div>";
html += "<label for='sliderHumidite'>Humidité cible: </label>";
html += "<span id='valeurHumidite' onclick='toggleSlider()'>" + String(Setpoint) + "%</span>";
html += "<input type='range' id='sliderHumidite' min='0' max='100' value='" + String(Setpoint) + "' oninput='updateHumidity()'>";
html += "</div>";
html += "</body></html>";
server.send(200, "text/html", html);
}
// Communication données DHT22 client/serveur
void donnees_DHT() {
String data = "<div class=\"temperature\">" + String(tauxTemperature, 1) + "<span class=\"unit\">°C</span></div>";
data += "<div class=\"humidity\">" + String(tauxHumidite, 1) + "<span class=\"unit\">%RH</span></div>";
server.send(200, "text/html", data);
}
// Communication données vitesse ventilateur client/serveur
void donnees_RPM() {
String data = "<div class=\"vitesse\">" + String(OutputRPM, 0) + "<span class=\"unit\">RPM</span></div>";
server.send(200, "text/html", data);
}
// Communication données humidité cible client/serveur
void donnees_Set_Humidite() {
if (server.hasArg("value")) {
Setpoint = server.arg("value").toDouble();
}
server.send(200, "text/plain", "Humidité cible mise à jour");
}
// Communication données page non trouvé client/serveur
void echec_Connexion() {
server.send(404, "text/plain", "Not found");
}

View file

@ -0,0 +1,289 @@
#include <WiFi.h>
#include <WebServer.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <PID_v1.h>
// Nom et mot de passe du Wifi
const char* ssid = "coh@bit";
const char* password = "lewifidecohabit";
WebServer server(80); // HTML correspond au port 80
#define brocheDeBranchementDHT 4 // Le DHT22 est branché sur le pin 4
#define typeDeDHT DHT22
DHT dht(brocheDeBranchementDHT, typeDeDHT);
float tauxHumidite = 0;
float tauxTemperature = 0;
float OutputRPM = 0;
int fanPin = 18; // Le ventilateur est branché sur le pin 18
LiquidCrystal_I2C lcd(0x27, 16, 2); // Le LCD peut afficher 16 caractères par ligne sur 2 lignes
// Définition du caractère "°" sur le LCD (tableau 5x8 en binaire)
byte Degres[] = {
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
B00000
};
// Variables pour gestion du temps
unsigned long dernierMajDHT = 0; // dernier moment où le DHT a été lu
const unsigned long IntervalleDHT = 2000; // Intervalle de lecture DHT en millisecondes
unsigned long dernierMajPID = 0; // dernier moment où le PID a été lu
const unsigned long IntervallePID = 300; // Intervalle de lecture PID en millisecondes
unsigned long dernierMajTach = 0; // dernier moment où le tachymètre a été lu
const unsigned long IntervalleTach = 300; // Intervalle de lecture tachymètre en millisecondes
// Variables PID
double Setpoint = 50; // Humidité ciblée
double Input;
double Output;
double Kp = 1.5; // Proportionnel
double Ki = 1; // Intégral
double Kd = 0.16; // Dérivé
PID pid(&Input, &Output, &Setpoint, Kp, Ki, Kd, REVERSE);
const int tachPin = 16; // Pin du tachymètre
volatile unsigned long compteImpulsionsTach = 0; // Compteur d'impulsions du tachymètre
double tachRPM = 0; // RPM mesuré par tachymètre
void IRAM_ATTR tachISR() {
compteImpulsionsTach++;
}
void setup() {
pinMode(fanPin, OUTPUT);
Wire.begin(21, 22); // SDA = 21, SCL = 22 (pins par défaut du LCD sur ESP32)
lcd.init();
lcd.backlight();
lcd.createChar(0, Degres); // Création du caractère degrés
lcd.clear();
// Moniteur série
Serial.begin(921600);
dht.begin();
pid.SetMode(AUTOMATIC);
pid.SetOutputLimits(0, 255); // PWM correspond à une valeur entre 0 et 255
// Connexion au Wifi local
WiFi.begin(ssid, password);
// Vérification de la connexion
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.print("IP de la carte : ");
Serial.println(WiFi.localIP());
// Message de communication client/serveur
server.on("/", connexion_Serveur);
server.on("/dataDHT", donnees_DHT);
server.on("/dataRPM", donnees_RPM);
server.on("/setHumidity", donnees_Set_Humidite);
server.onNotFound(echec_Connexion);
server.begin();
// Tachymètre
pinMode(tachPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(tachPin), tachISR, FALLING);
dernierMajTach = millis();
}
void loop() {
server.handleClient();
OutputRPM = (Output / 255.0) * 4500.0;
unsigned long millisActuels = millis();
// Lecture DHT toutes les 2 sec
if (millisActuels - dernierMajDHT >= IntervalleDHT) {
dernierMajDHT = millisActuels;
// Lecture des données
tauxHumidite = dht.readHumidity(); // Lecture du taux d'humidité (en %)
tauxTemperature = dht.readTemperature(); // Lecture de la température (en °C)
// Vérification des données
if (!isnan(tauxHumidite) && !isnan(tauxTemperature)) {
Input = tauxHumidite;
// Affichage sur le LCD
lcd.setCursor(3, 0);
lcd.print(tauxHumidite);
lcd.print(" %RH");
lcd.setCursor(4, 1);
lcd.print(tauxTemperature);
lcd.print(" ");
lcd.write(0);
lcd.print("C");
}
}
// Lecture PID toutes les 300 ms
if (millisActuels - dernierMajPID >= IntervallePID) {
dernierMajPID = millisActuels;
pid.Compute(); // Calcule PID
analogWrite(fanPin, (int)Output);
}
// Lecture Tachymètre toutes les 300 ms
if (millisActuels - dernierMajTach >= IntervalleTach) {
tachRPM = (compteImpulsionsTach * 60000UL) / (IntervalleTach * 2); // 2 implusions par révolution
compteImpulsionsTach = 0;
dernierMajTach = millisActuels;
}
}
// Création page HTML
void connexion_Serveur() {
// Style du texte
String html = "<!DOCTYPE html><html>";
html += "<head><meta charset=\"UTF-8\">";
html += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">";
html += "<style>";
html += "body {font-family: bauhaus 93, sans-serif; color: #000; text-align: center;}";
html += ".title {font-size: 30px; font-weight: bold; margin: 40px 0 30px;}";
html += ".temperature, .humidity, .vitesse {font-size: 40px; font-weight: 300; line-height: 1; margin-bottom: 20px;}";
html += ".temperature {color: #00b3ff;}";
html += ".humidity {color: #ff404d;}";
html += ".vitesse {color: #1eff1e;}";
html += ".unit {font-size: 20px; vertical-align: top;}";
// Style du slider et de la valeur
html += "#valeurHumidite {";
html += "font-size: 20px;";
html += "font-weight: bold;";
html += "margin-left: 10px;";
html += "color: #ff404d;";
html += "cursor: pointer;"; // valeur cliquable
html += "}";
html += "#sliderHumidite {";
html += "display: none;"; // Le slider est caché par défaut
html += "margin-top: 10px;";
html += "margin-left: 100px;";
html += "}";
html += "</style>";
html += "<script>";
// Température et humidité toutes les 2s
html += "setInterval(function(){";
html += "var xhttp = new XMLHttpRequest();";
html += "xhttp.onreadystatechange=function(){";
html += "if(this.readyState==4 && this.status==200){";
html += "document.getElementById('dht-container').innerHTML=this.responseText;";
html += "}};";
html += "xhttp.open('GET','/dataDHT',true);";
html += "xhttp.send();";
html += "},2000);";
// Vitesse ventilateur toutes les 300ms
html += "setInterval(function(){";
html += "var xhttp = new XMLHttpRequest();";
html += "xhttp.onreadystatechange=function(){";
html += "if(this.readyState==4 && this.status==200){";
html += "document.getElementById('rpm-container').innerHTML=this.responseText;";
html += "}};";
html += "xhttp.open('GET','/dataRPM',true);";
html += "xhttp.send();";
html += "},300);";
// Fonction pour mettre à jour l'humidité via le slider
html += "function updateHumidity() {";
html += "var humidity = document.getElementById('sliderHumidite').value;";
html += "document.getElementById('valeurHumidite').innerText = humidity + '%';"; // Mise à jour instantanée de l'affichage
html += "var xhttp = new XMLHttpRequest();";
html += "xhttp.open('GET', '/setHumidity?value=' + humidity, true);";
html += "xhttp.send();";
html += "}";
// Fonction pour basculer l'affichage du slider
html += "function toggleSlider() {";
html += "var slider = document.getElementById('sliderHumidite');";
html += "if (slider.style.display === 'none') {";
html += " slider.style.display = 'block';"; // Afficher le slider
html += "} else {";
html += " slider.style.display = 'none';"; // Cacher le slider
html += "}";
html += "}";
html += "</script>";
html += "</head><body>";
html += "<h1 class=\"title\">État de l'armoire</h1>";
html += "<div id='dht-container'></div>";
html += "<div id='rpm-container'></div>";
// Affichage de la valeur de l'humidité et du slider
html += "<div>";
html += "<label for='sliderHumidite'>Humidité cible: </label>";
html += "<span id='valeurHumidite' onclick='toggleSlider()'>" + String(Setpoint) + "%</span>";
html += "<input type='range' id='sliderHumidite' min='0' max='100' value='" + String(Setpoint) + "' oninput='updateHumidity()'>";
html += "</div>";
html += "</body></html>";
server.send(200, "text/html", html);
}
// Communication données DHT22 client/serveur
void donnees_DHT() {
String data = "<div class=\"temperature\">" + String(tauxTemperature, 1) + "<span class=\"unit\">°C</span></div>";
data += "<div class=\"humidity\">" + String(tauxHumidite, 1) + "<span class=\"unit\">%RH</span></div>";
server.send(200, "text/html", data);
}
// Communication données vitesse ventilateur client/serveur
void donnees_RPM() {
String data = "<div class=\"vitesse\">" + String(tachRPM, 0) + "<span class=\"unit\">RPM</span></div>";
data += "<div style='font-size:16px;color:#000;'>Vitesse cible: <span style='font-size:20px;color:#1eff1e;'>" + String(OutputRPM,0) + " RPM</span></div>";
server.send(200, "text/html", data);
}
// Communication données humidité cible client/serveur
void donnees_Set_Humidite() {
if (server.hasArg("value")) {
Setpoint = server.arg("value").toDouble();
}
server.send(200, "text/plain", "Humidité cible mise à jour");
}
// Communication données page non trouvée client/serveur
void echec_Connexion() {
server.send(404, "text/plain", "Not found");
}

View file

@ -0,0 +1,71 @@
#include <WiFi.h>
#include <WebServer.h>
// Nom et mot de passe du Wifi
const char* ssid = "coh@bit";
const char* password = "lewifidecohabit";
WebServer server(80); // HTML correspond au port 80
int nombre_visite = 0;
void setup() {
Serial.begin(115200);
Serial.println("Connexion à ");
Serial.println(ssid);
// Connexion au Wifi local
WiFi.begin(ssid, password);
// Verification si le Wifi est connecté à internet
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("Wifi Connecté");
Serial.print("IP : ");
Serial.println(WiFi.localIP());
server.on("/", handle_OnConnect);
server.onNotFound(handle_NotFound);
server.begin();
Serial.println("Server HTTP en marche");
}
void loop() {
server.handleClient();
}
void handle_OnConnect() {
nombre_visite++;
server.send(200, "text/html", createHTML());
}
//Création page d'erreur
void handle_NotFound() {
server.send(404, "text/plain", "Not found");
}
// Création page HTML
String createHTML() {
String html = "<!DOCTYPE html> <html>";
html += "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">";
html += "<style>";
html += "body {font-family: Arial, sans-serif; color: #444; text-align: center;}";
html += ".title {font-size: 30px; font-weight: bold; letter-spacing: 2px; margin: 80px 0 55px;}";
html += ".nombre_visite {font-size: 80px; font-weight: 300; line-height: 1; margin: 0px; color: #4285f4;}";
html += "</style>";
html += "</head>";
html += "<body>";
html += "<h1 class=\"title\">NOMBRE DE VISITEUR</h1>";
html += "<div class=\"nombre_visite\">";
html += nombre_visite;
html += "</div>";
html += "</body>";
html += "</html>";
return html;
}

View file

@ -0,0 +1,26 @@
int fanPin = 9; // Le ventilateur est branché sur le pin D9
// Définition du pin D9 comme sortie
void setup() {
pinMode(fanPin, OUTPUT);
}
// Le ventilateur fonctionne en boucle
void loop() {
for (int i = 0; i <= 255; i++) { // 0 correspond à aucun signal et 255 au maximum
analogWrite(fanPin, 10);
delay(1000);
analogWrite(fanPin, 100);
delay(1000);
analogWrite(fanPin, 175);
delay(1000);
analogWrite(fanPin, 255);
delay(2000);
analogWrite(fanPin, 175);
delay(1000);
analogWrite(fanPin, 100);
delay(1000);
analogWrite(fanPin, 10);
delay(1000);
}
}

Binary file not shown.