microbit 红外遥控接收micropython驱动

micro:bit编程、教学、展示
STEM
回复
头像
shaoziyang
帖子: 742
注册时间: 2019年 10月 21日 13:48

microbit 红外遥控接收micropython驱动

#1

帖子 shaoziyang » 2019年 11月 25日 10:21

原帖作者:chpczx 发表于 2019-7-16

microbit红外遥控驱动在网上搜了半天,有pyb的,有esp的,但唯独没有microbit的。我看了一下别的驱动,都用到了中断,我在网上找了半天,没有找到怎么在microbit上用中断。没办法,只能用while循环了。由于这个原因,可能在即时使用方面可能受限制。在其它支持多线程的主板上,把这个while循环放到其它线程中,会好很多。程序很简单,抛弃了许多不重要的检查。

Code: Select all

from machine import time_pulse_us

class IRremote():
    def __init__(self, pin):
        self.pin = pin
        self.pin.set_pull(self.pin.PULL_UP)

    def getIR(self):
        vlist = []
        while True:
            x=time_pulse_us(self.pin,1,100000)
            if x>=0:
                vlist.append(x)
            if x == -1 and len(vlist) > 3:
                return self.unlock(vlist)            

    # 将信号时间的长短转成16进制数返回
    def unlock(self, vlist):
        start=0
        addr=0
        cmd=0

        # 截取有效信号
        for i in range(len(vlist)):
            if vlist[i]>3000 and vlist[i]<5000 and vlist[i+1]<2000:
                start=i+1
        if (start+31)>len(vlist):
            return -1
        vlist=vlist[start:start+32]
        # print(vlist)
        # 转码
        for i in range(16):
            if vlist[i]>1000:
                addr=addr+2**i
            if vlist[i+16]>1000:
                cmd=cmd+2**i
        return [hex(addr),hex(cmd)]

if __name__ == "__main__":
    from microbit import *
    ir = IRremote(pin16)
    while True:
        r = ir.getIR()
        if r !=-1:
            print("ADDR=",r[0])
            print("CMD=",r[1])[/i][/i][/i]

回复

  • 随机主题
    回复总数
    阅读次数
    最新文章