/////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////// EncButton /////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
//#include <Arduino.h>
// #define EB_NO_FOR // отключить поддержку pressFor/holdFor/stepFor и счётчик степов (экономит 2 байта оперативки)
// #define EB_NO_CALLBACK // отключить обработчик событий attach (экономит 2 байта оперативки)
// #define EB_NO_COUNTER // отключить счётчик энкодера (экономит 4 байта оперативки)
// #define EB_NO_BUFFER // отключить буферизацию энкодера (экономит 1 байт оперативки)
// #define EB_DEB_TIME 50 // таймаут гашения дребезга кнопки (кнопка)
// #define EB_CLICK_TIME 500 // таймаут ожидания кликов (кнопка)
// #define EB_HOLD_TIME 600 // таймаут удержания (кнопка)
// #define EB_STEP_TIME 200 // таймаут импульсного удержания (кнопка)
// #define EB_FAST_TIME 30 // таймаут быстрого поворота (энкодер)
#include <EncButton.h>
#define EncButton_Pin_CLK 32
#define EncButton_Pin_DT 33
#define EncButton_Pin_SW 35
EncButton eb(EncButton_Pin_CLK, EncButton_Pin_DT, EncButton_Pin_SW); //eb(2, 3, 4); // CLK, DT, SW
// EncButton eb(2, 3, 4, INPUT); // + режим пинов энкодера
// EncButton eb(2, 3, 4, INPUT, INPUT_PULLUP); // + режим пинов кнопки
/////////////////////////////////////////////////////////////////////////////////////////
// управление тремя переменными при помощи энкодера:
// - нащёлкай кнопкой нужную переменную (1, 2 или 3 клика)
// - 1 переменная просто изменяется с постоянным шагом
// - 2 переменная: шаг 1, при зажатой кнопке - шаг 5
// - 3 переменная: шаг 1, при быстром вращении - шаг 5
int var1 = 0;
int var2 = 0;
int var3 = 0;
uint8_t EncButton_select = 1; // выбранная переменная
/////////////////////////////////////////////////////////////////////////////////////////
IRAM_ATTR void isr() { // esp8266/esp32
//void isr() {
eb.tickISR();
}
void EncButton_Read_setup() {
// показаны значения по умолчанию
eb.setBtnLevel(LOW);
eb.setClickTimeout(500);
eb.setDebTimeout(50);
eb.setHoldTimeout(600);
eb.setStepTimeout(200);
eb.setEncReverse(0);
eb.setEncType(EB_STEP4_LOW); //EB_STEP4_LOW - активный низкий сигнал (подтяжка к VCC). Полный период (4 фазы) за один щелчок. Установлен по умолчанию
//EB_STEP4_HIGH - активный высокий сигнал (подтяжка к GND). Полный период (4 фазы) за один щелчок
//EB_STEP2 - половина периода (2 фазы) за один щелчок
//EB_STEP1 - четверть периода (1 фаза) за один щелчок, а также энкодеры без фиксации
eb.setFastTimeout(30);
eb.counter = 0; // сбросить счётчик энкодера
/////////////////////////////////////////////////////////////////////////
//btn.tick();
//if (btn.press()) Serial.println("Кнопка нажата при старте");
//// btn.setBtnLevel(LOW); // можно настроить уровень
//// if (btn.read()) Serial.println("Кнопка нажата при старте");
//eb.tick();
//if (eb.press()) Serial.println("Кнопка нажата при старте");
////////////////////////////////////////////////////////////////////////
attachInterrupt(EncButton_Pin_CLK, isr, CHANGE); //Подкючаем аппаратное прерывание по изменению состояния пина
attachInterrupt(EncButton_Pin_DT, isr, CHANGE); //Подкючаем аппаратное прерывание по изменению состояния пина
eb.setEncISR(true);
}
void EncButton_Read_loop() {
eb.tick(); // Опрос энкодера
//if (eb.action()) {
//Led_Action_Start(Led_Action_Millis_Interval);
//}
EncButton_Serial_loop();
}
void EncButton_Serial_loop() {
//////////////////////////////////////////////////////////////////////////
// обработка поворота общая
if (eb.turn()) {
Serial.print("turn: dir ");
Serial.print(eb.dir());
Serial.print(", fast ");
Serial.print(eb.fast());
Serial.print(", hold ");
Serial.print(eb.pressing());
Serial.print(", counter ");
Serial.print(eb.counter);
Serial.print(", clicks ");
Serial.println(eb.getClicks());
}
// обработка поворота раздельная
if (eb.left()) Serial.println("left");
if (eb.right()) Serial.println("right");
if (eb.leftH()) Serial.println("leftH");
if (eb.rightH()) Serial.println("rightH");
// кнопка
if (eb.press()) Serial.println("press");
if (eb.click()) Serial.println("click");
if (eb.release()) {
Serial.println("release");
Serial.print("clicks: ");
Serial.print(eb.getClicks());
Serial.print(", steps: ");
Serial.print(eb.getSteps());
Serial.print(", press for: ");
Serial.print(eb.pressFor());
Serial.print(", hold for: ");
Serial.print(eb.holdFor());
Serial.print(", step for: ");
Serial.println(eb.stepFor());
}
// состояния
// Serial.println(eb.pressing());
// Serial.println(eb.holding());
// Serial.println(eb.busy());
// Serial.println(eb.waiting());
// таймаут
if (eb.timeout(1000)) Serial.println("timeout!");
// удержание
if (eb.hold()) Serial.println("hold");
if (eb.hold(3)) Serial.println("hold 3");
// импульсное удержание
if (eb.step()) Serial.println("step");
if (eb.step(3)) Serial.println("step 3");
// отпущена после импульсного удержания
if (eb.releaseStep()) Serial.println("release step");
if (eb.releaseStep(3)) Serial.println("release step 3");
// отпущена после удержания
if (eb.releaseHold()) Serial.println("release hold");
if (eb.releaseHold(2)) Serial.println("release hold 2");
// проверка на количество кликов
if (eb.hasClicks(3)) Serial.println("has 3 clicks");
// вывести количество кликов
if (eb.hasClicks()) {
Serial.print("has clicks: ");
Serial.println(eb.getClicks());
}
/////////////////////////////////////////////////////////////////////////////////////
// выбор переменной для изменения
if (eb.hasClicks()) {
EncButton_select = eb.getClicks();
Serial.println(String("Select: ") + EncButton_select);
}
if (eb.turn()) { // меняем переменную
switch (EncButton_select) {
case 1:
//var1 += 5 * eb.dir(); // изменение с шагом 5
var1 += eb.dir(); // изменение с шагом 1
break;
case 2:
//var2 += (eb.pressing() ? 5 : 1) * eb.dir(); // изменение с шагом 1, при зажатой кнопке шаг 5
var2 += eb.dir(); // изменение с шагом 1
break;
case 3:
//var3 += (eb.fast() ? 5 : 1) * eb.dir(); // изменение с шагом 1, при быстром вращении шаг 5
var3 += (eb.fast() ? 10 : 1) * eb.dir(); // изменение с шагом 1, при быстром вращении шаг 10
//var3 += eb.dir(); // изменение с шагом 1
break;
}
Serial.println(String("vars ") + var1 + ',' + var2 + ',' + var3);
}
///////////////////////////////////////////////////////////////////////////////////
}
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
int Radio_volume, Radio_volumeOld = 5;
int Radio_frequency, Radio_frequencyOld;
boolean Radio_bass = 0;
#define Radio_MAXmenu 4
//#define Radio_ledPin 13
//#define Radio_blPin 7
//boolean Radio_dspl = 0,
//boolean Radio_memdisplay = 0,
//boolean Radio_mempress = 0,
//boolean Radio_adj = 0;
//boolean Radio_ledPin_state;
//boolean Radio_Power_State;
//int Radio_txtl = 0, Radio_temparray = 0;
//int Radio_samples[5];
//unsigned int Radio_status[6];
//unsigned long Radio_timeprevious = 0, Radio_timeprev = 0;
#define Radio_MAXmenu 4
//int Radio_menu;
/////////////////////////////////////////////////////////////////////////////////////////
int presetIndexMax = 12; //
//uint16_t presetIndex = 0; ///< Start at Station with index = 1
int presetIndex = 0; ///< Start at Station with index = 1
////////////////////////////////////////////////////////////////////////////////////////
unsigned int Radio_Signal;
unsigned int Radio_Power_AKM;
/////////////////////////////////////////////////////////////
int potentiometer_value = 0;
int value_min = 0;
int value_max = 1000;
//float angle = 0;
int frequency_value = 0;
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
boolean Radio_Power_State; //не включене устройство (режим ожидания) при подключенном источнике питания //don't "power-on" of the unit (stand by mode) when power supply is connected
boolean Radio_Lights_State;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32!");
EncButton_Read_setup();
OLED_setup();
}
void loop() {
// put your main code here, to run repeatedly:
potentiometer_value = constrain(map(analogRead(A0), 0, 1023, value_min, value_max / 10), value_min, value_max / 10);
frequency_value = constrain(map(analogRead(A0), 0, 1023, value_min, value_max), value_min, value_max);
EncButton_Read_loop(); // RotaryEncoder // проверка нажатия клавиши // check for key press
OLED_loop();
//delay(10); // this speeds up the simulation
}