#include <Arduino.h>
// --- Піни ---
#define LED1 PA0
#define LED2 PA1
#define LED3 PA2
#define LED4 PA3
#define BUTTON PA4
#define PWM_OUT PA5
// --- LED ---
bool ledState = false;
int blinkFreq = 1;
unsigned long lastBlink = 0;
unsigned long blinkInterval = 500;
// --- Semaphore (імітація) ---
bool buttonPressed = false;
// --- Команди (імітація Queue) ---
enum SignalType { NONE, SIN, RAMP };
struct SignalCmd {
SignalType type;
uint16_t freq; // Hz
};
SignalCmd commandQueue[3];
int commandIndex = 0;
unsigned long lastCmdTime = 0;
// --- Таблиця синуса 32 точки ---
const uint8_t sinTable[32] = {
128,152,176,198,218,234,246,253,
255,253,246,234,218,198,176,152,
128,104,80,58,38,22,10,3,
0,3,10,22,38,58,80,104
};
// --- Поточний сигнал ---
SignalCmd currentSignal = {NONE,0};
uint8_t sinIndex=0;
uint8_t rampValue=0;
// -------------------- BUTTON ISR --------------------
void buttonISR(){
buttonPressed = true;
}
// -------------------- LED Task --------------------
void LED_Task(){
unsigned long now = millis();
if(now - lastBlink >= blinkInterval){
lastBlink = now;
ledState = !ledState;
digitalWrite(LED1, ledState);
digitalWrite(LED2, ledState);
digitalWrite(LED3, ledState);
digitalWrite(LED4, ledState);
}
// Semaphore для кнопки
if(buttonPressed){
buttonPressed = false;
if(blinkFreq == 1){ blinkFreq=2; blinkInterval=250; }
else { blinkFreq=1; blinkInterval=500; }
}
}
// -------------------- Command Task --------------------
void Command_Task(){
unsigned long now = millis();
if(now - lastCmdTime >= 5000 && commandIndex < 3){
// Імітація команд: SIN, RAMP, STOP
if(commandIndex == 0) currentSignal = {SIN,500};
else if(commandIndex == 1) currentSignal = {RAMP,500};
else if(commandIndex == 2) currentSignal = {NONE,0};
commandIndex++;
lastCmdTime = now;
}
}
// -------------------- Signal Task --------------------
void Signal_Task(){
if(currentSignal.type == NONE){
analogWrite(PWM_OUT,0);
}else if(currentSignal.type == SIN){
analogWrite(PWM_OUT, sinTable[sinIndex]);
sinIndex = (sinIndex+1)%32;
}else if(currentSignal.type == RAMP){
analogWrite(PWM_OUT, rampValue);
rampValue+=8;
}
}
// -------------------- SETUP --------------------
void setup(){
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
pinMode(LED3,OUTPUT);
pinMode(LED4,OUTPUT);
pinMode(BUTTON,INPUT_PULLUP);
pinMode(PWM_OUT,OUTPUT);
attachInterrupt(digitalPinToInterrupt(BUTTON), buttonISR, FALLING);
analogWrite(PWM_OUT,0);
// Ініціалізація команд
commandIndex = 0;
lastCmdTime = millis();
}
// -------------------- LOOP --------------------
void loop(){
LED_Task(); // "FreeRTOS Task" 1
Command_Task(); // "FreeRTOS Task" 2
Signal_Task(); // "FreeRTOS Task" 3
}