Загрузка данных


#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;
    }
  }
}