/*************************************************************************************************
MON CODE PROJET DE STAGE DE VALIDATION
THEME: CONCEPTION ET REALISATION D'UN SYSTEME DE COLLECTE, DE STOCKAGE ET
D'AFFICHAGE AUTOMATIQUE DES DONNEES DE TEMPERATURE ET D'HUMIDITE
Date: Du 24JUIN au 23 SEPTEMBRE 2024
Lieu: LIESSE: INPHB-YAMMOUSSOUKRO
Auteure: Mlle Kouakou Ange
***********************************************************************************************/
//INSERTION DES BIBLIOTHEQUES
#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <DHT.h>
//Addrese de l'écran LCD_I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
//AFFECTATION DES BROCHES
#define DHTPIN1 13
#define DHTPIN2 12
#define DHTPIN3 14
#define DHTPIN4 27
#define DHTTYPE DHT11
DHT dht11_1(DHTPIN1, DHTTYPE);
DHT dht11_2(DHTPIN2, DHTTYPE);
DHT dht11_3(DHTPIN3, DHTTYPE);
DHT dht11_4(DHTPIN4, DHTTYPE);
//Lien d'insertion des données dans la base de données
String URL = "http://172.16.1.100/dht11_project/Insert_db.php";
//Connection WiFi
const char* ssid = "linksys";
const char* password = "12345678";
//DECLARATION ET INITIALISATION DES VARIABLES
const int ledData = 33; // LED pour l'envoie des données
const int ledConnecting = 25; // LED pour la connexion
const int ledConnected = 32; // LED pour la connexion réussie
const int buttonPinmoins = 15; // Pin du bouton "Moins"
const int buttonPinplus = 2; // Pin du bouton "Plus"
const int resetButtonPin = 4; // Pin du bouton de redémarrage
float temperature1;
float humidity1;
float temperature2;
float humidity2;
float temperature3;
float humidity3;
float temperature4;
float humidity4;
int menuIndex = 0; // Index du menu
unsigned long previousMillis = 0; // Dernier temps d'activation de la LED
const long interval = 2000; // Intervalle de clignotement
const int menuOptions = 4; // Nombre d'options dans le menu
bool buttonmoinsPressed = false; // État du bouton "moins"
bool buttonplusPressed = false; // État du bouton "plus"
bool resetButtonPressed = false; // État du bouton de redémarrage
unsigned long lastDebounceTime = 0; // Temps du dernier changement d'état
const unsigned long debounceDelay = 50; // Délai de détection
// DECLARATION DES FONCTIONS
void Load_DHT11_Data();
void connectWiFi();
void Intro();
void capteur1();
void capteur2();
void capteur3();
void capteur4();
// Code des caractères spéciaux
byte droit[] = {
B00011,
B00110,
B01100,
B11000,
B11000,
B01100,
B00110,
B00011
};
byte gauche[] = {
B11000,
B01100,
B00110,
B00011,
B00011,
B00110,
B01100,
B11000
};
//===================================================================================================================================VOID SETUP
void setup() {
Serial.begin(115200); // initialisation du moniteur serie
pinMode(ledData, OUTPUT);
pinMode(ledConnecting, OUTPUT);
pinMode(ledConnected, OUTPUT);
pinMode(buttonPinmoins, INPUT); // Configurer la pin du bouton "haut" en entrée
pinMode(buttonPinplus, INPUT); // Configurer la pin du bouton "bas" en entrée
pinMode(resetButtonPin, INPUT); // Configurer la pin du bouton de redémarrage en entrée
dht11_1.begin(); // initialisation des capteurs
dht11_2.begin();
dht11_3.begin();
dht11_4.begin();
lcd.init(); // Initialisation de l'écran LCD_I2C
lcd.backlight();
lcd.createChar(1, gauche);// Création de caractères spéciaux
lcd.createChar(2, droit);
connectWiFi();
Intro();
afficherMenu();
}
//==========================================================================================================================
//===================================================================================================================================VOID LOOP
void loop() {
// Gérer le clignotement de la LED
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
digitalWrite(ledData, !digitalRead(ledData)); // Change l'état de la LED
Load_DHT11_Data();// Appel de la fonction
// Envoie des données dans la base de données
String postData = "&temperature1=" + String(temperature1) + "&humidity1=" + String(humidity1)+
"&temperature2=" + String(temperature2) + "&humidity2=" + String(humidity2)+
"&temperature3=" + String(temperature3) + "&humidity3=" + String(humidity3)+
"&temperature4=" + String(temperature4) + "&humidity4=" + String(humidity4);
// Déclaration des variable et fonction HTTP
HTTPClient http;
http.begin(URL);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
int httpCode = http.POST(postData);
String payload = http.getString();
// Affichage sur le moniteur serie
Serial.print("URL : "); Serial.println(URL);
Serial.print("Data1: "); Serial.println(postData);
Serial.print("httpCode: "); Serial.println(httpCode);
Serial.print("payload : "); Serial.println(payload);
Serial.println("--------------------------------------------------");
}
//-------------------------------------------------MENU
// Gérer le bouton "MOINS"
int buttonmoinsState = digitalRead(buttonPinmoins);
if (buttonmoinsState == HIGH) { // Le bouton "haut" est pressé
if (!buttonmoinsPressed && (currentMillis - lastDebounceTime > debounceDelay)) {
buttonmoinsPressed = true;
menuIndex--; // Monter dans le menu
if (menuIndex < 0) menuIndex = menuOptions - 1; // Boucle au bas du menu
afficherMenu();
lastDebounceTime = currentMillis; // Mettre à jour le temps
}
} else {
buttonmoinsPressed = false; // Réinitialise l'état du bouton
}
// Gérer le bouton "PLUS"
int buttonplusState = digitalRead(buttonPinplus);
if (buttonplusState == HIGH) { // Le bouton "bas" est pressé
if (!buttonplusPressed && (currentMillis - lastDebounceTime > debounceDelay)) {
buttonplusPressed = true;
menuIndex++; // Descendre dans le menu
if (menuIndex >= menuOptions) menuIndex = 0; // Boucle au haut du menu
afficherMenu();
lastDebounceTime = currentMillis; // Mettre à jour le temps
}
} else {
buttonplusPressed = false; // Réinitialise l'état du bouton
}
int resetButtonState = digitalRead(resetButtonPin);
if (resetButtonState == HIGH) { // Le bouton de sortie est pressé
if (!resetButtonPressed) {
resetButtonPressed = true;
// Si tu veux sortir de la boucle, utilise un break ou une condition
// Ici, nous allons juste afficher un message
lcd.clear();
lcd.print("Sortie..."); // Message de sortie
delay(2000); // Attendre 2 secondes
return; // Sortie de loop
}
} else {
resetButtonPressed = false; // Réinitialise l'état du bouton
}
}
//===============================================================================================================================
//=================================================(FONCTIONS SECONDAIRES)=======================================================
void afficherMenu() //----------------------------FONCTION MENU
{
lcd.clear(); // Efface l'écran
switch (menuIndex){
case 0:
capteur1();// Lecture du capteur 1
break;
case 1:
capteur2();// Lecture du capteur 2
break;
case 2:
capteur3();// Lecture du capteur 2
break;
case 3:
capteur4();// Lecture du capteur 4
break;
}
}
void Load_DHT11_Data()//----------------------------FONCTION DE LECTURE DES DONNEES DES CAPTEURS DHT11
{
temperature1 = dht11_1.readTemperature(); //Celsius
humidity1 = dht11_1.readHumidity();
temperature2 = dht11_2.readTemperature(); //Celsius
humidity2 = dht11_2.readHumidity();
temperature3 = dht11_3.readTemperature(); //Celsius
humidity3 = dht11_3.readHumidity();
temperature4 = dht11_4.readTemperature(); //Celsius
humidity4 = dht11_4.readHumidity();
//AFFICHAGE SUR LE MONITEUR SERIE
Serial.println(" ");
Serial.print("Temp1: ");
Serial.print(temperature1);
Serial.print("°C , ");
Serial.print("Hum1: ");
Serial.print(humidity1);
Serial.print("% /");
Serial.print("Temp2: ");
Serial.print(temperature2);
Serial.print("°C , ");
Serial.print("Hum2: ");
Serial.print(humidity2);
Serial.print("% /");
Serial.print("Temp3: ");
Serial.print(temperature3);
Serial.print("°C , ");
Serial.print("Hum3: ");
Serial.print(humidity3);
Serial.print("% /");
Serial.print("Temp4: ");
Serial.print(temperature4);
Serial.print("°C , ");
Serial.print("Hum4: ");
Serial.print(humidity4);
Serial.print("% /");
}
void connectWiFi()//--------------------------FONCTION DE VERIFICATION DE LA CONNECTION WIFI
{
Serial.println("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(ledConnecting, HIGH);
delay(100);
digitalWrite(ledConnecting, LOW);
delay(100);
delay(1000);
Serial.print(".");
}
// Une fois connecté, allume la LED de connexion réussie
digitalWrite(ledConnected, HIGH);
Serial.println("Connecté au Wi-Fi !");
Serial.print("connected to : "); Serial.println(ssid);
Serial.print("IP address: "); Serial.println(WiFi.localIP());
}
void Intro()//---------------------MESSAGE DE DEMARRAGE
{
lcd.setCursor(16,0);
lcd.print(" ");
lcd.write(1);
lcd.write(1);
lcd.write(1);
lcd.print("BONJOUR!");
lcd.write(2);
lcd.write(2);
lcd.write(2);
lcd.print(" ");
lcd.setCursor(16,1);
lcd.print("LECTURE DES CAPTEURS");
for (int i=0; i<25; i++){
lcd.scrollDisplayLeft();
delay(200);
}
delay(500);
for (int i=0; i<25; i++){
lcd.scrollDisplayRight();
delay(200);}
}
void capteur1() //---------------------------------AFFICHAGE DES DONNEES DU CAPTEUR 2
{
lcd.setCursor(2,0); lcd.write(2);
lcd.setCursor(3,0); lcd.print("Capteur 1");
lcd.setCursor(12,0); lcd.write(1);
float temperature1 = dht11_1.readTemperature();
float humidity1 = dht11_1.readHumidity();
lcd.setCursor(0,1);
lcd.print("T=");lcd.print(temperature1);lcd.write('\xDF');lcd.print("C,");
lcd.setCursor(10,1);
lcd.print("H=");lcd.print(humidity1);lcd.print("%");
}
void capteur2() //---------------------------------AFFICHAGE DES DONNEES DU CAPTEUR 2
{
lcd.setCursor(2,0); lcd.write(2);
lcd.setCursor(3,0); lcd.print("Capteur 2");
lcd.setCursor(12,0); lcd.write(1);
float temperature2 = dht11_2.readTemperature();
float humidity2 = dht11_2.readHumidity();
lcd.setCursor(0,1);
lcd.print("T=");lcd.print(temperature2);lcd.write('\xDF');lcd.print("C,");
lcd.setCursor(10,1);
lcd.print("H=");lcd.print(humidity2);lcd.print("%");
}
void capteur3() //----------------------------------AFFICHAGE DES DONNEES DU CAPTEUR 3
{
lcd.setCursor(2,0); lcd.write(2);
lcd.setCursor(3,0); lcd.print("Capteur 3");
lcd.setCursor(12,0); lcd.write(1);
float temperature3 = dht11_3.readTemperature();
float humidity3 = dht11_3.readHumidity();
lcd.setCursor(0,1);
lcd.print("T=");lcd.print(temperature3);lcd.write('\xDF');lcd.print("C,");
lcd.setCursor(10,1);
lcd.print("H=");lcd.print(humidity3);lcd.print("%");
}
void capteur4() //-------------------------------------AFFICHAGE DES DONNEES DU CAPTEUR 4
{
lcd.setCursor(2,0); lcd.write(2);
lcd.setCursor(3,0); lcd.print("Capteur 4");
lcd.setCursor(12,0); lcd.write(1);
float temperature4 = dht11_4.readTemperature();
float humidity4 = dht11_4.readHumidity();
lcd.setCursor(0,1);
lcd.print("T=");lcd.print(temperature4);lcd.write('\xDF');lcd.print("C,");
lcd.setCursor(10,1);
lcd.print("H=");lcd.print(humidity4);lcd.print("%");
}