注意旋转编码器接入电路要接10K上拉电阻最好在加上0.1UF滤波电容
#include <Arduino.h>
#include "OneButton.h" //按键库
#include <ESP32Encoder.h> //编码器库
#define LED_BUILTIN 2 // 板载LED灯
// EC11 引脚配置
#define EC11_A_PIN 25 // 编码器引脚A
#define EC11_B_PIN 26 // 编码器引脚B
#define EC11_K_PIN 19 // 按键引脚E
OneButton SW(EC11_K_PIN, true); // 按键绑定引脚
ESP32Encoder encoder;
int lastEncoderValue = 0; // 编码器的值
int now_count = 0; // 计数值
bool activate = true;
// setting PWM properties
const int freq = 5000; // 设置频率
const int PWM_TD = 0; // 通道号,取值0 ~ 15
const int resolution = 8; // 计数位数,取值0 ~ 20
char PWM_Value = 0; // PWM占空比
//================================ 按键单击回调函数=====================================
void click()
{
PWM_Value += 1;
if (PWM_Value > 100)
{
PWM_Value = 100; // 如果占空比100了就不让增加了
Serial.printf("click,PWM already is 100%,Current PWM_Value=%d \n", PWM_Value);
}
else
Serial.printf("Click,PWM ADD +1,Current PWM_Value=%d\t", PWM_Value);
}
// ===============================按键双击回调函数============================
void doubleclick()
{
PWM_Value += 3;
if (PWM_Value > 100)
{
PWM_Value = 100;
Serial.printf("Doubleclick,PWM already is 100%,Current PWM_Value=%d \n", PWM_Value);
}
else
Serial.printf("Doubleclick,PWM ADD +3,Current PWM_Value=%d\t", PWM_Value);
}
//================================ 按键长按回调函数=========================
void longclick()
{
if (activate)
{ // 如果旋钮转动,则不切换状态
PWM_Value += 6;
if (PWM_Value > 100)
{
PWM_Value = 100;
Serial.printf("longclick,PWM already is 100%,Current PWM_Value=%d \n", PWM_Value);
}
else
Serial.printf("longclick,PWM ADD +6,Current PWM_Value=%d\t", PWM_Value);
}
activate = true;
}
// ================================编码器控制函数===========================
void BMQ_KZ()
{
if (lastEncoderValue != encoder.getCount())
{
now_count = encoder.getCount();
if (now_count != lastEncoderValue)
{
if (!SW.isIdle())
{ // 检测按键是否空闲
activate = false;
Serial.print("(Long_pressed)Encoder value: ");
Serial.println(now_count);
}
else
{
Serial.print("Encoder value: ");
Serial.println(now_count);
}
}
if (now_count > lastEncoderValue)
{
if (!SW.isIdle())
{ // 检测按键是否空闲
// 按钮按下顺时针功能
Serial.println("UP_ARROW");
}
else
{
// 顺时针功能
PWM_Value++;
if (PWM_Value > 100)
{
PWM_Value = 100;
Serial.printf("PWM already is 100%%,Current PWM_Value=%d \n", PWM_Value);
}
else
Serial.printf("PWM_Value +1,PWM_Value=%d\t", PWM_Value);
}
}
if (now_count < lastEncoderValue)
{
if (!SW.isIdle())
{ // 检测按键是否空闲
// 模式1按钮按下逆时针功能
Serial.println("DOWN_ARROW");
}
else
{
// 逆时针功能
if (PWM_Value == 0)
{ // 先判断PWM_Value是否为0了,再进行--操作
PWM_Value = 0;
Serial.printf("PWM already is 0%%,Current PWM_Value=%d \n", PWM_Value);
}
else
{
PWM_Value--;
Serial.printf("PWM_Value -1,PWM_Value=%d\t", PWM_Value);
}
}
}
lastEncoderValue = now_count;
}
}
void setup()
{
//======================引脚初始化================================
pinMode(LED_BUILTIN, OUTPUT);
encoder.attachSingleEdge(EC11_A_PIN, EC11_B_PIN); // 初始化编码器引脚
pinMode(EC11_K_PIN, INPUT_PULLUP); // 初始化按键引脚为输入上拉模式
//======================================================
Serial.begin(115200);
//=========================PWM 通道初始化=============================
// 配置LED PWM功能
ledcSetup(PWM_TD, freq, resolution); // 设置PWM通道、频率、计数位数
// 将通道连接到要控制的GPIO
ledcAttachPin(LED_BUILTIN, PWM_TD); // 将 LEDC 通道绑定到指定 IO 口上以实现输出
ledcWrite(PWM_TD, 0); // 设置占空比0
//==========================编码器按键初始化============================
// 初始化按键事件检测
SW.attachClick(click); // 绑定按键双击回调函数
SW.attachDoubleClick(doubleclick); // 绑定按键双击回调函数
SW.attachLongPressStop(longclick); // 绑定按键长按回调函数
SW.setDebounceMs(20); // 单击滤波时间长度(ms)
SW.setClickMs(200); // 双击滤波时间长度(ms)
SW.setPressMs(500); // 长按滤波时间长度(ms)
}
void loop()
{
// put your main code here, to run repeatedly:
SW.tick(); // 按钮开始工作函数
BMQ_KZ(); // 编码器控制函数
// analogWrite(LED_BUILTIN, PWM_Value); // 实现PWM引脚设置
ledcWrite(PWM_TD, PWM_Value); // 指定通道输出指定占空比波形
}