temp_hum_sensor.lua 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. --[[
  2. @module temp_hum_sensor
  3. @summary 485温湿度传感器读取模块
  4. @version 1.0
  5. @date 2025.12.12
  6. @author 马梦阳
  7. @usage
  8. 本功能模块演示的内容为:
  9. 1、将设备配置为 modbus RTU 主站模式
  10. 2、读取485接口的温湿度传感器数据
  11. 3、每 2 秒读取一次传感器数据并解析温度和湿度值
  12. 注意事项:
  13. 1、该示例程序需要搭配 exmodbus 扩展库使用
  14. 2、参考对应传感器手册,配置从站地址、寄存器地址等参数
  15. 特别说明:
  16. 1、本示例演示使用的是中盛科技的气体浓度变送器(RS485 版),
  17. 该变送器模块上电后默认输出数据,从站地址为 1,波特率为 9600
  18. 2、温度传感器数值通过保持寄存器地址 0x001E 输出,输出数据为 16 位有符号整数(-0x7FFF ~ +0x7FFF),
  19. 数据范围为 -40℃ ~ +85℃,分辨率为 0.1℃
  20. 注:寄存器值为 235,实际温度值为 235 * 0.1 = 23.5
  21. 3、湿度传感器数值通过保持寄存器地址 0x001F 输出,输出数据为 16 位无符号整数(0 ~ 0xFFFF),
  22. 数据范围为 0%RH ~ 85%RH,分辨率为 0.1%RH
  23. 注:寄存器值为 653,实际湿度值为 653 * 0.1 = 65.3
  24. 本文件没有对外接口,直接在 main.lua 中 require "temp_hum_sensor" 就可以加载运行;
  25. ]]
  26. local exmodbus = require("exmodbus")
  27. -- Air8000 开发板硬件配置
  28. gpio.setup(16, 1) -- RS485 芯片供电引脚
  29. local rs485_dir_gpio = 17 -- RS485 方向引脚
  30. -- 创建 RTU 主站配置参数
  31. local create_config = {
  32. -- 串口配置参数;
  33. mode = exmodbus.RTU_MASTER, -- 通信模式:RTU主站
  34. uart_id = 1, -- UART 端口号:1
  35. baud_rate = 9600, -- 波特率:9600(根据传感器手册调整)
  36. data_bits = 8, -- 数据位:8
  37. stop_bits = 1, -- 停止位:1
  38. parity_bits = uart.None, -- 校验位:无
  39. byte_order = uart.LSB, -- 字节顺序:LSB(低位优先)
  40. rs485_dir_gpio = rs485_dir_gpio, -- RS485 方向引脚:17
  41. rs485_dir_rx_level = 0, -- RS485 接收方向电平:0
  42. }
  43. -- 初始化传感器数据结构
  44. -- 用于记录传感器的温度和湿度值
  45. local sensor_data = {
  46. temperature = 0, -- 温度值
  47. humidity = 0 -- 湿度值
  48. }
  49. -- 配置读取温湿度传感器的参数
  50. local read_config = {
  51. slave_id = 1, -- 从站地址:1
  52. reg_type = exmodbus.HOLDING_REGISTER, -- 寄存器类型:保持寄存器
  53. start_addr = 0x001E, -- 起始地址:0x001E(温度寄存器)
  54. reg_count = 0x0002, -- 读取 2 个寄存器:温度和湿度
  55. timeout = 1000 -- 超时时间 1000 ms
  56. }
  57. -- 创建 RTU 主站实例
  58. local rtu_master = exmodbus.create(create_config)
  59. -- 判断主站是否创建成功并记录日志
  60. if not rtu_master then
  61. log.info("temp_hum_sensor", "RTU 主站创建失败")
  62. else
  63. log.info("temp_hum_sensor", "RTU 主站创建成功")
  64. end
  65. -- 读取温湿度传感器数据的函数
  66. local function read_temp_humidity()
  67. log.info("temp_hum_sensor", "开始读取温湿度传感器数据")
  68. -- 执行读取操作
  69. local read_result = rtu_master:read(read_config)
  70. -- 根据返回状态处理结果
  71. if read_result.status == exmodbus.STATUS_SUCCESS then
  72. -- 读取原始寄存器值
  73. local temp_raw = read_result.data[read_config.start_addr]
  74. local humi_raw = read_result.data[read_config.start_addr + 1]
  75. -- 处理温度值的符号位
  76. if temp_raw > 0x7FFF then
  77. temp_raw = temp_raw - 0x10000
  78. end
  79. -- 解析温度和湿度值
  80. -- 这里假设温度和湿度都是16位整数,单位分别为0.1℃和0.1%RH
  81. sensor_data.temperature = temp_raw / 10.0
  82. sensor_data.humidity = humi_raw / 10.0
  83. log.info("temp_hum_sensor", "读取成功,温度为", sensor_data.temperature, "℃,湿度为", sensor_data.humidity, "%RH")
  84. elseif read_result.status == exmodbus.STATUS_DATA_INVALID then
  85. log.info("temp_hum_sensor", "收到传感器响应数据但数据损坏/校验失败")
  86. elseif read_result.status == exmodbus.STATUS_EXCEPTION then
  87. log.info("temp_hum_sensor", "收到传感器异常响应,标准异常码为", read_result.execption_code)
  88. elseif read_result.status == exmodbus.STATUS_TIMEOUT then
  89. log.info("temp_hum_sensor", "未收到传感器的响应(超时)")
  90. end
  91. end
  92. -- 定时任务函数:每 2 秒读取一次温湿度数据
  93. local function task()
  94. while true do
  95. if rtu_master then
  96. read_temp_humidity()
  97. else
  98. log.info("temp_hum_sensor", "RTU主站未创建,无法读取传感器数据")
  99. end
  100. sys.wait(2000)
  101. end
  102. end
  103. -- 初始化任务
  104. sys.taskInit(task)