#include <Arduino_FreeRTOS.h>
#include <queue.h> // Tambahkan header untuk menggunakan queue
// Definisi pin untuk LED dan pin analog selain A0 (A5)
const int ledBiru = 2;
const int InputPotensio = A5;
// Handle untuk setiap task
TaskHandle_t LEDTaskHandle;
TaskHandle_t ADCTaskHandle;
TaskHandle_t InfoTaskHandle;
// Queue handle untuk mengirim data ADC
QueueHandle_t adcQueue;
// Deklarasi fungsi task
void LEDTask(void *pvParameters);
void ReadADCTask(void *pvParameters);
void InfoTask(void *pvParameters);
void setup() {
// Inisialisasi LED pin sebagai output
pinMode(ledBiru, OUTPUT);
// Mulai komunikasi Serial dengan baudrate 9600
Serial.begin(9600);
// Buat queue untuk mengirim data ADC dengan ukuran 5 elemen
adcQueue = xQueueCreate(5, sizeof(int));
if (adcQueue == NULL) {
// Jika queue gagal dibuat
Serial.println("Failed to create ADC Queue.");
while (1); // Berhenti di sini jika gagal
}
// Buat task untuk LED blink
xTaskCreate(
LEDTask, // Fungsi yang akan dijalankan oleh task
"LED Blink", // Nama task untuk identifikasi
128, // Ukuran stack task dalam byte
NULL, // Parameter task (tidak digunakan)
1, // Prioritas task (1 = paling rendah)
&LEDTaskHandle // Handle task untuk manajemen
);
// Buat task untuk membaca nilai ADC
xTaskCreate(
ReadADCTask,"Read ADC",128,NULL,
2, // Prioritas lebih tinggi dari task LED
&ADCTaskHandle
);
// Buat task untuk mengirimkan Nama dan NIM
xTaskCreate(
InfoTask,"Send Info",128,NULL,
3, // Prioritas tertinggi
&InfoTaskHandle
);
// Mulai menjalankan scheduler FreeRTOS
vTaskStartScheduler();
}
void loop() {
// Tidak ada kode di loop() karena FreeRTOS mengelola task secara independen
}
// Task untuk mengontrol LED berkedip (Tugas 1)
void LEDTask(void *pvParameters) {
(void) pvParameters; // Tidak menggunakan parameter
const TickType_t delayTime = 500 / portTICK_PERIOD_MS; // Waktu tunda 500ms
TickType_t xLastWakeTime = xTaskGetTickCount(); // Dapatkan waktu saat ini
while (1) {
// Nyalakan LED
digitalWrite(ledBiru, HIGH);
// Tunggu hingga waktu berikutnya
vTaskDelayUntil(&xLastWakeTime, delayTime);
// Matikan LED
digitalWrite(ledBiru, LOW);
// Tunggu lagi hingga waktu berikutnya
vTaskDelayUntil(&xLastWakeTime, delayTime);
Serial.print("=====================task 1 Water Mark :");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}
// Task untuk membaca data dari ADC dan mengirimkannya ke queue (Tugas 2)
void ReadADCTask(void *pvParameters) {
(void) pvParameters;
const TickType_t delayTime = 1000 / portTICK_PERIOD_MS; // Waktu tunda 1 detik
TickType_t xLastWakeTime = xTaskGetTickCount(); // Dapatkan waktu saat ini
int sensorValue = 0;
while (1) {
// Baca nilai dari pin analog A5
sensorValue = analogRead(InputPotensio);
// Kirimkan nilai yang terbaca ke queue
if (xQueueSend(adcQueue, &sensorValue, portMAX_DELAY) == pdPASS) {
Serial.println("ADC Value terkirim ke Queue.");
}
// Tunggu hingga waktu berikutnya
vTaskDelayUntil(&xLastWakeTime, delayTime);
Serial.print("=====================task 2 Water Mark :");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}
// Task untuk mengirimkan nama, NIM dan mengambil data dari queue untuk ditampilkan (Tugas 3)
void InfoTask(void *pvParameters) {
(void) pvParameters;
const TickType_t delayTime = 2000 / portTICK_PERIOD_MS; // Waktu tunda 2 detik
TickType_t xLastWakeTime = xTaskGetTickCount(); // Dapatkan waktu saat ini
int receivedValue = 0;
while (1) {
// Kirimkan informasi Nama
Serial.println("Name: Hablii Surya P");
// Kirimkan informasi NIM
Serial.println("NIM: 5311422090");
// Coba untuk menerima nilai dari queue
if (xQueueReceive(adcQueue, &receivedValue, 0) == pdPASS) {
Serial.print("ADC Value diterima : ");
Serial.println(receivedValue);
} else {
Serial.println("ADC Value gagal terkirim.");
}
// Tunggu hingga waktu berikutnya
vTaskDelayUntil(&xLastWakeTime, delayTime);
Serial.print("=====================task 3 Water Mark :");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}