#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include <ansi.h>
ANSI ansi(&Serial);
// Définition des broches
#define DHTPIN 2 // Broche pour le capteur DHT22
#define DHTTYPE DHT22 // Type de capteur : DHT22
#define BUZZER 8 // Broche pour le buzzer
#define LED_RED 11 // Broche pour LED Rouge
#define LED_GREEN 12 // Broche pour LED Verte
#define BUTTON 7 // Broche pour le bouton-poussoir
#define MQ2_ANA A1 // Sortie analogique du MQ2
// Initialisation des capteurs et de l'écran LCD
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adresse I2C de l'écran LCD
// Variables globales
float temperature = 0.0;
float humidity = 0.0;
int seuilTemperature = 30; // Seuil d'alerte pour la température
int seuilGazPourcentage = 50; // Seuil critique pour la qualité de l'air en pourcentage
bool buzzerActive = false; // État du buzzer
unsigned long lastButtonPress = 0; // Pour le debounce
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
lcd.backlight();
pinMode(BUZZER, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP);
pinMode(MQ2_ANA, INPUT);
dht.begin();
// Lecture du seuil de température depuis l'EEPROM
seuilTemperature = EEPROM.read(0);
if (seuilTemperature <= 0 || seuilTemperature > 100) {
seuilTemperature = 30;
}
// Message d'accueil
lcd.setCursor(0, 0);
lcd.print("System Start");
lcd.setCursor(0, 1);
lcd.print("Monitoring...");
delay(2000);
lcd.clear();
}
void loop() {
// Lecture des capteurs
temperature = dht.readTemperature();
humidity = dht.readHumidity();
int gazAnalog = analogRead(MQ2_ANA);
// Conversion de la lecture analogique en pourcentage (0-1022 -> 0-100%)
int gazPourcentage = map(gazAnalog, 0, 1022, 0, 100);
// Affichage des données dans le Serial Monitor
Serial.print("Température: ");
Serial.print(temperature);
Serial.println("°C");
Serial.print("Humidité: ");
Serial.print(humidity);
Serial.println("%");
Serial.print("Gaz: ");
Serial.print(gazPourcentage);
Serial.println("%");
// Vérification des valeurs de température et d'humidité
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Erreur de lecture des capteurs !");
lcd.setCursor(0, 0);
lcd.print("Erreur capteur!");
delay(1000);
return;
}
// Affichage des données sur l'écran LCD
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Gaz: ");
lcd.print(gazPourcentage);
lcd.print("% ");
// Alerte pour le gaz si seuil critique atteint
if (gazPourcentage > seuilGazPourcentage) {
Serial.println("Alerte : qualité de l'air critique !");
lcd.setCursor(0, 1);
lcd.print("Gaz Danger! ");
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
buzzerActive = true;
sonnerBuzzer();
} else {
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, HIGH);
buzzerActive = false;
noTone(BUZZER);
}
// Alerte pour la température
if (temperature > seuilTemperature) {
Serial.println("Alerte : température élevée !");
lcd.setCursor(0, 1);
lcd.print("Temp High! ");
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
buzzerActive = true;
sonnerBuzzer();
}
// Arrêt des alarmes avec le bouton
if (buzzerActive && boutonAppuye()) {
noTone(BUZZER);
buzzerActive = false;
Serial.println("Buzzer arrêté par bouton.");
}
// Lecture des commandes via le Serial Monitor
verifierCommande();
delay(2000);
}
void sonnerBuzzer() {
if (!buzzerActive) return;
tone(BUZZER, 1000);
delay(500);
noTone(BUZZER);
delay(500);
}
void verifierCommande() {
if (Serial.available()) {
String commande = Serial.readStringUntil('\n');
commande.trim();
if (commande.startsWith("seuil")) {
int nouvelleValeur = commande.substring(6).toInt();
if (nouvelleValeur > 0 && nouvelleValeur <= 100) {
seuilTemperature = nouvelleValeur;
EEPROM.write(0, seuilTemperature);
Serial.print("Nouveau seuil: ");
Serial.println(seuilTemperature);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Seuil maj:");
lcd.print(seuilTemperature);
delay(1000);
} else {
Serial.println("Valeur invalide. Reessayez!");
}
} else if (commande.startsWith("seuil_gaz")) {
int nouvelleValeur = commande.substring(10).toInt();
if (nouvelleValeur >= 0 && nouvelleValeur <= 100) {
seuilGazPourcentage = nouvelleValeur;
Serial.print("Nouveau seuil gaz: ");
Serial.println(seuilGazPourcentage);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Seuil gaz maj:");
lcd.print(seuilGazPourcentage);
delay(1000);
} else {
Serial.println("Valeur invalide pour seuil gaz. Reessayez!");
}
} else {
Serial.println("Commande inconnue. Utilisez: seuil <valeur> ou seuil_gaz <valeur>");
}
}
}
bool boutonAppuye() {
// Gestion du debounce
unsigned long currentMillis = millis();
if (digitalRead(BUTTON) == LOW && (currentMillis - lastButtonPress > 200)) {
lastButtonPress = currentMillis;
return true;
}
return false;
}