/*
Nama Lengkap: M. Cahyo Nugroho
NIM: 5311422023
Deskripsi Program:
Program ini menggunakan FreeRTOS pada Arduino Uno yang terdiri dari tiga task dengan prioritas berbeda:
- Task pertama melakukan LED blink dengan periode tertentu.
- Task kedua membaca nilai ADC dari beberapa pin Analog (A1, A2, A3) dan membuktikan bahwa hanya pin A1 yang memiliki nilai, sementara pin lainnya 0.
- Task ketiga mengirimkan data Nama dan NIM pemrogram ke Serial Monitor.
*/
#include <Arduino_FreeRTOS.h>
// Definisi pin LED dan pin analog
const int ledPin = 13; // Pin LED
const int analogPin1 = A1; // Pin analog untuk pembacaan ADC (A1)
const int analogPin2 = A2; // Pin analog tambahan untuk pengecekan (A2)
const int analogPin3 = A3; // Pin analog tambahan untuk pengecekan (A3)
// Variabel untuk menyimpan hasil pembacaan ADC
int adcValue1;
int adcValue2;
int adcValue3;
// Task Handles
TaskHandle_t Task1_Handle;
TaskHandle_t Task2_Handle;
TaskHandle_t Task3_Handle;
// Task 1: LED Blink
void Task1(void *pvParameters) {
(void) pvParameters;
// Setup pin LED sebagai output
pinMode(ledPin, OUTPUT);
for (;;) {
digitalWrite(ledPin, HIGH); // LED ON
vTaskDelay(500 / portTICK_PERIOD_MS); // Tunggu 500ms
digitalWrite(ledPin, LOW); // LED OFF
vTaskDelay(500 / portTICK_PERIOD_MS); // Tunggu 500ms
}
}
// Task 2: Baca ADC dari beberapa pin dan kirim hasilnya ke Serial Monitor
void Task2(void *pvParameters) {
(void) pvParameters;
for (;;) {
// Baca nilai ADC dari pin A1, A2, A3
adcValue1 = analogRead(analogPin1); // Baca nilai ADC dari pin A1
adcValue2 = analogRead(analogPin2); // Baca nilai ADC dari pin A2
adcValue3 = analogRead(analogPin3); // Baca nilai ADC dari pin A3
// Kirim hasil pembacaan ke Serial Monitor
Serial.print("Nilai ADC dari pin A1: ");
Serial.println(adcValue1); // Nilai dari A1
Serial.print("Nilai ADC dari pin A2: ");
Serial.println(adcValue2); // Nilai dari A2, diharapkan 0
Serial.print("Nilai ADC dari pin A3: ");
Serial.println(adcValue3); // Nilai dari A3, diharapkan 0
vTaskDelay(1000 / portTICK_PERIOD_MS); // Tunggu 1 detik sebelum membaca lagi
}
}
// Task 3: Kirim Nama Lengkap dan NIM ke Serial Monitor
void Task3(void *pvParameters) {
(void) pvParameters;
for (;;) {
Serial.println("Nama Lengkap: M. Cahyo Nugroho");
Serial.println("NIM: 5311422023");
vTaskDelay(2000 / portTICK_PERIOD_MS); // Tunggu 2 detik sebelum mengirim lagi
}
}
void setup() {
// Inisialisasi komunikasi Serial
Serial.begin(9600);
while (!Serial) {
; // Tunggu hingga serial terhubung
}
// Buat Task 1 (LED Blink) dengan prioritas 1
xTaskCreate(
Task1, // Fungsi Task1
"Task1", // Nama task
128, // Alokasi stack dalam byte
NULL, // Parameter yang akan dikirimkan ke task
1, // Prioritas task
&Task1_Handle // Handle untuk Task1
);
// Buat Task 2 (Baca ADC) dengan prioritas 2
xTaskCreate(
Task2, // Fungsi Task2
"Task2", // Nama task
128, // Alokasi stack dalam byte
NULL, // Parameter yang akan dikirimkan ke task
2, // Prioritas task
&Task2_Handle // Handle untuk Task2
);
// Buat Task 3 (Kirim Nama & NIM) dengan prioritas 3
xTaskCreate(
Task3, // Fungsi Task3
"Task3", // Nama task
128, // Alokasi stack dalam byte
NULL, // Parameter yang akan dikirimkan ke task
3, // Prioritas task
&Task3_Handle // Handle untuk Task3
);
}
void loop() {
// Tidak ada kode di loop(), FreeRTOS menangani task scheduling
}