大家好我是渣渣辉,啊不对。。今天给大家分享一个NodeMCU通过GY-30也就是BH1750模块监控环境亮度的程序。
这是我手头的GY30模块,使用I2C总线协议。
经过查看手册,发现如下知识点:
我把sda接在nodeMCU的5号脚,scl接在nodeMCU的6号脚,写了如下程序。
--初始化
function initGY30(sda ,scl)
i2c.setup(0, sda, scl, i2c.SLOW)
end
function readGY30(mode,func)
--mode是函数参数,func是测量完成后的回调参数
--因为测量需要时间,所以要写成回调模式
i2c.start(0)
i2c.address(0, 0x23, i2c.TRANSMITTER)
i2c.write(0, 0x01)
i2c.stop(0)
--上面四句话是发送0x01,模块上电,准备测量。
i2c.start(0)
i2c.address(0, 0x23, i2c.TRANSMITTER)
i2c.write(0, mode)
i2c.stop(0)
--这四句代码的是输入测量模式,mode是函数参数
tmr.alarm(2,129,tmr.ALARM_SINGLE,function()
--启动一个延时器,129毫秒后读取,sda线上的数据。
--下面四句话是读取的过程
--之所以取129毫秒,是因为测量最长需要120毫秒哈哈哈
i2c.start(0)
i2c.address(0, 0x23, i2c.RECEIVER)
local c = i2c.read(0, 2)
--读出两个Byte的数据"local c"是string类型
i2c.stop(0)
if string.byte(c,1)~=0 then
--如果前一个字节不为零,也就是当前环境亮度大于255lx
--string.byte(c,n) 把c的第n个字符换为十进制整数
--把第一个字节左移8位也就是×256,加上第二个字节
local lx=string.byte(c,1)*256+string.byte(c,2)
func(lx)--回调
else
--如果前一个字节为零,也就是当前环境亮度小于255lx
local lx=string.byte(c,2)
func(lx)--回调
end
end)
end
initGY30(5,6)
tmr.alarm(6,500,tmr.ALARM_AUTO,function()
readGY30(0x20,function(lx)
--回调函数具体执行的内容,这里是打印出来
print('lx:'..lx)
end)
end)
很多同学喜欢没有注释直接复制的,那我就再贴一份。
function initGY30(sda ,scl)
i2c.setup(0, sda, scl, i2c.SLOW)
end
function readGY30(mode,func)
i2c.start(0)
i2c.address(0, 0x23, i2c.TRANSMITTER)
i2c.write(0, 0x01)
i2c.stop(0)
i2c.start(0)
i2c.address(0, 0x23, i2c.TRANSMITTER)
i2c.write(0, mode)
i2c.stop(0)
tmr.alarm(2,129,tmr.ALARM_SINGLE,function()
i2c.start(0)
i2c.address(0, 0x23, i2c.RECEIVER)
local c = i2c.read(0, 2)
i2c.stop(0)
if string.byte(c,1)~=0 then
local lx=string.byte(c,1)*256+string.byte(c,2)
func(lx)
else
local lx=string.byte(c,2)
func(lx)
end
end)
end
initGY30(5,6)
tmr.alarm(6,500,tmr.ALARM_AUTO,function()
readGY30(0x20,function(lx)
print('lx:'..lx)
end)
end)
用原生ESP8266的同学可能不知道5脚和6脚在哪里,可以看下图,可以到nodemcu官网查阅。
http://nodemcu.readthedocs.io/en/dev/en/modules/gpio/