掌控板Nec红外遥控驱动

MicroPython相关代码、库、工具
回复
头像
shaoziyang
帖子: 711
注册时间: 2019年 10月 21日 13:48

掌控板Nec红外遥控驱动

#1

帖子 shaoziyang » 2019年 11月 28日 12:17

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

网上找了个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
 

回复

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