#include <Keyboard.h>
// Пины джойстика
const int JOY_X_PIN = A0;
const int JOY_Y_PIN = A1;
// Пороги срабатывания джойстика
const int THRESHOLD = 400; // Отклонение от центра (512)
const int DEADZONE = 100; // Мертвая зона
// Переменные для отслеживания состояния клавиш
bool wPressed = false;
bool aPressed = false;
bool sPressed = false;
bool dPressed = false;
// Пины кнопок (5-13)
const int buttonPins[] = {5, 6, 7, 8, 9, 10, 11, 12, 13};
// Соответствующие клавиши (измените по вашему желанию)
const char keys[] = {'Q', 'E', 'R', 'F', 'Z', 'X', 'C', 'V', 'B'};
const int numButtons = 9;
// Массив для отслеживания состояния кнопок
bool buttonStates[numButtons];
void setup() {
// Инициализация последовательного порта для отладки
Serial.begin(9600);
// Инициализация клавиатуры
Keyboard.begin();
// Настройка пинов кнопок как входов с подтяжкой к питанию
for (int i = 0; i < numButtons; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
buttonStates[i] = false;
}
Serial.println("Джойстик-клавиатура запущена");
}
void loop() {
// Чтение значений джойстика
int xValue = analogRead(JOY_X_PIN);
int yValue = analogRead(JOY_Y_PIN);
// Обработка джойстика (WASD)
processJoystick(xValue, yValue);
// Обработка кнопок
processButtons();
// Небольшая задержка для стабильности
delay(10);
}
void processJoystick(int x, int y) {
// Проверка вертикальной оси (Y) - W и S
if (y < 512 - THRESHOLD) { // Вверх
if (!wPressed) {
Keyboard.press('W');
wPressed = true;
Serial.println("W нажата");
}
} else if (y > 512 + THRESHOLD) { // Вниз
if (!sPressed) {
Keyboard.press('S');
sPressed = true;
Serial.println("S нажата");
}
} else { // В мертвой зоне
if (wPressed) {
Keyboard.release('W');
wPressed = false;
Serial.println("W отпущена");
}
if (sPressed) {
Keyboard.release('S');
sPressed = false;
Serial.println("S отпущена");
}
}
// Проверка горизонтальной оси (X) - A и D
if (x < 512 - THRESHOLD) { // Влево
if (!aPressed) {
Keyboard.press('A');
aPressed = true;
Serial.println("A нажата");
}
} else if (x > 512 + THRESHOLD) { // Вправо
if (!dPressed) {
Keyboard.press('D');
dPressed = true;
Serial.println("D нажата");
}
} else { // В мертвой зоне
if (aPressed) {
Keyboard.release('A');
aPressed = false;
Serial.println("A отпущена");
}
if (dPressed) {
Keyboard.release('D');
dPressed = false;
Serial.println("D отпущена");
}
}
}
void processButtons() {
for (int i = 0; i < numButtons; i++) {
// Кнопки активны низким уровнем (INPUT_PULLUP)
bool currentState = (digitalRead(buttonPins[i]) == LOW);
// Проверка изменения состояния
if (currentState != buttonStates[i]) {
if (currentState) {
// Кнопка нажата
Keyboard.press(keys[i]);
Serial.print("Клавиша ");
Serial.print(keys[i]);
Serial.println(" нажата");
} else {
// Кнопка отпущена
Keyboard.release(keys[i]);
Serial.print("Клавиша ");
Serial.print(keys[i]);
Serial.println(" отпущена");
}
buttonStates[i] = currentState;
}
}
}