物联网嵌入式【免费下载链接】nodemcu-firmwareLua based interactive firmware for ESP8266, ESP8285 and ESP32项目地址https://gitcode.com/gh_mirrors/no/nodemcu-firmware点击查看免费下载本指南以本仓库 bh1750_CN.md 文档为主体结合 bh1750.lua 源码与配套示例系统讲解在 NodeMCU 固件上通过 I²C 总线驱动 BH1750GY-30数字环境光传感器的方法。读完本文你将掌握该 Lua 模块的加载/释放、引脚初始化、数据读取与 Lux 值换算的完整实战流程并理解其底层 I²C 通信原理。一、模块概览一个轻量的 I²C 光照采集方案BH1750常见于 GY-30 模块是一款数字环境光传感器通过 I²C 接口输出 16 位光照强度数据无需额外换算即可获得 Lux 勒克斯值。本仓库中的 Lua 模块最初由 Martin Han 于 2015-01-30 提交维护记录见 docs/lua-modules/bh1750.md。该模块以纯 Lua 实现运行在 NodeMCU 固件之上核心文件与配套资源位于lua_modules/bh1750/目录bh1750.lua模块主体实现bh1750_CN.md中文 API 文档bh1750_EN.md英文 API 文档bh1750_Example1.lua周期性采集示例bh1750_Example2.lua联网上报云端示例。重要依赖此模块依赖固件内置的i2cC 模块源码见 app/modules/i2c.c。构建固件时需确保user_modules.h中启用了i2c模块否则require(bh1750)后无法正常通信。ESP8266 芯片本身没有硬件 I²C 控制器NodeMCU 固件使用软件 I²C 驱动因此 SDA/SCL 可以自由选择任意可用 GPIO详见 i2c 模块文档这正是本模块init(sda, scl)需要显式传入引脚号的原因。二、模块加载与释放加载requirebh1750 require(bh1750)require会执行 bh1750.lua 并返回模块表M其中封装了init、read、getlux三个公开方法。释放bh1750 nil package.loaded[bh1750] nil这两行分别断开全局引用、清除 Lua 模块缓存使模块可以被重新加载或回收内存适合在需要更换引脚或重跑初始化流程时使用。三、bh1750.init(sda, scl)初始化 I²C 引脚描述设置 BH1750 所在的 I²C 引脚并完成 I²C 总线初始化。语法bh1750.init(sda, scl)参数参数取值范围说明sda1 ~ 12SDA 数据线的 IO indexI/O 索引号scl1 ~ 12SCL 时钟线的 IO indexI/O 索引号注意参数是IO indexNodeMCU 风格的引脚索引并非 GPIO 编号本身。以文档示例为例SDA_PIN 6 -- sda pin, GPIO12 SCL_PIN 5 -- scl pin, GPIO14 bh1750 require(bh1750) bh1750.init(SDA_PIN, SCL_PIN)即 IO index6对应 GPIO12IO index5对应 GPIO14。这一映射关系在固件底层的 pin_map.c 引脚映射表中可查证表中按顺序将 GPIO16、GPIO5、GPIO4、GPIO0、GPIO2、GPIO14、GPIO12……依次编号为 index 0、1、2、3、4、5、6……。返回值nil底层行为从源码 bh1750.lua 可以看出init实际执行的是i2c.setup(id, sda, scl, i2c.SLOW) init true其中id固定为0总线 0速度固定为i2c.SLOW标准模式100 kHz。init true这个内部标记会在read()中用于校验是否已初始化。I²C 总线采用开漏模式工作SDA 与 SCL 线上通常需要 1k10k 的上拉电阻多数 GY-30 成品模块已板载上拉可直接接线使用。四、bh1750.read()触发一次数据读取描述从 BH1750 中读取一次光线传感器数据并将结果缓存在模块内部供getlux()提取。语法bh1750.read()参数无。返回值nil真正的 Lux 数据需通过getlux()获取。底层读取流程read() 的实现 会先检查init标志function M.read() if (not init) then print(init() must be called before read.) else read_lux() end end如果忘记调用init()就执行read()控制台会打印init() must be called before read.的提示这是排查问题时最常见的一条报错信息。成功读取后内部走的是标准的 I²C 写命令 读数据流程read_data 函数i2c.start(id)发送起始条件i2c.address(id, 0x23, i2c.TRANSMITTER)以写模式寻址传感器地址0x23即 GY-30 模块默认的 I²C 从机地址i2c.write(id, CMD)写入测量命令CMD 0x10连续 H 分辨率模式i2c.stop(id)结束写操作再次i2c.start(id)以i2c.RECEIVER读模式重新寻址通过tmr.delay(200000)等待传感器完成 A/D 转换i2c.read(id, 2)读取 2 字节原始数据i2c.stop(id)收尾。这一段调用链与 i2c 模块文档 中描述的i2c.start/address/write/stop/read用法完全对应可作为理解底层原理的参照。五、bh1750.getlux()提取 Lux 数据描述获取最近一次read()得到的光照强度数据。语法bh1750.getlux()参数无。返回值l整数Lux 计数。注意这里的返回值放大了 100 倍即实际照度单位 lxl / 100因此文档示例采用如下格式化输出SDA_PIN 6 -- sda pin, GPIO12 SCL_PIN 5 -- scl pin, GPIO14 bh1750 require(bh1750) bh1750.init(SDA_PIN, SCL_PIN) bh1750.read() l bh1750.getlux() print(lux: ..(l / 100).....(l % 100).. lx) -- release module bh1750 nil package.loaded[bh1750]nil换算原理从源码 read_lux 函数 可以看到换算公式local UT dataT:byte(1) * 256 dataT:byte(2) l (UT*1000/12)dataT:byte(1) * 256 dataT:byte(2)将两个字节拼成 16 位原始计数值l UT * 1000 / 12等价于UT / 1.2 × 100。BH1750 在 H 分辨率模式下每个计数单位约对应 1.2 lx 的照度因此UT / 1.2得到实际照度lx再乘以 100 即为模块返回的整数l。由于 Lua 中整数除法会截断放大 100 倍可以保留两位小数精度这也是示例中(l / 100).....(l % 100)这种打印方式的由来。六、实战示例一定时周期采集光照强度Example1 演示了使用 NodeMCU 定时器tmr每 10 秒自动采集一次的完整用法适合长期运行的环境光监测场景local bh1750 require(bh1750) local sda 6 -- sda pin, GPIO12 local scl 5 -- scl pin, GPIO14 do bh1750.init(sda, scl) tmr.create():alarm(10000, tmr.ALARM_AUTO, function() bh1750.read() local l bh1750.getlux() print(lux: ..(l / 100).....(l % 100).. lx) end) end要点说明bh1750.init(sda, scl)只需执行一次tmr.create():alarm(10000, tmr.ALARM_AUTO, ...)创建自动循环定时器每隔 10000 ms 触发一次回调回调内先read()触发读取再getlux()取值二者必须成对使用。七、实战示例二采集数据联网上报Example2 展示了将光照数据通过 HTTP POST 上报到云平台的思路适用于把传感器接入物联网云端场景。核心流程如下local bh1750 require(bh1750) local sda 6 local scl 5 local ServerIP do bh1750.init(sda, scl) tmr.create():alarm(60000, tmr.ALARM_AUTO, function() bh1750.read() local l bh1750.getlux() -- 定义数据变量格式 local PostData [{\Name\:\T\,\Value\:\ ..(l / 100).....(l % 100)..\}] -- 创建 TCP 连接 local socket net.createConnection(net.TCP, 0) -- 域名解析 socket:dns(www.lewei50.com, function(_, ip) ServerIP ip print(Connection IP: .. ServerIP) end) -- 连接服务器 socket:connect(80, ServerIP) socket:on(connection, function() end) -- 发送 HTTP POST 请求 socket:send(POST /api/V1/gateway/UpdateSensors/LW_GATEWAY HTTP/1.1\r\n .. Host: www.lewei50.com\r\n .. Content-Length: .. string.len(PostData) .. \r\n .. userkey: USERKEY\r\n\r\n .. PostData .. \r\n) -- 打印 HTTP 响应 socket:on(receive, function(sck, response) -- luacheck: no unused print(response) end) end) end该示例涉及的网络 APInet.createConnection、socket:dns、socket:connect、socket:send等属于 NodeMCU 的net模块能力使用时需将LW_GATEWAY设备标识与USERKEY用户密钥替换为自己的实际凭据。八、底层实现细节与注意事项固定常量一览从 bh1750.lua 源码中可确认以下硬编码常量| 常量 | 值 | 含义 | | ---- | -- | ---- | |GY_30_address|0x23| BH1750 / GY-30 的 I²C 从机地址 | |id|0| 固定使用 I²C 总线 0 | |CMD|0x10| 连续 H 分辨率测量命令0x10 | | 读取字节数 |2| 16 位测量结果 |由于地址、总线号、测量命令均为硬编码模块开箱即用无需额外配置但这也意味着如果硬件上通过 ADDR 引脚将地址改成了0x5C或需要同时挂接多片同地址传感器就需要自行修改源码地址、总线号层面。I²C 速度与稳定性模块以i2c.SLOW100 kHz 标准模式初始化总线这是保守且兼容性最好的选择。若自行改用更高速率需参考 docs/modules/i2c.mdi2c.FAST400 kHz、i2c.FASTPLUS1 MHz需 CPU 160 MHz。ESP8266 的 I²C 为软件实现遇到时序问题时可适当降低速率。使用限制提醒必须先 init 再 read未初始化就调用read()只会打印提示而不会读取数据read/getlux 成对使用read()返回nil数据缓存在模块内部必须通过getlux()取出固件需包含 i2c 模块否则模块无法工作构建固件时注意在 app/include/user_modules.h 中启用i2cGPIO 选择引脚参数为 IO index112推荐参照示例使用 GPIO12/GPIO14 等常规引脚GPIO16 虽可作 SCL 但速度受限且可能与深睡复位冲突详见 i2c 模块文档。九、小结BH1750 的 NodeMCU Lua 模块以极简的三函数 APIinit/read/getlux封装了完整的 I²C 读写流程通过i2c.setup初始化总线、以0x10命令触发连续 H 分辨率测量、读取 2 字节原始数据并按UT*1000/12换算为放大 100 倍的 Lux 整数。无论是本地周期采集Example1还是联网上报Example2掌握上述 API 语义与换算原理后即可快速将 BH1750 集成到自己的光照监测项目中。赞分享物联网嵌入式【免费下载链接】nodemcu-firmwareLua based interactive firmware for ESP8266, ESP8285 and ESP32项目地址https://gitcode.com/gh_mirrors/no/nodemcu-firmware点击查看免费下载相关推荐NodeMCU 固件 BH1750 环境光传感器 Lua 模块完整指南NodeMCU 固件 BH1750 环境光传感器 Lua 模块完整指南 导读 本文面向在 NodeMCUESP8266/ESP8285上使用 Lua 开发环物联网嵌入式NodeMCU hx711 模块基于 HX711 称重传感器 ADC 的 Lua 驱动完全指南NodeMCU hx711 模块基于 HX711 称重传感器 ADC 的 Lua 驱动完全指南 导读 本文面向在 NodeMCUESP8266/ESP828物联网嵌入式NodeMCU BME680 模块指南基于 Lua 的环境传感器集成实战NodeMCU BME680 模块指南基于 Lua 的环境传感器集成实战 NodeMCU 固件为 Bosch BME680 温/湿/气压与气体VOC传感器物联网嵌入式上一篇深度解析现代Web签名技术Signature Pad架构设计与性能优化指南下一篇构建高分辨率二分图像分割解决方案BiRefNet专业部署指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
