调音量、调转速、翻菜单,旋钮往往比按钮手感好。KY-040就是一块很便宜的小型旋转编码器,模块自带旋钮和内部的按键,接几根线到Arduino,转一下就能读出角度变化和方向。这篇文章把它怎么接线、怎么读数讲清楚。

引脚认识:旋钮的两个信号和中间的按键
模块上一排引出GND、VCC、SW、DT、CLK这几个脚。CLK和DT是旋转时输出的两个方波信号,位置相差90度,靠谁超前谁滞后就能判断正转还是反转;SW对应的是旋钮内部那个按键,按下去输出低电平。模块板载了上拉电阻,所以VCC接对后信号比较干净。
多数KY-040每转一圈有20个定位档位——手感里的那一下“咔哒”就是触发了一个信号周期。它是增量式编码器,只给“转了几格、往哪转”,并不直接告诉你绝对角度,所以想测角度要用代码在上电时归零自己计数。

接线:五根线三分钟搞定
接线很简单:GND接Arduino的GND,VCC接3.3V或5V(看具体模块丝印,多数5V兼容),CLK接一个数字脚(比如D2),DT接另一个数字脚(比如D3),SW接一个数字脚(比如D4)。把CLK接在Arduino支持中断的引脚上,剩下的就交给程序。
因为旋一下CLK和DT会高速翻转,用轮询读经常丢步,标准做法是把CLK接中断脚、在中断服务函数里读DT的高低来判方向,一个计数变量就能记录旋了多少格。
代码要诀和两个高频坑
核心逻辑就三句:CLK触发上升沿中断,中断里看DT是高是低,高就计数加一、低就减一,这样把“旋了几格和往哪旋”都拿到手;SW那路再用软件消抖读一次按键,顺便用它做归零、确认之类的事。
坑一:用轮询读旋转会丢步,转速一快读数就乱跳,务必用中断。坑二:不接上拉电阻信号会抖,代码里把CLK、DT、SW都设成INPUT_PULLUP最省事。记住它是增量式,上电必须自己归零再往下算。


按键做软件消抖很实用,不然按一下弹跳当两次,调音量乱跳
增量式的不能直接读绝对角度,上电必须自己归零,搞懂这个就不懵了
模块板载上拉这细节重要,我之前没设上拉读数乱跳,设成INPUT_PULLUP就干净了
中断读方向这个点救我,我之前用轮询一转快就丢步,换中断立马稳了