给设备做一个能拧的旋钮来调音量、调亮度、翻菜单,旋转编码器(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就是一个人见人爱的旋钮控制器,做调参、菜单、音量都顺手。


方向反了交换CLK和DT就行,我上次卡了好久
开源Encoder库直接读位置,我调菜单就是这么干的
按键要开上拉,这个提醒重要,不然按下行为不稳定
正反转判断那两行逻辑讲得很透,收藏了
旋转编码器调音量是真的爽,比电位器顺滑多了还不怕拧到头