#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;
// --- Сигнали ---
enum SignalType { NONE, SIN, RAMP };
SignalType signalMode = NONE;
float signalFreq = 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
};
uint8_t sinIndex = 0;
// --- Рамп генератор ---
uint8_t rampValue = 0;
// --- Таймери ---
unsigned long lastSignal = 0;
const int sampleRate = 2000; // 2 kHz
// --- Тестові команди ---
int currentCmd = 0;
unsigned long lastCmdTime = 0;
// -------------------- TASK: LED --------------------
void taskLED() {
unsigned long now = millis();
if (now - lastBlink >= blinkInterval) {
lastBlink = now;
ledState = !ledState;
digitalWrite(LED1, ledState);
digitalWrite(LED2, ledState);
digitalWrite(LED3, ledState);
digitalWrite(LED4, ledState);
}
static bool lastBtn = HIGH;
bool btn = digitalRead(BUTTON);
if (btn == LOW && lastBtn == HIGH) {
if (blinkFreq == 1) {
blinkFreq = 2; blinkInterval = 250;
} else {
blinkFreq = 1; blinkInterval = 500;
}
}
lastBtn = btn;
}
// -------------------- TASK: COMMAND --------------------
void taskCommand() {
unsigned long now = millis();
if (now - lastCmdTime > 5000) {
if (currentCmd == 0) { signalMode = SIN; signalFreq = 500; } // SIN 0.5 kHz
else if (currentCmd == 1) { signalMode = RAMP; signalFreq = 500; } // RAMP 0.5 kHz
else if (currentCmd == 2) { signalMode = NONE; analogWrite(PWM_OUT, 0); } // STOP
currentCmd++;
lastCmdTime = now;
}
}
// -------------------- TASK: SIGNAL --------------------
void taskSignal() {
if (signalMode == NONE) return;
unsigned long now = micros();
if (now - lastSignal >= (1000000 / sampleRate)) {
lastSignal = now;
int value = 0;
if (signalMode == SIN) {
value = sinTable[sinIndex];
sinIndex = (sinIndex + 1) % 32;
} else if (signalMode == RAMP) {
value = rampValue;
rampValue += 8;
}
analogWrite(PWM_OUT, value); // 8-біт PWM
}
}
// -------------------- SETUP --------------------
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP);
pinMode(PWM_OUT, OUTPUT);
analogWrite(PWM_OUT, 0);
}
// -------------------- LOOP --------------------
void loop() {
taskLED();
taskCommand();
taskSignal();
}