//============================================ CODE COUVEUSE =======================================================
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define PIN_DHT 6 // La ligne de communication du DHT22 sera donc branchée sur la pin D6 de l'Arduino
#define typeDeDHT DHT22 // Ici, le type de DHT utilisé est un DHT22 (que vous pouvez changer en DHT11, DHT21, ou autre, le cas échéant)
//=========================================================================================================
// Instanciation de la librairie DHT
DHT dht(PIN_DHT, typeDeDHT);
//=========================================================================================================
//----- Adressage matériel -----
// En cas de non fonctionnement, commenter et decommenter les deux ligne en dessous
// commentaire et retirez le commentaire à la ligne en dessous.
LiquidCrystal_I2C lcd(0x27, 20, 4);
//LiquidCrystal_I2C lcd(0x3F,20,4);
//=========================================================================================================
//Declaration des PIN
const int relais_heat = 8;
const int relais_humidif = 7;
const int relais_ventilo = 5;
//=========================================================================================================
//Declartion des boutons poussoirs
const int BP1_PIN = 2;
const int BP2_PIN = 3;
const int BP3_PIN = 4;
//=========================================================================================================
// Target
float tempCible = 37.5;
float humiditeCible = 35.0;
float humiditeCibleCritique = 20.0;
// arrondi a 1 chiffre apres la virgule
char str_tempC[16];
char str_tauxHumidite[16];
char str_tempCible[16];
char str_humiditeCible[16];
//=========================================================================================================
// Délai minimal entre deux incréments
const unsigned long delaiMin = 500; // 500 mili seconde
// Variable pour stocker le moment du dernier incrément
unsigned long dernierIncrement = 0;
// Variable pour le suivi du menu sélectionné
int selection_menu = 1;
//=========================================================================================================
// Variables pour le suivi de l'état de bp1
bool bp1Pressed = false;
bool bp1LongPress = false;
unsigned long bp1StartTime = 0;
int etat_Precedent_bp1 = HIGH;
bool etat_Actuel_bp1 = false;
bool menu_State = false;
//=========================================================================================================
// bp2
bool appui_complet_bp2 = false;
bool etat_Actuel_bp2 = false;
bool etat_Precedent_bp2 = false;
//=========================================================================================================
// bp3
bool appui_complet_bp3 = false;
bool etat_Actuel_bp3 = false;
bool etat_Precedent_bp3 = false;
//=========================================================================================================
// symbole ° en byte pour affichage LCD
byte simvol[8] = {
0b01100,
0b10010,
0b10010,
0b01100,
0b00000,
0b00000,
0b00000,
0b00000
};
//=========================================================================================================
//=========================================================================================================
//=========================================================================================================
void setup () {
Serial.begin(9600);
dht.begin();
lcd.init(); // initialisation de l'afficheur
lcd.backlight();
lcd.begin(16, 2);
// Declaration du PinMode =============================================
pinMode(BP1_PIN, INPUT_PULLUP);
pinMode(BP2_PIN, INPUT_PULLUP);
pinMode(BP3_PIN, INPUT_PULLUP);
pinMode(relais_heat, OUTPUT);
pinMode(relais_humidif, OUTPUT);
pinMode(relais_ventilo, OUTPUT);
}
//=========================================================================================================
//=========================================================================================================
//=========================================================================================================
void loop () {
//=======================================================================
// Lecture des données DHT22
float tauxHumidite = dht.readHumidity(); // Lecture du taux d'humidité (en %)
float tempC = dht.readTemperature(); // Lecture de la température, exprimée en degrés Celsius
// Arrondi a une decimale
dtostrf(tempC, 5, 1, str_tempC);
dtostrf(tauxHumidite, 5, 1, str_tauxHumidite);
dtostrf(tempCible, 5, 1, str_tempCible);
dtostrf(humiditeCible, 5, 1, str_humiditeCible);
// Lecture de l'état des boutons poussoirs=================================
int etatActuel = digitalRead(BP1_PIN);
bool bp1State = digitalRead(BP1_PIN);
bool bp2State = digitalRead(BP2_PIN);
bool bp3State = digitalRead(BP3_PIN);
//=========================================
//Boucle relais ( auto-regulation T° et Humidité)
//=========================================
//=========================================================================================================
//Temperature
if (tempC <= tempCible) {
digitalWrite(relais_heat, HIGH);
} else {
digitalWrite(relais_heat, LOW);
}
//Hygrometrie
if (tauxHumidite > humiditeCible) {
digitalWrite(relais_ventilo, HIGH);
} else {
digitalWrite(relais_ventilo, LOW);
}
// //Hygrometrie
if (tauxHumidite < humiditeCibleCritique) {
digitalWrite(relais_humidif, HIGH);
} else {
digitalWrite(relais_humidif, LOW);
}
//================================================================================================================
//====================================================================
// Gestion du Menu en fonction de l'activation ou pas de bp1LongPress
//====================================================================
if (bp1LongPress == false) {
lcd.setCursor(0, 0);
lcd.print("TEMP: ");
lcd.print(str_tempC);
lcd.setCursor(11, 0);
lcd.print(" ");
lcd.createChar(1, simvol); // création du caractère personnalisé
lcd.setCursor(12, 0);
lcd.print(char(1)); // affiche le caractère
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("HYGRO: ");
lcd.print(str_tauxHumidite);
lcd.print(" %");
} else { // Condition pour la selectiond des menus
if (bp1State == LOW && etat_Precedent_bp1 == HIGH && menu_State == HIGH) {
// Vérification du délai depuis le dernier incrément
unsigned long maintenant = millis();
if (maintenant - dernierIncrement >= delaiMin) {
selection_menu = selection_menu + 1;
lcd.clear();
dernierIncrement = maintenant;
}
}
//====================================================================
// Gestion menu Temperature Cible
if (menu_State == true && selection_menu == 2) {
lcd.setCursor(0, 0);
lcd.print("TEMP-TARGET: ");
lcd.setCursor(0, 1);
lcd.print(str_tempCible);
lcd.createChar(1, simvol); // création du caractère personnalisé
lcd.setCursor(5, 1);
lcd.print(" ");
lcd.print(char(1)); // affiche le caractère
lcd.print("C ");
//=========================================================================================================
// Augmentation de la valeur temperature cible ===============================================================
if (bp2State == LOW && etat_Precedent_bp2 == false && etat_Actuel_bp2 == false) {
etat_Precedent_bp2 = true;
etat_Actuel_bp2 = true;
//en cours d'appuis
}
if (bp2State == HIGH && etat_Precedent_bp2 == true && etat_Actuel_bp2 == true) {
appui_complet_bp2 = true;
etat_Precedent_bp2 = false;
etat_Actuel_bp2 = false;
//bouton relaché
if (appui_complet_bp2 == true) {
tempCible = tempCible + 0.5;
//Incremente
}
} // Fin de l'augmentation de la valeur temperature cible =================================================
// Dimintion de la valeur temperature cible ==============================================================
if (bp3State == LOW && etat_Precedent_bp3 == false && etat_Actuel_bp3 == false) {
etat_Precedent_bp3 = true;
etat_Actuel_bp3 = true;
//en cours d'appuis
}
if (bp3State == HIGH && etat_Precedent_bp3 == true && etat_Actuel_bp3 == true) {
appui_complet_bp3 = true;
etat_Precedent_bp3 = false;
etat_Actuel_bp3 = false;
//bouton relaché
if (appui_complet_bp3 == true) {
tempCible = tempCible - 0.5;
//Incremente
}
} // fin Diminution de la valeur temperature cible ====================================================
} // Fin Gestion Menu temperature cible
//=========================================================================================================
// Gestion menu Humidié Cible
if (menu_State == true && selection_menu == 3) {
lcd.setCursor(0, 0);
lcd.print("HYGRO-TARGET: ");
lcd.setCursor(0, 1);
lcd.print(str_humiditeCible);
lcd.print(" % ");
// Augmentation de la valeur humidité cible ===============================================================
if (bp2State == LOW && etat_Precedent_bp2 == false && etat_Actuel_bp2 == false) {
etat_Precedent_bp2 = true;
etat_Actuel_bp2 = true;
//en cours d'appuis
}
if (bp2State == HIGH && etat_Precedent_bp2 == true && etat_Actuel_bp2 == true) {
appui_complet_bp2 = true;
etat_Precedent_bp2 = false;
etat_Actuel_bp2 = false;
//bouton relaché
if (appui_complet_bp2 == true) {
humiditeCible = humiditeCible + 0.5;
//Incremente
}
} // Fin de l'augmentation de la valeur humidité cible =================================================
//=========================================================================================================
// Dimintion de la valeur humidité cible ==============================================================
if (bp3State == LOW && etat_Precedent_bp3 == false && etat_Actuel_bp3 == false) {
etat_Precedent_bp3 = true;
etat_Actuel_bp3 = true;
//en cours d'appuis
}
if (bp3State == HIGH && etat_Precedent_bp3 == true && etat_Actuel_bp3 == true) {
appui_complet_bp3 = true;
etat_Precedent_bp3 = false;
etat_Actuel_bp3 = false;
//bouton relaché
if (appui_complet_bp3 == true) {
humiditeCible = humiditeCible - 0.5;
//Incremente
}
} // fin Diminution de la valeur humidité cible ====================================================
}// Fin gestion Menu Humidité cible
//=========================================================================================================
// Correction de l'affichage de selection_menu
if (selection_menu == 1) {
selection_menu = 2; //
}
if (selection_menu > 3) {
selection_menu = 2;
}
if (selection_menu == 4) {
selection_menu = 2;
}
//===========================================================================================================
// Condition de fermeture du menu
if (bp1State == LOW && bp1Pressed == false) {
bp1Pressed = true;
bp1StartTime = millis();
}
if (bp1State == HIGH && bp1Pressed == true) {
bp1Pressed = false;
unsigned long bp1Duration = millis() - bp1StartTime;
if (bp1Duration >= 2000) {
bp1LongPress = false;
menu_State = !menu_State;
lcd.clear();
selection_menu = 1;
}
}
}// Fin du if (bp1LongPress == false)
//===========================================================================================================
// Détection de l'appui long sur BP1
if (bp1LongPress == false)
if (bp1State == LOW && !bp1Pressed) { // premiere pression du bouton
bp1Pressed = true;
bp1StartTime = millis();
etat_Actuel_bp1 = true;
}
// Relachement du bouton
if (bp1State == HIGH && bp1Pressed) {
bp1Pressed = false;
unsigned long bp1Duration = millis() - bp1StartTime;
if (bp1Duration >= 2000) {
bp1LongPress = true; // Detection du long press apres relachement
menu_State = !menu_State; // changer l'état du menu
}
}// fin Detection appuis long BP1
//=========================================================================================================
//================================================================================
}// FIN void loop
//================================================================================