NodeMCU检测环境亮度GY30程序

大家好我是渣渣辉,啊不对。。今天给大家分享一个NodeMCU通过GY-30也就是BH1750模块监控环境亮度的程序。
这是我手头的GY30模块,使用I2C总线协议。
经过查看手册,发现如下知识点:

下面三点极为关键,害我弄了一晚上!!!!!!

  • addr拉低时,GY30 I2C地址为0x23 BH1750好像是0x46
  • addr拉高时,I2C地址为0x5c BH1750好像是0xb8
  • 需要发送**0x01**进行初始化

这是官方的说明书
BH1750—GY30说明书
NodeMCU检测环境亮度GY30程序_第1张图片

我把sda接在nodeMCU的5号脚,scl接在nodeMCU的6号脚,写了如下程序。
NodeMCU检测环境亮度GY30程序_第2张图片

--初始化
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/

NodeMCU检测环境亮度GY30程序_第3张图片

你可能感兴趣的:(嵌入式)