#include <Arduino.h>
#include <Arduino_FreeRTOS.h>
#include <task.h>
#include <semphr.h>
// Pin untuk tombol dan LED
const int buttonPin = 2;
const int ledPin1 = 13;
const int ledPin2 = 12;
const int ledPin3 = 11; // Tambahkan LED3
// Semaphore untuk mengelola akses antara task
SemaphoreHandle_t ledSemaphore;
// Flag untuk status LED
bool ledFlag1 = false;
bool ledFlag2 = false;
bool ledFlag3 = false; // Tambahkan flag untuk LED3
// Handle untuk task LED
TaskHandle_t led1TaskHandle;
TaskHandle_t led2TaskHandle;
TaskHandle_t led3TaskHandle; // Handle untuk LED3
// Task untuk LED 1 (Prioritas Tinggi)
void led1Task(void *pvParameters) {
for (;;) {
ledFlag1 = !ledFlag1; // Toggle LED 1
digitalWrite(ledPin1, ledFlag1 ? HIGH : LOW);
// Print status LED 1 ke Serial Monitor
Serial.print("Task LED 1: ");
Serial.println(ledFlag1 ? "ON" : "OFF");
xSemaphoreGive(ledSemaphore); // Beri akses ke task lain
vTaskDelay(pdMS_TO_TICKS(1000)); // LED1 berkedip setiap 1 detik
}
}
// Task untuk LED 2 (Prioritas Tinggi)
void led2Task(void *pvParameters) {
for (;;) {
xSemaphoreTake(ledSemaphore, portMAX_DELAY); // Tunggu semaphore
ledFlag2 = !ledFlag2; // Toggle LED 2
digitalWrite(ledPin2, ledFlag2 ? HIGH : LOW);
// Print status LED 2 ke Serial Monitor
Serial.print("Task LED 2 : ");
Serial.println(ledFlag2 ? "ON" : "OFF");
xSemaphoreGive(ledSemaphore); // Lepaskan semaphore
vTaskDelay(pdMS_TO_TICKS(500)); // LED2 berkedip setiap 500 ms
}
}
// Task untuk LED 3 (Tanpa prioritas)
void led3Task(void *pvParameters) {
for (;;) {
// Task ini berjalan tanpa memerlukan semaphore
ledFlag3 = !ledFlag3; // Toggle LED 3
digitalWrite(ledPin3, ledFlag3 ? HIGH : LOW);
// Print status LED 3 ke Serial Monitor
Serial.print("Task LED 3: ");
Serial.println(ledFlag3 ? "ON" : "OFF");
vTaskDelay(pdMS_TO_TICKS(2000)); // LED3 berkedip setiap 2 detik
}
}
void setup() {
// Setup untuk pin LED dan tombol
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT); // Setup untuk LED3
// Membuat semaphore biner
ledSemaphore = xSemaphoreCreateBinary();
Serial.begin(9600);
// Membuat task dengan prioritas tinggi untuk LED1 dan LED2
xTaskCreate(led1Task, "LED1Task", 100, NULL, 2, &led1TaskHandle); // Prioritas 2
xTaskCreate(led2Task, "LED2Task", 100, NULL, 2, &led2TaskHandle); // Prioritas 2
// Membuat task untuk LED3 tanpa prioritas
xTaskCreate(led3Task, "LED3Task", 100, NULL, NULL, &led3TaskHandle); // Prioritas 0
vTaskStartScheduler(); // Memulai scheduler FreeRTOS
}
void loop() {
// Kosong karena semua task berjalan secara paralel
}