#include "Wire.h" // библиотека для протокола I2C
#include "LiquidCrystal_I2C.h" // библиотека для дисплея
LiquidCrystal_I2C LCD(0x27, 20, 4); // присваиваем имя дисплею
#include "RotaryEncoder.h" // библиотека для энкодера
RotaryEncoder encoder(13, 12); // пины подключение энкодера (DT, CLK)
// задаем шаг энкодера и макс./мин. значение
#define STEPS 6
#define POSMIN 0
#define POSMAX 12
int lastPos, newPos;
boolean buttonWasUp = true;
void setup() {
LCD.init(); // инициализация LCD дисплея и подсветки
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("LED1 LED2 LED3");
pinMode(9, OUTPUT); // пины для светодиодов
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(2, INPUT_PULLUP); // пин для кнопки энкодера
Serial.begin(9600);
encoder.setPosition(10 / STEPS);
}
void loop() {
LCD.init(); // инициализация LCD дисплея и подсветки
// проверяем положение ручки энкодера
encoder.tick();
newPos = encoder.getPosition() * STEPS;
if (newPos < POSMIN) { encoder.setPosition(POSMIN / STEPS); newPos = POSMIN; }
else if (newPos > POSMAX) { encoder.setPosition(POSMAX / STEPS); newPos = POSMAX; }
// если положение изменилось - выводим на монитор и дисплей
if (lastPos != newPos) {
Serial.println(newPos);
LCD.setCursor(lastPos, 1);
LCD.print(" ");
LCD.setCursor(newPos, 1);
LCD.print("====");
lastPos = newPos;
}
// узнаем состояние кнопки модуля энкодера
boolean buttonIsUp = digitalRead(11);
if (buttonWasUp && !buttonIsUp) {
// исключаем дребезг контактов тактовой кнопки
delay(10);
// снова считываем сигнал с кнопки энкодера
buttonIsUp = digitalRead(2);
// если кнопка нажата, то включаем соответствующий светодиод
if (!buttonIsUp && newPos == 0) {
digitalWrite(9, HIGH); digitalWrite(10, LOW); digitalWrite(11, LOW);
}
if (!buttonIsUp && newPos == 6) {
digitalWrite(9, LOW); digitalWrite(10, HIGH); digitalWrite(11, LOW);
}
if (!buttonIsUp && newPos == 12) {
digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, HIGH);
}
}
}