旋转编码器的使用

本文介绍了如何使用旋转编码器模块增强Arduino项目的交互性,包括精确控制和菜单操作。通过两个示例,一种是常规轮询使用,另一种是利用硬件中断提高响应速度,展示了旋转编码器的灵活性和实用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

旋转编码器是一个精确旋转测定和点击合二为一的器件,用它来控制舵机比用电位器要精确得多,同时使用它也实现菜单的选择和修改设置项的值也比使用多个按键的方式方便很多。

在网上面很容易就找到这些便宜的器件,直接在TB上搜 旋转编码器 即可。
我买的旋转编码器模块有5个引脚,分别是GND, VCC(+), SW, DT, CLK。其中VCC和GND用来接电源和地,按缩写SW应该是Switch(开关)、CLK是Clock(时钟)、DT是Data(数据)。这个编码器的详细介绍可以看网上的资料,网上面还有不少的例子介绍这个编码器的使用,但在我看来这些例子都是用来讲述原理的,我还是觉得把这些代码封装成一个类来使用更为简单清晰,以下是我封装好再写的两个例子。

常规的使用:

#include "flexmisc.h"

//---------------------------------------------------------------------------------
/*
旋转编码器例子1,常规轮询使用
TFlexRotaryEncoder re(CLK, DT, SW);分别对应相应旋转编码器所连接的Arduino针脚;
如不方便在声明时确定对应的参数,也可以在实例化后使用bind来做后绑定。
编写:flexitime
2019-5-12
*/
//---------------------------------------------------------------------------------

TFlexRotaryEncoder re(2, 3, 4);

void reRotateEvent(int direct){
  Serial.print("Position: ");
  Serial.println(re.getCount());
  if (direct == 1){ Serial.println("Turn Right");}
  if (direct == -1){ Serial.println("Turn Left");};
}

void reButtonClickEvent(){
  Serial.print("Click ");
  Serial.println(re.getCount());  
}

void setup() {
  Serial.begin (9600);
  //绑定旋转响应事件,不绑定表示不响应该事件。
  re.attachRotateEvent(reRotateEvent);
  //绑定按键响应事件,不绑定表示不响应该事件。
  re.attachButtonClickEvent(reButtonClickEvent);
  //设置当按下按键时将计数器归 0,默认是不归0;
  re.setClickResetCount(true);
}
 
void loop() { 
  //检查旋转编码器的状态。
  re.checkState();
}

以下这个是利用硬件中断,适应高响应要求的:

#include "flexmisc.h"

//---------------------------------------------------------------------------------
/*
旋转编码器例子2,使用中断方式调用,当系统处于高负载,无法太好响应轮询时使用
TFlexRotaryEncoder re(CLK, DT, SW);分别对应相应旋转编码器所连接的Arduino针脚;
如不方便在声明时确定对应的参数,也可以在实例化后使用bind来做后绑定。
编写:flexitime
2019-5-12
*/
//---------------------------------------------------------------------------------
//旋转编码器的CLK接在Arduino的2脚上,2脚对应的是Arduino中断0
TFlexRotaryEncoder re(2, 3, 4);

void reRotateEvent(int direct){
  Serial.print("Position: ");
  Serial.println(re.getCount());
  if (direct == 1){ Serial.println("Turn Right");}
  if (direct == -1){ Serial.println("Turn Left");};
}

void Int0Event(){
  // 注意,在中断调用时无法响应按键事件
  re.checkState();
}

void setup() {
  Serial.begin (9600);

  //绑定旋转响应事件,不绑定表示不响应该事件。
  re.attachRotateEvent(reRotateEvent);
  
  //设置中断0的处理函数,电平变化触发,但此中断无法响应按键事件
  attachInterrupt(0, Int0Event, CHANGE);
  
}
 
void loop() { 
  //检测按键事件
  if (re.isClick()){Serial.println("click");};
  
  //假设系统响应很慢~~
  delay(100);
}

至于 flexmisc.h这个库,在这里可以下载:https://download.youkuaiyun.com/download/flexitime/11175329

