#include <U8g2lib.h>
// Настройка дисплея SH1106 через I2C
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);
// Пины энкодера
const int pinCLK = 32; // Пин CLK (A)
const int pinDT = 33; // Пин DT (B)
const int pinSW = 25; // Пин кнопки (опционально)
// Переменные для отслеживания состояния энкодера
int lastCLK = HIGH;
int value = 1; // Начальное значение (от 1 до 10)
void setup() {
// Настройка пинов энкодера
pinMode(pinCLK, INPUT_PULLUP);
pinMode(pinDT, INPUT_PULLUP);
pinMode(pinSW, INPUT_PULLUP);
// Инициализация дисплея
u8g2.begin();
u8g2.setFont(u8g2_font_fub25_tf); // Устанавливаем крупный шрифт (максимальный)
// Первоначальный вывод значения
displayValue();
}
void loop() {
// Чтение текущего состояния CLK
int currentCLK = digitalRead(pinCLK);
// Проверяем изменение состояния CLK (детектируем поворот энкодера)
if (currentCLK != lastCLK && currentCLK == LOW) {
// Если DT отличается от CLK, то вращение вправо, иначе влево
if (digitalRead(pinDT) != currentCLK) {
value++;
if (value > 10) value = 10; // Ограничиваем сверху
} else {
value--;
if (value < 1) value = 1; // Ограничиваем снизу
}
// Обновляем значение на дисплее
displayValue();
}
// Сохраняем текущее состояние CLK
lastCLK = currentCLK;
// (Опционально) Обработка нажатия кнопки энкодера
if (digitalRead(pinSW) == LOW) {
// Действие при нажатии кнопки (например, сброс значения)
value = 1;
displayValue();
delay(200); // Задержка для устранения дребезга кнопки
}
}
// Функция для отображения значения на OLED-дисплее
void displayValue() {
u8g2.clearBuffer(); // Очистка буфера
u8g2.setCursor(10, 50); // Установка позиции текста
u8g2.print(value); // Вывод значения
u8g2.sendBuffer(); // Отправка буфера на дисплей
}