物联网开发笔记(45)- 使用Micropython开发ESP32开发板之控制红外传感器
创始人
2024-04-07 10:11:19

一、目的

        这一节我们学习如何使用我们的ESP32开发板来控制红外传感器。

二、环境

        ESP32 + 红外传感器 + HX1838B红外接收模块 + Thonny IDE + 几根杜邦线

接线方法:

红外接收模块 接口说明(3线制)
1 VCC  外接开发板3.3V
2 GND  外接开发板GND
3 DO   小板数字量输出接口姐开发板IO口

红外传感器介绍:

1 发送

当按下遥控器时,遥控器发出一帧数据(帧理解为完整的一次数据传输中的所有数据)

这一帧数据由前导码、用户码高8位、用户码低8位、数据码、数据反码组成

其中

  • 前导码为9ms高电平接着4.5ms低电平,标志数据帧的开始
  • 用户码(共16位)为红外接收器识别遥控器的身份的标志,不同的遥控器一般用户码不同,以防止不同电器设备之间遥控码的干扰
  • 数据码为红外接收器识别遥控器上不同的按键的标志,对同一遥控器来说,按不同的键所发出的二进制编码具有相同的用户码,不同的数据码
  • 数据反码用于信息正确接收校验
  • 以脉宽0.56ms间隔0.565ms周期1.125ms表示二进制0;以脉宽0.56ms间隔1.69ms周期2.25ms表示二进制1

2 接收

解码就是将接收到脉冲还原为二进制的“0”和“1”,得到二进制“0”,“1”序列

三、代码

关于ESP32的官方介绍请查看:class Pin – control I/O pins — MicroPython latest documentation

import machine
import utime
from machine import Pinclass IR(object):CODE = {162: "ch-", 98: "ch", 226: "ch+",34: "prev", 2: "next", 194: "play/stop",152: "0", 104: "*", 176: "#",224: "-", 168: "+", 144: "EQ",104: "0", 152: "100+", 176: "200+",48: "1", 24: "2", 122: "3",16: "4", 56: "5", 90: "6",66: "7", 74: "8", 82: "9"}def __init__(self, gpioNum):self.irRecv = machine.Pin(gpioNum, machine.Pin.IN, machine.Pin.PULL_UP)self.irRecv.irq(trigger=machine.Pin.IRQ_RISING | machine.Pin.IRQ_FALLING, handler=self.__handler)  # 配置中断信息self.ir_step = 0self.ir_count = 0self.buf64 = [0 for i in range(64)]self.recived_ok = Falseself.cmd = Noneself.cmd_last = Noneself.repeat = 0self.repeat_last = Noneself.t_ok = Noneself.t_ok_last = Noneself.start = 0self.start_last = 0        self.changed = Falsedef __handler(self, source):"""中断回调函数"""thisComeInTime = utime.ticks_us()# 更新时间curtime = utime.ticks_diff(thisComeInTime, self.start)self.start = thisComeInTimeif curtime >= 8500 and curtime <= 9500:self.ir_step = 1returnif self.ir_step == 1:if curtime >= 4000 and curtime <= 5000:self.ir_step = 2self.recived_ok = Falseself.ir_count = 0self.repeat = 0elif curtime >= 2000 and curtime <= 3000:  # 长按重复接收self.ir_step = 3self.repeat += 1elif self.ir_step == 2:  # 接收4个字节self.buf64[self.ir_count] = curtimeself.ir_count += 1if self.ir_count >= 64:self.recived_ok = Trueself.t_ok = self.start #记录最后ok的时间self.ir_step = 0elif self.ir_step == 3:  # 重复if curtime >= 500 and curtime <= 650:self.repeat += 1def __check_cmd(self):byte4 = 0for i in range(32):x = i * 2t = self.buf64[x] + self.buf64[x+1]byte4 <<= 1if t >= 1800 and t <= 2800:byte4 += 1user_code_hi = (byte4 & 0xff000000) >> 24user_code_lo = (byte4 & 0x00ff0000) >> 16data_code = (byte4 & 0x0000ff00) >> 8data_code_r = byte4 & 0x000000ffself.cmd = data_codedef scan(self):        # 接收到数据if self.recived_ok:self.__check_cmd()self.recived_ok = False# 数据有变化if self.cmd != self.cmd_last or self.repeat != self.repeat_last or self.t_ok != self.t_ok_last:self.changed = Trueelse:self.changed = False# 更新self.cmd_last = self.cmdself.repeat_last = self.repeatself.t_ok_last = self.t_ok# 对应按钮字符print(self.cmd)s = self.CODE.get(self.cmd)return self.changed, s, self.repeat, self.t_okif __name__ == "__main__":t = IR(15)while(True):changed, s, repeat, t_ok = t.scan()print(changed, s, repeat, t_ok)utime.sleep(0.3)

 四、演示效果

五、购买链接
        在某宝上的链接如下:
https://detail.tmall.com/item.htm?spm=a1z10.3-b-s.w4011-16538328900.191.4f8b3d6cjqkVnt&id=548393997684&rn=17fa8e86d94a272e0d651db8723a2b3d&abbucket=8&skuId=4361372496386

 

 

相关内容

热门资讯

世界读书日演讲稿一个民族的灵魂... 以下这篇演讲稿是中国当代著名作家刘醒龙在世界读书日(4月23日)这天在武汉大学所作的关于阅读的一次演...
中学生世界读书日演讲稿 两篇 ... 篇一  今天是世界读书日,请让我们一起来纪念这个读书人的节日。4月23日是世界文学的象征日,塞万提斯...
世界读书日演讲稿800字 两篇... 篇一  今天是世界读书日,请让我们一起来纪念这个读书人的节日。4月23日是世界文学的象征日,塞万提斯...
中学生我的理想演讲稿 三篇 我... 篇一  大家下午好!我是来自广宗县宗城中学七年级1班的杜鑫沐。今天我演讲的题目是《我的理想》。  俄...
中学生我的理想演讲稿 两篇 演... 篇一  亲爱的老师、同学们:  大家好!今天,我演讲的题目是:我的理想。  相信各位同学都有自己的理...