/*
Nama: Yufa Rian Isnanto
NIM: 5311422035
Deskripsi Program:
Program ini menggunakan FreeRTOS pada Arduino Uno dengan tiga task berbeda.
Task pertama akan melakukan blink LED dengan periode 4000 ms (HIGH selama 4000 ms, kemudian LOW selama 4000 ms).
Task kedua membaca nilai ADC dibaca dari pin analog A4, kemudian hasilnya dikirim ke Serial Monitor setiap 1000 ms.
Task ketiga mengirimkan data berupa "Yufa Rian Isnanto" dan "5311422035" ke Serial Monitor.
*/
#include <Arduino_FreeRTOS.h>
// Pin dan definisi variabel
const int ledPin = 13; // Pin untuk LED
const int adcPin = A4; // Pin untuk pembacaan ADC
int adcValue = 0; // Variabel untuk menyimpan nilai ADC
// Deklarasi fungsi Task
void TaskBlink(void *pvParameters);
void TaskReadADC(void *pvParameters);
void TaskSendSerial(void *pvParameters);
void setup() {
// Inisialisasi pin LED
pinMode(ledPin, OUTPUT);
// Inisialisasi komunikasi Serial
Serial.begin(9600);
// Membuat task untuk LED Blink dengan prioritas 1
xTaskCreate(TaskBlink, "LED Blink", 128, NULL, 1, NULL);
// Membuat task untuk pembacaan ADC dengan prioritas 2
xTaskCreate(TaskReadADC, "Read ADC", 128, NULL, 2, NULL);
// Membuat task untuk pengiriman data Serial dengan prioritas 3
xTaskCreate(TaskSendSerial, "Send Serial", 128, NULL, 3, NULL);
}
void loop() {
// Tidak ada yang dilakukan di loop(), semua dilakukan oleh task
}
// Task pertama: Blink LED dengan periode 4000 ms
void TaskBlink(void *pvParameters) {
(void) pvParameters;
TickType_t xLastWakeTime;
xLastWakeTime = xTaskGetTickCount();
for (;;) {
digitalWrite(ledPin, HIGH); // LED On
vTaskDelayUntil( &xLastWakeTime, ( 1000 / portTICK_PERIOD_MS) ); // Tunda 4000 ms
digitalWrite(ledPin, LOW); // LED Off
vTaskDelayUntil( &xLastWakeTime, ( 1000 / portTICK_PERIOD_MS) ); // Tunda 4000 ms
Serial.print("=Task pertama: ");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}
// Task kedua: Membaca nilai ADC dari pin analog A4, kemudian hasilnya dikirim ke Serial Monitor setiap 1000 ms.
void TaskReadADC(void *pvParameters) {
(void) pvParameters;
for (;;) {
adcValue = analogRead(adcPin); // Membaca nilai ADC
Serial.print("Nilai ADC: ");
Serial.println(adcValue); // Kirim hasil pembacaan ke Serial Monitor
vTaskDelay(1000 / portTICK_PERIOD_MS); // Tunda 1000 ms
Serial.print("Task kedua: ");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}
// Task ketiga: Mengirim nama dan NIM ke Serial Monitor
void TaskSendSerial(void *pvParameters) {
(void) pvParameters;
for (;;) {
Serial.println("Yufa Rian Isnanto");
Serial.println("5311422035");
vTaskDelay(2000 / portTICK_PERIOD_MS); // Tunda 2000 ms
Serial.print("Task ketiga: ");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}