掌控板红外遥控芯片5104接收驱动
发表于 : 2019年 11月 28日 12:19
原帖作者:chpczx 发表于 2019-7-25
红外遥控芯片5104编码采用等长编码,就是说每一位所占据的信号长度是相同的而且没有引导码,但每次发射采用多次发射,信号间隔为4位长度大约7000us.
程序在mpython 0.33下调试通过。
红外遥控芯片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