// Подключаем библиотеку русских сиволов
#define _LCD_TYPE 1 // указывает, чьл дисплей подключен по шине i2c
#include <LCD_1602_RUS_ALL.h>
LCD_1602_RUS lcd(0x27, 16, 2);
#define SW_PIN 15 // пин GPIO15 ESP32 назначаем для кнопки SW энкодера
#define DT_PIN 2 // пин GPIO2 ESP32 назначаем для DT выхода энкодера
#define CLK_PIN 4 // пин GPIO4 ESP32 назначаем для CLK выхода энкодера
//======= Энкодер =================================================================================
// Обязательно на сигнальные провода энкодера вешать керамические конденсаторы 0.1мкф
#include "ESP32Encoder.h"
#include <ezButton.h> // Библиотека для использования SW пина энкодера
bool isPressing = false;
bool isLongDetected = false;
#define SHORT_PRESS_TIME 1000 // 1000 milliseconds
#define LONG_PRESS_TIME 1000 // 1000 milliseconds
unsigned long pressedTime = 0; // Время нажатия на кнопку энкодера
unsigned long releasedTime = 0; // Время отпускания кнопки энкодера
ezButton button(SW_PIN); // создаем обьект ezButton на 15 пине;
// Обработчик прерываний
static IRAM_ATTR void enc_cb(void* arg) {
ESP32Encoder* enc = (ESP32Encoder*) arg;
}
ESP32Encoder encoder(true, enc_cb);
// Функция опроса энкодера
int opros_encoder(){
int8_t otvet = 0;
button.loop(); // опрос кнопки энкодера
if(button.isPressed()){ // Кнопка энкодера нажата
pressedTime = millis();
isPressing = true;
isLongDetected = false;
}
if(button.isReleased()){ // Кнопка энкодера отпущена
isPressing = false;
releasedTime = millis();
long pressDuration = releasedTime - pressedTime;
if ( pressDuration < SHORT_PRESS_TIME ){
Serial.println("Короткое нажатие зафиксировано");
otvet = 1;
}
}
if (isPressing == true && isLongDetected == false) {
long pressDuration = millis() - pressedTime;
if ( pressDuration > LONG_PRESS_TIME ) {
Serial.println("Длинное нажатие определено");
isLongDetected = true;
otvet = 2;
}
}
delay(10);
/* if (encoder.getCount()>0){ // Вращение вправо
Serial.println("Повернули вправо");
otvet = 3;
}
else if (encoder.getCount()<0){ //Вращение влево
Serial.println("Повернули влево");
otvet = 4;
}
Serial.printf("Enc count: %d\n", encoder.getCount());
*/
encoder.setCount(0); // обнуляем энкодер
Serial.println(otvet);
return(otvet);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32!");
lcd.init(); //Инициализация LCD (по умолчанию для ESP32 30Pin: 21 - SDA, 22 - SCL)
lcd.backlight();
lcd.setCursor(0, 0); // Первый аргумент позиция, второй строка
lcd.print("Наливатор");
lcd.setCursor(0, 1);
lcd.print("Версия 1");
button.setDebounceTime(50); // кнопка энкодера устанавливаем время восстановления 50 миллисекундам
}
void loop() {
// put your main code here, to run repeatedly:
switch (opros_encoder()) {
case 0:
// выполнить, если значение == 0
break;
case 1:
// выполнить, если значение == 1
//naliv() ; // Запускаем налив
break;
case 2:
// выполнить, если значение == 2
//menu(); // Переходим в меню
break;
case 3:
// выполнить, если значение == 3
Serial.println(" отработали казе Повернули вправо");
//volum_level(1);
break;
case 4:
// выполнить, если значение == 4
Serial.println(" отработали казе Повернули влево");
//volum_level(0);
break;
}
delay(10); // this speeds up the simulation
}