/*
Nama Lengkap : Dhea Yunita Utari
NIM : 5311422100
Deskripsi : Program ini menggunakan FreeRTOS pada Arduino Uno dan terdiri dari tiga task:
1. Task pertama menyalakan dan mematikan LED (blink) dengan periode kedip selain 1000ms.
2. Task kedua membaca nilai ADC dari pin analog selain A0 dan mengirimkan hasilnya ke serial monitor.
3. Task ketiga mengirimkan "Nama Lengkap" dan "NIM" ke serial monitor.
*/
#include <Arduino_FreeRTOS.h> // Library FreeRTOS
// Definisi pin yang digunakan
const int ledPin = 13; // Pin LED internal
const int adcPin = A1; // Pin ADC untuk pembacaan nilai analog
// Deklarasi fungsi untuk setiap task
void TaskBlinkLED(void *pvParameters); // Task untuk LED blink
void TaskReadADC(void *pvParameters); // Task untuk membaca nilai ADC
void TaskSendData(void *pvParameters); // Task untuk mengirim data berupa Nama dan NIM
// Setup (fungsi setup dijalankan satu kali pada awal program)
void setup() {
// Inisialisasi pin yang digunakan
pinMode(ledPin, OUTPUT); // Pin 13 sebagai output (LED akan berkedip)
pinMode(adcPin, INPUT); // Pin A1 sebagai input (membaca nilai ADC dari potensio)
// Inisialisasi komunikasi serial dengan baurate 9600 untuk mengirim data ke serial monitor
Serial.begin(9600);
// Membuat tiga Task dengan prioritas yang berbeda-beda
xTaskCreate(TaskBlinkLED, "LED Blink", 128, NULL, 3, NULL); // Membuat task LED blink dengan prioritas tertinggi
xTaskCreate(TaskReadADC, "ADC Read", 128, NULL, 2, NULL); // Membuat task pembacaan ADC dengan prioritas sedang
xTaskCreate(TaskSendData, "Send Data", 128, NULL, 1, NULL); // Membuat task pengiriman Nama dan NIM dengan prioritas terendah
}
// Task 1: LED Blink
void TaskBlinkLED(void *pvParameters) {
(void) pvParameters;
const TickType_t xDelay = 500 / portTICK_PERIOD_MS; // Periode kedip 500ms
for (;;) {
digitalWrite(ledPin, HIGH); // Nyalakan LED
vTaskDelay(xDelay); // Tunggu selama 500ms
digitalWrite(ledPin, LOW); // Matikan LED
vTaskDelay(xDelay); // Tunggu lagi selama 500 ms
}
}
// Task 2: Membaca nilai ADC dan mengirim ke Serial Monitor
void TaskReadADC(void *pvParameters) {
(void) pvParameters;
const TickType_t xDelay = 1000 / portTICK_PERIOD_MS; // Periode baca 1000ms
for (;;) {
int adcValue = analogRead(adcPin); // Membaca nilai analog dari pin A1 (range 0-1023)
Serial.print("Nilai ADC dari pin A1: "); // Teks yang akan ditampilkan pada Serial Monitor
Serial.println(adcValue); // Kirim hasil pembacaan ke serial monitor
vTaskDelay(xDelay); // Tunggu selama 1000ms sebelum pembacaan berikutnya
}
}
// Task 3: Mengirim Nama dan NIM ke Serial Monitor
void TaskSendData(void *pvParameters) {
(void) pvParameters;
const TickType_t xDelay = 2000 / portTICK_PERIOD_MS; // Periode kirim 2000ms
for (;;) {
Serial.println("Nama Lengkap: Dhea Yunita Utari"); // Menampilkan Nama Lengkap di serial monitor
Serial.println("NIM: 5311422100"); // Menampilkan NIM di serial monitor
vTaskDelay(xDelay); // Tunggu selama 2000ms sebelum mengirim data lagi
}
}
void loop() {
// Loop kosong karena FreeRTOS menggunakan task
// Fungsi loop() tidak akan dipakai karena semua tugas dikelola oleh FreeRTOS
}