Esp32基础(③旋转编码器)
一、引脚定义说明
先明确各引脚功能,避免接错:
编码器引脚 | 功能描述 | ESP32 连接要求 |
---|---|---|
GND | 接地 | 必须与 ESP32 共地(任意 GND 引脚) |
VCC | 电源输入 | 通常接 3.3V(部分支持 5V,需看模块手册) |
CLK | 时钟信号(旋转脉冲输出) | 接 ESP32 任意数字 GPIO 引脚(输入模式) |
DT | 数据信号(方向识别) | 接 ESP32 另一个数字 GPIO 引脚(输入模式) |
SW | 中心按键(开关信号) | 接 ESP32 数字 GPIO 引脚(输入模式,建议加下拉电阻) |
引脚名字 | 简单理解(作用) |
---|---|
GND | 地线,所有设备的 “负极” 要连在一起,就像电路的 “公共下水道”,电流从这回去 |
VCC | 电源线,给编码器供电的 “正极”,一般接 3.3V(接对了编码器才能工作) |
CLK | 时钟线,编码器旋转时会发出 “脉冲信号”(像眨眼睛一样闪),告诉 ESP32 “我动了” |
DT | 方向线,和 CLK 配合,告诉 ESP32 “我是正转还是反转”(比如 CLK 闪的时候,DT 亮就是正转,灭就是反转) |
SW | 按键线,编码器中间的按钮,按下去的时候会给 ESP32 发信号 “我被按了” |
CLK(Clock):编码器旋转时,会像 “闪光灯” 一样不断切换高低电平(0 和 1),告诉 ESP32 “我在转动”。
DT(Data):和 CLK 配合,通过两者的电平差异(比如 CLK 亮时 DT 灭,或相反),告诉 ESP32 “我在正转还是反转”。
SW(Switch):编码器中间的按钮,按下时会切换电平,相当于 “一个独立的按键信号”。
所有元器件的地线(GND)连在一起,就像一条 “公共负极线”,最终汇总后连接到电源的负极。这样电流就能从电源正极(VCC)流出,经过各个元器件(比如你的旋转编码器、ESP32),再通过这条公共地线流回电源负极,形成一个完整的 “电流回路”。
二、ESP32 具体接线表(推荐引脚)
选择 ESP32 通用 GPIO 引脚(避开特殊功能引脚,如 GPIO0、GPIO1 等下载引脚),推荐如下:
编码器引脚 | 连接到 ESP32 的引脚 | 备注 |
---|---|---|
GND | 任意标有 GND 的引脚 | 例如 ESP32 开发板边缘的 GND 引脚 |
VCC | 标有 3V3 的引脚 | 优先 3.3V 供电,避免 5V 烧毁模块 |
CLK | GPIO18 | 可替换为 GPIO2、GPIO4 等通用引脚 |
DT | GPIO19 | 与 CLK 用不同引脚,避免冲突 |
SW | GPIO21 | 按键引脚,需在代码中设置下拉电阻 |
三、接线示意图(简化版)
ESP32 开发板┌───────────────────┐│ 3V3 GND ││ ▲ ▲ ││ │ │ ││ GPIO18 GPIO19 ││ ▲ ▲ ││ │ │ ││ GPIO21 ││ ▲ │
┌──┴───┴────────┴──────┴───┐
│ 旋转编码器/模拟器 │
│ VCC GND CLK DT SW │
│ │
└──────────────────────────┘
完整main.py代码
from machine import Pin
import time# 定义引脚(对应接线)
CLK = Pin(18, Pin.IN, Pin.PULL_UP) # 时钟引脚,启用内部上拉
DT = Pin(19, Pin.IN, Pin.PULL_UP) # 数据引脚,启用内部上拉
SW = Pin(21, Pin.IN, Pin.PULL_DOWN) # 按键引脚,启用内部下拉# 初始化变量
counter = 0 # 计数变量,正转递增,反转递减
last_clk_state = CLK.value() # 记录上一次CLK状态
sw_state = 0 # 按键状态
last_sw_state = 0 # 上一次按键状态
debounce_time = 50 # 按键防抖时间(ms)
last_debounce = 0 # 最后一次防抖时间print("旋转编码器测试 - 开始旋转或按动旋钮")
print("初始计数: 0")while True:# 读取当前CLK状态current_clk_state = CLK.value()# 检测CLK状态变化(脉冲信号)if current_clk_state != last_clk_state:# CLK状态变化时,读取DT状态判断方向if DT.value() != current_clk_state:# DT与CLK状态不同 → 正转counter += 1print(f"正转 | 计数: {counter}")else:# DT与CLK状态相同 → 反转counter -= 1print(f"反转 | 计数: {counter}")# 更新上一次CLK状态last_clk_state = current_clk_state# 按键检测(带防抖)current_sw_state = SW.value()current_time = time.ticks_ms()# 检测按键状态变化且超过防抖时间if current_sw_state != last_sw_state and time.ticks_diff(current_time, last_debounce) > debounce_time:if current_sw_state == 1:print("按键按下")# 可在此处添加按键触发的功能(如重置计数)# counter = 0# print("计数已重置")# 更新状态和时间last_sw_state = current_sw_statelast_debounce = current_time# 短暂延迟,降低CPU占用time.sleep(0.001)
123