<think>好的,我现在需要帮助用户了解如何使用EC11旋转编码器的按键进行控制。首先,我要回忆一下EC11的结构和功能。EC11通常有三个主要功能:旋转方向检测、旋转步数检测以及按键开关。用户已经询问了旋转方向判断的问题,现在关注的是按键控制部分。 首先,EC11的按键是一个常开型轻触开关,按下时导通,松开后断开。因此,按键检测需要通过检测引脚的电平变化来实现。通常,按键连接到微控制器的GPIO引脚,需要配置为上拉输入模式,这样当按键未按下时,引脚保持高电平,按下时变为低电平。 接下来,我需要考虑按键消抖的问题。机械开关在按下和释放时会有抖动,导致电平快速变化,可能会被误判为多次按下。常见的消抖方法包括软件延时和硬件滤波。软件方法通常是在检测到低电平后延时10-50毫秒再次检测,确认状态稳定。 然后,用户可能需要区分不同的按键操作,比如单击、双击、长按等。这需要在代码中处理不同的时间阈值。例如,按下超过1秒判定为长按,两次快速按下判定为双击。这需要记录按下和释放的时间戳,并根据时间差来判断操作类型。 另外,代码示例会帮助用户更好地理解实现方法。例如,使用Arduino框架,配置引脚为输入上拉模式,循环检测引脚状态,结合状态机来处理按键事件。需要展示基本的按键检测代码,并解释每个步骤的作用。 还需要考虑用户可能的实际应用场景,比如在项目中用按键作为确认、模式切换或功能选择。例如,引用中提到的ESP32蓝牙控制电脑音量项目,按键可能用于静音或切换模式,这部分可以结合实例说明。 最后,要提醒用户注意硬件连接的正确性,比如正确连接上拉电阻或使用内部上拉,避免引脚悬空导致误触发。同时,测试时使用串口打印调试信息有助于确认按键状态。 总结步骤:硬件连接、消抖处理、状态检测、事件判断、应用实例和注意事项。确保回答结构清晰,覆盖用户可能的问题点,并提供实用的代码示例和调试建议。</think>### EC11旋转编码器按键控制方法详解 EC11旋转编码器的按键功能通过内部轻触开关实现,操作逻辑与普通按钮相似。以下是具体实现步骤和注意事项: #### 一、硬件连接 1. EC11的按键引脚(通常标记为SW)需连接至微控制器GPIO 2. 推荐使用$10k\Omega$上拉电阻或启用MCU内部上拉 3. 典型电路: ``` SW引脚 --[10kΩ]--> VCC | +--> GPIO | GND(通过开关导通) ``` #### 二、软件实现核心逻辑 ```arduino const int SW_PIN = 4; // 按键引脚 bool lastState = HIGH; // 初始状态 unsigned long pressTime = 0; void setup() { pinMode(SW_PIN, INPUT_PULLUP); Serial.begin(115200); } void loop() { bool currentState = digitalRead(SW_PIN); // 状态变化检测 if(currentState != lastState){ delay(50); // 消抖延时[^1] currentState = digitalRead(SW_PIN); if(currentState == LOW){ pressTime = millis(); Serial.println("按键按下"); }else{ unsigned long duration = millis() - pressTime; if(duration > 1000){ Serial.println("长按触发"); }else{ Serial.println("短按释放"); } } lastState = currentState; } } ``` #### 三、进阶功能实现 1. **单击/双击识别**: ```arduino unsigned long lastRelease = 0; int clickCount = 0; void handlePress(){ if(millis() - lastRelease < 300){ // 双击时间窗口 clickCount++; if(clickCount == 2){ Serial.println("双击"); clickCount = 0; } }else{ clickCount = 1; } lastRelease = millis(); } ``` 2. **长按功能**: ```arduino void checkLongPress(){ if(digitalRead(SW_PIN) == LOW){ if(millis() - pressTime > 1000){ Serial.println("长按持续中..."); } } } ``` #### 四、实际应用示例(基于引用[2]的蓝牙音量控制) ```arduino bool isMuted = false; void handleKeyAction(){ if(clickCount == 1){ // 发送静音指令 Bluetooth.send(MUTE_CMD); isMuted = !isMuted; }else if(clickCount == 2){ // 切换音源设备 Bluetooth.send(SWITCH_DEVICE_CMD); } } ``` #### 五、注意事项 1. 确保引脚模式正确设置为`INPUT_PULLUP` 2. 机械按键寿命约10万次,避免频繁操作 3. 调试建议: - 使用示波器观察消抖效果 - 通过串口打印时间戳日志 - 添加LED状态指示灯
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值