zh07.lua 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. --[[
  2. @module zh07
  3. @summary ZH07 激光粉尘传感器
  4. @version 1.0
  5. @date 2023.03.09
  6. @author BaiShiyu
  7. @usage
  8. --注意:因使用了sys.wait()所有api需要在协程中使用
  9. -- 用法实例
  10. sys = require("sys")
  11. local zh07 = require "zh07"
  12. local uartid = 1 -- 根据实际设备选取不同的uartid
  13. sys.taskInit(function ()
  14. local result = zh07.init(uartid)
  15. if not result then return end
  16. while true do
  17. sys.wait(1000)
  18. log.info(string.format("pm1.0 %sμg/m³", zh07.getPM_1()))
  19. log.info(string.format("pm2.5 %sμg/m³", zh07.getPM_2_5()))
  20. log.info(string.format("pm10 %sμg/m³", zh07.getPM_10()))
  21. end
  22. end)
  23. ]]
  24. local zh07 = {}
  25. -- local sys = require "sys"
  26. local uartid -- 根据实际设备选取不同的uartid
  27. local rbuff
  28. --[[
  29. zh07初始化
  30. @api zh07.init(uart_id)
  31. @number uart_id uartid
  32. @return bool 成功返回true
  33. @usage
  34. zh07.init(1)
  35. ]]
  36. function zh07.init(uart_id)
  37. uartid = uart_id
  38. --初始化
  39. local result = uart.setup(
  40. uartid,--串口id
  41. 9600,--波特率
  42. 8,--数据位
  43. 1--停止位
  44. )
  45. if result ~= 0 then
  46. log.info("zh07 init_fail")
  47. return false
  48. end
  49. -- 收取数据会触发回调, 这里的"receive" 是固定值
  50. uart.on(uartid, "receive", function(id, len)
  51. local s = ""
  52. s = uart.read(id, len)
  53. if #s == 0 then return end
  54. local hexStr, hexLen = s:toHex()
  55. log.info("ZH07", "receive", hexStr, hexLen)
  56. if string.sub(hexStr,1,2) == "42" and hexLen == 64 then
  57. rbuff = s
  58. end
  59. end)
  60. log.info("zh07 init_ok")
  61. return true
  62. end
  63. --[[
  64. 获取zh07 PM1.0数据
  65. @api zh07.getPM_1()
  66. @return number PM1.0数据
  67. @usage
  68. local zh07_pm1 = zh07.getPM_1()
  69. log.info(string.format("pm1.0 %sμg/m³", zh07_pm1))
  70. ]]
  71. function zh07.getPM_1()
  72. if not rbuff then return 0 end
  73. return rbuff:byte(11)*256 + rbuff:byte(12)
  74. end
  75. --[[
  76. 获取zh07 PM2.5数据
  77. @api zh07.getPM_2_5()
  78. @return number PM2.5数据
  79. @usage
  80. local zh07_pm25 = zh07.getPM_2_5()
  81. log.info(string.format("pm2.5 %sμg/m³", zh07_pm25))
  82. ]]
  83. function zh07.getPM_2_5()
  84. if not rbuff then return 0 end
  85. return rbuff:byte(13)*256 + rbuff:byte(14)
  86. end
  87. --[[
  88. 获取zh07 PM10数据
  89. @api zh07.getPM_10()
  90. @return number PM10数据
  91. @usage
  92. local zh07_pm10 = zh07.getPM_10()
  93. log.info(string.format("pm10 %sμg/m³", zh07_pm10))
  94. ]]
  95. function zh07.getPM_10()
  96. if not rbuff then return 0 end
  97. return rbuff:byte(15)*256 + rbuff:byte(16)
  98. end
  99. return zh07