掌控板红外遥控芯片5104接收驱动

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

掌控板红外遥控芯片5104接收驱动

#1

帖子 shaoziyang »

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

红外遥控芯片5104编码采用等长编码,就是说每一位所占据的信号长度是相同的而且没有引导码,但每次发射采用多次发射,信号间隔为4位长度大约7000us.

程序在mpython 0.33下调试通过。

Code: Select all

from mpython  import *
import time

# 本驱动只支持红外遥控芯片 5104
# 格力电扇遥控键码
# 网上搜HS5104或5104可查阅芯片相关信息

class IR5104:
    def __init__(self, pin=2):
        self._cb = None
        self._ic_pin = MPythonPin(pin, PinMode.IN).Pin
        self._ic_pin.irq(trigger=(Pin.IRQ_FALLING | Pin.IRQ_RISING), handler=self._ic_cb)
        self._ic_start = 0
        self._ic_last = time.ticks_us()
        self._level=self._ic_pin.value()

        self._rst()

    def _rst(self):
        self._sr = [0]*12
        self._sb = 0


    def _bit(self, v):
        self._sr[self._sb] =  v
        self._sb = self._sb + 1
        if self._sb >= 11:
            if (self._cb):
                self._cb(self, self._sr)
            self._rst()

    def _ic_cb(self, pin):
        # 防抖动
        if self._ic_pin.value()==self._level:
            return
        self._level=self._ic_pin.value()
        self._ic_start = time.ticks_us()
        icw = time.ticks_diff(self._ic_start, self._ic_last)
        self._ic_last = self._ic_start
        if self._level==0 and icw>6000:
            self._rst()
        if self._level==1:
            if icw>2000:
                pass
            elif icw>1000:
                self._bit(1)
            else:
                self._bit(0)


    def callback(self, fn):
        self._cb = fn

if __name__ == "__main__":

    def myfn(ir, sr):
        oled.fill(0)
        oled.DispChar(("sr=%s" % (sr[:3])), 0,0)
        oled.DispChar(("sr=%s" % (sr[3:5])), 0,12)
        oled.DispChar(("sr=%s" % (sr[5:])), 0,24)
        oled.show()
    ir = IR5104(2)    # 引脚P2
    myfn(ir,ir._sr)    # 初始化屏幕显示
    ir.callback(myfn)

    while True:
        pass

回复

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