aht10.lua 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 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 bit.isclear(state,3) then
  49. i2c.send(i2cid, AHT10_ADDRESS_ADR_LOW, {AHT10_INIT,0x08,0x00})--初始化
  50. end
  51. sys.wait(20)
  52. log.info("aht10 init_ok")
  53. return true
  54. end
  55. --获取原始数据
  56. local function aht10_get_raw_data()
  57. local raw_data={Srh=nil,St=nil}
  58. i2c.send(i2cid, AHT10_ADDRESS_ADR_LOW, {AHT10_MEASURE, 0x33, 0x00})
  59. sys.wait(80)--等待80毫秒以上
  60. i2c.send(i2cid, AHT10_ADDRESS_ADR_LOW, AHT10_STATE)
  61. local data = i2c.recv(i2cid, AHT10_ADDRESS_ADR_LOW, 1)
  62. local _,state = pack.unpack(data, "b")
  63. -- if bit.isclear(state,7) then
  64. local data = i2c.recv(i2cid, AHT10_ADDRESS_ADR_LOW, 6)
  65. local _, data1, data2, data3, data4, data5, data6 = pack.unpack(data, "b6")
  66. raw_data.Srh = bit.bor(bit.bor(bit.rshift(data4, 4), bit.lshift(data3, 4)),bit.lshift(data2, 12))
  67. raw_data.St = bit.bor(bit.bor(bit.lshift(bit.band(data4, 0x0f), 16), bit.lshift(data5, 8)), data6)
  68. -- end
  69. return raw_data or 0
  70. end
  71. --[[
  72. 获取aht10数据
  73. @api aht10.get_data()
  74. @return table aht10数据
  75. @usage
  76. local aht10_data = aht10.get_data()
  77. log.info("aht10_data", "aht10_data.RH:"..(aht10_data.RH*100).."%","aht10_data.T"..(aht10_data.T).."℃")
  78. ]]
  79. function aht10.get_data()
  80. local aht10_data={RH=nil,T=nil}
  81. local raw_data = aht10_get_raw_data()
  82. aht10_data.RH = raw_data.Srh/1048576
  83. aht10_data.T = raw_data.St/1048576*200-50
  84. return aht10_data or 0
  85. end
  86. return aht10