HDC1080.lua 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. --- 模块功能:HDC1080温湿度传感器
  2. -- @author FeoniL
  3. -- @module HDC1080
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2021.8.4
  7. module(..., package.seeall)
  8. require "utils"
  9. require "pm"
  10. require "powerKey"
  11. pm.wake("WORK") -- 模块保持唤醒
  12. local rbuf=""
  13. local i2cid = 2 -- core 0025版本之前,0、1、2都表示i2c 2
  14. local i2cslaveaddr=0x40
  15. local cmd,i = {0x00,0x01,0x02,0xFB,0xFC,0xfd,0xfe,0xff}
  16. local Serialid,i={0xFB,0xFC,0xFD}
  17. local Configuration=0x10
  18. --读取温度
  19. local function readTemperature()
  20. sys.taskInit(function ()
  21. if i2c.setup(i2cid,100000) ~= 100000 then
  22. print("init fail")
  23. return
  24. end
  25. i2c.send(i2cid,i2cslaveaddr,0x02)
  26. i2c.send(i2cid,i2cslaveaddr,Configuration)
  27. i2c.send(i2cid,i2cslaveaddr,0x00)
  28. sys.wait(50)
  29. local tm=string.toHex(i2c.recv(i2cid,i2cslaveaddr,2))
  30. if tm=="" then print("i2c recv error") i2c.close(i2cid) return 0 end
  31. log.info("i2c.recv",tm)
  32. tm=tonumber(tm, 16)
  33. local over_tm=tm/65535*165-40
  34. log.info("HDC1080",(string.format("实际温度%.2f℃\n",over_tm)))
  35. i2c.close(i2cid)
  36. end)
  37. end
  38. --读取湿度
  39. local function readHumidity()
  40. sys.taskInit(function ()
  41. if i2c.setup(i2cid,100000) ~= 100000 then
  42. print("init fail")
  43. return
  44. end
  45. i2c.send(i2cid,i2cslaveaddr,0x02)
  46. i2c.send(i2cid,i2cslaveaddr,Configuration)
  47. i2c.send(i2cid,i2cslaveaddr,0x01)
  48. sys.wait(50)
  49. local wd=string.toHex(i2c.recv(i2cid,i2cslaveaddr,2))
  50. if wd=="" then print("i2c recv error") i2c.close(i2cid) return 0 end
  51. log.info("i2c.recv",wd)
  52. wd=tonumber(wd, 16)
  53. local over_wd=wd/65535*100
  54. log.info("HDC1080",(string.format("实际湿度%.2f\n",over_wd)))
  55. i2c.close(i2cid)
  56. end)
  57. end
  58. --读取制造商ID Manufacturer
  59. local function Manufacturer()
  60. if i2c.setup(i2cid,100000) ~= 100000 then
  61. print("init fail")
  62. return
  63. end
  64. i2c.send(i2cid,i2cslaveaddr,0xfe)
  65. print("制造商ID:",string.toHex(i2c.recv(i2cid,i2cslaveaddr,2)))
  66. i2c.close(i2cid)
  67. end
  68. --复位
  69. local function RESET()
  70. if i2c.setup(i2cid,100000) ~= 100000 then
  71. print("init fail")
  72. return
  73. end
  74. i2c.send(i2cid,i2cslaveaddr,0x02)
  75. i2c.send(i2cid,i2cslaveaddr,0x80)
  76. i2c.close(i2cid)
  77. end
  78. --读取序列号
  79. local function Serial_ID()
  80. if i2c.setup(i2cid,100000) ~= 100000 then
  81. print("init fail")
  82. return
  83. end
  84. for i=1,#Serialid,1 do
  85. i2c.send(i2cid,i2cslaveaddr,Serialid[i])
  86. local wl=string.toHex(i2c.recv(i2cid,i2cslaveaddr,2))
  87. rbuf=rbuf..wl
  88. print(type(rbuf),rbuf)
  89. end
  90. print("序列号",rbuf,tonumber(rbuf,16))
  91. i2c.close(i2cid)
  92. end
  93. local function longCb()
  94. readTemperature()
  95. end
  96. local function shortCb()
  97. readHumidity()
  98. end
  99. sys.taskInit(function ()
  100. sys.wait(7000)
  101. while true do
  102. readHumidity()
  103. sys.wait(1000)
  104. readTemperature()
  105. sys.wait(5000)
  106. end
  107. end)
  108. powerKey.setup(1000, longCb, shortCb)