网上找了个ESP红外遥控驱动,使用我的红外遥控时毫无效果。后 来才搞清楚,我手上的红外遥控并没有严格遵守NEC协议。于是去掉了驱动的校验部分,后来发现家里的美的电扇竟然把数据部分发了两遍,于是又增加一个参数,最多可读取6字节的数据并且用列表返回。是否需要校验,也可以在收到数据后再进行。
程序在mpythox 0.33下调试通过。
代码: 全选
from mpython import *
import time
class NecIr:
def __init__(self, pin=2, charNum=4):
self.charNum = charNum
self._ic_start = 0
self._ic_last = time.ticks_us()
self._rst()
self._cb = None
self._ic_pin = MPythonPin(pin, PinMode.IN).Pin
self._ic_pin.irq(trigger=Pin.IRQ_RISING, handler=self._ic_cb)
def _rst(self):
self._sr = [0, 0, 0, 0, 0, 0]
self._sc = 0
self._sb = 0
def _bit(self, v):
self._sr[self._sb] = (self._sr[self._sb] >> 1) + v
self._sc = self._sc + 1
if (self._sc > 7):
self._sc = 0
self._sb = self._sb + 1
if self._sb >= self.charNum:
if (self._cb):
self._cb(self, self._sr, False)
self._rst()
def _ic_cb(self, pin):
self._ic_start = time.ticks_us()
icw = time.ticks_diff(self._ic_start, self._ic_last)
self._ic_last = self._ic_start
if (icw > 5500): # gap in transmission
pass
elif (icw > 4000): #IR start
self._rst()
elif (icw > 2500): # Repeat command
if (self._cb):
self._cb(self, self._sr, True)
elif (icw > 1500): # High bit
self._bit(0x80)
else: # Low bit
self._bit(0x00)
def callback(self, fn):
self._cb = fn
if __name__ == "__main__":
def nec_cb(nec, sr, r):
oled.fill(0)
oled.DispChar(("sr=%s" % (sr[:2])), 0,0)
oled.DispChar(("sr=%s" % (sr[2:4])), 0,12)
oled.DispChar(("sr=%s" % (sr[4:])), 0,24)
oled.DispChar(("repeat=%s" % (r)), 0,36)
oled.show()
nec = NecIr(2, 4) # 引脚P2,接收4字节
nec_cb(nec,nec._sr,False) # 初始化屏幕显示
nec.callback(nec_cb)
while True:
pass