ze08g_ch2o.lua 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. --[[
  2. @module ze08g_ch2o
  3. @summary ZE08G-CH2O 激光粉尘传感器
  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 ch2o = require "ze08g_ch2o"
  12. local uartid = 1 -- 根据实际设备选取不同的uartid
  13. sys.taskInit(function ()
  14. local result = ch2o.init(uartid)
  15. if not result then return end
  16. while true do
  17. sys.wait(1000)
  18. log.info("气体浓度值 PPB:", ch2o.getPPB())
  19. log.info("百万分比浓度 PPM:", ch2o.getPPM())
  20. end
  21. end)
  22. ]]
  23. local ze08g_ch2o = {}
  24. local uartid -- 根据实际设备选取不同的uartid
  25. local rbuff
  26. local ppb = 0
  27. --[[
  28. ze08g_ch2o初始化
  29. @api ze08g_ch2o.init(uart_id)
  30. @number uart_id uartid
  31. @return bool 成功返回true
  32. @usage
  33. ze08g_ch2o.init(1)
  34. ]]
  35. function ze08g_ch2o.init(uart_id)
  36. uartid = uart_id
  37. --初始化
  38. local result = uart.setup(
  39. uartid,--串口id
  40. 9600,--波特率
  41. 8,--数据位
  42. 1--停止位
  43. )
  44. if result ~= 0 then
  45. log.info("ze08g_ch2o init_fail")
  46. return false
  47. end
  48. -- 收取数据会触发回调, 这里的"receive" 是固定值
  49. uart.on(uartid, "receive", function(id, len)
  50. local s = ""
  51. s = uart.read(id, len)
  52. if #s == 0 then return end
  53. local hexStr, hexLen = s:toHex()
  54. log.info("CH2O", "receive", hexStr, hexLen)
  55. if string.sub(hexStr,1,2) == "FF" and hexLen == 18 then
  56. rbuff = s
  57. end
  58. end)
  59. log.info("ze08g_ch2o init_ok")
  60. return true
  61. end
  62. --[[
  63. 获取ze08g_ch2o PPB数据
  64. @api ze08g_ch2o.getPPB()
  65. @return number 气体浓度值
  66. @usage
  67. local ppb = ze08g_ch2o.getPPB()
  68. log.info("气体浓度值 PPB:", ppb))
  69. ]]
  70. function ze08g_ch2o.getPPB()
  71. if not rbuff then return 0 end
  72. ppb = rbuff:byte(5)*255 + rbuff:byte(6)
  73. return ppb
  74. end
  75. --[[
  76. 获取ze08g_ch2o PPM数据
  77. @api ze08g_ch2o.getPPM()
  78. @return number 百万分比浓度
  79. @usage
  80. local ppm = ze08g_ch2o.getPPM()
  81. log.info("百万分比浓度 PPM:", ppm))
  82. ]]
  83. function ze08g_ch2o.getPPM()
  84. return ppb / 1000
  85. end
  86. return ze08g_ch2o