init: Air780EPM 官方 LuatOS 项目代码基线

- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码
- 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等)
- 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
This commit is contained in:
wangfq
2026-08-31 08:53:49 +08:00
commit 173dd6874f
813 changed files with 125484 additions and 0 deletions
@@ -0,0 +1,121 @@
--[[
@module bmp280_demo
@summary BMP280 数字气压传感器演示模块,包含所有功能的演示用例
@version 1.0
@date 2026.07.24
@author 江访
@usage
本文件包含 BMP280 的逐项功能演示。
通过 exs_bmx280 扩展库的 API 逐一演示数据读取、IIR 滤波切换、海拔计算等功能。
Air780EPM 接线(软件 I2C):
SCL = GPIO31
SDA = GPIO30
]]
local exs_bmx280 = require "exs_bmx280"
-- [1/4] 初始化与数据读取
local function demo_init_and_read()
log.info("bmp280_demo", "===== [1/4] 初始化与数据读取 =====")
-- BMP280 使用软件 I2C 模式初始化,开启 IIR 滤波
-- 注意:BMP180 返回气压单位为 Pa,BMP280 返回气压单位为 hPa,使用时不需换算
local result = exs_bmx280.setup("I2C", {
scl = 31,
sda = 30,
filter = 4, -- 16 次采样平均,数据更平滑
})
if not result then
log.error("bmp280_demo", "BMP280 初始化失败,请检查接线")
return false
end
log.info("bmp280_demo", "BMP280 初始化成功,版本:", exs_bmx280.version())
-- 等待传感器稳定,数据手册推荐 200ms
sys.wait(200)
local data = exs_bmx280.get_data()
if data then
log.info("bmp280_demo", string.format("温度=%.2f°C 气压=%.2fhPa", data.temperature, data.pressure))
else
log.error("bmp280_demo", "读取数据失败")
end
sys.wait(1000) -- 稳定后等待 1 秒进入连续读取
-- 连续读取 3 次,观察数据变化
for i = 1, 3 do
sys.wait(2000) -- 每次读取间隔 2 秒
local d = exs_bmx280.get_data()
if d then
log.info("bmp280_demo", string.format("第%d次读取: 温度=%.2f°C 气压=%.1fhPa", i, d.temperature, d.pressure))
end
end
log.info("bmp280_demo", "---- [1/4] 完成 ----")
return true
end
-- [2/4] IIR 滤波器切换演示
local function demo_filter_switch()
log.info("bmp280_demo", "===== [2/4] IIR 滤波器切换演示 =====")
-- 依次切换 filter=0/1/2/3/4,观察数据变化
local filter_list = { 0, 1, 2, 3, 4 }
for _, f in ipairs(filter_list) do
log.info("bmp280_demo", string.format("设置滤波器 filter=%d", f))
exs_bmx280.set_filter(f)
sys.wait(100) -- 等待滤波器生效
local data = exs_bmx280.get_data()
if data then
log.info("bmp280_demo", string.format("filter=%d: 温度=%.2f°C 气压=%.2fhPa", f, data.temperature, data.pressure))
end
sys.wait(1000) -- 每档滤波器显示间隔 1 秒
end
log.info("bmp280_demo", "---- [2/4] 完成 ----")
end
-- [3/4] 海拔高度测量
local function demo_altitude()
log.info("bmp280_demo", "===== [3/4] 海拔高度测量 =====")
local data = exs_bmx280.get_data()
if data then
local alt = exs_bmx280.get_altitude(data.pressure)
log.info("bmp280_demo", string.format("温度=%.2f°C 气压=%.1fhPa 海拔=%.1f米", data.temperature, data.pressure, alt))
end
log.info("bmp280_demo", "---- [3/4] 完成 ----")
end
-- [4/4] 关闭传感器
local function demo_close()
log.info("bmp280_demo", "===== [4/4] 关闭传感器 =====")
exs_bmx280.close()
log.info("bmp280_demo", "---- [4/4] 完成 ----")
end
local function bmp280_demo_task_func()
log.info("bmp280_demo", "HELLO")
sys.wait(1000) -- 启动后等待 1 秒再开始演示
local ok = demo_init_and_read()
if not ok then
log.error("bmp280_demo", "初始化失败,演示终止")
return
end
sys.wait(500) -- 每项演示间隔 500ms
demo_filter_switch()
sys.wait(500) -- 每项演示间隔 500ms
demo_altitude()
sys.wait(500) -- 每项演示间隔 500ms
demo_close()
sys.wait(500) -- 关闭后等待 500ms 再结束
log.info("bmp280_demo", "===== [演示完毕] =====")
log.info("bmp280_demo", "End")
end
sys.taskInit(bmp280_demo_task_func)
@@ -0,0 +1,70 @@
--[[
@module main
@summary BMP280 数字气压传感器 Demo 入口
@version 1.0
@date 2026.07.24
@author 江访
]]
--[[
=== 演示内容 ===
本 demo 演示 exs_bmx280 扩展库的完整功能,顺序为:
HELLO→[1/4]→[2/4]→[3/4]→[4/4]→End
1、初始化和数据读取([1/4]
2、IIR 滤波器切换演示([2/4])
3、海拔高度测量([3/4]
4、关闭传感器([4/4]
]]
--[[
VERSION:项目版本号,ascii string类型
如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
]]
-- main.lua - 程序入口文件
PROJECT = "BMP280_Demo" -- 项目命名
VERSION = "001.000.000" -- 项目版本号
-- 在日志中打印项目名和项目版本号
log.info("main", PROJECT, VERSION)
-- 设置日志输出风格为样式2(建议调试时开启)
-- log.style(2)
-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
-- 启动errDump日志存储并且上传功能,600秒上传一次
-- if errDump then
-- errDump.config(true, 600)
-- end
-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
-- 可以使用合宙的iot.openluat.com平台进行远程升级
-- 也可以使用客户自己搭建的平台进行远程升级
-- 远程升级的详细用法,可以参考fota的demo进行使用
-- 启动一个循环定时器
-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
-- 方便分析内存使用是否有异常
-- sys.timerLoopStart(function()
-- log.info("mem.lua", rtos.meminfo())
-- log.info("mem.sys", rtos.meminfo("sys"))
-- end, 3000)
-- 加载 bmx280_demo.lua 演示模块
require "bmx280_demo"
-- 用户代码已结束
-- 结尾总是这一句
sys.run()
-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行
@@ -0,0 +1,208 @@
# BMP280 数字气压传感器演示
## 一、功能模块介绍
### 1.1 核心主程序模块
1. **main.lua** - 主程序入口
2. **bmp280_demo.lua** - BMP280 功能演示模块
### 1.2 扩展库模块
1. **exs_bmx280** - BMP280/BME280 扩展库,提供初始化、气压/温度/湿度读取、IIR 滤波配置、海拔高度计算等 API
### 1.3 I2C 模式说明
**推荐使用软件 I2C 模式**BMP280 使用标准 I2C 接口通信,软件 I2C 模式无需指定 I2C 控制器,任意 GPIO 均可模拟 I2C 时序,灵活性更高。本 demo 使用软件 I2C 模式演示。
## 二、演示流程介绍
本 demo 按顺序演示 exs_bmx280 扩展库的 4 项功能:HELLO → [1/4] → [2/4] → [3/4] → [4/4] → End
### 2.1 功能演示项说明
1. **[1/4] 初始化与数据读取** - 初始化 BMP280 传感器并读取温度(°C)和气压(hPa)数据
2. **[2/4] IIR 滤波器切换演示** - 依次切换 filter=0/1/2/3/4,观察数据平滑效果
3. **[3/4] 海拔高度测量** - 通过气压值计算当前海拔高度(米)
4. **[4/4] 关闭传感器** - 关闭传感器,结束演示
## 三、演示硬件环境
### 3.1 硬件清单
- Air780EPM 核心板 × 1
- BMP280 数字气压传感器模块 × 1
demo所演示的BMP280 气压传感器模块[购买链接](https://item.taobao.com/item.htm?abbucket=12&id=536588151627&mi_id=0000rIYIyPLv_DpmZ6ZcJUWP9s0vMMalxqy2nPnWDpHQZ48&ns=1&spm=a21n57.1.hoverItem.3&utparam=%7B%22aplus_abtest%22%3A%2296002c296ee298a12225edacf84fa11b%22%7D&xxc=taobaoSearch)
- 母对母杜邦线 × 4
- TYPE-C 数据线 × 1
### 3.2 接线配置
#### 3.2.1 BMP280 模块接线
![](https://docs.openluat.com/cdn/image/Air780EHM_exs_bmp280.png)
| Air780EPM 核心板 | BMP280 模块 |
|-----------------|------------|
| 32/GPIO31 | SCL |
| 31/GPIO30 | SDA |
| VDD_EXT | VCC |
| GND | GND |
> 说明:
> 1. 接线时注意杜邦线不宜过长,以免通信不稳定
> 2. SCL 和 SDA 需外接 4.7kΩ~10kΩ 上拉电阻到 VCC(部分模块已自带)
> 3. BMP280 的 I2C 地址:SDO=GND 时 0x76SDO=VCC 时 0x77
## 四、演示软件环境
### 4.1 开发工具
- [Luatools下载调试工具](https://docs.openluat.com/air780egh/luatos/common/download/) - 固件烧录和代码调试
### 4.2 内核固件
- [点击下载Air780EPM系列最新版本内核固件](https://docs.openluat.com/air780epm/luatos/firmware/780epm_version/)demo所使用的是 LuatOS-SoC_V2046_Air780EPM 1号固件
### 4.3 脚本文件
1. **main.lua** - 程序入口
2. **bmp280_demo.lua** - BMP280 功能演示模块
3. **exs_bmx280** - BMP280/BME280 扩展库
## 五、演示核心步骤
### 5.1 硬件准备
1. 按照接线表将 BMP280 模块连接到核心板
2. 确保电源连接正确,通过 TYPE-C USB 口供电
3. 检查所有接线无误,避免短路
### 5.2 软件配置
`main.lua` 中加载对应的演示模块:
```lua
require "bmp280_demo"
```
### 5.3 软件烧录
1. 使用 Luatools 选择最新内核固件
2. 下载本项目所有脚本文件
3. 将固件和脚本一起烧录到设备
4. 烧录成功后设备自动重启后开始运行
### 5.4 功能测试
#### 5.4.1 初始化与数据读取演示
1. 设备启动后打印 "HELLO",随后自动进入 [1/4] 初始化与数据读取
2. 观察日志输出,确认初始化成功
3. 观察温度(°C)和气压(hPa)的连续读取
#### 5.4.2 IIR 滤波器切换演示
1. 自动进入 [2/4] IIR 滤波器切换演示
2. 依次观察 filter=0(关闭)~ filter=416 次平均)下的数据
3. filter 越大数据跳动越小
#### 5.4.3 海拔高度测量
1. 自动进入 [3/4] 海拔高度测量
2. 观察基于当前气压值和海平面标准气压(101325Pa)计算的海拔高度
#### 5.4.4 关闭传感器
1. 自动进入 [4/4] 关闭传感器
2. 演示完毕后打印 "End"
### 5.5 预期效果
- **初始化与数据读取**:BMP280 初始化成功,温度与气压数据正常输出
- **IIR 滤波器切换**:不同滤波器下数据平滑度不同
- **海拔高度测量**:根据气压计算出当前海拔高度
- **关闭传感器**:传感器正常关闭
- **日志如下:**
```lua
[2026-07-24 19:59:39.006][000000000.213] D/user.exs_bmx280 version -> 202607240000
[2026-07-24 19:59:39.028][000000000.214] I/user.bmp280_demo HELLO
[2026-07-24 19:59:39.586][000000001.214] I/user.bmp280_demo ===== [1/4] =====
[2026-07-24 19:59:39.605][000000001.224] I/user.exs_bmx280 BMP280 @ I2C 0x76
[2026-07-24 19:59:39.613][000000001.262] I/user.exs_bmx280 : T1=27251 T2=25882 T3=50 P1=39170 P2=-10689
[2026-07-24 19:59:39.622][000000001.264] I/user.exs_bmx280 BMP280 , filter=4
[2026-07-24 19:59:39.630][000000001.265] I/user.bmp280_demo BMP280 : 202607240000
[2026-07-24 19:59:39.640][000000001.469] I/user.bmp280_demo =25.55°C =1008.00hPa
[2026-07-24 19:59:42.440][000000004.473] I/user.bmp280_demo 1: =26.02°C =1008.0hPa
[2026-07-24 19:59:43.789][000000005.748] I/mobile sim0 sms ready
[2026-07-24 19:59:43.809][000000005.749] D/mobile cid1, state0
[2026-07-24 19:59:43.822][000000005.749] D/mobile bearer act 0, result 0
[2026-07-24 19:59:43.837][000000005.750] D/mobile NETIF_LINK_ON -> IP_READY
[2026-07-24 19:59:43.852][000000005.786] D/mobile TIME_SYNC 0 tm 1784894382
[2026-07-24 19:59:44.448][000000006.477] I/user.bmp280_demo 2: =26.06°C =1008.0hPa
[2026-07-24 19:59:46.450][000000008.481] I/user.bmp280_demo 3: =26.08°C =1008.0hPa
[2026-07-24 19:59:46.476][000000008.481] I/user.bmp280_demo ---- [1/4] 完成 ----
[2026-07-24 19:59:46.949][000000008.982] I/user.bmp280_demo ===== [2/4] IIR =====
[2026-07-24 19:59:46.967][000000008.983] I/user.bmp280_demo filter=0
[2026-07-24 19:59:46.983][000000008.986] I/user.exs_bmx280 IIR 0
[2026-07-24 19:59:47.059][000000009.090] I/user.bmp280_demo filter=0: =26.09°C =1008.00hPa
[2026-07-24 19:59:48.071][000000010.090] I/user.bmp280_demo filter=1
[2026-07-24 19:59:48.091][000000010.093] I/user.exs_bmx280 IIR 1
[2026-07-24 19:59:48.164][000000010.197] I/user.bmp280_demo filter=1: =26.10°C =1008.00hPa
[2026-07-24 19:59:49.175][000000011.197] I/user.bmp280_demo filter=2
[2026-07-24 19:59:49.196][000000011.200] I/user.exs_bmx280 IIR 2
[2026-07-24 19:59:49.284][000000011.305] I/user.bmp280_demo filter=2: =26.11°C =1008.00hPa
[2026-07-24 19:59:50.281][000000012.305] I/user.bmp280_demo filter=3
[2026-07-24 19:59:50.301][000000012.308] I/user.exs_bmx280 IIR 3
[2026-07-24 19:59:50.390][000000012.412] I/user.bmp280_demo filter=3: =26.12°C =1008.00hPa
[2026-07-24 19:59:51.387][000000013.412] I/user.bmp280_demo filter=4
[2026-07-24 19:59:51.409][000000013.415] I/user.exs_bmx280 IIR 4
[2026-07-24 19:59:51.497][000000013.520] I/user.bmp280_demo filter=4: =26.13°C =1008.00hPa
[2026-07-24 19:59:52.493][000000014.520] I/user.bmp280_demo ---- [2/4] 完成 ----
[2026-07-24 19:59:52.992][000000015.020] I/user.bmp280_demo ===== [3/4] =====
[2026-07-24 19:59:53.011][000000015.024] I/user.bmp280_demo =26.14°C =1008.0hPa =43.8
[2026-07-24 19:59:53.025][000000015.025] I/user.bmp280_demo ---- [3/4] 完成 ----
[2026-07-24 19:59:53.492][000000015.525] I/user.bmp280_demo ===== [4/4] =====
[2026-07-24 19:59:53.511][000000015.527] I/user.exs_bmx280
[2026-07-24 19:59:53.528][000000015.527] I/user.bmp280_demo ---- [4/4] 完成 ----
[2026-07-24 19:59:54.003][000000016.027] I/user.bmp280_demo ===== [] =====
[2026-07-24 19:59:54.025][000000016.027] I/user.bmp280_demo End
```
### 5.6 故障排除
1. **传感器初始化失败**
- 检查 BMP280 接线是否正确(SCL、SDA、VCC、GND
- 确认 GPIO 引脚配置与接线一致
- 检查电源电压是否稳定(3.3V
- 确认 SCL/SDA 上拉电阻是否连接
- 确认 exs_bmx280 扩展库已正常加载
2. **读取数据异常**
- 检查传感器供电是否正常
- 自动地址检测会尝试 0x76 和 0x77,确认 SDO 引脚电平
- 检查接线无松动
3. **海拔高度显示异常**
- 海拔计算基于海平面标准气压 101325Pa,天气变化会影响计算精度
- 可通过 `exs_bmx280.set_sea_level_pressure(pressure)` 传入实际海平面气压校正
### 5.7 扩展功能建议
exs_bmx280 更多接口的使用可以查看 [exs_bmx280 扩展库说明](https://docs.openluat.com/osapi/ext/sensor/exs_bmx280/)
## 六、BMP180 与 BMP280 对比
| 特性 | BMP180 | BMP280 |
|------|--------|--------|
| 扩展库 | exs_bmp180 | exs_bmx280 |
| 初始化方式 | `exs_bmp180.setup({scl, sda})` | `exs_bmx280.setup("I2C", {scl, sda, ...})` |
| 气压单位 | Pa(帕斯卡) | hPa(百帕斯卡) |
| 温度精度 | 0.1°C | 0.01°C |
| IIR 滤波 | 不支持(过采样 OSS 方式) | 支持 filter=0~4 |
| 工作电压 | 1.8V~3.6V | 1.71V~3.6V |
| 气压范围 | 300~1100hPa | 300~1100hPa |
| 湿度测量 | 不支持 | BME280 型号支持 |