// Pinos dos LEDs
#define LED1_PIN 13 // GPI13
#define LED2_PIN 12 // GPI12
#define LED3_PIN 27 // GPI27
#define BUTTON_PIN 33 // GPIO33 (botão para reiniciar o one-shot)
// Handles
TimerHandle_t xAutoReloadTimer1, xAutoReloadTimer2, xOneShotTimer;
TaskHandle_t xButtonTaskHandle;
// Callbacks dos timers
void vAutoReloadCallback1(TimerHandle_t xTimer) {
digitalWrite(LED1_PIN, !digitalRead(LED1_PIN));
Serial.println("Timer Auto-Reload 1: LED1 piscou");
}
void vAutoReloadCallback2(TimerHandle_t xTimer) {
digitalWrite(LED2_PIN, !digitalRead(LED2_PIN));
Serial.println("Timer Auto-Reload 2: LED2 piscou");
}
void vOneShotCallback(TimerHandle_t xTimer) {
digitalWrite(LED3_PIN, LOW);
Serial.println("Timer One-Shot: LED3 desligado");
}
// Função para reiniciar o one-shot
void restartOneShotTimer() {
digitalWrite(LED3_PIN, HIGH);
xTimerReset(xOneShotTimer, 0);
Serial.println("Botão pressionado: Timer One-Shot reiniciado!");
}
// Task do botão (substitui o loop)
void vButtonTask(void *pvParameters) {
bool buttonPressed = false;
while (1) {
if (digitalRead(BUTTON_PIN) == LOW) { // Botão pressionado (LOW por causa do pull-up)
vTaskDelay(pdMS_TO_TICKS(50)); // Debounce simples
if (digitalRead(BUTTON_PIN) == LOW && !buttonPressed) {
buttonPressed = true;
restartOneShotTimer();
}
} else {
buttonPressed = false;
}
vTaskDelay(pdMS_TO_TICKS(10)); // Libera a CPU
}
}
void setup() {
Serial.begin(115200);
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED3_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Cria os timers
xAutoReloadTimer1 = xTimerCreate("AutoReload1", pdMS_TO_TICKS(500), pdTRUE, NULL, vAutoReloadCallback1);
xAutoReloadTimer2 = xTimerCreate("AutoReload2", pdMS_TO_TICKS(1000), pdTRUE, NULL, vAutoReloadCallback2);
xOneShotTimer = xTimerCreate("OneShot", pdMS_TO_TICKS(3000), pdFALSE, NULL, vOneShotCallback);
// Inicia os timers
xTimerStart(xAutoReloadTimer1, 0);
xTimerStart(xAutoReloadTimer2, 0);
xTimerStart(xOneShotTimer, 0);
// Liga o LED3 inicialmente
digitalWrite(LED3_PIN, HIGH);
Serial.println("LED3 ligado. Será desligado pelo One-Shot Timer em 3s...");
// Cria a task do botão (substitui o loop)
xTaskCreate(
vButtonTask, // Função da task
"ButtonTask", // Nome da task (para debug)
2048, // Stack size (em palavras)
NULL, // Parâmetros (NULL)
1, // Prioridade (baixa)
&xButtonTaskHandle // Handle da task
);
}
void loop() {
// Vazio (toda a lógica está nas tasks/timers)
vTaskDelay(pdMS_TO_TICKS(10)); // Libera a CPU
}