/*
Nama: [BENAYA MARCELLINO PUTRA SITORUS]
NIM: [5311422010]
Deskripsi Program:
Program ini menggunakan FreeRTOS pada Arduino Uno yang terdiri dari tiga task:
1. Task pertama untuk membuat LED berkedip dengan periode tertentu.
2. Task kedua untuk membaca nilai ADC dari pin analog selain A0 dan mengirimnya ke serial monitor.
3. Task ketiga untuk mengirimkan Nama Lengkap dan NIM ke serial monitor.
Setiap task memiliki prioritas yang berbeda.
*/
#include <Arduino_FreeRTOS.h> // Library FreeRTOS
// Deklarasi variabel
const int ledPin = 13; // Pin untuk LED Task 1
const int adcPin = A1; // Pin ADC Task 2 (selain A0)
// Deklarasi fungsi-fungsi Task
void TaskBlinkLED(void *pvParameters);
void TaskReadADC(void *pvParameters);
void TaskSendInfo(void *pvParameters);
void setup() {
// Set pin LED sebagai output
pinMode(ledPin, OUTPUT);
// Inisialisasi serial monitor
Serial.begin(9600);
// Membuat Task dengan prioritas yang berbeda
xTaskCreate(TaskBlinkLED, "Blink LED", 128, NULL, 1, NULL); // Prioritas 1
xTaskCreate(TaskReadADC, "Read ADC", 128, NULL, 2, NULL); // Prioritas 2
xTaskCreate(TaskSendInfo, "Send Info", 128, NULL, 3, NULL); // Prioritas 3
}
void loop() {
// FreeRTOS akan mengatur eksekusi Task, jadi tidak ada perintah di loop()
}
// Task 1: Membuat LED berkedip
void TaskBlinkLED(void *pvParameters) {
(void) pvParameters; // Untuk menghindari peringatan kompilasi
TickType_t xLastWakeTime;
// LED blink dengan ariode selain 1000ms (misal 500ms)
xLastWakeTime = xTaskGetTickCount();
// const TickType_t xDelay = 500 / portTICK PERIOD MS;
for (;;) {
// Nyalakan LED
digitalWrite(ledPin, HIGH);
// Tunda selama 500ms
vTaskDelayUntil(&xLastWakeTime, (1000 / portTICK_PERIOD_MS));
// Matikan LED
digitalWrite(ledPin, LOW);
// Tunda lagi selama 500ms
vTaskDelayUntil(&xLastWakeTime, (1000 / portTICK_PERIOD_MS));
// Serial.print("Task 1 (words): ");
//Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}
// Task 2: Membaca nilai ADC dan mengirimkan hasil ke serial monitor
void TaskReadADC(void *pvParameters) {
(void) pvParameters;
for (;;) {
// Baca nilai ADC dari pin A1
int adcValue = analogRead(adcPin);
// Kirim nilai ADC ke serial monitor
Serial.print("ADC Value: ");
Serial.println(adcValue);
// Tunda selama 1000ms
vTaskDelay(1000 / portTICK_PERIOD_MS);
Serial.print("Task 2 (words): ");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}
// Task 3: Mengirim Nama dan NIM ke serial monitor
void TaskSendInfo(void *pvParameters) {
(void) pvParameters;
for (;;) {
// Kirim Nama dan NIM ke serial monitor
Serial.println("Nama: [BENAYA MARCELLINO PUTRA SITORUS]");
Serial.println("NIM: [5311422010]");
// Tunda selama 2000ms
vTaskDelay(2000 / portTICK_PERIOD_MS);
Serial.print("Task 3 (words): ");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}