#include "DHTesp.h"
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <ESP32Servo.h>
const int DHT_PIN_AIR = 39;
const int DHT_PIN_SOIL = 40;
const int ENCODER_CLK = 36;
const int ENCODER_DT = 37;
const int ENCODER_SW = 38;
const int PUMP_PIN = 35; // Pin pour contrôler la pompe
int counter = 0;
float windSpeed = 0.0;
unsigned long previousMillis = 0;
const long interval = 1000; // Intervalle de 1 seconde pour le calcul de la vitesse du vent
const float radius = 0.5; // Rayon de l'anémomètre en mètres
const float pi = 3.14159;
const float pulsesPerRotation = 20; // Nombre d'impulsions par rotation
int pos = 0;
DHTesp dhtSensorAir;
DHTesp dhtSensorSoil;
// Vos identifiants réseau
const char* ssid = "Wokwi_GUEST";
const char* apiKey = "251689473d47624641bbd4fdf6ba1fd1";
const char* city = "London";
const char* countryCode = "GB";
String weatherURL = "http://api.openweathermap.org/data/2.5/weather?q=" + String(city) + "," + String(countryCode) + "&appid=" + String(apiKey) + "&units=metric";
// Variables globales pour stocker les données des capteurs
TempAndHumidity data_air;
TempAndHumidity data_soil;
// Variables globales pour stocker les données de l'API
float api_temp = 0.0;
float api_humidity = 0.0;
float api_windSpeed = 0.0;
Servo servo;
void setup() {
Serial.begin(115200);
setup_dht();
pinMode(PUMP_PIN, OUTPUT);
digitalWrite(PUMP_PIN, LOW); // Assurez-vous que la pompe est éteinte au démarrage
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_SW, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, FALLING);
servo.attach(PUMP_PIN, 500, 2400);
connectToWiFi();
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
calculateWindSpeed();
Serial.print("Wind Speed: ");
Serial.print(windSpeed, 2);
Serial.println(" m/s");
resetCounter();
get_data_dht();
getWeatherData();
// Décider d'activer ou non la pompe
bool pumpOn = shouldActivatePump();
if (pumpOn) {
for (pos = 0; pos <= 180; pos += 1) {
servo.write(pos);
delay(15);
}
Serial.println("Pump Activated");
} else {
Serial.println("Pump Deactivated");
}
}
delay(1000); // Ralentir la boucle
}
int getCounter() {
int result;
noInterrupts();
result = counter;
interrupts();
return result;
}
void resetCounter() {
noInterrupts();
counter = 0;
interrupts();
}
void readEncoder() {
int dtValue = digitalRead(ENCODER_DT);
if (dtValue == HIGH) {
counter++; // Sens horaire
}
if (dtValue == LOW) {
counter--; // Sens antihoraire
}
}
void calculateWindSpeed() {
int pulses = getCounter();
float rotations = (float)pulses / pulsesPerRotation;
float distance = 2 * pi * radius * rotations; // Distance parcourue par la pointe de l'hélice
windSpeed = distance / (interval / 1000.0); // Vitesse en mètres par seconde
}
void setup_dht() {
Serial.println("Setup DHT");
dhtSensorAir.setup(DHT_PIN_AIR, DHTesp::DHT22);
dhtSensorSoil.setup(DHT_PIN_SOIL, DHTesp::DHT22);
}
void get_data_dht() {
data_air = dhtSensorAir.getTempAndHumidity();
data_soil = dhtSensorSoil.getTempAndHumidity();
Serial.println("AIR Temp: " + String(data_air.temperature, 2) + "°C");
Serial.println("AIR Humidity: " + String(data_air.humidity, 1) + "%");
Serial.println("SOIL Temp: " + String(data_soil.temperature, 2) + "°C");
Serial.println("SOIL Humidity: " + String(data_soil.humidity, 1) + "%");
}
void connectToWiFi() {
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
}
void getWeatherData() {
if ((WiFi.status() == WL_CONNECTED)) {
HTTPClient http;
http.begin(weatherURL);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
String payload = http.getString();
DynamicJsonDocument doc(1024);
deserializeJson(doc, payload);
api_temp = doc["main"]["temp"];
api_humidity = doc["main"]["humidity"];
api_windSpeed = doc["wind"]["speed"];
Serial.print("API Temperature: ");
Serial.print(api_temp);
Serial.println("°C");
Serial.print("API Humidity: ");
Serial.print(api_humidity);
Serial.println("%");
Serial.print("API Wind Speed: ");
Serial.print(api_windSpeed);
Serial.println(" m/s");
} else {
Serial.print("Error on HTTP request: ");
Serial.println(httpResponseCode);
}
http.end(); // Libérer les ressources
} else {
Serial.println("WiFi Disconnected");
}
}
bool shouldActivatePump() {
// Conditions pour activer la pompe
// Exemple : Activer si l'humidité du sol est inférieure à 30% ET la température de l'air est supérieure à 25°C
if (data_soil.humidity < 30.0 && data_air.temperature > 25.0) {
return true; // Activer la pompe
}
// Vous pouvez ajouter d'autres conditions en fonction de vos besoins
// Par exemple, en utilisant la vitesse du vent ou les données de l'API
return false; // Ne pas activer la pompe
}