• 物联网开发笔记(45)- 使用Micropython开发ESP32开发板之控制红外传感器


    一、目的

            这一节我们学习如何使用我们的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

    1. import machine
    2. import utime
    3. from machine import Pin
    4. class IR(object):
    5. CODE = {
    6. 162: "ch-", 98: "ch", 226: "ch+",
    7. 34: "prev", 2: "next", 194: "play/stop",
    8. 152: "0", 104: "*", 176: "#",
    9. 224: "-", 168: "+", 144: "EQ",
    10. 104: "0", 152: "100+", 176: "200+",
    11. 48: "1", 24: "2", 122: "3",
    12. 16: "4", 56: "5", 90: "6",
    13. 66: "7", 74: "8", 82: "9"
    14. }
    15. def __init__(self, gpioNum):
    16. self.irRecv = machine.Pin(gpioNum, machine.Pin.IN, machine.Pin.PULL_UP)
    17. self.irRecv.irq(trigger=machine.Pin.IRQ_RISING | machine.Pin.IRQ_FALLING, handler=self.__handler) # 配置中断信息
    18. self.ir_step = 0
    19. self.ir_count = 0
    20. self.buf64 = [0 for i in range(64)]
    21. self.recived_ok = False
    22. self.cmd = None
    23. self.cmd_last = None
    24. self.repeat = 0
    25. self.repeat_last = None
    26. self.t_ok = None
    27. self.t_ok_last = None
    28. self.start = 0
    29. self.start_last = 0
    30. self.changed = False
    31. def __handler(self, source):
    32. """
    33. 中断回调函数
    34. """
    35. thisComeInTime = utime.ticks_us()
    36. # 更新时间
    37. curtime = utime.ticks_diff(thisComeInTime, self.start)
    38. self.start = thisComeInTime
    39. if curtime >= 8500 and curtime <= 9500:
    40. self.ir_step = 1
    41. return
    42. if self.ir_step == 1:
    43. if curtime >= 4000 and curtime <= 5000:
    44. self.ir_step = 2
    45. self.recived_ok = False
    46. self.ir_count = 0
    47. self.repeat = 0
    48. elif curtime >= 2000 and curtime <= 3000: # 长按重复接收
    49. self.ir_step = 3
    50. self.repeat += 1
    51. elif self.ir_step == 2: # 接收4个字节
    52. self.buf64[self.ir_count] = curtime
    53. self.ir_count += 1
    54. if self.ir_count >= 64:
    55. self.recived_ok = True
    56. self.t_ok = self.start #记录最后ok的时间
    57. self.ir_step = 0
    58. elif self.ir_step == 3: # 重复
    59. if curtime >= 500 and curtime <= 650:
    60. self.repeat += 1
    61. def __check_cmd(self):
    62. byte4 = 0
    63. for i in range(32):
    64. x = i * 2
    65. t = self.buf64[x] + self.buf64[x+1]
    66. byte4 <<= 1
    67. if t >= 1800 and t <= 2800:
    68. byte4 += 1
    69. user_code_hi = (byte4 & 0xff000000) >> 24
    70. user_code_lo = (byte4 & 0x00ff0000) >> 16
    71. data_code = (byte4 & 0x0000ff00) >> 8
    72. data_code_r = byte4 & 0x000000ff
    73. self.cmd = data_code
    74. def scan(self):
    75. # 接收到数据
    76. if self.recived_ok:
    77. self.__check_cmd()
    78. self.recived_ok = False
    79. # 数据有变化
    80. if self.cmd != self.cmd_last or self.repeat != self.repeat_last or self.t_ok != self.t_ok_last:
    81. self.changed = True
    82. else:
    83. self.changed = False
    84. # 更新
    85. self.cmd_last = self.cmd
    86. self.repeat_last = self.repeat
    87. self.t_ok_last = self.t_ok
    88. # 对应按钮字符
    89. print(self.cmd)
    90. s = self.CODE.get(self.cmd)
    91. return self.changed, s, self.repeat, self.t_ok
    92. if __name__ == "__main__":
    93. t = IR(15)
    94. while(True):
    95. changed, s, repeat, t_ok = t.scan()
    96. print(changed, s, repeat, t_ok)
    97. 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

     

     

  • 相关阅读:
    3DInfomax 化合物分子基于对比学习的向量表示及相似检索
    解决uniapp修改内置组件样式,在微信中不生效问题
    FlyFish开发者说|开源低代码平台的体验与思考
    如何3分钟,快速开发一个新功能
    Dell 服务器远程安装操作系统
    Linux常用命令 - 网络管理与通信命令
    使用uniapp开发APP时的调试/安卓打包等
    109.firefly-extboot的生成脚本
    NB的Github项目,看到最后一个我惊呆了!
    【C++模拟实现】哈希与unorder_set和unorder_map关联式容器的模拟实现
  • 原文地址:https://blog.csdn.net/zhusongziye/article/details/127833883