KY-040旋转编码器Arduino怎么用?旋钮调参方向判断防抖避坑

固件烧录仔硬件DIY 2026-10-14 23:10:03 17阅读 举报

给设备做一个能拧的旋钮来调音量、调亮度、翻菜单,旋转编码器(Rotary Encoder)比普通电位器好用太多——它没有机械限位,可以无限正反转,还能配合按键当确认键,是很多仪表盘和机器人的标配交互。KY-040是其中最常见的一颗模块,带一个旋钮和一颗轻触开关。这篇把从接线到转方向和做计数的实操讲清楚。

五个脚,CLK和DT是关键

KY-040模块有五根脚:CLK、DT、SW、+(VCC)、GND。SW是按键输出脚,按下旋钮时接地;CLK和DT是两个信号输出脚,正反转就是靠把它们两个的时序关系判断出来的。

接到Arduino上:+接5V、GND接地、CLK和DT分别接两个数字输入脚(比如D2、D3,很多示例喜欢用带中断的脚配合轮询),SW接另一个数字脚开内部上拉就能读按键。注意旋转编码器输出是开漏/开关量,接Arduino数字脚时建议开INPUT_PULLUP,读高电平是常态、转动时产生脉冲。

判断正反转,看两相的时序

旋转编码器的核心是正交编码:转动时CLK和DT会各输出一串脉冲,但两个信号之间有一个相位差。顺转和逆转时,哪个信号先变化是反过来的。所以判断方向很简单:当检测到CLK发生变化时,去看DT当前是高还是低,就能知道现在是正转还是反转。

用现成的Encoder库最省心,比如ArduinoEncoder库,初始化时把两个引脚绑进去,然后一个函数就能读出当前位置。位置值是正负整数,转一圈前后数值会增减,拿这个值去映射音量、亮度、页码就非常流畅,也天然抗抖动。

三个高频坑,提前绕开

第一是抖动(Bounce)。编码器是机械触点,转动时触点会在一个点上快速抖动几下,直接读会一卡一卡甚至数值乱跳。解决办法一是用带内部上拉加短延时去抖,二是用已经内置去抖逻辑的Encoder库,别自己在中断里裸读。

第二是引脚别接错。CLK和DT接反了,表现出来就是“正转反而减小、反转反而增加”,功能没坏但方向反了。这种通常把两个引脚交换一下就好,不用改代码。

第三是SW按键要开上拉。SW输出是接地的开关量,如果不开内部上拉而处于悬空,按下时行为会不稳定。用digitalRead之前先在pinMode里开INPUT_PULLUP,读到LOW就是按下了。把CLK/DT方向、去抖和上拉三件事捋顺,KY-040就是一个人见人爱的旋钮控制器,做调参、菜单、音量都顺手。

版权声明:
作者:固件烧录仔
链接:https://www.aiddithome.com/p/4f1902ea0ce3d.html
来源:硬件DIY
实践版权归作者所有,未经允许请勿转载,若此实践存在违规行为,您可以点击 “举报”。


登录 后发表评论
5条评论
板砖搬不动
1楼 · 2天前

方向反了交换CLK和DT就行,我上次卡了好久

参数党小马
2楼 · 2天前

开源Encoder库直接读位置,我调菜单就是这么干的

下班才有空
3楼 · 2天前

按键要开上拉,这个提醒重要,不然按下行为不稳定

好说好说
4楼 · 2天前

正反转判断那两行逻辑讲得很透,收藏了

老张装机
5楼 · 2天前

旋转编码器调音量是真的爽,比电位器顺滑多了还不怕拧到头