encoder
旋转编码器示例

示例功能:使用旋转编码器之前需要预装一个库文件 ESP32Encoder
,通过杜邦线将模块与传感器扩展排针的对应引脚相连接,以下示例将读取到的编码数值通过串口打印出来。
板载模块 EC11 增量式旋转编码器,该编码器有 3 个主要引脚:
- CLK(时钟 / 通道 A)
- DT(数据 / 通道 B)
- SW(开关按钮)
其原理是利用两个通道的相位差,来确认编码器转动的数值。
电气特性
状态 | CLK | DT |
---|---|---|
初始位置 | HIGH | HIGH |
顺时针步进 | 先变 | 后变 |
逆时针步进 | 后变 | 先变 |
时序波形
- 顺时针旋转(CW):
CLK: ------__-- DT: -------- (相位差 90°)
- 逆时针旋转(CCW):
CLK: -------- DT: ------__-- (相位差 90°)
硬件连接
ENA —— GPIO6 ENB —— GPIO7 SW —— GPIO8 V —— 3.3V G —— GND

#include <ESP32Encoder.h>
#define CLK_PIN 6 // GPIO6
#define DT_PIN 7 // GPIO7
#define SW_PIN 8 // GPIO8
ESP32Encoder encoder;
int lastPos = 0;
void setup() {
Serial.begin(115200);
encoder.attachHalfQuad(CLK_PIN, DT_PIN);
pinMode(SW_PIN, INPUT_PULLUP);
// 设置编码器起始值
encoder.setCount(0);
}
void loop() {
int newPos = encoder.getCount() / 2; // 全周期计数需除以2
if (newPos != lastPos) {
Serial.println(newPos);
lastPos = newPos;
}
if (digitalRead(SW_PIN) == LOW) {
Serial.println("Button Pressed!");
delay(200); // 消抖
}
}
#include <Arduino.h>
#include <ESP_Knob.h>
#define GPIO_NUM_KNOB_PIN_A 5
#define GPIO_NUM_KNOB_PIN_B 4
ESP_Knob *knob;
void onKnobLeftEventCallback(int count, void *usr_data)
{
Serial.printf("Detect left event, count is %d\n", count);
}
void onKnobRightEventCallback(int count, void *usr_data)
{
Serial.printf("Detect right event, count is %d\n", count);
}
void onKnobHighLimitEventCallback(int count, void *usr_data)
{
Serial.printf("Detect high limit event, count is %d\n", count);
}
void onKnobLowLimitEventCallback(int count, void *usr_data)
{
Serial.printf("Detect low limit event, count is %d\n", count);
}
void onKnobZeroEventCallback(int count, void *usr_data)
{
Serial.printf("Detect zero event, count is %d\n", count);
}
void setup() {
Serial.begin(115200);
Serial.println("ESP_Knob example");
knob = new ESP_Knob(GPIO_NUM_KNOB_PIN_A, GPIO_NUM_KNOB_PIN_B);
// knob->invertDirection();
knob->begin();
knob->attachLeftEventCallback(onKnobLeftEventCallback);
knob->attachRightEventCallback(onKnobRightEventCallback);
knob->attachHighLimitEventCallback(onKnobHighLimitEventCallback);
knob->attachLowLimitEventCallback(onKnobLowLimitEventCallback);
knob->attachZeroEventCallback(onKnobZeroEventCallback);
}
void loop() {
delay(1000);
}