platformio+esp32+ EC11旋转编码器的应用

注意旋转编码器接入电路要接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); // 指定通道输出指定占空比波形
}

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
如果你想在ESP32-C3开发板上使用PlatformIO和TFT_eSPI库来操作旋转编码器,你可以按照以下步骤进行设置: 1. 在PlatformIO中创建一个新的项目,选择ESP32开发板作为目标设备。 2. 在你的项目文件夹中打开`platformio.ini`文件,确保以下内容存在或添加: ```ini [env:esp32c3] platform = espressif32 board = esp32c3 framework = arduino lib_deps = bodmer/TFT_eSPI@^2.4.0 ``` 这将配置PlatformIO以使用ESP32-C3开发板和TFT_eSPI库。 3. 在你的项目文件夹中创建一个新的源文件(例如`main.cpp`),并添加以下示例代码: ```cpp #include <TFT_eSPI.h> // 定义编码器引脚 #define PIN_A 4 #define PIN_B 5 TFT_eSPI tft; // 初始化编码器状态 int encoder_last_state = 0; void setup() { // 初始化TFT显示屏 tft.init(); tft.setRotation(1); // 设置编码器引脚为输入模式 pinMode(PIN_A, INPUT); pinMode(PIN_B, INPUT); // 启用内部上拉电阻 digitalWrite(PIN_A, HIGH); digitalWrite(PIN_B, HIGH); // 注册编码器引脚的中断回调函数 attachInterrupt(digitalPinToInterrupt(PIN_A), encoder_callback, CHANGE); } void loop() { // 主循环 } void encoder_callback() { // 读取编码器当前状态 int encoder_state = digitalRead(PIN_A); // 判断旋转方向 if (encoder_state != encoder_last_state) { if (digitalRead(PIN_B) != encoder_state) { // 顺时针旋转 tft.println("顺时针"); } else { // 逆时针旋转 tft.println("逆时针"); } } // 更新编码器状态 encoder_last_state = encoder_state; } ``` 这段代码假设你已经将TFT显示屏连接到ESP32-C3的相应引脚,并且已经将旋转编码器的引脚连接到GPIO 4和GPIO 5。在`setup()`函数中,我们初始化TFT显示屏和编码器引脚,并注册中断回调函数。在`encoder_callback()`函数中,我们读取编码器的当前状态并判断旋转方向,然后在TFT显示屏上打印相应的信息。 4. 编译和上传代码到ESP32-C3开发板。 这样,你就可以使用PlatformIO和TFT_eSPI库来操作旋转编码器,并在TFT显示屏上显示旋转方向的信息。请确保你已正确配置硬件连接,并根据需要进行适当的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君零渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值