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]