bh1750.lua 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. --[[
  2. @module bh1750
  3. @summary bh1750 数字型光强度传感器
  4. @version 1.0
  5. @date 2022.03.15
  6. @author Dozingfiretruck
  7. @usage
  8. --注意:因使用了sys.wait()所有api需要在协程中使用
  9. -- 用法实例
  10. local bh1750 = require "bh1750"
  11. i2cid = 0
  12. i2c_speed = i2c.FAST
  13. sys.taskInit(function()
  14. i2c.setup(i2cid,i2c_speed)
  15. bh1750.init(i2cid)--初始化,传入i2c_id
  16. while 1 do
  17. local bh1750_data = bh1750.read_light()
  18. log.info("bh1750_read_light", bh1750_data)
  19. sys.wait(1000)
  20. end
  21. end)
  22. ]]
  23. local bh1750 = {}
  24. local sys = require "sys"
  25. local i2cid
  26. local BH1750_ADDRESS_AD0_LOW = 0x23 -- address pin low (GND), default for InvenSense evaluation board
  27. local BH1750_ADDRESS_AD0_HIGH = 0x24 -- address pin high (VCC)
  28. local i2cslaveaddr = BH1750_ADDRESS_AD0_LOW
  29. -- bh1750 registers define
  30. local BH1750_POWER_DOWN = 0x00 -- power down
  31. local BH1750_POWER_ON = 0x01 -- power on
  32. local BH1750_RESET = 0x07 -- reset
  33. local BH1750_CON_H_RES_MODE = 0x10 -- Continuously H-Resolution Mode
  34. local BH1750_CON_H_RES_MODE2 = 0x11 -- Continuously H-Resolution Mode2
  35. local BH1750_CON_L_RES_MODE = 0x13 -- Continuously L-Resolution Mode
  36. local BH1750_ONE_H_RES_MODE = 0x20 -- One Time H-Resolution Mode
  37. local BH1750_ONE_H_RES_MODE2 = 0x21 -- One Time H-Resolution Mode2
  38. local BH1750_ONE_L_RES_MODE = 0x23 -- One Time L-Resolution Mode
  39. local function i2c_send(data)
  40. i2c.send(i2cid, i2cslaveaddr, data)
  41. end
  42. local function i2c_recv(num)
  43. local revData = i2c.recv(i2cid, i2cslaveaddr, num)
  44. return revData
  45. end
  46. function bh1750.power_on()
  47. i2c_send(BH1750_POWER_ON)
  48. end
  49. function bh1750.power_down()
  50. i2c_send(BH1750_POWER_DOWN)
  51. end
  52. local function bh1750_set_measure_mode(mode,time)
  53. i2c_send(BH1750_RESET)
  54. i2c_send(mode)
  55. sys.wait(time)
  56. end
  57. --[[
  58. bh1750初始化
  59. @api bh1750.init(i2c_id)
  60. @number 所在的i2c总线id
  61. @return bool 成功返回true
  62. @usage
  63. bh1750.init(0)
  64. ]]
  65. function bh1750.init(i2c_id)
  66. i2cid = i2c_id
  67. bh1750.power_on()
  68. log.info("bh1750 init_ok")
  69. return true
  70. end
  71. --[[
  72. 获取bh1750数据
  73. @api bh1750.read_light()
  74. @return number 光照强度数据, 若读取失败会返回nil
  75. @usage
  76. local bh1750_data = bh1750.read_light()
  77. log.info("bh1750_read_light", bh1750_data)
  78. ]]
  79. function bh1750.read_light()
  80. bh1750_set_measure_mode(BH1750_CON_H_RES_MODE, 180)
  81. -- local _,light = pack.unpack(i2c_recv(2),">h") -- 极端情况下数据溢出导致的光照出现负值, 如string.toHex(i2c_recv(2)) == "FFFF"
  82. local _,light = pack.unpack(i2c_recv(2),">H")
  83. if light then
  84. return light / 1.2
  85. end
  86. end
  87. return bh1750