esp32 Micropython 使用多线程驱动EC11编码器

近日在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

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值