#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <freertos/timers.h>
#include <esp_task_wdt.h>
// Use only core 1 for demo purposes
#if CONFIG_FREERTOS_UNICORE
static const BaseType_t app_cpu = 0;
#else
static const BaseType_t app_cpu = 1;
#endif
// Settings
static const TickType_t dim_delay = 5000 / portTICK_PERIOD_MS;
static const int wdt_timeout_seconds = 6; // Timeout untuk WDT
// Pins (change this if your Arduino board does not have LED_BUILTIN defined)
static const int led_pin = LED_BUILTIN;
// Globals
static TimerHandle_t one_shot_timer = NULL;
//*****************************************************************************
// Callbacks
// Callback untuk mematikan LED saat timer berakhir
void autoDimmerCallback(TimerHandle_t xTimer) {
Serial.println("LED dimming...");
digitalWrite(led_pin, LOW); // Matikan LED
}
//*****************************************************************************
// Tasks
// Task untuk CLI dan kontrol LED
void doCLI(void *parameters) {
char c;
// Konfigurasi pin LED
pinMode(led_pin, OUTPUT);
// Tambahkan task CLI ke dalam WDT
esp_task_wdt_add(NULL); // Tambahkan task ini ke WDT
while (1) {
// Reset WDT untuk task CLI
esp_task_wdt_reset();
// Cek apakah ada input dari serial
if (Serial.available() > 0) {
c = Serial.read();
Serial.print(c);
// Nyalakan LED ketika ada input
digitalWrite(led_pin, HIGH);
// Restart timer jika sedang berjalan, atau mulai timer
if (xTimerIsTimerActive(one_shot_timer)) {
xTimerReset(one_shot_timer, portMAX_DELAY);
} else {
xTimerStart(one_shot_timer, portMAX_DELAY);
}
}
// Tambahkan sedikit delay agar WDT tidak timeout
vTaskDelay(10 / portTICK_PERIOD_MS);
}
}
//*****************************************************************************
// Main
void setup() {
// Konfigurasi Serial
Serial.begin(115200);
// Beri jeda untuk memastikan output Serial tidak terlewat
vTaskDelay(1000 / portTICK_PERIOD_MS);
Serial.println();
Serial.println("---FreeRTOS Timer Solution with WDT---");
// Inisialisasi Watchdog Timer dengan timeout 6 detik
esp_task_wdt_config_t wdt_config = {
.timeout_ms = wdt_timeout_seconds * 1000, // Timeout dalam milidetik
.idle_core_mask = 0, // Memantau semua task idle
.trigger_panic = true // Memicu panic jika timeout
};
esp_task_wdt_init(&wdt_config); // Inisialisasi dengan konfigurasi WDT
// Membuat one-shot timer untuk mematikan LED
one_shot_timer = xTimerCreate(
"One-shot timer", // Nama timer
dim_delay, // Periode timer (dalam ticks)
pdFALSE, // Auto-reload nonaktif
(void *)0, // Timer ID
autoDimmerCallback); // Callback function untuk mematikan LED
// Memulai task CLI pada core yang ditentukan
xTaskCreatePinnedToCore(doCLI,
"Do CLI",
2048,
NULL,
1,
NULL,
app_cpu);
// Hapus task loop setup ini
vTaskDelete(NULL);
}
void loop() {
// Tidak digunakan dalam FreeRTOS ini, tapi perlu reset WDT
esp_task_wdt_reset();
}