/*
NAMA LENGKAP : BAYU ADI PAMBUDI
NIM : 5311422103
Deskripsi Program : Program ini mencakup 3 task dengan prioritas berbeda. Diantaranya adalah:
1. Task pertama, melakukan program LED Blink (kedip) dengan periode selain 1000ms.
2. Task kedua, membaca nilai ADC dari pin analog selain dari pin analog 0 dan mengirimkan hasilnya ke serial monitor.
3. Task ketiga, pengiriman secara berkala data "Nama Lengkap" dan "NIM" ke serial monitor.
*/
#include <Arduino_FreeRTOS.h>
// Definisi Pin
#define LED_PIN 13 // Pin untuk LED Blink (pin 13 sebagai LED built-in di Arduino Uno)
#define ANALOG_PIN A5 // Pin Analog pada A5
// Task Function Prototypes
void TaskBlink(void *pvParameters); // Tugas untuk menyalakan blink
void TaskAnalogRead(void *pvParameters); // Tugas membaca signal analog
void TaskNameNIM(void *pvParameters); // Tugas menampilkan Nama Lengkap dan NIM
// Variabel ADC
int analogValue = 0;
void setup()
{
// Serial Komunikasi pada Serial Monitor
Serial.begin(9600);
// Mengatur LED_PIN MODE = OUTPUT
pinMode(LED_PIN, OUTPUT);
// Task LED Blink
xTaskCreate(
TaskBlink,
"Task Blink", // Nama Task
128, // Ukuran memori
NULL,
3, // Prioritas task tertinggi dibandingkan dengan task lainnya
NULL);
// Task Pembacaan nilai analog
xTaskCreate(
TaskAnalogRead,
"Task Analog Read", // Nama task
128, // Ukuran memori
NULL,
2, // Prioritas task tertinggi nomor 2 dibandingkan dengan task lainnya
NULL);
// Task mengirimkan Nama Lengkap dan NIM
xTaskCreate(
TaskNameNIM,
"Task Send Info", // Nama Task
128, // Ukuran memori
NULL,
1, // Prioritas task terendah dibandingkan dengan task lainnya
NULL);
}
// Void loop kosongkan!
void loop()
{
}
// Task 1 - LED Blink
void TaskBlink(void *pvParameters)
{
// Variabel untuk menyimpan waktu terakhir task berjalan
TickType_t xLastWakeTime = xTaskGetTickCount();
// Periode delay untuk task (2000 ms)
const TickType_t xFrequency = 2000 / portTICK_PERIOD_MS;
for(;;)
{
digitalWrite(LED_PIN, HIGH); // LED ON
Serial.println("LED ON");
vTaskDelayUntil(&xLastWakeTime, xFrequency); // Delay hingga waktu berikutnya
digitalWrite(LED_PIN, LOW); // LED OFF
Serial.println("LED OFF");
vTaskDelayUntil(&xLastWakeTime, xFrequency); // Delay hingga waktu berikutnya
}
}
// Task 2 - Pembacaan nilai Analog
void TaskAnalogRead(void *pvParameters)
{
// Variabel untuk menyimpan waktu terakhir task berjalan
TickType_t xLastWakeTime = xTaskGetTickCount();
// Periode delay untuk task (500 ms)
const TickType_t xFrequency = 500 / portTICK_PERIOD_MS;
for(;;)
{
analogValue = analogRead(ANALOG_PIN); // Membaca nilai analog dari pin A5
Serial.print("Nilai Analog : ");
Serial.println(analogValue); // Menampilkan nilai analog ke Serial Monitor
vTaskDelayUntil(&xLastWakeTime, xFrequency); // Delay hingga waktu berikutnya
}
}
// Task 3 - Mengirim Nama dan NIM ke Serial Monitor
void TaskNameNIM(void *pvParameters)
{
// Variabel untuk menyimpan waktu terakhir task berjalan
TickType_t xLastWakeTime = xTaskGetTickCount();
// Periode delay untuk task (3000 ms)
const TickType_t xFrequency = 3000 / portTICK_PERIOD_MS;
for(;;)
{
Serial.println("BAYU ADI PAMBUDI 5311422103"); // Data yang ditampilkan pada Serial Monitor
vTaskDelayUntil(&xLastWakeTime, xFrequency); // Delay hingga waktu berikutnya
}
}
/*
Kesimpulan setelah melakukan percobaan dengan website WOKWI adalah:
1. Prioritas yang dilakukan oleh FREERTOS sesuai dengan program yang telah disettings. Dilakukan terlebih dahulu menyalakan LED untuk blink lalu dilanjutkan pembacaan nilai analog dan yang terakhir menampilkan Nama Lengkap dan NIM.
2. Penjadwalan sesuai dengan program. Dengan mengambil Sample waktu selama 6.239 detik maka:
A. Mulai dari blink LED bekerja LED ON > LED OFF > LED ON > LED OFF. Berarti waktu kerja sesuai dengan settingnya 2000 ms x 4 perintah = 8000 ms. Waktu off akan hingga detik ke 8.
B. Nilai Analog muncul sebanyak 13x dengan waktu delay 500 ms setiap task. Maka waktu total yang dilakukannya adalah sebesar 6500 ms. Berarti masuk ke waktu jalannya program selama 6239 ms.
C. Pengiriman Nama Lengkap dan NIM muncul sebanyak 3x dengan waktu delay setiap task adalah 3000 ms. Maka waktu total yang dikerjakan oleh task tersebut adalah 9000ms. sebelum detik ke-9, jumlah task untuk menampilkan Nama dan NIM adalah 3. Karena waktu sudah 6 detik lebih, maka menampilkan task sebanyak 3.
*/
/*
Saat setelah di compile menggunakan arduino IDE, dapat terlihat seberapa banyak penyimpanan yang digunakan untuk program diatas. hasilnya adalah sebagai berikut:
Sketch uses 8700 bytes (26%) of program storage space. Maximum is 32256 bytes.
Global variables use 449 bytes (21%) of dynamic memory, leaving 1599 bytes for local variables. Maximum is 2048 bytes.
*/