// ==== 1. НАЛАШТУВАННЯ ПІНІВ ТА КОНСТАНТ ====
// Піни для 6-ти Світлодіодів
const int LED_PINS[6] = {D2, D3, D4, D5, D6, D13};
const int LED_COUNT = 6;
// Піни для Аналогового Джойстика
const int JOY_X_PIN = A0; // X-вісь (Direction B/C)
const int JOY_Y_PIN = A1; // Y-вісь (Delay A/D)
const int JOY_SW_PIN = D12; // Кнопка SW (Stop CTR)
// Константи затримки (1с до 5с)
const long MIN_DELAY_MS = 1000;
const long MAX_DELAY_MS = 5000;
const long DELAY_STEP_MS = 1000;
// Пороги АЦП (Припускаємо 10-бітний АЦП: 0-1023)
const int THRESHOLD_HIGH = 800; // Порогове значення для "Вправо" або "Вгору"
const int THRESHOLD_LOW = 200; // Порогове значення для "Вліво" або "Вниз"
// ==== 2. ЗМІННІ СТАНУ ====
volatile long current_delay_ms = MIN_DELAY_MS;
volatile int direction = 0; // 0: Стоп, 1: L->R, -1: R->L
volatile int current_led_index = 0;
long last_button_press_time = 0;
unsigned long last_led_change_time = 0;
const int DEBOUNCE_DELAY = 200; // Антидребезг
// Змінні для відстеження попереднього стану джойстика
int prev_joy_state = 0; // 0: центр, 1: X+, 2: X-, 3: Y+, 4: Y-, 5: SW
int joy_act_count = 0; // Кількість активцій джойстика
int joy_act_state = 0; // Стан джойстика
const int REQ = 3; // Кількість необхідних натискань
// Функція для вимкнення всіх світлодіодів
void All_LEDs_Off() {
for (int i = 0; i < LED_COUNT; i++) {
digitalWrite(LED_PINS[i], LOW);
}
}
// Функція для обробки команди
void Execute_Command(int command_state) {
switch (command_state) {
case 5: // Кнопка SW (STOP)
direction = 0;
Serial.println("STOP");
break;
case 1: // JOY_B: R -> L
direction = -1;
Serial.println("R to L");
break;
case 2: // JOY_C: L -> R
direction = 1;
Serial.println("L to R");
break;
case 3: // JOY_A: + Delay
if (current_delay_ms < MAX_DELAY_MS) {
current_delay_ms += DELAY_STEP_MS;
Serial.print("Delay: ");
Serial.println(current_delay_ms);
}
break;
case 4: // JOY_D: - Delay
if (current_delay_ms > MIN_DELAY_MS) {
current_delay_ms -= DELAY_STEP_MS;
Serial.print("Delay: ");
Serial.println(current_delay_ms);
}
break;
}
}
// Функція для зчитування аналогового джойстика та зміни стану
void Check_Joystick() {
if (millis() - last_button_press_time < DEBOUNCE_DELAY) {
return;
}
// Зчитування аналогових значень
int val_x = analogRead(JOY_X_PIN);
int val_y = analogRead(JOY_Y_PIN);
// Зчитування цифрового значення кнопки (SW часто Active LOW)
int sw_state = digitalRead(JOY_SW_PIN);
// Визначаємо поточний стан джойстика
int current_joy_state = 0;
if (sw_state == LOW) {
current_joy_state = 5; // Кнопка натиснута
}
else if (val_x > THRESHOLD_HIGH) {
current_joy_state = 1; // X- (R -> L)
}
else if (val_x < THRESHOLD_LOW) {
current_joy_state = 2; // X+ (L -> R)
}
else if (val_y > THRESHOLD_HIGH) {
current_joy_state = 3; // Y+ (+ Delay)
}
else if (val_y < THRESHOLD_LOW) {
current_joy_state = 4; // Y- (- Delay)
}
// Обробляємо команду ЛИШЕ якщо стан змінився
if (current_joy_state != prev_joy_state && current_joy_state != 0) {
// Якщо це новий стан або той же стан, що ми рахуємо
if (current_joy_state != joy_act_state) {
// Новий стан — починаємо рахування заново
joy_act_state = current_joy_state;
joy_act_count = 1;
Serial.print("Нова команда: " );
Serial.print(current_joy_state);
Serial.println(" (1 з 3)");
}
else {
// Той же стан — збільшуємо лічильник
joy_act_count++;
Serial.print("Команда: ");
Serial.print(current_joy_state);
Serial.print(" (");
Serial.print(joy_act_count);
Serial.println(" з 3)");
// Якщо набрали потрібну кількість активацій
if (joy_act_count >= REQ) {
Execute_Command(current_joy_state);
joy_act_count = 0;
joy_act_state = 0;
}
}
last_button_press_time = millis();
}
// Оновлюємо попередній стан
prev_joy_state = current_joy_state;
}
// ==== 3. ФУНКЦІЯ SETUP (ІНІЦІАЛІЗАЦІЯ) ====
void setup() {
Serial.begin(115200);
// Ініціалізація LED пінів як OUTPUT
for (int i = 0; i < LED_COUNT; i++) {
pinMode(LED_PINS[i], OUTPUT);
}
// Ініціалізація пінів джойстика
pinMode(JOY_SW_PIN, INPUT_PULLUP); // Кнопка SW: Input з підтягуючим резистором
// Аналогові піни (A0, A1) не потребують pinMode
All_LEDs_Off();
}
// ==== 4. ФУНКЦІЯ LOOP (ГОЛОВНИЙ ЦИКЛ) ====
void loop() {
Check_Joystick(); // Перевіряємо джойстик ПОСТІЙНО
if (direction != 0) {
// Перевіряємо чи минув потрібний час
if (millis() - last_led_change_time >= current_delay_ms) {
// 1. Гасимо всі світлодіоди
All_LEDs_Off();
// 2. Оновлюємо індекс
current_led_index += direction;
// 3. Циклічний рух
if (current_led_index >= LED_COUNT) {
current_led_index = 0;
}
else if (current_led_index < 0) {
current_led_index = LED_COUNT - 1;
}
// 4. Запалюємо поточний світлодіод
digitalWrite(LED_PINS[current_led_index], HIGH);
// 5. Запам'ятовуємо час зміни
last_led_change_time = millis();
}
}
}Loading
st-nucleo-l031k6
st-nucleo-l031k6