#include <Arduino.h>
#include <DHT.h>
#include <FreeRTOS.h>
#include <queue.h>
#include <semphr.h>
// --- CONFIGURATION ---
#define DHT1_PIN D6
#define DHT2_PIN D7
#define LED1_PIN D2
#define LED2_PIN D3
#define LED_URG_PIN D4
#define BTN_URG_PIN D5
#define POTENTIOMETER_PIN A2
#define DHTTYPE DHT22
#define VANNE_ON_DURATION 10000 // 10 sec
// --- OBJETS ---
DHT dht1(DHT1_PIN, DHTTYPE);
DHT dht2(DHT2_PIN, DHTTYPE);
QueueHandle_t humidityQueue;
SemaphoreHandle_t emergencySemaphore;
SemaphoreHandle_t seuilMutex;
// --- VARIABLES ---
int humidityThreshold = 50; // par défaut
// --- STRUCTURE POUR QUEUE ---
typedef struct {
int zone;
float humidity;
} HumidityData;
// --- TÂCHES ---
void taskReadHumidity(void *pvParameters) {
while (1) {
HumidityData data1 = {1, dht1.readHumidity()};
HumidityData data2 = {2, dht2.readHumidity()};
xSemaphoreTake(seuilMutex, portMAX_DELAY);
int seuil = humidityThreshold;
xSemaphoreGive(seuilMutex);
if (!isnan(data1.humidity) && data1.humidity < seuil) {
xQueueSend(humidityQueue, &data1, 0);
}
if (!isnan(data2.humidity) && data2.humidity < seuil) {
xQueueSend(humidityQueue, &data2, 0);
}
vTaskDelay(pdMS_TO_TICKS(5000)); // toutes les 5 secondes
}
}
void taskVanneControl(void *pvParameters) {
HumidityData received;
while (1) {
if (xQueueReceive(humidityQueue, &received, portMAX_DELAY)) {
if (xSemaphoreTake(emergencySemaphore, 0) == pdTRUE) {
// Urgence active, ignorer
continue;
}
int ledPin = (received.zone == 1) ? LED1_PIN : LED2_PIN;
digitalWrite(ledPin, HIGH);
Serial.printf("Zone %d : Arrosage activé (humidité = %.1f%%)\n", received.zone, received.humidity);
vTaskDelay(pdMS_TO_TICKS(VANNE_ON_DURATION));
digitalWrite(ledPin, LOW);
Serial.printf("Zone %d : Arrosage désactivé\n", received.zone);
}
}
}
void taskEmergencyButton(void *pvParameters) {
while (1) {
if (digitalRead(BTN_URG_PIN) == LOW) { // Bouton appuyé
xSemaphoreGive(emergencySemaphore);
digitalWrite(LED1_PIN, LOW);
digitalWrite(LED2_PIN, LOW);
digitalWrite(LED_URG_PIN, HIGH);
Serial.println("⚠️ Arrêt d'urgence activé !");
while (digitalRead(BTN_URG_PIN) == LOW) {
vTaskDelay(pd