/*
* Nama : Sheva Ekyn Mart
* NIM : 5311422062
* Deskripsi Program: Program ini dibuat untuk mengontrol tiga task menggunakan FreeRTOS.
* Task 1 melakukan kedip LED pada interval yang ditentukan.
* Task 2 membaca nilai ADC dari pin analog A1 dan menampilkan hasilnya di serial monitor.
* Task 3 mengirimkan data berupa Nama dan NIM ke serial monitor.
*/
// Include FreeRTOS library
#include <Arduino_FreeRTOS.h>
// Definisi pin
const int ledPin = 12; // Pin untuk LED pada board Arduino
const int adcPin = A1; // Pin untuk pembacaan ADC, menggunakan pin A1
// Prototipe fungsi Task
void TaskBlinkLED(void *pvParameters); // Fungsi untuk task Blink LED
void TaskReadADC(void *pvParameters); // Fungsi untuk task pembacaan nilai ADC
void TaskSendInfo(void *pvParameters); // Fungsi untuk task pengiriman Nama dan NIM
void setup() {
// Inisialisasi pin LED
pinMode(ledPin, OUTPUT);
// Inisialisasi serial monitor untuk output
Serial.begin(9600);
while (!Serial); // Menunggu serial siap
// Membuat Task untuk LED Blink
xTaskCreate(
TaskBlinkLED, // Fungsi Task yang akan dijalankan
"Blink LED", // Nama Task (untuk debugging)
100, // Alokasi memori stack (128 byte)
NULL, // Parameter untuk Task (tidak ada)
3, // Prioritas Task (prioritas tinggi)
NULL // Handle Task (tidak diperlukan)
);
// Membuat Task untuk pembacaan ADC
xTaskCreate(
TaskReadADC, // Fungsi Task yang akan dijalankan
"Read ADC", // Nama Task
100, // Alokasi memori stack (128 byte)
NULL, // Parameter untuk Task (tidak ada)
2, // Prioritas Task (prioritas menengah)
NULL // Handle Task (tidak diperlukan)
);
// Membuat Task untuk mengirimkan Nama dan NIM
xTaskCreate(
TaskSendInfo, // Fungsi Task yang akan dijalankan
"Send Info", // Nama Task
100, // Alokasi memori stack (128 byte)
NULL, // Parameter untuk Task (tidak ada)
1, // Prioritas Task (prioritas rendah)
NULL // Handle Task (tidak diperlukan)
);
}
void loop() {
// Loop kosong karena FreeRTOS mengambil alih dari sini.
// Semua logika program berada di dalam Task.
}
// Task untuk LED Blink
void TaskBlinkLED(void *pvParameters) {
(void) pvParameters; // Menghindari peringatan tentang parameter yang tidak digunakan
const TickType_t delayLED = 2000 / portTICK_PERIOD_MS; // Periode kedipan LED 2000ms (2 detik)
TickType_t xLastWakeTime = xTaskGetTickCount(); // Mendapatkan waktu tick saat ini sebagai acuan
for (;;) {
// Nyalakan LED
digitalWrite(ledPin, HIGH);
Serial.println("LED ON"); // Menampilkan status LED nyala ke Serial Monitor
vTaskDelayUntil(&xLastWakeTime, delayLED); // Delay dengan presisi hingga waktu yang telah ditentukan
// Matikan LED
digitalWrite(ledPin, LOW);
Serial.println("LED OFF"); // Menampilkan status LED mati ke Serial Monitor
vTaskDelayUntil(&xLastWakeTime, delayLED); // Delay lagi sebelum memulai siklus berikutnya
Serial.print("========== Task 1 Water Mark = ");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}
// Task untuk membaca nilai ADC
void TaskReadADC(void *pvParameters) {
(void) pvParameters; // Menghindari peringatan tentang parameter yang tidak digunakan
TickType_t xLastWakeTime = xTaskGetTickCount(); // Mendapatkan waktu tick saat ini sebagai acuan
const TickType_t delayADC = 1000 / portTICK_PERIOD_MS; // Periode 1000ms (1 detik)
for (;;) {
int adcValue = analogRead(adcPin); // Membaca nilai ADC dari pin A1
Serial.print("Nilai ADC: ");
Serial.println(adcValue); // Menampilkan hasil pembacaan ADC ke Serial Monitor
vTaskDelayUntil(&xLastWakeTime, delayADC); // Delay 1 detik sebelum pembacaan berikutnya
Serial.print("========== Task 2 Water Mark = ");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}
// Task untuk mengirimkan nama dan NIM
void TaskSendInfo(void *pvParameters) {
(void) pvParameters; // Menghindari peringatan tentang parameter yang tidak digunakan
TickType_t xLastWakeTime = xTaskGetTickCount(); // Mendapatkan waktu tick saat ini sebagai acuan
const TickType_t delayINPO = 3000 / portTICK_PERIOD_MS; // Periode 3000ms (3 detik)
for (;;) {
// Mengirimkan Nama dan NIM ke Serial Monitor
Serial.println("Nama: Sheva Ekyn Mart");
Serial.println("NIM : 5311422062");
vTaskDelayUntil(&xLastWakeTime, delayINPO); // Delay 3 detik sebelum pengiriman berikutnya
Serial.print("========== Task 3 Water Mark = ");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}