#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h> // Importation de la bibliothèque DHT
// Déclaration des composants
Servo servo;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adresse LCD 0x27 (ou utilisez 0x3F si cela ne fonctionne pas)
DHT dht(2, DHT22); // Initialisation du capteur DHT22 sur la broche 2
// Déclaration des broches et autres variables
const int trigPin = 9;
const int echoPin = 10;
const int pirPin = 7;
const int ledVerte = 3;
const int ledJaune = 4;
const int ledRouge = 5;
const int buzzerPin = 8;
const int potPin = A0; // Potentiomètre pour simuler le capteur de gaz
long duration;
int distance;
int sensorValue;
int level;
float temperature;
float humidity;
void setup() {
// Configuration des composants
servo.attach(6); // Pin du servomoteur
lcd.begin(16, 2); // Initialisation de l'écran LCD
dht.begin(); // Initialisation du capteur DHT22
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(pirPin, INPUT);
pinMode(ledVerte, OUTPUT);
pinMode(ledJaune, OUTPUT);
pinMode(ledRouge, OUTPUT);
pinMode(buzzerPin, OUTPUT);
// Message de bienvenue sur le LCD
lcd.setCursor(0, 0);
lcd.print("Poubelle Connecte");
delay(2000);
}
void loop() {
// Mesure de la distance avec le capteur ultrasonique
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2; // Conversion du temps en distance (cm)
// Lecture de la valeur du potentiomètre (simule un capteur de gaz)
sensorValue = analogRead(potPin);
level = map(sensorValue, 0, 1023, 0, 100); // Conversion en pourcentage (0 à 100)
// Lecture des données de température et d'humidité du DHT22
temperature = dht.readTemperature(); // Température en °C
humidity = dht.readHumidity(); // Humidité en %
// Vérification de la validité des données du DHT22
if (isnan(temperature) || isnan(humidity)) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Erreur capteur DHT");
return;
}
// Contrôle des LEDs et du buzzer en fonction du niveau de la poubelle
if (distance < 10) { // Poubelle pleine
digitalWrite(ledRouge, HIGH);
digitalWrite(ledJaune, LOW);
digitalWrite(ledVerte, LOW);
tone(buzzerPin, 1000); // Activation du buzzer
} else if (distance < 50) { // Poubelle partiellement pleine
digitalWrite(ledRouge, LOW);
digitalWrite(ledJaune, HIGH);
digitalWrite(ledVerte, LOW);
noTone(buzzerPin); // Désactivation du buzzer
} else { // Poubelle vide
digitalWrite(ledRouge, LOW);
digitalWrite(ledJaune, LOW);
digitalWrite(ledVerte, HIGH);
noTone(buzzerPin); // Désactivation du buzzer
}
// Détection de mouvement et contrôle du servomoteur pour ouvrir/fermer le couvercle
if (digitalRead(pirPin) == HIGH) {
servo.write(90); // Ouvre le couvercle
} else {
servo.write(0); // Ferme le couvercle
}
// Mise à jour de l'affichage sur le LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Distance: ");
lcd.print(distance);
lcd.print(" cm");
lcd.setCursor(0, 1);
lcd.print("Gaz: ");
lcd.print(level);
lcd.print("%");
// Affichage de la température
lcd.setCursor(8, 1);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("C");
// Affichage d'alertes spécifiques sur le LCD
if (level > 80 && temperature > 35) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Mauvaises odeurs");
lcd.setCursor(0, 1);
lcd.print("detectees !");
} else if (level > 80) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Niveau gaz trop");
lcd.setCursor(0, 1);
lcd.print("eleve !");
} else if (temperature > 35) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp trop elevee");
lcd.setCursor(0, 1);
lcd.print("! Alerte !");
}
delay(100); // Petite pause pour éviter une boucle trop rapide
}