#include <Servo.h>
#include <DHT.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(13, 12, 11, 8, 7, 6);
// Broches des capteurs
const int temperaturePin = A0;
const int ultrasonicTrigPin =4;
// Broche Trig pour le capteur ultrasonique
const int ultrasonicEchoPin = 3;
// Broche Echo pour le capteur ultrasonique
const int photoresistorPin = A2;
const int dhtPin = 2;
const int photoresistorAnalogPin = A3; // Broche numérique pour la sortie DO
// Broches des actionneurs
const int servoPin = 9;
// Initialisation des objets
Servo myservo;
DHT dht(dhtPin, DHT22);
void setup() {
lcd.begin(16, 2); // Initialiser l'écran LCD
lcd.clear(); // Effacer l'écran LCD au démarrage
lcd.print("Arrosage OFF"); // Afficher ce message par défaut
Serial.begin(9600);
myservo.attach(servoPin);
myservo.write(0);
// Attache le servomoteur à la broche spécifiée
dht.begin();
// Initialise le capteur DHT22
pinMode(photoresistorAnalogPin, INPUT); // Configure la broche comme entrée pour la sortie DO
}
int measureDistance() {
digitalWrite(ultrasonicTrigPin, LOW);
delayMicroseconds(0.7);
digitalWrite(ultrasonicTrigPin, HIGH);
delayMicroseconds(0.7);
// Augmenter le délai
digitalWrite(ultrasonicTrigPin, LOW);
return pulseIn(ultrasonicEchoPin, HIGH) * 0.034 / 2;
}
void loop() {
float temperature = dht.readTemperature(); // Lecture de la température à partir du DHT22
float humidity = dht.readHumidity(); // Lecture de l'humidité
// Mesure de la distance avec le capteur ultrasonique
int distances[5];
for (int i = 0; i < 5; ++i) {
distances[i] = measureDistance();
delay(1);
}
// Ignorer les valeurs aberrantes (0 cm) car j'ai eu beaucoup de soucis avec
int validCount = 0;
int distanceSum = 0;
for (int i = 0; i < 5; ++i) {
if (distances[i] > 0) {
distanceSum += distances[i];
validCount++;
}
}
// Utiliser la moyenne des valeurs valides pour eviter d'avoir de fausse valeur qui fasse buguer le servomotor
int distance = (validCount > 0) ? (distanceSum / validCount) : 0;
// Utilise la sortie numérique (DO) pour déterminer la luminosité car j'ai rencontré des soucis avec la digiital
int lightIntensityAnalog = analogRead(photoresistorAnalogPin); // Lecture de la sortie numérique
int lightIntensity = (lightIntensityAnalog == HIGH) ? 1023 : 0; // 1023 correspond à une luminosité maximale, 0 à une luminosité minimale
// Affichage des valeurs sur le moniteur série
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print("°C, Distance: ");
Serial.print(distance);
Serial.print("cm, Light Intensity: ");
Serial.println(lightIntensityAnalog);
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println("%");
// Logique d'arrosage en fonction des valeurs des capteurs
if (temperature > 30 && lightIntensity > 500 && humidity < 30 && distance > 10 || distance > 20) {
// Conditions pour arroser la plante
lcd.clear();
lcd.print("Arrosage ON");
myservo.write(90);
delay(500);
myservo.write(10);
} else {
// Conditions où l'arrosage n'est pas nécessaire
lcd.clear();
lcd.print("Arrosage OFF");
myservo.write(0);
delay(1000);
}
delay(500); // Ajoutez un délai pour éviter une lecture fréquente des capteurs
}