#include <Encoder.h>
// Определение пинов через константы
namespace Pins {
// Энкодер KY-040
const uint8_t ENC_CLK = 2;
const uint8_t ENC_DT = 3;
const uint8_t ENC_BTN = 4;
// Джойстик KY-023
const uint8_t JOY_X = A0;
const uint8_t JOY_Y = A1;
const uint8_t JOY_BTN = 5;
}
// Создание объекта энкодера
Encoder rotaryEncoder(Pins::ENC_CLK, Pins::ENC_DT);
// Структура для хранения состояний
struct EncoderState {
long value = 0;
bool button = HIGH;
long lastValue = 0;
bool lastButton = HIGH;
};
struct JoystickState {
int x = 0;
int y = 0;
bool button = HIGH;
int lastX = -1;
int lastY = -1;
bool lastButton = HIGH;
};
EncoderState encState;
JoystickState joyState;
void setup() {
Serial.begin(9600);
pinMode(Pins::ENC_BTN, INPUT_PULLUP);
pinMode(Pins::JOY_BTN, INPUT_PULLUP);
Serial.println("=== Система мониторинга KY-040 и KY-023 ===");
Serial.println("Энкодер | Кнопки | Джойстик");
Serial.println("----------------------------------------");
}
void loop() {
readEncoder();
readJoystick();
displayData();
delay(100);
}
void readEncoder() {
// Чтение энкодера
encState.value = rotaryEncoder.read();
encState.button = (digitalRead(Pins::ENC_BTN) == LOW);
}
void readJoystick() {
// Чтение аналоговых значений джойстика с масштабированием
int rawX = analogRead(Pins::JOY_X);
int rawY = analogRead(Pins::JOY_Y);
// Преобразование в проценты с ограничением
joyState.x = constrain(map(rawX, 0, 1023, 0, 100), 0, 100);
joyState.y = constrain(map(rawY, 0, 1023, 0, 100), 0, 100);
// Чтение кнопки
joyState.button = (digitalRead(Pins::JOY_BTN) == LOW);
}
void displayData() {
// Вывод изменений энкодера
if (encState.value != encState.lastValue) {
Serial.print("Энкодер позиция: ");
Serial.println(encState.value);
encState.lastValue = encState.value;
}
// Вывод кнопки энкодера
if (encState.button != encState.lastButton) {
Serial.print("Кнопка энкодера: ");
Serial.println(encState.button ? "Нажата" : "Отпущена");
encState.lastButton = encState.button;
}
// Вывод кнопки джойстика
if (joyState.button != joyState.lastButton) {
Serial.print("Кнопка джойстика: ");
Serial.println(joyState.button ? "Нажата" : "Отпущена");
joyState.lastButton = joyState.button;
}
// Вывод значений джойстика
Serial.print("Джойстик -> X: ");
Serial.print(joyState.x);
Serial.print("% | Y: ");
Serial.print(joyState.y);
Serial.println("%");
}