#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// ======== Pins ========
#define DHTPIN A0
#define DHTTYPE DHT22
#define GAS_DIGITAL_PIN 2 // DO du capteur de gaz
#define LDR_DIGITAL_PIN 3 // DO du module photoresistor
#define PIR_PIN 9 // OUT du PIR
#define LED_VERT 12
#define LED_JAUNE 11
#define LED_ROUGE 10
#define BUZZER 13
// ======== Objets ========
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // si ne marche pas, essayer 0x3F
unsigned long lastChange = 0;
int page = 0;
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(GAS_DIGITAL_PIN, INPUT);
pinMode(LDR_DIGITAL_PIN, INPUT);
pinMode(PIR_PIN, INPUT);
pinMode(LED_VERT, OUTPUT);
pinMode(LED_JAUNE, OUTPUT);
pinMode(LED_ROUGE, OUTPUT);
pinMode(BUZZER, OUTPUT);
digitalWrite(LED_VERT, LOW);
digitalWrite(LED_JAUNE, LOW);
digitalWrite(LED_ROUGE, LOW);
digitalWrite(BUZZER, LOW);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Systeme pret");
lcd.setCursor(0, 1);
lcd.print("Mode digital");
delay(2000);
lcd.clear();
}
void loop() {
// ======== Lecture ========
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int gasState = digitalRead(GAS_DIGITAL_PIN); // 0 ou 1
int ldrState = digitalRead(LDR_DIGITAL_PIN); // 0 ou 1
int pirState = digitalRead(PIR_PIN); // 0 ou 1
// souvent modules DO:
// LOW = détection
// HIGH = pas de détection
bool gazDetected = (gasState == LOW);
bool darkDetected = (ldrState == LOW);
bool motionDetected = (pirState == HIGH);
if (isnan(temperature) || isnan(humidity)) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Erreur DHT22");
lcd.setCursor(0, 1);
lcd.print("Verifier module");
delay(1000);
return;
}
// ======== Logique ========
String etat = "NORMAL";
if (gazDetected) {
etat = "DANGER GAZ";
}
else if (motionDetected || darkDetected || temperature > 35) {
etat = "ALERTE";
}
else {
etat = "NORMAL";
}
// ======== LEDs + buzzer ========
if (etat == "NORMAL") {
digitalWrite(LED_VERT, HIGH);
digitalWrite(LED_JAUNE, LOW);
digitalWrite(LED_ROUGE, LOW);
digitalWrite(BUZZER, LOW);
}
else if (etat == "ALERTE") {
digitalWrite(LED_VERT, LOW);
digitalWrite(LED_JAUNE, HIGH);
digitalWrite(LED_ROUGE, LOW);
digitalWrite(BUZZER, HIGH);
delay(100);
digitalWrite(BUZZER, LOW);
}
else if (etat == "DANGER GAZ") {
digitalWrite(LED_VERT, LOW);
digitalWrite(LED_JAUNE, LOW);
digitalWrite(LED_ROUGE, HIGH);
digitalWrite(BUZZER, HIGH);
delay(300);
digitalWrite(BUZZER, LOW);
delay(200);
}
// ======== LCD pages ========
if (millis() - lastChange > 2000) {
lastChange = millis();
page++;
if (page > 2) page = 0;
}
lcd.clear();
if (page == 0) {
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temperature, 1);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("H:");
lcd.print(humidity, 0);
lcd.print("% ");
lcd.print(etat);
}
else if (page == 1) {
lcd.setCursor(0, 0);
lcd.print("Gaz:");
lcd.print(gazDetected ? "OUI" : "NON");
lcd.setCursor(0, 1);
lcd.print("Mvt:");
lcd.print(motionDetected ? "OUI" : "NON");
}
else if (page == 2) {
lcd.setCursor(0, 0);
lcd.print("Lum:");
lcd.print(darkDetected ? "SOMBRE" : "CLAIR");
lcd.setCursor(0, 1);
lcd.print("Etat:");
lcd.print(etat);
}
// ======== Serial ========
Serial.print("Temp=");
Serial.print(temperature);
Serial.print(" Hum=");
Serial.print(humidity);
Serial.print(" Gaz=");
Serial.print(gazDetected);
Serial.print(" PIR=");
Serial.print(motionDetected);
Serial.print(" LDR=");
Serial.print(darkDetected);
Serial.print(" Etat=");
Serial.println(etat);
delay(500);
}