#include <Arduino.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
// Definições de pinos para simulação
#define PIN_RESFRIAMENTO 23 // LED para sistema de resfriamento
#define PIN_UMIDADE 22 // LED para sistema de umidade
// Limites para temperatura e umidade
#define TEMPERATURA_LIMITE 40
#define UMIDADE_LIMITE 20
// Semáforos binários
SemaphoreHandle_t semaforoResfriamento;
SemaphoreHandle_t semaforoUmidade;
// Função para simular o sistema de resfriamento (ligar/desligar LED)
void controleResfriamento() {
digitalWrite(PIN_RESFRIAMENTO, HIGH); // Liga resfriamento
delay(2000); // Mantém o sistema ligado por 2 segundos
digitalWrite(PIN_RESFRIAMENTO, LOW); // Desliga resfriamento
}
// Função para simular o sistema de umidade (ligar/desligar LED)
void controleUmidade() {
digitalWrite(PIN_UMIDADE, HIGH); // Liga umidade
delay(3000); // Mantém o sistema ligado por 3 segundos
digitalWrite(PIN_UMIDADE, LOW); // Desliga umidade
}
// Tarefa de monitoramento de temperatura
void monitoramentoTemperatura(void *pvParameters) {
float temperatura = 0.0;
while (true) {
// Simula a leitura de temperatura (exemplo fixo de 42ºC)
temperatura = 42.0; // Simular que a temperatura está alta
Serial.print("Temperatura: ");
Serial.println(temperatura);
if (temperatura > TEMPERATURA_LIMITE) {
// Envia notificação para o controle de resfriamento
xSemaphoreGive(semaforoResfriamento);
}
vTaskDelay(500 / portTICK_PERIOD_MS); // Espera 500 ms
}
}
// Tarefa de controle de resfriamento
void controleResfriamentoTarefa(void *pvParameters) {
while (true) {
// Espera a notificação do monitoramento de temperatura
if (xSemaphoreTake(semaforoResfriamento, portMAX_DELAY) == pdTRUE) {
controleResfriamento();
}
}
}
// Tarefa de monitoramento de umidade
void monitoramentoUmidade(void *pvParameters) {
float umidade = 50.0;
while (true) {
// Simula a leitura de umidade
umidade = (rand() % 100); // Simula valor de umidade aleatória entre 0 e 100
Serial.print("Umidade: ");
Serial.println(umidade);
if (umidade < UMIDADE_LIMITE) {
// Envia notificação para o controle de umidade
xSemaphoreGive(semaforoUmidade);
}
vTaskDelay(700 / portTICK_PERIOD_MS); // Espera 700 ms
}
}
// Tarefa de controle de umidade
void controleUmidadeTarefa(void *pvParameters) {
while (true) {
// Espera a notificação do monitoramento de umidade
if (xSemaphoreTake(semaforoUmidade, portMAX_DELAY) == pdTRUE) {
controleUmidade();
}
}
}
void setup() {
Serial.begin(115200);
// Configura pinos dos LEDs
pinMode(PIN_RESFRIAMENTO, OUTPUT);
pinMode(PIN_UMIDADE, OUTPUT);
// Cria os semáforos binários
semaforoResfriamento = xSemaphoreCreateBinary();
semaforoUmidade = xSemaphoreCreateBinary();
// Cria as tarefas
xTaskCreatePinnedToCore(monitoramentoTemperatura, "Monitoramento Temperatura", 2048, NULL, 1, NULL, 0);
xTaskCreatePinnedToCore(controleResfriamentoTarefa, "Controle Resfriamento", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(monitoramentoUmidade, "Monitoramento Umidade", 2048, NULL, 1, NULL, 0);
xTaskCreatePinnedToCore(controleUmidadeTarefa, "Controle Umidade", 2048, NULL, 1, NULL, 1);
}
void loop() {
// O loop principal não precisa de código adicional, pois as tarefas FreeRTOS já estão sendo executadas
}