|
|
@@ -6,27 +6,98 @@ VERSION = "1.0.0"
|
|
|
-- sys库是标配
|
|
|
local sys = require "sys"
|
|
|
|
|
|
---1010000x
|
|
|
-local addr = 0x50
|
|
|
-- 当前仅支持i2c0哦
|
|
|
-local i2cid = 0
|
|
|
+i2c.setup(0)
|
|
|
+
|
|
|
+-- 读取 OPT3001 光亮度传感器的数据
|
|
|
+
|
|
|
+-- OPT3001 device addr
|
|
|
+local OPT3001_DEVICE_ADDR = 0x44
|
|
|
+
|
|
|
+-- OPT3001 register addr
|
|
|
+local OPT3001_REG_RESULT = 0x00
|
|
|
+local OPT3001_REG_CONFIGURATION = 0x01
|
|
|
+local OPT3001_REG_LOW_LIMIT = 0x02
|
|
|
+local OPT3001_REG_HIGH_LIMIT = 0x03
|
|
|
+local OPT3001_REG_MANUFACTURE_ID = 0x7E
|
|
|
+local OPT3001_REG_DEVICE_ID = 0x7F
|
|
|
+
|
|
|
+--OPT3001 CONFIG resister bit map
|
|
|
+local CONFIG_RN_Pos = (12)
|
|
|
+local CONFIG_RN_Msk = (0xF << CONFIG_RN_Pos) -- Lua 5.3支持各种位运算符, 这在Lua 5.1是没有的
|
|
|
+
|
|
|
+local CONFIG_CT_Pos = (11)
|
|
|
+local CONFIG_CT_Msk = (0x1 << CONFIG_CT_Pos)
|
|
|
+
|
|
|
+local CONFIG_M_Pos = (9)
|
|
|
+local CONFIG_M_Msk = (0x3 << CONFIG_M_Pos)
|
|
|
+
|
|
|
+local CONFIG_OVF_Pos = (8)
|
|
|
+local CONFIG_OVF_Msk = (0x1 << CONFIG_OVF_Pos)
|
|
|
+
|
|
|
+local CONFIG_CRF_Pos = (7)
|
|
|
+local CONFIG_CRF_Msk = (0x1 << CONFIG_CRF_Pos)
|
|
|
+
|
|
|
+local CONFIG_FH_Pos = (6)
|
|
|
+local CONFIG_FH_Msk = (0x1 << CONFIG_FH_Pos)
|
|
|
+
|
|
|
+local CONFIG_FL_Pos = (5)
|
|
|
+local CONFIG_FL_Msk = (0x1 << CONFIG_FL_Pos)
|
|
|
+
|
|
|
+local CONFIG_L_Pos = (4)
|
|
|
+local CONFIG_L_Msk = (0x1 << CONFIG_L_Pos)
|
|
|
+
|
|
|
+local CONFIG_POL_Pos = (3)
|
|
|
+local CONFIG_POL_Msk = (0x1 << CONFIG_POL_Pos)
|
|
|
+
|
|
|
+local CONFIG_ME_Pos = (2)
|
|
|
+local CONFIG_ME_Msk = (0x1 << CONFIG_ME_Pos)
|
|
|
+
|
|
|
+local CONFIG_FC_Pos = (0)
|
|
|
+local CONFIG_FC_Msk = (0x3 << CONFIG_L_Pos)
|
|
|
+
|
|
|
+
|
|
|
+-- OPT3001 CONFIG setting macro
|
|
|
+local CONFIG_CT_100 = 0x0000 -- conversion time set to 100ms
|
|
|
+local CONFIG_CT_800 = CONFIG_CT_Msk -- conversion time set to 800ms
|
|
|
+
|
|
|
+local CONFIG_M_CONTI = (0x2 << CONFIG_M_Pos) -- continuous conversions
|
|
|
+local CONFIG_M_SINGLE = (0x1 << CONFIG_M_Pos) -- single-shot
|
|
|
+local CONFIG_M_SHUTDOWN = 0x0000 -- shutdown
|
|
|
+
|
|
|
+
|
|
|
+local CONFIG_RN_RESET = (0xC << CONFIG_RN_Pos)
|
|
|
+local CONFIG_CT_RESET = CONFIG_CT_800
|
|
|
+local CONFIG_L_RESET = CONFIG_L_Msk
|
|
|
+local CONFIG_DEFAULTS = (CONFIG_RN_RESET | CONFIG_CT_RESET | CONFIG_L_RESET)
|
|
|
+
|
|
|
+local CONFIG_ENABLE_CONTINUOUS = (CONFIG_M_CONTI | CONFIG_DEFAULTS)
|
|
|
+local CONFIG_ENABLE_SINGLE_SHOT = (CONFIG_M_SINGLE | CONFIG_DEFAULTS)
|
|
|
+local CONFIG_DISABLE = CONFIG_DEFAULTS
|
|
|
|
|
|
sys.taskInit(function()
|
|
|
- log.info("i2c initial",i2c.setup(0))
|
|
|
- while true do
|
|
|
- i2c.send(i2cid, addr, string.char(0x01).."1234abcd")
|
|
|
- sys.wait(100)
|
|
|
- i2c.send(i2cid, addr, string.char(0x01))
|
|
|
- local data = i2c.recv(i2cid, addr, 8)
|
|
|
- log.info("i2c", "data1",data:toHex(),data)
|
|
|
-
|
|
|
- i2c.writeReg(i2cid, addr, 0x01, "abcd1234")
|
|
|
- sys.wait(100)
|
|
|
- local data = i2c.readReg(i2cid, addr, 0x01, 8)
|
|
|
- log.info("i2c", "data2",data:toHex(),data)
|
|
|
- sys.wait(1000)
|
|
|
+ -- 读取device id, 应该是0x3001 = 12289
|
|
|
+ local devid = i2c.readReg(0, OPT3001_DEVICE_ADDR, OPT3001_REG_DEVICE_ID)
|
|
|
+ log.info("i2c", "opt3001", "device id", devid)
|
|
|
+ -- 设置为持续转换
|
|
|
+ i2c.writeReg(0, OPT3001_DEVICE_ADDR, OPT3001_REG_CONFIGURATION, CONFIG_ENABLE_CONTINUOUS)
|
|
|
+ local regVal = 0
|
|
|
+ while 1 do
|
|
|
+ while 1 do
|
|
|
+ log.info("i2c", "check sensor data ready")
|
|
|
+ regVal = i2c.readReg(0, OPT3001_DEVICE_ADDR, OPT3001_REG_CONFIGURATION)
|
|
|
+ if (regVal & CONFIG_CRF_Msk) then
|
|
|
+ log.info("i2c", "sensor data ready")
|
|
|
+ break
|
|
|
+ end
|
|
|
+ sys.wait(3000)
|
|
|
+ end
|
|
|
+ regVal = i2c.readReg(0, OPT3001_DEVICE_ADDR, OPT3001_REG_RESULT)
|
|
|
+ local fraction = regVal & 0xFFF
|
|
|
+ local exponent = 1 << (regVal >> 12)
|
|
|
+ log.info("i2c", "read lux=", fraction * exponent, "/100")
|
|
|
+ sys.wait(3000)
|
|
|
end
|
|
|
-
|
|
|
end)
|
|
|
|
|
|
-- 用户代码已结束---------------------------------------------
|