/*
Nama Lengkap: Muhammad Daffa Fauzan
NIM: 5311422009
Deskripsi Program: Program ini menggunakan FreeRTOS dengan 3 task yang memiliki prioritas berbeda.
Task pertama mengendalikan LED untuk berkedip, task kedua membaca nilai ADC dari pin analog (selain A0), dan task ketiga mengirimkan data Nama Lengkap dan NIM ke serial monitor.
*/
#include <Arduino_FreeRTOS.h>
// Definisi pin
const int ledPin = 12; // Pin untuk LED
const int analogPin = A2; // Pin analog yang digunakan selain A0
// Variabel untuk penyimpanan data ADC
int adcValue = 0;
// Prototipe task
void TaskBlinkLED(void *pvParameters);
void TaskReadADC(void *pvParameters);
void TaskSendSerial(void *pvParameters);
void setup() {
// Inisialisasi pin LED sebagai output
pinMode(ledPin, OUTPUT);
// Inisialisasi Serial Monitor
Serial.begin(9600);
// Membuat Task
xTaskCreate(TaskBlinkLED, "Blink LED", 128, NULL, 2, NULL); // Task 1 (Prioritas 2)
xTaskCreate(TaskReadADC, "Read ADC", 128, NULL, 1, NULL); // Task 2 (Prioritas 1)
xTaskCreate(TaskSendSerial, "Send Serial", 128, NULL, 3, NULL); // Task 3 (Prioritas 3)
// Memulai FreeRTOS scheduler
vTaskStartScheduler();
}
void loop() {
// Tidak ada kode dalam loop karena FreeRTOS menangani task secara mandiri.
}
// Task 1: Mengedipkan LED
void TaskBlinkLED(void *pvParameters) {
(void) pvParameters;
TickType_t xLastWakeTime;
//const TickType_t xDelay = 500 / portTICK_PERIOD_MS; // Waktu tunda untuk berkedip (500ms)
xLastWakeTime = xTaskGetTickCount();
for (;;) {
digitalWrite(ledPin, HIGH); // Nyalakan LED
//vTaskDelay(xDelay); // Tunda selama 500ms
vTaskDelayUntil( &xLastWakeTime, (1000 / portTICK_PERIOD_MS) );
digitalWrite(ledPin, LOW); // Matikan LED
//vTaskDelay(xDelay); // Tunda selama 500ms
vTaskDelayUntil( &xLastWakeTime, (1000 / portTICK_PERIOD_MS) );
//Serial.print("dodi nangis: ");
//Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}
// Task 2: Membaca nilai ADC dan mengirimkan ke Serial Monitor
void TaskReadADC(void *pvParameters) {
(void) pvParameters;
const TickType_t xDelay = 1000 / portTICK_PERIOD_MS; // Periode pembacaan ADC (1 detik)
for (;;) {
adcValue = analogRead(analogPin); // Membaca nilai dari pin analog A1
Serial.print("ADC Value: ");
Serial.println(adcValue); // Kirim hasil pembacaan ke serial monitor
vTaskDelay(xDelay); // Tunda selama 1 detik
Serial.print("dodi nangis: ");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}
// Task 3: Mengirimkan Nama dan NIM ke Serial Monitor
void TaskSendSerial(void *pvParameters) {
(void) pvParameters;
const TickType_t xDelay = 5000 / portTICK_PERIOD_MS; // Periode pengiriman (5 detik)
for (;;) {
Serial.println("Nama: Muhammad Daffa Fauzan");
Serial.println("NIM: 5311422009");
vTaskDelay(xDelay); // Tunda selama 5 detik
Serial.print("dodi nangis: ");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}