1 前言
整理几个传感器的代码。
BMP气压:https://doc.openluat.com/wiki/21?wiki_page_id=2729
罗盘仪:https://doc.openluat.com/wiki/21?wiki_page_id=2750
光强:https://doc.openluat.com/wiki/21?wiki_page_id=2668
色彩:https://doc.openluat.com/wiki/21?wiki_page_id=2746
本章是光照强度传感器BH1750。
2 硬件连接
esp32只支持一个i2c,id为0
查看源码:https://gitee.com/dreamcmi/LuatOS-ESP32/blob/master/components/luat/port/luat_i2c_esp32.c
3 官方实例代码
PROJECT = "sensor"
VERSION = "1.0.0"
require "log"
require "sys"
require "misc"
-- i2c ID
i2cid = 2
-- i2c 速率
speed = 100000
-- 初始化
function init(address)
if i2c.setup(i2cid, speed, -1, 1) ~= speed then
log.error("i2c", "setup fail", addr)
return
end
addr = address
end
-- 读取数据
function send(...)
sys.wait(10)
if not addr then
log.info("i2c", "addr err")
return
end
local t = {...}
if i2c.send(i2cid, addr, t) ~= #t then
log.error("i2c", "send fail", #t)
return
end
return true
end
-- 发送数据
function read(n)
sys.wait(10)
if not addr then
log.info("i2c", "addr err")
return "\x00"
end
val = i2c.recv(i2cid, addr, n)
if val and #val>0 then
return val
end
return "\x00"
end
-- 颜色识别传感器
function TCS34725()
init(0x29)
send(0x83, 0xff)
send(0x81, 0x00)
send(0x8f, 0x00)
send(0x80, 0x03)
sys.wait(800)
while true do
sys.wait(1000)
send(0x94)
_, c, red, green, blue = pack.unpack(read(8), "<HHHH")
if red and green and blue then
lux = (-0.32466 * red) + (1.57837 * green) + (-0.73191 * blue)
log.info("red", red)
log.info("green", green)
log.info("blue", blue)
log.info("c, lux", c, lux)
else
log.info("TCS34725", "err")
end
end
end
sys.taskInit(function()
sys.wait(3000)
TCS34725()
end)
sys.init(0, 0)
sys.run()
4 改动代码
sen_BH1750.lua
--- 模块功能:BH1750
-- @module BH1750
-- @author Dozingfiretruck ,youkai
-- @license MIT
-- @copyright OpenLuat.com
-- @release 2021.03.14
-- 源码https://doc.openluat.com/wiki/21?wiki_page_id=2668
BH1750_i2c_id = 0 --BH1750_i2c_id esp32 i2c 0
BH1750_ADDRESS_AD0_LOW = 0x23 -- address pin low (GND), default for InvenSense evaluation board
BH1750_ADDRESS_AD0_HIGH = 0x5c -- address pin high (VCC)
BH1750_i2c_slaveaddr = BH1750_ADDRESS_AD0_LOW -- ADDRES
-- BH1750 registers define
BH1750_POWER_DOWN = 0x00 -- power down
BH1750_POWER_ON = 0x01 -- power on
BH1750_RESET = 0x07 -- reset
BH1750_CON_H_RES_MODE = 0x10 -- Continuously H-Resolution Mode
BH1750_CON_H_RES_MODE2 = 0x11 -- Continuously H-Resolution Mode2
BH1750_CON_L_RES_MODE = 0x13 -- Continuously L-Resolution Mode
BH1750_ONE_H_RES_MODE = 0x20 -- One Time H-Resolution Mode
BH1750_ONE_H_RES_MODE2 = 0x21 -- One Time H-Resolution Mode2
BH1750_ONE_L_RES_MODE = 0x23 -- One Time L-Resolution Mode
local function BH1750_i2c_send(data)
i2c.send(BH1750_i2c_id, BH1750_i2c_slaveaddr, data)
end
local function BH1750_i2c_recv(num)
revData = i2c.recv(BH1750_i2c_id, BH1750_i2c_slaveaddr, num)
return revData
end
local function BH1750_power_on()
BH1750_i2c_send(BH1750_POWER_ON)
end
local function BH1750_power_down()
BH1750_i2c_send(BH1750_POWER_DOWN)
end
local function BH1750_set_measure_mode(mode,time)
BH1750_i2c_send(BH1750_RESET)
BH1750_i2c_send(mode)
sys.wait(time)
end
local function BH1750_read_light()
BH1750_set_measure_mode(BH1750_CON_H_RES_MODE2, 180)
_,light = pack.unpack(BH1750_i2c_recv(2),">h")
light = light / 1.2
return light;
end
function BH1750_init(t_spi_id)
BH1750_i2c_id = t_spi_id
log.info("BH1750_i2c_id",BH1750_i2c_id)
if i2c.setup(t_spi_id,i2c.SLOW) ~= i2c.SLOW then
log.error("I2c.init","fail")
return
else
print("BH1750_init ok.")
end
BH1750_power_on()
end
function BH1750_get()
log.info("BH1750_read_light", BH1750_read_light()*10)
sys.wait(100)
end
main.lua
PROJECT = "sensor"
VERSION = "1.0.0"
_G.sys = require("sys")
require("sen_BH1750") -- 光感
-- 加载I²C功能测试模块
T1_BH1750 = 1
-- i2c ID
esp32_i2c_id = 0 -- esp32只支持一路i2c, id为0
sys.taskInit(function()
if T1_BH1750 == 1 then
BH1750_init(esp32_i2c_id)
end
while 1 do
if T1_BH1750 == 1 then
BH1750_get()
end
sys.wait(100)
end
end)
sys.run()