#include <Arduino.h>
// Pinagem dos componentes
#define LED_PIN 2 //LED p/ tarefa 1
#define TRIG_PIN 4 //Trig do ultrassom da tarefa 2
#define ECHO_PIN 5 //echo do ultrassom da tarefa 2
// 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); // Usei um potenciomentro para simular.
if (valorSensor > 2000) { // Condição de risco simulada
digitalWrite(LED_PIN, HIGH); // Alarme visual com LED
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; //Formula para converter o tempo em distancia.
Serial.printf("[%lu ms] Distância medida: %.2f cm\n", millis(), distancia);
vTaskDelayUntil(&lastWakeTime, pdMS_TO_TICKS(500)); //Executa a cada 500ms
}
}
// Função Fibonacci (para simular carga na CPU)
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); // Simula carga calculando o 30 numero fibonacci
// Simula atraso artificial
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)); //Executa a cada 1000ms
}
}
void setup() {
Serial.begin(115200);
delay(1000);
// Configuracao de pinos.
pinMode(LED_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Criação das tarefas com prioridades (Rate-Monotonic). O quinto parametro é a prioridade.
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() {
//Aqui está vazio, pois, o controle é executado pelo freeRTOS
}