#include "GyverEncoder.h"
#define CLK 9
#define DT 7
#define SW 8
#define right 3
#define swich 4
#define left 5
#define PERIOD 100U // период, в миллисекундах, на который "нажимаются" кнопки left\right, то-есть состояния выводов поддерживается в состоянии LOW.
// Желательно подобрать минимально возможный, но так, чтобы целевой прибор четко фиксировал одно "нажатие" кнопки, каждый щелчек энкодера.
#define FAST 8U // множитель для периода, удлинняющий период "нажатия" кнопок в N раз. Для режима быстрого вращения энкодераНужно подбирать опытным путем,
// так, чтобы целевое устройство четко фиксировало "зажатие" кнопки. (ИМХО, это в принципе глупо, и в результате пользователю не понравится
//этим пользоваться, потому как будет серьезный лаг управления - пока устройство поймет, что кнопка зажата, пока начнет наращивать показания,
// лаг в секунду-две обеспечен. Но другого способа попросту нет).
Encoder enc1(CLK, DT, SW);
unsigned long thisTime;
void setup() {
Serial.begin(9600);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
digitalWrite(right, 1);
digitalWrite(left, 1);
digitalWrite(swich, 1);
enc1.setType(TYPE1);
}
void loop() {
static bool fast = false;
enc1.tick();
if (millis() - thisTime >= PERID * (fast ? FAST : 1)) { // если быстро крутили энкодер, то кнопки left\right "нажимаются" на время PERIOD умноженный на FAST, иначе на 1.
// Значение множителя нужно подбирать, в зависимости от реакции целевого прибора.
digitalWrite(left, 1);
digitalWrite(right, 1);
fast = false;
}
if (enc1.isTurn()) { //если крутили энкодер, сбрасываем все состояния кнопок и снова взводим таймер. Это принудительно отменяет предыдущие действие.
thisTime = millis();
digitalWrite(left, 1);
digitalWrite(right, 1);
fast = false;
}
if (enc1.isRight()) { // теперь проверяем куда крутили, и как быстро, "нажимаем" кнопки. Они будут в "нажатом" состоянии, пока не отработает таймер выше, или команда не будет принудительно отменена новой командой.
digitalWrite(right, 0);
fast = false;
} else if (enc1.isLeft()) {
digitalWrite(left, 0);
fast = false;
} else if (enc1.isFastR()) {
digitalWrite(right, 0);
fast = true;
} else if (enc1.isFastL()) {
digitalWrite(left, 0);
fast = true;
}
if (enc1.isPress()) { // Если кнопку нажали.
digitalWrite(swich, 0);
}
if (enc1.isRelease()) { // Если кнопку отпустили. Таким способом хоть зажимай кнопку, хоть кликай, это будет повторять действия пользователя.
digitalWrite(swich, 1);
}
}