|
旋转编码器是一个精确旋转测定和点击合二为一的器件,用它来控制舵机比用电位器要精确得多,同时使用它也实现菜单的选择和修改设置项的值也比使用多个按键的方式方便很多。
在网上面很容易就找到这些便宜的器件,直接在TB上搜 旋转编码器 即可。
我买的旋转编码器模块有5个引脚,分别是GND, VCC(+), SW, DT, CLK。其中VCC和GND用来接电源和地,按缩写SW应该是Switch(开关)、CLK是Clock(时钟)、DT是Data(数据)。这个编码器的详细介绍可以看网上的资料,网上面还有不少的例子介绍这个编码器的使用,但在我看来这些例子都是用来讲述原理的,我还是觉得把这些代码封装成一个类来使用更为简单清晰,以下是我封装好再写的两个例子。
常规的使用:
[mw_shl_code=arduino,true]#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();
}
[/mw_shl_code]
以下这个是利用硬件中断,适应高响应要求的:
[mw_shl_code=arduino,true]#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);
}
[/mw_shl_code]
至于 flexmisc.h这个库,我稍晚上传后再补充。
|
|