#include <iostream>
using namespace std;
int main()
{
cout << "Hello, World!";
return 0;
}// C++ code
//
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
digitalWrite(LED_BUILTIN, HIGH);
delay(1000); // Wait for 1000 millisecond(s)
digitalWrite(LED_BUILTIN, LOW);
delay(1000); // Wait for 1000 millisecond(s)
}
#include <HX711.h>
#include <Joystick.h>
// Калибровка датчика HX711 (подберите под свой датчик)
#define calibration_factor -2300
#define DOUT A2
#define CLK A1
// Пины педалей
#define throttlePin A0 // Газ
#define clutchPin A3 // Сцепление
// Пины матрицы кнопок 2?4
const int rowPins[2] = {8, 9}; // Строки (D8, D9)
const int colPins[4] = {10, 11, 12, 13}; // Столбцы (D10, 11, D12, D13)
// Карта клавиш матрицы
byte KEY_MAP[2][4] = {
{0, 1, 2, 3}, // Первая строка
{4, 5, 6, 7} // Вторая строка
};
// Объекты
HX711 scale;
Joystick_ Joystick(
JOYSTICK_DEFAULT_REPORT_ID,
JOYSTICK_TYPE_JOYSTICK,
4, // Оси: X, Y, Z, Rz
3, // Потенциометры: газ, тормоз, сцепление
false, false, true, false, false, false, // Оси X, Y, Z, Rx, Ry, Rz
false, true, true, true, false // Руль, газ, тормоз, сцепление, дроссель
);
// Переменные для педалей
int throttleValue = 0;
int lastThrottleValue = 270;
int brakeValue = 0;
int lastBrakeValue = 150;
int clutchValue = 0;
int lastClutchValue = 180;
// Матрица состояний кнопок
bool buttonStates[2][4] = {false};
void setup() {
// Инициализация джойстика
Joystick.setBrakeRange(0, 2048);
Joystick.setThrottleRange(0, 1023);
Joystick.begin();
// Инициализация Serial (для отладки)
Serial.begin(38400);
// Инициализация датчика веса (тормоз)
scale.begin(DOUT, CLK);
scale.set_scale(calibration_factor);
scale.tare();
// Настройка пинов матрицы кнопок
for (int i = 0; i < 2; i++) {
pinMode(rowPins, OUTPUT);
}
for (int i = 0; i < 4; i++) {
pinMode(colPins, INPUT_PULLUP);
}
}
void loop() {
// --- Чтение педалей ---
// Газ (throttle)
throttleValue = analogRead(throttlePin);
if (throttleValue > 666) throttleValue = 670;
else if (throttleValue < 273) throttleValue = 270;
if (lastThrottleValue != throttleValue) {
Joystick.setThrottle(throttleValue);
lastThrottleValue = throttleValue;
}
// Тормоз (brake) — с датчика HX711
brakeValue = (int)scale.get_units();
if (brakeValue < 8) brakeValue = 0; // Фильтрация шумов
if (lastBrakeValue != brakeValue) {
Joystick.setBrake(brakeValue);
lastBrakeValue = brakeValue;
}
// Сцепление (clutch)
clutchValue = analogRead(clutchPin);
if (clutchValue < 185) clutchValue = 180;
if (lastClutchValue != clutchValue) {
Joystick.setZAxis(clutchValue); // Ось Z = сцепление
lastClutchValue = clutchValue;
}
// --- Сканирование матрицы кнопок 2?4 ---
for (int row = 0; row < 2; row++) {
// 1. Выключаем все строки
for (int r = 0; r < 2; r++) {
digitalWrite(rowPins[r], HIGH);
}
// 2. Активируем текущую строку (LOW)
digitalWrite(rowPins[row], LOW);
delayMicroseconds(20); // Даём сигналу стабилизироваться
// 3. Читаем столбцы
for (int col = 0; col < 4; col++) {
bool isPressed = !digitalRead(colPins[col]); // Инверсия из-за INPUT_PULLUP
// Если состояние изменилось — обновляем и отправляем в джойстик
if (buttonStates[row][col] != isPressed) {
buttonStates[row][col] = isPressed;
// Присваиваем ID кнопке (от 0 до 7)
int buttonId = row * 4 + col;
Joystick.setButton(buttonId, isPressed);
// Отладка: вывод в Serial Monitor
Serial.print("Button ");
Serial.print(buttonId);
Serial.print(": ");
Serial.println(isPressed ? "PRESSED" : "RELEASED");
}
}
}
delay(10); // Необязательная задержка для стабильности
}
using namespace std;
int main()
{
cout << "Hello, World!";
return 0;
}// C++ code
//
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
digitalWrite(LED_BUILTIN, HIGH);
delay(1000); // Wait for 1000 millisecond(s)
digitalWrite(LED_BUILTIN, LOW);
delay(1000); // Wait for 1000 millisecond(s)
}
#include <HX711.h>
#include <Joystick.h>
// Калибровка датчика HX711 (подберите под свой датчик)
#define calibration_factor -2300
#define DOUT A2
#define CLK A1
// Пины педалей
#define throttlePin A0 // Газ
#define clutchPin A3 // Сцепление
// Пины матрицы кнопок 2?4
const int rowPins[2] = {8, 9}; // Строки (D8, D9)
const int colPins[4] = {10, 11, 12, 13}; // Столбцы (D10, 11, D12, D13)
// Карта клавиш матрицы
byte KEY_MAP[2][4] = {
{0, 1, 2, 3}, // Первая строка
{4, 5, 6, 7} // Вторая строка
};
// Объекты
HX711 scale;
Joystick_ Joystick(
JOYSTICK_DEFAULT_REPORT_ID,
JOYSTICK_TYPE_JOYSTICK,
4, // Оси: X, Y, Z, Rz
3, // Потенциометры: газ, тормоз, сцепление
false, false, true, false, false, false, // Оси X, Y, Z, Rx, Ry, Rz
false, true, true, true, false // Руль, газ, тормоз, сцепление, дроссель
);
// Переменные для педалей
int throttleValue = 0;
int lastThrottleValue = 270;
int brakeValue = 0;
int lastBrakeValue = 150;
int clutchValue = 0;
int lastClutchValue = 180;
// Матрица состояний кнопок
bool buttonStates[2][4] = {false};
void setup() {
// Инициализация джойстика
Joystick.setBrakeRange(0, 2048);
Joystick.setThrottleRange(0, 1023);
Joystick.begin();
// Инициализация Serial (для отладки)
Serial.begin(38400);
// Инициализация датчика веса (тормоз)
scale.begin(DOUT, CLK);
scale.set_scale(calibration_factor);
scale.tare();
// Настройка пинов матрицы кнопок
for (int i = 0; i < 2; i++) {
pinMode(rowPins, OUTPUT);
}
for (int i = 0; i < 4; i++) {
pinMode(colPins, INPUT_PULLUP);
}
}
void loop() {
// --- Чтение педалей ---
// Газ (throttle)
throttleValue = analogRead(throttlePin);
if (throttleValue > 666) throttleValue = 670;
else if (throttleValue < 273) throttleValue = 270;
if (lastThrottleValue != throttleValue) {
Joystick.setThrottle(throttleValue);
lastThrottleValue = throttleValue;
}
// Тормоз (brake) — с датчика HX711
brakeValue = (int)scale.get_units();
if (brakeValue < 8) brakeValue = 0; // Фильтрация шумов
if (lastBrakeValue != brakeValue) {
Joystick.setBrake(brakeValue);
lastBrakeValue = brakeValue;
}
// Сцепление (clutch)
clutchValue = analogRead(clutchPin);
if (clutchValue < 185) clutchValue = 180;
if (lastClutchValue != clutchValue) {
Joystick.setZAxis(clutchValue); // Ось Z = сцепление
lastClutchValue = clutchValue;
}
// --- Сканирование матрицы кнопок 2?4 ---
for (int row = 0; row < 2; row++) {
// 1. Выключаем все строки
for (int r = 0; r < 2; r++) {
digitalWrite(rowPins[r], HIGH);
}
// 2. Активируем текущую строку (LOW)
digitalWrite(rowPins[row], LOW);
delayMicroseconds(20); // Даём сигналу стабилизироваться
// 3. Читаем столбцы
for (int col = 0; col < 4; col++) {
bool isPressed = !digitalRead(colPins[col]); // Инверсия из-за INPUT_PULLUP
// Если состояние изменилось — обновляем и отправляем в джойстик
if (buttonStates[row][col] != isPressed) {
buttonStates[row][col] = isPressed;
// Присваиваем ID кнопке (от 0 до 7)
int buttonId = row * 4 + col;
Joystick.setButton(buttonId, isPressed);
// Отладка: вывод в Serial Monitor
Serial.print("Button ");
Serial.print(buttonId);
Serial.print(": ");
Serial.println(isPressed ? "PRESSED" : "RELEASED");
}
}
}
delay(10); // Необязательная задержка для стабильности
}