#include <Arduino.h>
// Definições de hardware
#define LED_PIN 2
#define TRIG_PIN 4
#define ECHO_PIN 5
// Handles das tarefas
TaskHandle_t task1Handle, task2Handle, task3Handle;
// Tarefa 1: Monitoramento de sensor crítico (Alta Prioridade)
void sensorCriticoTask(void *param) {
TickType_t lastWakeTime = xTaskGetTickCount();
while (1) {
// Simula leitura de valor crítico
int valorSensor = analogRead(34); // Exemplo de leitura (pode ser aleatória)
if (valorSensor > 2000) { // Condição de risco simulada
digitalWrite(LED_PIN, HIGH); // Alarme visual
Serial.printf("[%lu ms] ALERTA: Valor crítico detectado: %d\n", millis(), valorSensor);
} else {
digitalWrite(LED_PIN, LOW);
}
vTaskDelayUntil(&lastWakeTime, pdMS_TO_TICKS(100)); // Periodicidade garantida
}
}
// Tarefa 2: Aquisição de dados (Média Prioridade)
void aquisicaoDadosTask(void *param) {
TickType_t lastWakeTime = xTaskGetTickCount();
while (1) {
// Envia trigger ultrassônico
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Mede tempo do eco
long duration = pulseIn(ECHO_PIN, HIGH);
float distancia = duration * 0.034 / 2;
Serial.printf("[%lu ms] Distância medida: %.2f cm\n", millis(), distancia);
vTaskDelayUntil(&lastWakeTime, pdMS_TO_TICKS(500));
}
}
// Função Fibonacci (para simular carga pesada)
int fibonacci(int n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
// Tarefa 3: Processamento histórico (Baixa Prioridade)
void processamentoHistoricoTask(void *param) {
TickType_t lastWakeTime = xTaskGetTickCount();
while (1) {
Serial.printf("[%lu ms] Iniciando processamento histórico\n", millis());
// Simula carga de CPU: cálculo Fibonacci
int resultado = fibonacci(30); // Ajustar para mais/menos carga
// Simula atraso artificial (não bloqueante)
for (volatile int j = 0; j < 50000; j++);
Serial.printf("[%lu ms] Resultado do processamento: %d\n", millis(), resultado);
vTaskDelayUntil(&lastWakeTime, pdMS_TO_TICKS(1000));
}
}
void setup() {
Serial.begin(115200);
delay(1000);
// Configura os pinos
pinMode(LED_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Criação das tarefas com prioridades (Rate-Monotonic)
xTaskCreate(sensorCriticoTask, "Sensor Critico", 2048, NULL, 3, &task1Handle); // Maior prioridade
xTaskCreate(aquisicaoDadosTask, "Aquisição", 2048, NULL, 2, &task2Handle);
xTaskCreate(processamentoHistoricoTask, "Histórico", 4096, NULL, 1, &task3Handle); // Menor prioridade
}
void loop() {
// Não utilizado - FreeRTOS gerencia o sistema
}