#include "stm32c0xx_hal.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include <stdio.h>

// Définition des pins GPIO
#define HUMIDITY_SENSOR1_PIN    GPIO_PIN_0 // Capteur Humidité 1 sur PA0
#define HUMIDITY_SENSOR2_PIN    GPIO_PIN_1 // Capteur Humidité 2 sur PA1
#define VALVE1_PIN              GPIO_PIN_5 // LED simule vanne 1 sur PA5
#define VALVE2_PIN              GPIO_PIN_6 // LED simule vanne 2 sur PA6
#define EMERGENCY_BUTTON_PIN    GPIO_PIN_4 // Bouton d'arrêt d'urgence sur PA4
#define POTENTIOMETER_PIN       GPIO_PIN_3 // Potentiomètre sur PB3
#define EMERGENCY_LED_PIN       GPIO_PIN_7 // LED rouge pour arrêt d'urgence

// Variables globales
SemaphoreHandle_t emergencySemaphore;
SemaphoreHandle_t humidityThresholdMutex;
QueueHandle_t humidityQueue;
uint8_t humidityThreshold = 50; // Seuil d'humidité initial à 50%

// Prototypes des fonctions
void SystemClock_Config(void);
void GPIO_Init(void);
void ADC_Init(void);
void ReadHumidityTask(void *pvParameters);
void ValveControlTask(void *pvParameters);
void EmergencyButtonTask(void *pvParameters);
void PotentiometerTask(void *pvParameters);
void LogEvent(const char* event);

// Fonction principale
int main(void) {
    HAL_Init();
    SystemClock_Config();
    GPIO_Init();
    ADC_Init();

    // Création des sémaphores et des queues
    emergencySemaphore = xSemaphoreCreateBinary();
    humidityQueue = xQueueCreate(10, sizeof(uint8_t));
    humidityThresholdMutex = xSemaphoreCreateMutex();

    if (humidityThresholdMutex == NULL || humidityQueue == NULL || emergencySemaphore == NULL) {
        LogEvent("Erreur lors de la création des ressources FreeRTOS !");
        while (1);
    }

    // Création des tâches
    xTaskCreate(ReadHumidityTask, "Read Humidity", 128, NULL, 1, NULL);
    xTaskCreate(ValveControlTask, "Valve Control", 128, NULL, 2, NULL);
    xTaskCreate(EmergencyButtonTask, "Emergency Button", 128, NULL, 3, NULL);
    xTaskCreate(PotentiometerTask, "Potentiometer", 128, NULL, 1, NULL);

    // Démarrage du scheduler
    vTaskStartScheduler();

    // Si le scheduler échoue
    while (1) {}
}

// Initialisation des GPIO
void GPIO_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    // Configurer les pins des capteurs d'humidité et du bouton
    GPIO_InitStruct.Pin = HUMIDITY_SENSOR1_PIN | HUMIDITY_SENSOR2_PIN | EMERGENCY_BUTTON_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    // Configurer les LEDs (vannes + LED d'urgence) en sortie
    GPIO_InitStruct.Pin = VALVE1_PIN | VALVE2_PIN | EMERGENCY_LED_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    // Configurer le potentiomètre en entrée analogique
    GPIO_InitStruct.Pin = POTENTIOMETER_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

// Initialisation de l'ADC
void ADC_Init(void) {
    __HAL_RCC_ADC_CLK_ENABLE();
    // Configuration de l'ADC pour lire les valeurs analogiques des capteurs et du potentiomètre
    // ...
}

// Tâche de lecture des capteurs d'humidité
void ReadHumidityTask(void *pvParameters) {
    uint32_t adcValue1, adcValue2;
    float humidity1, humidity2;

    while (1) {
        // Lire les valeurs ADC des capteurs d'humidité
        adcValue1 = HAL_ADC_GetValue(&hadc1); // Assurez-vous que l'ADC est correctement configuré
        adcValue2 = HAL_ADC_GetValue(&hadc2);

        // Convertir les valeurs ADC en pourcentage d'humidité
        humidity1 = (adcValue1 / 4095.0) * 100.0; // Supposant une résolution ADC de 12 bits
        humidity2 = (adcValue2 / 4095.0) * 100.0;

        // Lire le seuil d'humidité protégé par un mutex
        xSemaphoreTake(humidityThresholdMutex, portMAX_DELAY);
        uint8_t currentThreshold = humidityThreshold;
        xSemaphoreGive(humidityThresholdMutex);

        // Envoyer dans la queue si l'humidité est en dessous du seuil
        if (humidity1 < currentThreshold) {
            uint8_t zone = 1;
            xQueueSend(humidityQueue, &zone, portMAX_DELAY);
        }
        if (humidity2 < currentThreshold) {
            uint8_t zone = 2;
            xQueueSend(humidityQueue, &zone, portMAX_DELAY);
        }

        vTaskDelay(pdMS_TO_TICKS(5000)); // Lire toutes les 5 secondes
    }
}

//
::contentReference[oaicite:0]{index=0}
 
Loading
st-nucleo-c031c6