/*
Nama Lengkap : Salsabila Fatiha Rahma
NIM : 5311422081
Deskripsi Program:
Task 1: LED Blink
Task ini bertanggung jawab mengendalikan LED yang terhubung pada pin 13 (pin LED built-in pada Arduino Uno). LED akan menyala dan mati (blink) dengan interval waktu 500 ms. Program ini menggunakan fungsi digitalWrite() untuk mengatur kondisi HIGH (menyala) dan LOW (mati) pada LED.
Prioritas: 1 (Prioritas terendah)
Interval Waktu: 600 ms (LED menyala 600 ms, mati 600 ms).
Task 2: Pembacaan ADC
Task ini melakukan pembacaan data dari pin analog A1 (selain A0) menggunakan fungsi analogRead(). Nilai yang dibaca dari pin A1 akan dikirim ke Serial Monitor setiap 1 detik. Program ini berfungsi untuk membaca input dari sensor analog (misalnya potensiometer) atau input lainnya yang dihubungkan ke pin analog A1.
Prioritas: 2 (Prioritas menengah)
Interval Waktu: 1 detik (membaca nilai ADC dan mengirim ke Serial Monitor setiap detik).
Task 3: Pengiriman Nama dan NIM
Deskripsi: Task ini bertanggung jawab mengirimkan data dari pemrogram secara berkala ke Serial Monitor berupa "Nama: Salsabila Fatiha Rahma" dan "NIM: 5311422081" setiap 2 detik. Ini berfungsi sebagai task yang memberikan output tetap dengan interval yang lebih jarang dibandingkan task lainnya.
Prioritas: 3 (Prioritas tertinggi)
Interval Waktu: 4 detik (mengirimkan data ke Serial Monitor setiap 4 detik).
*/
#include <Arduino_FreeRTOS.h> // Library FreeRTOS untuk multitasking pada Arduino
// Definisi pin
#define LED_PIN 12 // Pin untuk LED
#define ADC_PIN A1 // Pin untuk pembacaan nilai ADC
// Task Handles untuk mengidentifikasi masing-masing task
TaskHandle_t Task1Handle; // Task Handle untuk Task1 (LED Blink)
TaskHandle_t Task2Handle; // Task Handle untuk Task2 (Pembacaan ADC)
TaskHandle_t Task3Handle; // Task Handle untuk Task3 (Pengiriman Nama dan NIM)
// Fungsi untuk Task 1: LED Blink
// Task ini bertanggung jawab mengendalikan LED pada pin 12 agar berkedip dengan periode 500 ms.
void Task1(void *pvParameters) {
(void) pvParameters; // Tidak menggunakan parameter
pinMode(LED_PIN, OUTPUT); // Mengatur pin LED_PIN sebagai output
while (1) { // Loop tak terbatas untuk menghidupkan dan mematikan LED
digitalWrite(LED_PIN, HIGH); // Menghidupkan LED
vTaskDelay(600 / portTICK_PERIOD_MS); // Menunggu selama 500 ms (LED ON)
digitalWrite(LED_PIN, LOW); // Mematikan LED
vTaskDelay(600 / portTICK_PERIOD_MS); // Menunggu selama 500 ms (LED OFF)
Serial.print("======================Task 1 Water Mark: ");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}
// Fungsi untuk Task 2: Pembacaan ADC
// Task ini bertugas membaca nilai dari pin analog A1 dan menampilkan hasilnya di Serial Monitor.
void Task2(void *pvParameters) {
(void) pvParameters; // Tidak menggunakan parameter
while (1) { // Loop tak terbatas untuk pembacaan ADC
int adcValue = analogRead(ADC_PIN); // Membaca nilai ADC dari pin A1
Serial.print("Nilai ADC dari pin A1: "); // Menampilkan teks deskriptif
Serial.println(adcValue); // Menampilkan nilai ADC yang dibaca
vTaskDelay(1000 / portTICK_PERIOD_MS); // Menunggu selama 1 detik sebelum pembacaan berikutnya
Serial.print("======================Task 2 Water Mark: ");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}
// Fungsi untuk Task 3: Pengiriman Nama dan NIM
// Task ini bertugas mengirimkan Nama dan NIM ke Serial Monitor setiap 5 detik.
void Task3(void *pvParameters) {
(void) pvParameters; // Tidak menggunakan parameter
while (1) { // Loop tak terbatas untuk mengirimkan data ke Serial Monitor
Serial.println("Nama: Salsabila Fatiha Rahma"); // Menampilkan Nama di Serial Monitor
Serial.println("NIM: 5311422081"); // Menampilkan NIM di Serial Monitor
vTaskDelay(4000 / portTICK_PERIOD_MS); // Menunggu selama 4 detik sebelum pengiriman berikutnya
Serial.print("======================Task 3 Water Mark: ");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}
void setup() {
// Menginisialisasi komunikasi serial dengan baud rate 9600
Serial.begin(9600);
// Membuat Task dengan prioritas berbeda menggunakan xTaskCreate
// Membuat Task1 (LED Blink) dengan prioritas 1
xTaskCreate(Task1, "LED Blink", 90, NULL, 1, &Task1Handle);
// Membuat Task2 (Read ADC) dengan prioritas 2
xTaskCreate(Task2, "Read ADC", 90, NULL, 2, &Task2Handle);
// Membuat Task3 (Send Info) dengan prioritas 3
xTaskCreate(Task3, "Send Info", 90, NULL, 3, &Task3Handle);
// Memulai scheduler FreeRTOS untuk mulai menjalankan task-task yang telah dibuat
vTaskStartScheduler();
}
// Fungsi loop() kosong karena FreeRTOS akan menangani penjadwalan task secara otomatis
void loop() {
// Tidak digunakan dalam program FreeRTOS
}