#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
// Mendefinisikan prioritas untuk task LED dan task serial monitor
#define LED_TASK_PRIORITY 1
#define INPUT_TASK_PRIORITY 2
// Jika ESP hanya memiliki satu core, gunakan core 0, jika tidak, gunakan core 1
#if CONFIG_FREERTOS_UNICORE
static const BaseType_t app_cpu = 0;
#else
static const BaseType_t app_cpu = 1;
#endif
// Deklarasi handle task untuk mengontrol task LED dan serial monitor
TaskHandle_t LedTaskHandle;
TaskHandle_t SerialTaskHandle;
int ledBlinkInterval = 500; // Interval blink LED default (500ms)
// Task untuk mengontrol LED
void vLedTask(void *parameter) {
pinMode(LED_BUILTIN, OUTPUT); // Set pin LED sebagai output
while (1) { // Loop task LED
digitalWrite(LED_BUILTIN, HIGH); // Nyalakan LED
vTaskDelay(ledBlinkInterval / portTICK_PERIOD_MS); // Delay selama interval
digitalWrite(LED_BUILTIN, LOW); // Matikan LED
vTaskDelay(ledBlinkInterval / portTICK_PERIOD_MS); // Delay selama interval yang sama
}
}
// Task untuk input dari serial monitor
void vSerialMonitorTask(void *parameter) {
while (1) { // Loop task serial monitor
if (Serial.available()) { // Cek apakah ada data yang tersedia di Serial
String input = Serial.readStringUntil('\n');
if (input == "resume") { // Jika input "resume", lanjutkan task LED jika sedang disuspend
if (eTaskGetState(LedTaskHandle) == eSuspended) {
vTaskResume(LedTaskHandle); // resume task LED
Serial.println("LED Task Resumed");
} else {
Serial.println("Failed to resume LED Task: Task already running");
}
}
// Jika input adalah "suspend", hentikan sementara task LED
else if (input == "suspend") {
if (eTaskGetState(LedTaskHandle) != eSuspended) {
vTaskSuspend(LedTaskHandle); // suspend task LED
Serial.println("LED Task Suspended");
} else {
Serial.println("Failed to suspend LED Task: Task already suspended");
}
}
// Jika input adalah "delete", hapus task LED
else if (input == "delete") {
if (eTaskGetState(LedTaskHandle) == eDeleted) {
Serial.println("Failed to delete LED Task: Tasks already deleted");
} else {
vTaskDelete(LedTaskHandle);
Serial.println("LED Task deleted successfully");
}
}
// Jika input adalah angka, ubah interval blink LED
else if (input.toInt() > 0) {
if (eTaskGetState(LedTaskHandle) == eDeleted) {
ledBlinkInterval = input.toInt();
// Buat task LED baru dengan interval baru
xTaskCreatePinnedToCore(
vLedTask,
"Led Task",
1000,
NULL,
LED_TASK_PRIORITY,
&LedTaskHandle,
0);
Serial.print("Created LED Task with new interval: ");
Serial.println(input.toInt());
} else {
Serial.println("Failed to create a new LED Task. Task already exists");
}
} else {
// Jika input tidak valid
Serial.println("Invalid input: Input must be a positive number");
}
}
// Tunda sementara untuk mengurangi beban CPU
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
// Fungsi setup, dipanggil sekali saat perangkat mulai
void setup() {
// Inisialisasi komunikasi Serial
Serial.begin(9600);
// Buat task LED
xTaskCreatePinnedToCore(
vLedTask,
"Led Task",
1024,
NULL,
LED_TASK_PRIORITY,
&LedTaskHandle,
app_cpu);
// Buat task untuk memonitor input Serial
xTaskCreatePinnedToCore(
vSerialMonitorTask,
"Serial Monitor Task",
1024,
NULL,
INPUT_TASK_PRIORITY,
&SerialTaskHandle,
app_cpu);
// Hapus task setup ini, karena tidak diperlukan lagi
vTaskDelete(NULL);
}
// Fungsi loop kosong karena logika utama ditangani oleh task FreeRTOS
void loop() {}Loading
esp32-s2-devkitm-1
esp32-s2-devkitm-1