近日在CSDN上找到一个EC11驱动(原文链接:Micropython下采用非中断(循环扫描)模式驱动EC11旋钮),在测试时总是不成功,最终发现在模块内重新定义一次多线程函数可顺利运行,本次使用ESP32S3芯片,发现运行出现卡顿现象,一直没有找到原因,各位大佬有了解原因烦请留言指教。
1.EC11驱动模块
from machine import Pin
import time
import _thread
def thread_EC_ReadValue(insEC11Process):
while True:
insEC11Process.EC_ReadValue()
class EC11Var:
def __init__(self):
self.EC11Value = 0x00
class EC11Process:
def __init__(self, pinNumClk, pinNumData, pinNumKey, insEC11Var):
self.ECPin_Clk = Pin(pinNumClk,Pin.IN,Pin.PULL_UP)
self.ECPin_Data = Pin(pinNumData, Pin.IN, Pin.PULL_UP)
self.ECPin_Key = Pin(pinNumKey, Pin.IN, Pin.PULL_UP)
self.insEC11Var=insEC11Var
def EC_ReadValue(self):
while True: # 此处的 while True 可以去掉,因为在线程循环处还有一个 while True
if self.ECPin_Key.value() == 0x00:
#先判断是否是按钮按下。如果是按下状态并有旋转动作,则只会处理按下动作,不会处理旋转动作
#一般人也不会采取这种非常规的动作....
#print("key pressed!")
time.sleep_ms(5)#延时消抖
if self.ECPin_Key.value() != 0x00:
print("EC11按键-抖动")
return
i=1000000
while(self.ECPin_Key.value()==0 and i>0):
#等待引脚返回高电平(按钮释放)
#同时防止旋转按钮卡住或不到位导致程序卡死
i-=1
if i==0:
print("EC11按键-卡涩超时")
self.insEC11Var.EC11Value=0x00
self.insEC11Var.EC11Value=0x01
#print(self.clsEC11Value.EC11Value)
return
elif self.ECPin_Clk.value() == 0x00:
if self.ECPin_Clk.value() != 0x00:#重复检测一次防抖
print("EC11旋转-抖动")
return
if self.ECPin_Data.value()==0:
print("EC11左转!")
self.insEC11Var.EC11Value=0x03
print("EC11左转!",self.insEC11Var.EC11Value)
elif self.ECPin_Data.value()==1:
print("EC11右转")
self.insEC11Var.EC11Value=0x02
print("EC11右转!", self.insEC11Var.EC11Value)
else:
print("EC11旋转-检测错误!")
i=1000000
while((self.ECPin_Data.value()==0 and i>0) or (self.ECPin_Clk.value()==0 and i>0)):
#等待CLK和DATA引脚都返回高电平,才是旋转一格结束
#同时防止旋转按钮卡住或不到位导致程序卡死
i-=1
if i==0:
print("EC11旋转-卡涩超时")
self.insEC11Var.EC11Value=0x00
2.主函数 main
import time, machine
import _thread
def thread_EC_ReadValue(insEC11Process):
while True:
insEC11Process.EC_ReadValue()
if __name__ == "__main__":
insEC11Var =EC11Var()
insEC11Process =EC11Process(6,7,15,insEC11Var)#Pin18=clk,19=data,23=key
print("EC11示例程序启动...")
PerPwrPin=Pin(25,Pin.OUT)#开启EC11电源,你的板子如果没有电源控制,删掉即可
PerPwrPin(1)
_thread.start_new_thread(thread_EC_ReadValue,(insEC11Process,))#启动EC11扫描程序
while True:
if insEC11Var.EC11Value!=0x00:
print("insEC11Var.EC11Value=",insEC11Var.EC11Value)
insEC11Var.EC11Value=0
CLK接6号引脚,DT接7号引脚,SW接15号引脚,
按下按键insEC11Var.EC11Value = 1
向右旋转insEC11Var.EC11Value = 2
向左旋转insEC11Var.EC11Value = 3