aht10.lua 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. --[[
  2. @module aht10
  3. @summary aht10 温湿度传感器
  4. @version 1.0
  5. @date 2022.03.10
  6. @author Dozingfiretruck
  7. @usage
  8. --注意:因使用了sys.wait()所有api需要在协程中使用
  9. -- 用法实例
  10. local aht10 = require "aht10"
  11. i2cid = 0
  12. i2c_speed = i2c.FAST
  13. sys.taskInit(function()
  14. i2c.setup(i2cid,i2c_speed)
  15. aht10.init(i2cid)--初始化,传入i2c_id
  16. while 1 do
  17. local aht10_data = aht10.get_data()
  18. log.info("aht10_data", "aht10_data.RH:"..(aht10_data.RH*100).."%","aht10_data.T"..(aht10_data.T).."℃")
  19. sys.wait(1000)
  20. end
  21. end)
  22. ]]
  23. local aht10 = {}
  24. local sys = require "sys"
  25. local i2cid
  26. local AHT10_ADDRESS_ADR_LOW = 0x38
  27. ---器件所用地址
  28. local AHT10_INIT = 0xE1 --初始化命令
  29. local AHT10_MEASURE = 0xAC --触发测量命令
  30. local AHT10_SOFT_RESET = 0xBA --软复位命令,软复位所需时间不超过20毫秒.
  31. local AHT10_STATE = 0x71 --状态字.
  32. --[[
  33. aht10初始化
  34. @api aht10.init(i2c_id)
  35. @number 所在的i2c总线id
  36. @return bool 成功返回true
  37. @usage
  38. aht10.init(0)
  39. ]]
  40. function aht10.init(i2c_id)
  41. i2cid = i2c_id
  42. sys.wait(40)--40 毫秒等待设备稳定
  43. i2c.send(i2cid, AHT10_ADDRESS_ADR_LOW, AHT10_SOFT_RESET)--软复位
  44. sys.wait(20)
  45. i2c.send(i2cid, AHT10_ADDRESS_ADR_LOW, AHT10_STATE)
  46. local data = i2c.recv(i2cid, AHT10_ADDRESS_ADR_LOW, 1)
  47. local _,state = pack.unpack(data, "b")
  48. if not state then
  49. log.info("aht10", "not found")
  50. return
  51. end
  52. if bit.isclear(state,3) then
  53. i2c.send(i2cid, AHT10_ADDRESS_ADR_LOW, {AHT10_INIT,0x08,0x00})--初始化
  54. end
  55. sys.wait(20)
  56. log.info("aht10 init_ok")
  57. return true
  58. end
  59. --获取原始数据
  60. local function aht10_get_raw_data()
  61. local raw_data={Srh=nil,St=nil}
  62. i2c.send(i2cid, AHT10_ADDRESS_ADR_LOW, {AHT10_MEASURE, 0x33, 0x00})
  63. sys.wait(80)--等待80毫秒以上
  64. i2c.send(i2cid, AHT10_ADDRESS_ADR_LOW, AHT10_STATE)
  65. local data = i2c.recv(i2cid, AHT10_ADDRESS_ADR_LOW, 1)
  66. local _,state = pack.unpack(data, "b")
  67. -- if bit.isclear(state,7) then
  68. local data = i2c.recv(i2cid, AHT10_ADDRESS_ADR_LOW, 6)
  69. local _, data1, data2, data3, data4, data5, data6 = pack.unpack(data, "b6")
  70. raw_data.Srh = bit.bor(bit.bor(bit.rshift(data4, 4), bit.lshift(data3, 4)),bit.lshift(data2, 12))
  71. raw_data.St = bit.bor(bit.bor(bit.lshift(bit.band(data4, 0x0f), 16), bit.lshift(data5, 8)), data6)
  72. -- end
  73. return raw_data or 0
  74. end
  75. --[[
  76. 获取aht10数据
  77. @api aht10.get_data()
  78. @return table aht10数据
  79. @usage
  80. local aht10_data = aht10.get_data()
  81. log.info("aht10_data", "aht10_data.RH:"..(aht10_data.RH*100).."%","aht10_data.T"..(aht10_data.T).."℃")
  82. ]]
  83. function aht10.get_data()
  84. local aht10_data={RH=nil,T=nil}
  85. local raw_data = aht10_get_raw_data()
  86. aht10_data.RH = raw_data.Srh/1048576
  87. aht10_data.T = raw_data.St/1048576*200-50
  88. return aht10_data or 0
  89. end
  90. return aht10