/*
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
#include <queue.h> // Library FreeRTOS
QueueHandle_t integerQueue;
// 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);
integerQueue = xQueueCreate(10, // Queue length
sizeof(int) // Queue item size
);
// 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
for (;;) {
// Nyalakan LED
digitalWrite(ledPin, HIGH);
// Tunda selama 500ms
vTaskDelay(500 / portTICK_PERIOD_MS);
// Matikan LED
digitalWrite(ledPin, LOW);
// Tunda lagi selama 500ms
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
// 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);
if (xQueueSend(integerQueue, &adcValue , portMAX_DELAY)==pdPASS){
Serial.println("Data Terkirim");}
// Tunda selama 1000ms
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
// Task 3: Mengirim Nama dan NIM ke serial monitor
void TaskSendInfo(void *pvParameters) {
(void) pvParameters;
int valueFromQueue = 0;
for (;;) {
// Kirim Nama dan NIM ke serial monitor
Serial.println("Nama: [Rizal Budi Santoso]");
Serial.println("NIM: [5311422032]");
if (xQueueReceive(integerQueue, &valueFromQueue, portMAX_DELAY) == pdPASS) {
Serial.print ("ADC Value From Queue : ");
Serial.println(valueFromQueue);
// Tunda selama 2000ms
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}}