#include <Arduino.h>
#include <FreeRTOS.h>
// Variabel untuk mengontrol LED blinking
int blinkDelay = 1000;
// Handle untuk Mutex dan Semaphore
SemaphoreHandle_t xMutex;
SemaphoreHandle_t xBinarySemaphore;
// Task untuk membaca input dari serial
void serialInputTask(void *pvParameters) {
char inputString[10];
int newDelay;
while (1) {
if (Serial.available() > 0) {
// Baca input dari serial
int len = Serial.readBytesUntil('\n', inputString, sizeof(inputString) - 1);
inputString[len] = '\0'; // Null-terminate string
newDelay = atoi(inputString); // Konversi input ke integer
// Lindungi akses ke variabel blinkDelay dengan Mutex
if (xSemaphoreTake(xMutex, (TickType_t) 10) == pdTRUE) {
Serial.println("Mutex acquired by Serial Input Task");
blinkDelay = newDelay;
Serial.print("Blink delay set to: ");
Serial.println(blinkDelay);
xSemaphoreGive(xMutex); // Lepaskan mutex
Serial.println("Mutex released by Serial Input Task");
}
// Beri sinyal ke Task output untuk mencetak hasil
xSemaphoreGive(xBinarySemaphore);
Serial.println("Semaphore given by Serial Input Task");
}
vTaskDelay(100 / portTICK_PERIOD_MS); // Delay sebentar
}
}
// Task untuk mengontrol LED blinking
void ledBlinkTask(void *pvParameters) {
int currentDelay;
while (1) {
// Lindungi akses ke variabel blinkDelay dengan Mutex
if (xSemaphoreTake(xMutex, (TickType_t) 10) == pdTRUE) {
Serial.println("Mutex acquired by LED Blink Task");
currentDelay = blinkDelay;
xSemaphoreGive(xMutex); // Lepaskan mutex
Serial.println("Mutex released by LED Blink Task");
}
digitalWrite(LED_BUILTIN, HIGH);
vTaskDelay(currentDelay / portTICK_PERIOD_MS); // Gunakan delay yang dikontrol oleh input
digitalWrite(LED_BUILTIN, LOW);
vTaskDelay(currentDelay / portTICK_PERIOD_MS);
}
}
// Task untuk mengeluarkan output ke serial
void serialOutputTask(void *pvParameters) {
while (1) {
// Tunggu sinyal dari Task input
if (xSemaphoreTake(xBinarySemaphore, portMAX_DELAY) == pdTRUE) {
Serial.println("Semaphore taken by Serial Output Task");
// Output hasil input ke serial monitor
Serial.print("Blink delay updated to: ");
Serial.println(blinkDelay);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
// Buat Mutex dan Semaphore
xMutex = xSemaphoreCreateMutex();
xBinarySemaphore = xSemaphoreCreateBinary();
// Prompt pengguna
Serial.println("Enter blink delay in milliseconds:");
// Buat Task untuk membaca input dari serial
xTaskCreate(serialInputTask, "Serial Input Task", 1024, NULL, 1, NULL);
// Buat Task untuk mengontrol LED blinking
xTaskCreate(ledBlinkTask, "LED Blink Task", 1024, NULL, 1, NULL);
// Buat Task untuk mengeluarkan output ke serial
xTaskCreate(serialOutputTask, "Serial Output Task", 1024, NULL, 1, NULL);
}
void loop() {}