#include <Wire.
h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <Servo.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
Servo monServo;
// Définition des broches
const int pinMQ2 = A0;
const int pinFlamme = 3;
const int pinRelais = 4;
const int pinBuzzer = 5;
const int ledVerte = 6;
const int ledJaune = 7;
const int ledRouge = 8;
const int pinServo = 9;
// Configuration des variables de contrôle
const int seuilGaz = 400;
// Variables pour le mouvement du servo (Centre à 90°)
int angle = 90;
int phase = 1;
// Variables pour la stabilisation de l'affichage
unsigned long tempsPrecedentLCD = 0;
const long intervalleLCD = 400; // L'écran se mettra à jour toutes les
400ms (stable pour l'œil)
void setup() {
[Link](9600);
[Link]();
[Link](pinServo);
[Link](90);
delay(500);
pinMode(pinFlamme, INPUT);
pinMode(pinRelais, OUTPUT);
pinMode(pinBuzzer, OUTPUT);
pinMode(ledVerte, OUTPUT);
pinMode(ledJaune, OUTPUT);
pinMode(ledRouge, OUTPUT);
digitalWrite(pinRelais, LOW);
digitalWrite(pinBuzzer, LOW);
[Link]();
[Link]();
[Link]();
void loop() {
// 1. Lecture stabilisée du capteur de gaz (Moyenne sur 10 lectures)
long sommeGaz = 0;
for(int i = 0; i < 10; i++) {
sommeGaz += analogRead(pinMQ2);
delay(2); // Très court délai entre les lectures pour la stabilité
int niveauGaz = sommeGaz / 10; // C'est cette valeur lissée qu'on utilise
// 2. Lecture des autres capteurs
float temperature = [Link]();
int etatFlamme = digitalRead(pinFlamme);
if (isnan(temperature)) { temperature = 0; }
// 3. Affichage sur le LCD cadencé (SANS bloquer le reste du code)
unsigned long tempsActuel = millis();
if (tempsActuel - tempsPrecedentLCD >= intervalleLCD) {
tempsPrecedentLCD = tempsActuel; // Sauvegarde du temps
// Ligne 1 : Température et Gaz
[Link](0, 0);
[Link]("T:"); [Link]((int)temperature); [Link]("C ");
[Link]("Gaz:");
[Link](niveauGaz);
[Link](" "); // Espaces vides pour effacer proprement les anciens
chiffres (ex: passer de 1000 à 99)
}
// 4. Logique de sécurité (S'exécute TOUJOURS en temps réel à chaque
cycle)
if (etatFlamme == HIGH) {
// FEU DETECTE
[Link](0, 1);
[Link]("!! FEU DETECTE !!");
digitalWrite(pinRelais, HIGH);
digitalWrite(pinBuzzer, HIGH);
digitalWrite(ledRouge, HIGH);
digitalWrite(ledJaune, LOW);
digitalWrite(ledVerte, LOW);
else if (niveauGaz > seuilGaz) {
// ALERTE GAZ
[Link](0, 1);
[Link]("Alerte: Fume/Gaz");
digitalWrite(pinRelais, LOW);
digitalWrite(pinBuzzer, HIGH);
digitalWrite(ledRouge, LOW);
digitalWrite(ledJaune, HIGH);
digitalWrite(ledVerte, LOW);
deplacerServo90Degres();
else {
// SURVEILLANCE NORMALE
[Link](0, 1);
[Link]("Scan en cours... ");
digitalWrite(pinRelais, LOW);
digitalWrite(pinBuzzer, LOW);
digitalWrite(ledRouge, LOW);
digitalWrite(ledJaune, LOW);
digitalWrite(ledVerte, HIGH);
deplacerServo90Degres();
delay(40); // Contrôle la vitesse globale et du servomoteur
void deplacerServo90Degres() {
if (phase == 1) {
angle++;
if (angle >= 135) { phase = 2; }
else if (phase == 2) {
angle--;
if (angle <= 90) { phase = 3; }
else if (phase == 3) {
angle--;
if (angle <= 45) { phase = 4; }
else if (phase == 4) {
angle++;
if (angle >= 90) { phase = 1; }
[Link](angle);