main.lua 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "air302_i2c_demo"
  3. VERSION = "1.0.0"
  4. -- sys库是标配
  5. local sys = require "sys"
  6. -- 当前仅支持i2c0哦
  7. i2c.setup(0)
  8. -- 读取 OPT3001 光亮度传感器的数据
  9. -- OPT3001 device addr
  10. local OPT3001_DEVICE_ADDR = 0x44
  11. -- OPT3001 register addr
  12. local OPT3001_REG_RESULT = 0x00
  13. local OPT3001_REG_CONFIGURATION = 0x01
  14. local OPT3001_REG_LOW_LIMIT = 0x02
  15. local OPT3001_REG_HIGH_LIMIT = 0x03
  16. local OPT3001_REG_MANUFACTURE_ID = 0x7E
  17. local OPT3001_REG_DEVICE_ID = 0x7F
  18. --OPT3001 CONFIG resister bit map
  19. local CONFIG_RN_Pos = (12)
  20. local CONFIG_RN_Msk = (0xF << CONFIG_RN_Pos) -- Lua 5.3支持各种位运算符, 这在Lua 5.1是没有的
  21. local CONFIG_CT_Pos = (11)
  22. local CONFIG_CT_Msk = (0x1 << CONFIG_CT_Pos)
  23. local CONFIG_M_Pos = (9)
  24. local CONFIG_M_Msk = (0x3 << CONFIG_M_Pos)
  25. local CONFIG_OVF_Pos = (8)
  26. local CONFIG_OVF_Msk = (0x1 << CONFIG_OVF_Pos)
  27. local CONFIG_CRF_Pos = (7)
  28. local CONFIG_CRF_Msk = (0x1 << CONFIG_CRF_Pos)
  29. local CONFIG_FH_Pos = (6)
  30. local CONFIG_FH_Msk = (0x1 << CONFIG_FH_Pos)
  31. local CONFIG_FL_Pos = (5)
  32. local CONFIG_FL_Msk = (0x1 << CONFIG_FL_Pos)
  33. local CONFIG_L_Pos = (4)
  34. local CONFIG_L_Msk = (0x1 << CONFIG_L_Pos)
  35. local CONFIG_POL_Pos = (3)
  36. local CONFIG_POL_Msk = (0x1 << CONFIG_POL_Pos)
  37. local CONFIG_ME_Pos = (2)
  38. local CONFIG_ME_Msk = (0x1 << CONFIG_ME_Pos)
  39. local CONFIG_FC_Pos = (0)
  40. local CONFIG_FC_Msk = (0x3 << CONFIG_L_Pos)
  41. -- OPT3001 CONFIG setting macro
  42. local CONFIG_CT_100 = 0x0000 -- conversion time set to 100ms
  43. local CONFIG_CT_800 = CONFIG_CT_Msk -- conversion time set to 800ms
  44. local CONFIG_M_CONTI = (0x2 << CONFIG_M_Pos) -- continuous conversions
  45. local CONFIG_M_SINGLE = (0x1 << CONFIG_M_Pos) -- single-shot
  46. local CONFIG_M_SHUTDOWN = 0x0000 -- shutdown
  47. local CONFIG_RN_RESET = (0xC << CONFIG_RN_Pos)
  48. local CONFIG_CT_RESET = CONFIG_CT_800
  49. local CONFIG_L_RESET = CONFIG_L_Msk
  50. local CONFIG_DEFAULTS = (CONFIG_RN_RESET | CONFIG_CT_RESET | CONFIG_L_RESET)
  51. local CONFIG_ENABLE_CONTINUOUS = (CONFIG_M_CONTI | CONFIG_DEFAULTS)
  52. local CONFIG_ENABLE_SINGLE_SHOT = (CONFIG_M_SINGLE | CONFIG_DEFAULTS)
  53. local CONFIG_DISABLE = CONFIG_DEFAULTS
  54. sys.taskInit(function()
  55. -- 读取device id, 应该是0x3001 = 12289
  56. local devid = i2c.readReg(0, OPT3001_DEVICE_ADDR, OPT3001_REG_DEVICE_ID)
  57. log.info("i2c", "opt3001", "device id", devid)
  58. -- 设置为持续转换
  59. i2c.writeReg(0, OPT3001_DEVICE_ADDR, OPT3001_REG_CONFIGURATION, CONFIG_ENABLE_CONTINUOUS)
  60. local regVal = 0
  61. while 1 do
  62. while 1 do
  63. log.info("i2c", "check sensor data ready")
  64. regVal = i2c.readReg(0, OPT3001_DEVICE_ADDR, OPT3001_REG_CONFIGURATION)
  65. if (regVal & CONFIG_CRF_Msk) then
  66. log.info("i2c", "sensor data ready")
  67. break
  68. end
  69. sys.wait(3000)
  70. end
  71. regVal = i2c.readReg(0, OPT3001_DEVICE_ADDR, OPT3001_REG_RESULT)
  72. local fraction = regVal & 0xFFF
  73. local exponent = 1 << (regVal >> 12)
  74. log.info("i2c", "read lux=", fraction * exponent, "/100")
  75. sys.wait(3000)
  76. end
  77. end)
  78. -- 用户代码已结束---------------------------------------------
  79. -- 结尾总是这一句
  80. sys.run()
  81. -- sys.run()之后后面不要加任何语句!!!!!