// Pinos dos LEDs
#define LED1_PIN 13 // GPI13
#define LED2_PIN 12 // GPI12
#define LED3_PIN 27 // GPI27
// Handles dos timers
TimerHandle_t xAutoReloadTimer1, xAutoReloadTimer2, xOneShotTimer;
// Callback do Timer Auto-Reload 1 (pisca LED1 a cada 500ms)
void vAutoReloadCallback1(TimerHandle_t xTimer) {
digitalWrite(LED1_PIN, !digitalRead(LED1_PIN)); // Alterna o estado do LED1
Serial.println("Timer Auto-Reload 1: LED1 piscou");
}
// Callback do Timer Auto-Reload 2 (pisca LED2 a cada 1000ms)
void vAutoReloadCallback2(TimerHandle_t xTimer) {
digitalWrite(LED2_PIN, !digitalRead(LED2_PIN)); // Alterna o estado do LED2
Serial.println("Timer Auto-Reload 2: LED2 piscou");
}
// Callback do Timer One-Shot (liga LED3 por 3 segundos e depois desliga)
void vOneShotCallback(TimerHandle_t xTimer) {
digitalWrite(LED3_PIN, LOW); // Desliga o LED3
Serial.println("Timer One-Shot: LED3 desligado");
}
void setup() {
Serial.begin(115200);
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED3_PIN, OUTPUT);
// Cria os timers:
// 1. Auto-Reload Timer 1 (500ms)
xAutoReloadTimer1 = xTimerCreate(
"AutoReload1",
pdMS_TO_TICKS(500), // Período de 500ms
pdTRUE, // Auto-reload (recorrente)
(void*)0, // ID do timer (opcional)
vAutoReloadCallback1
);
// 2. Auto-Reload Timer 2 (1000ms)
xAutoReloadTimer2 = xTimerCreate(
"AutoReload2",
pdMS_TO_TICKS(1000), // Período de 1000ms
pdTRUE, // Auto-reload
(void*)1, // ID diferente
vAutoReloadCallback2
);
// 3. One-Shot Timer (3000ms)
xOneShotTimer = xTimerCreate(
"OneShot",
pdMS_TO_TICKS(3000), // Período de 3000ms
pdFALSE, // One-shot (não recarrega)
(void*)2,
vOneShotCallback
);
// Inicia os timers
if (xTimerStart(xAutoReloadTimer1, 0) != pdPASS ||
xTimerStart(xAutoReloadTimer2, 0) != pdPASS ||
xTimerStart(xOneShotTimer, 0) != pdPASS) {
Serial.println("Erro ao iniciar timers!");
}
// Liga o LED3 (será desligado pelo one-shot após 3 segundos)
digitalWrite(LED3_PIN, HIGH);
Serial.println("LED3 ligado. Será desligado pelo One-Shot Timer em 3s...");
}
void loop() {
// Nada aqui - os timers rodam em segundo plano!
vTaskDelay(pdMS_TO_TICKS(10)); // Libera a CPU para outras tarefas
}