立即注册

micropython-microbit 中文社区

查看: 96|回复: 0

掌控板Nec红外遥控驱动

[复制链接]
  • TA的每日心情
    开心
    2019-10-6 19:57
  • 签到天数: 62 天

    [LV.6]常住居民II

    发表于 2019-7-22 11:40:03 | 显示全部楼层 |阅读模式

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有帐号?立即注册

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


    评分

    参与人数 1金钱 +10 收起 理由
    shaoziyang + 10

    查看全部评分

    回复

    使用道具 举报

    游客
    回复
    您需要登录后才可以回帖 登录 | 立即注册

    Archiver|手机版|小黑屋|micropython-microbit 中文社区

    GMT+8, 2019-12-5 23:40 , Processed in 0.083799 second(s), 21 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表