#include <Keyboard.h>
// Пины
const int JOY_X = A0; // Ось X
const int JOY_Y = A1; // Ось Y
const int BTN_PIN = 2; // Кнопка джойстика
// Пороги срабатывания (0-1023)
const int DEADZONE = 300; // Мёртвая зона от центра (512 ±300)
const int TRIGGER = 700; // Порог для крайних положений
// Центр
const int CENTER = 512;
// Текущее состояние клавиш
bool wPressed = false;
bool sPressed = false;
bool aPressed = false;
bool dPressed = false;
bool hPressed = false;
void setup() {
// Инициализация пинов
pinMode(BTN_PIN, INPUT_PULLUP);
// Задержка перед запуском (опционально)
delay(1000);
// Запуск клавиатуры
Keyboard.begin();
}
void loop() {
// Чтение значений с джойстика
int xValue = analogRead(JOY_X);
int yValue = analogRead(JOY_Y);
// Чтение кнопки (LOW при нажатии, т.к. INPUT_PULLUP)
bool btnState = (digitalRead(BTN_PIN) == LOW);
// --- Обработка оси Y (W/S) ---
if (yValue < CENTER - DEADZONE) {
// Движение вперёд (W)
if (!wPressed && yValue < CENTER - TRIGGER) {
Keyboard.press('w');
wPressed = true;
}
} else if (yValue > CENTER + DEADZONE) {
// Движение назад (S)
if (!sPressed && yValue > CENTER + TRIGGER) {
Keyboard.press('s');
sPressed = true;
}
} else {
// Возврат в центр
if (wPressed) {
Keyboard.release('w');
wPressed = false;
}
if (sPressed) {
Keyboard.release('s');
sPressed = false;
}
}
// --- Обработка оси X (A/D) ---
if (xValue < CENTER - DEADZONE) {
// Движение влево (A)
if (!aPressed && xValue < CENTER - TRIGGER) {
Keyboard.press('a');
aPressed = true;
}
} else if (xValue > CENTER + DEADZONE) {
// Движение вправо (D)
if (!dPressed && xValue > CENTER + TRIGGER) {
Keyboard.press('d');
dPressed = true;
}
} else {
// Возврат в центр
if (aPressed) {
Keyboard.release('a');
aPressed = false;
}
if (dPressed) {
Keyboard.release('d');
dPressed = false;
}
}
// --- Обработка кнопки (H) ---
if (btnState && !hPressed) {
Keyboard.press('h');
hPressed = true;
} else if (!btnState && hPressed) {
Keyboard.release('h');
hPressed = false;
}
// Небольшая задержка для стабильности
delay(10);
}