#include <Arduino.h>
#include <STM32FreeRTOS.h>
#define LED_BLINK D10
#define LED_BUTTON D11
#define LED_FIBO D12
#define BUTTON_PIN A3
volatile int fibIndex = 1;
// =====================================================
// FIBONACCI FUNCTION
// =====================================================
unsigned long fibonacci(int n) {
if (n <= 1)
return n;
uint64_t a = 0;
uint64_t b = 1;
uint64_t c;
for (int i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return b;
}
// =====================================================
// BLINK TASK (1 Hz)
// =====================================================
void blinkTask(void *pvParameters) {
pinMode(LED_BLINK, OUTPUT);
while (1) {
digitalWrite(LED_BLINK, HIGH);
vTaskDelay(pdMS_TO_TICKS(500));
digitalWrite(LED_BLINK, LOW);
vTaskDelay(pdMS_TO_TICKS(500));
}
}
// =====================================================
// BUTTON TASK
// =====================================================
void buttonTask(void *pvParameters) {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_BUTTON, OUTPUT);
while (1) {
if (digitalRead(BUTTON_PIN) == LOW) {
digitalWrite(LED_BUTTON, HIGH);
} else {
digitalWrite(LED_BUTTON, LOW);
}
vTaskDelay(pdMS_TO_TICKS(10));
}
}
// =====================================================
// FIBONACCI TASK (PULSE INDICATOR)
// =====================================================
void fibonacciTask(void *pvParameters) {
pinMode(LED_FIBO, OUTPUT);
while (1) {
// LED OFF sebelum compute
digitalWrite(LED_FIBO, LOW);
unsigned long startTime = micros();
unsigned long result = fibonacci(fibIndex);
unsigned long endTime = micros();
// =================================================
// PULSE INDICATOR (SOLUSI UTAMA)
// =================================================
digitalWrite(LED_FIBO, HIGH);
vTaskDelay(pdMS_TO_TICKS(30)); // pulse ON singkat
digitalWrite(LED_FIBO, LOW); // langsung OFF
// =================================================
// SERIAL OUTPUT
// =================================================
Serial.print("Fib(");
Serial.print(fibIndex);
Serial.print(") = ");
Serial.print(result);
Serial.print(" | Time = ");
Serial.print(endTime - startTime);
Serial.println(" us");
fibIndex++;
// delay antar perhitungan (0.1 detik)
vTaskDelay(pdMS_TO_TICKS(100));
}
}
// =====================================================
// SETUP
// =====================================================
void setup() {
Serial.begin(115200);
xTaskCreate(blinkTask, "Blink", 128, NULL, 1, NULL);
xTaskCreate(buttonTask, "Button", 128, NULL, 1, NULL);
xTaskCreate(fibonacciTask, "Fibo", 256, NULL, 1, NULL);
vTaskStartScheduler();
}
// =====================================================
// LOOP (tidak dipakai)
// =====================================================
void loop() {
}