#include <LiquidCrystal_I2C.h>
// le nom de la variable de l'écran lcd1
LiquidCrystal_I2C lcd1(0x27, 20, 4);
//================================================================
#include <RTClib.h>
// le nom de la variable du composant d'horloge en temps réel (rtc)
RTC_DS1307 rtc;
char Jour[7][10] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
char Mois[13][10] = {"", "Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"};
char Horloge[9], LaDate[20];
//================================================================
#include <DHT.h>
int dhtHallSignalPin = 2; // Hall d'entrée
int dhtSalonSignalPin = 3; // Salon
int dhtChambreSignalPin = 4; // Chambre des maîtres
int dhtSerreSignalPin = 5; // Serre
DHT capteurDHTHall(dhtHallSignalPin, DHT22); // dhtHallSignalPin(pin, Type)
DHT capteurDHTSalon(dhtSalonSignalPin, DHT22); // dhtSalonSignalPin(pin, Type)
DHT capteurDHTChambre(dhtChambreSignalPin, DHT22); // dhtChambreSignalPin(pin, Type)
DHT capteurDHTSerre(dhtSerreSignalPin, DHT22); // dhtSerreSignalPin(pin, Type)
// Variable de type float "flottante" pour le DHT22.
float Hum, Cel, Far; // Variables à virgule flottante.
char tC[6], tF[6], H[6], buffer[20], buffer2[20]; // mémoires tampons (Buffers)
//================================================================
/*
const int selectButtonPin = 8;
int lastSelectButtonPinState = LOW; // Variable pour stocker le dernier état du bouton
int currentSelectButtonPinState; // Variable pour stocker l'état actuel du bouton
*/
// Les boutons poussoirs...
const int buttonOnOff = 11; // Définir la broche pour le bouton
int lastButtonOnOffState = HIGH; // Variable pour stocker le dernier état du bouton
int currentButtonOnOffState; // Variable pour stocker l'état actuel du bouton
const int leftButtonPin = 10;
int lastLeftButtonPinState = HIGH; // Variable pour stocker le dernier état du bouton
int currentLeftButtonPinState; // Variable pour stocker l'état actuel du bouton
const int rightButtonPin = 9;
int lastRightButtonPinState = HIGH; // Variable pour stocker le dernier état du bouton
int currentRightButtonPinState; // Variable pour stocker l'état actuel du bouton
//================================================================
bool FlagDisplayOn = false; // Drapeau pour suivre l'état de l'affichage LCD
int pageNo = 0; // Numéro de de la page = index du menu.
char* Menu[6] = {"< Select Fonction >", // pageNo 0.
"Real Time Clock", // pageNo 1.
"Temperature Hall", // pageNo 2.
"Temperature Salon", // pageNo 3.
"Temperature Chambre", // pageNo 4.
"Temperature Serre", // pageNo 5.
};
DateTime now; // Variable de type DateTime nommée "now"
void setup() {
lcd1.init(); lcd1.backlight();
for (int pin = 2; pin <= 5; pin++) {
pinMode(pin, INPUT_PULLUP);
}
for (int pin = 9; pin <= 11; pin++) {
pinMode(pin, INPUT_PULLUP);
}
// active RTC et les 4 DHT22
rtc.begin(); capteurDHTHall.begin(); capteurDHTSalon.begin();
capteurDHTChambre.begin(); capteurDHTSerre.begin();
lcd1PrintCenter(String("Bouton bleu"), 0); //Instruction au démarrage
lcd1PrintCenter(String("Active/Desactive"), 1);
lcd1PrintCenter(String("le retroeclairage"), 2);
lcd1PrintCenter(String("et lance le menu"), 3);
delay(3000); lcd1.noBacklight();
}
void loop() {
displayState(); // Fonction MARCHE/ARRÊT
if (FlagDisplayOn) { // démarre le menu des fonctions si FlagDisplayOn = HIGH
displayMenu(pageNo); // Appelle le menu à la page courante,
rightButtonPressed(); // si bouton droit est appuyé avance d'une page
leftButtonPressed(); // si bouton gauche est appuyé recule d'une page
}
}
void displayMenu(int pageNo) {
lcd1PrintCenter(String(Menu[pageNo]), 0);
switch (pageNo) { // Affiche la date et l'heure
case 0: lcd1PrintCenter(" <<< >>> ", 3);
break;
case 1:
now = rtc.now(); //DateTime, ajoute la capacité de chronométrage et donne accès aux heures, minutes, secondes, jours, mois et années.
// Affiche le jour de la semaine = Jour[now.dayOfTheWeek()];
lcd1PrintCenter(String(Jour[now.dayOfTheWeek()]), 1);
// Formate l'affichage de la date.
sprintf(LaDate, "Le %d %s %d", now.day(), Mois[now.month()], now.year());
lcd1PrintCenter(LaDate, 2); // Affiche la date au complet...
//Formate l'affichage de l'heure. Heure = now.hour(), Minutes = now.minute(), Secondes = now.second()
sprintf(Horloge, " %02d:%02d:%02d ", now.hour(), now.minute(), now.second());
lcd1PrintCenter(Horloge, 3); // Affiche l'heure ...
break;
case 2: // Affiche la température et l'humidité du hall
Hum = capteurDHTHall.readHumidity(); // Pourcentage de l'humidité.
Cel = capteurDHTHall.readTemperature(); // Température en degré Celcius
Far = capteurDHTHall.readTemperature(true);// Température en degré Fahrenheit
displayDHT(Hum, Cel, Far);
break;
case 3: // Affiche la température et l'humidité du Salon
Hum = capteurDHTSalon.readHumidity(); // Pourcentage de l'humidité.
Cel = capteurDHTSalon.readTemperature(); // Température en degré Celcius
Far = capteurDHTSalon.readTemperature(true);// Température en degré Fahrenheit
displayDHT(Hum, Cel, Far);
break;
case 4: // Affiche la température et l'humidité de la chambre
Hum = capteurDHTChambre.readHumidity(); // Pourcentage de l'humidité.
Cel = capteurDHTChambre.readTemperature(); // Température en degré Celcius
Far = capteurDHTChambre.readTemperature(true);// Température en degré Fahrenheit
displayDHT(Hum, Cel, Far);
break;
case 5: // Affiche la température et l'humidité de la serre
Hum = capteurDHTSerre.readHumidity(); // Pourcentage de l'humidité.
Cel = capteurDHTSerre.readTemperature(); // Température en degré Celcius
Far = capteurDHTSerre.readTemperature(true);// Température en degré Fahrenheit
displayDHT(Hum, Cel, Far);
break;
}
}
void displayDHT(float Hum, float Cel, float Far) {
// // Affiche la température et l'humidité des DHT sur lcd1
lcd1PrintCenter("Celsius Fahrenheit", 1);
dtostrf(Cel, 5, 2, tC); // Converti float"Cel" en Chaine de caractères.
// pour afficher la température en degré Celcius
lcd1.setCursor(0, 2); lcd1.print(String(tC) + (char)223 + "C ");
// pour afficher la température en degré Fahrenheit
dtostrf(Far, 5, 2, tF); // Converti float"Far" en Chaine de caractères.
lcd1.setCursor(11, 2); lcd1.print(String(tF) + (char)223 + "F ");
// pour afficher le Pourcentage de l'humidité.
dtostrf(Hum, 5, 1, H); // Converti float"Far" en Chaine de caractères.
lcd1.setCursor(0, 3); lcd1.print("Humidity: " + String(H) + "% ");
}
void displayState() { // Active ou désactive le rétroéclairage.
if (digitalRead(buttonOnOff) != lastButtonOnOffState) {
delay(50); // Délai pour anti-rebond
currentButtonOnOffState = digitalRead(buttonOnOff);
/*
lorsque Sketch est exécuté pour la première fois, ce bloc de code
if s'exécute en fait car *lastButtonOnOffState* est initialement défini
sur HIGH, ce qui change ensuite lorsque j'appuie sur le bouton
*/
if (currentButtonOnOffState == HIGH && lastButtonOnOffState == LOW) {
// Le bouton est appuyé pour la première fois
FlagDisplayOn = !FlagDisplayOn; // Basculer l'état d'affichage
lcd1.clear(); // Rafraîchit l'affichage
if (FlagDisplayOn) { // Active le rétroéclairage.
lcd1.backlight();
} else { // Désactive le rétroéclairage
lcd1.noBacklight();
}
}
lastButtonOnOffState = currentButtonOnOffState;
}
}
// Centre l'affichage du texte sur la ligne indiquée de lcd1
void lcd1PrintCenter(String texte, int ligne) {
int len = texte.length(); // Défini la longeur de la variable "texte"
lcd1.setCursor((20 - len) / 2, ligne); // positionne le curseur au centre de la ligne choisie et soustrait la longeur du text à afficher
lcd1.print(texte); // Affiche le texte demandé sur lcd2.
}
void rightButtonPressed() {
if (digitalRead(rightButtonPin) != lastRightButtonPinState) {
delay(50); // Délai pour anti-rebond
currentRightButtonPinState = digitalRead(rightButtonPin);
if (currentRightButtonPinState == LOW && lastRightButtonPinState == HIGH) {
lcd1.clear();
pageNo++; if (pageNo >= 6) pageNo = 0;
//selectMenu();
displayMenu(pageNo);
}
lastRightButtonPinState = currentRightButtonPinState;
}
}
void leftButtonPressed() {
if (digitalRead(leftButtonPin) != lastLeftButtonPinState) {
delay(50); // Délai pour anti-rebond
currentLeftButtonPinState = digitalRead(leftButtonPin);
if (currentLeftButtonPinState == LOW && lastLeftButtonPinState == HIGH) {
lcd1.clear();
pageNo--;
if (pageNo <= 0)pageNo = 0;
displayMenu(pageNo);
}
lastLeftButtonPinState = currentLeftButtonPinState;
}
}
Hall
Salon
Chambre
Serre
Marche
/ Arrêt
<<<
>>>
RealTimeClock
DS1307 RTC
Précédant
Suivant