Skip to main content

encoder

旋转编码器示例

示例功能:使用旋转编码器之前需要预装一个库文件 ESP32Encoder,通过杜邦线将模块与传感器扩展排针的对应引脚相连接,以下示例将读取到的编码数值通过串口打印出来。
板载模块 EC11 增量式旋转编码器,该编码器有 3 个主要引脚:

  • CLK(时钟 / 通道 A)
  • DT(数据 / 通道 B)
  • SW(开关按钮)

其原理是利用两个通道的相位差,来确认编码器转动的数值。

电气特性

状态CLKDT
初始位置HIGHHIGH
顺时针步进先变后变
逆时针步进后变先变

时序波形

  • 顺时针旋转(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);
}