// Definição dos bits do Event Group (1 bit por sensor)
#define TEMPERATURE_READY_BIT (1 << 0) // Bit 0 = Temperatura
#define HUMIDITY_READY_BIT (1 << 1) // Bit 1 = Umidade
#define PRESSURE_READY_BIT (1 << 2) // Bit 2 = Pressão
// Handler do Event Group
EventGroupHandle_t xSensorEventGroup;
// Tarefa: Simula leitura do sensor de temperatura
void vTemperatureTask(void *pvParameters) {
while (1) {
vTaskDelay(pdMS_TO_TICKS(1000)); // Delay de 1 segundo
float temperature = 25.0 + (rand() % 10); // Dummy data (25.0°C a 35.0°C)
Serial.print("[TEMP] Sensor lido: ");
Serial.print(temperature);
Serial.println("°C");
// Sinaliza que a temperatura está pronta
xEventGroupSetBits(xSensorEventGroup, TEMPERATURE_READY_BIT);
}
}
// Tarefa: Simula leitura do sensor de umidade
void vHumidityTask(void *pvParameters) {
while (1) {
vTaskDelay(pdMS_TO_TICKS(1500)); // Delay de 1.5 segundos
float humidity = 60.0 + (rand() % 20); // Dummy data (60% a 80%)
Serial.print("[UMID] Sensor lido: ");
Serial.print(humidity);
Serial.println("%");
// Sinaliza que a umidade está pronta
xEventGroupSetBits(xSensorEventGroup, HUMIDITY_READY_BIT);
}
}
// Tarefa: Simula leitura do sensor de pressão
void vPressureTask(void *pvParameters) {
while (1) {
vTaskDelay(pdMS_TO_TICKS(2000)); // Delay de 2 segundos
float pressure = 1013.0 + (rand() % 10); // Dummy data (1013hPa a 1023hPa)
Serial.print("[PRESS] Sensor lido: ");
Serial.print(pressure);
Serial.println("hPa");
// Sinaliza que a pressão está pronta
xEventGroupSetBits(xSensorEventGroup, PRESSURE_READY_BIT);
}
}
// Tarefa principal: Aguarda todos os sensores e imprime os dados consolidados
void vPrintDataTask(void *pvParameters) {
while (1) {
// Aguarda até que TODOS os bits estejam setados (AND)
EventBits_t xBits = xEventGroupWaitBits(
xSensorEventGroup,
TEMPERATURE_READY_BIT | HUMIDITY_READY_BIT | PRESSURE_READY_BIT,
pdTRUE, // Limpa os bits automaticamente após a espera
pdTRUE, // Espera por TODOS os bits (AND)
portMAX_DELAY
);
// Se chegou aqui, todos os sensores estão prontos!
Serial.println("\n=== DADOS COMPLETOS ===");
Serial.println("Temperatura | Umidade | Pressão");
Serial.println("-----------------------------");
Serial.println("Dados recebidos e consolidados!\n");
}
}
void setup() {
Serial.begin(9600);
// Cria o Event Group
xSensorEventGroup = xEventGroupCreate();
// Cria as tarefas
xTaskCreate(vTemperatureTask, "TempTask", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(vHumidityTask, "HumidityTask", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(vPressureTask, "PressureTask", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(vPrintDataTask, "PrintTask", configMINIMAL_STACK_SIZE, NULL, 2, NULL); // Prioridade maior
}
void loop() {
delay(10);
} // Não usado (o scheduler do FreeRTOS assume o controle)