init: Air780EPM 官方 LuatOS 项目代码基线
- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码 - 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等) - 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
--[[
|
||||
@module main
|
||||
@summary SPL06-001 数字气压传感器 Demo 入口
|
||||
@version 1.0
|
||||
@date 2026.08.21
|
||||
@author 江访
|
||||
@usage
|
||||
本 demo 演示 exs_spl06 扩展库的完整功能,业务逻辑见 spl06_app.lua
|
||||
]]
|
||||
|
||||
--[[
|
||||
=== 演示内容 ===
|
||||
|
||||
本 demo 演示 exs_spl06 扩展库的完整功能,顺序为:
|
||||
HELLO→[1/5]→[2/5]→[3/5]→[4/5]→[5/5]→End
|
||||
1、初始化([1/5])
|
||||
2、数据读取([2/5])
|
||||
3、海拔高度计算([3/5])
|
||||
4、过采样率切换([4/5])
|
||||
5、测量模式切换与休眠唤醒([5/5])
|
||||
|
||||
更多说明参考本目录下的 readme.md 文件
|
||||
]]
|
||||
|
||||
--[[
|
||||
VERSION:项目版本号,ascii string类型
|
||||
如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
|
||||
X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
|
||||
因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
|
||||
如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
|
||||
]]
|
||||
|
||||
PROJECT = "sensor_spl06" -- 项目命名
|
||||
VERSION = "001.999.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秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
|
||||
-- 方便分析内存使用是否有异常
|
||||
-- local function mem_check_func()
|
||||
-- log.info("mem.lua", rtos.meminfo())
|
||||
-- log.info("mem.sys", rtos.meminfo("sys"))
|
||||
-- end
|
||||
-- sys.timerLoopStart(mem_check_func, 3000)
|
||||
|
||||
-- 加载 spl06_app.lua 演示模块
|
||||
require "spl06_app"
|
||||
|
||||
-- 用户代码已结束
|
||||
-- 结尾总是这一句
|
||||
sys.run()
|
||||
-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行
|
||||
@@ -0,0 +1,232 @@
|
||||
# SPL06-001 数字气压传感器演示
|
||||
|
||||
## 一、功能模块介绍
|
||||
|
||||
### 1.1 核心主程序模块
|
||||
|
||||
1. **main.lua** - 主程序入口,负责项目初始化、版本定义和任务调度
|
||||
2. **spl06_app.lua** - SPL06-001 功能演示模块,包含初始化、数据读取、海拔计算、过采样切换、模式切换与休眠唤醒等所有功能的演示用例
|
||||
|
||||
### 1.2 扩展库模块
|
||||
|
||||
1. **exs_spl06** - SPL06-001 扩展库,提供初始化(I2C 地址自动探测、芯片 ID 校验、校准系数读取)、气压/温度读取、过采样率切换、海拔高度计算、测量模式切换、休眠唤醒、关闭等 API
|
||||
|
||||
### 1.3 I2C 模式说明
|
||||
|
||||
**推荐使用软件 I2C 模式**:SPL06-001 使用标准 I2C 接口通信,软件 I2C 模式无需指定 I2C 控制器,任意 GPIO 均可模拟 I2C 时序,灵活性更高。本 demo 默认使用软件 I2C 模式(SCL=GPIO31, SDA=GPIO30)演示,也可通过 `spl06_app.lua` 中的 `MODE` 变量切换为硬件 I2C 模式。
|
||||
|
||||
> SPL06-001 是**双地址芯片**:SDO 引脚悬空或接高电平时地址为 0x77,SDO 接 GND 时地址为 0x76。`setup()` 不传 `addr` 时扩展库会自动探测两个地址并校验芯片 ID,无需手动配置。
|
||||
|
||||
## 二、演示流程介绍
|
||||
|
||||
本 demo 按顺序演示 exs_spl06 扩展库的 5 项功能:HELLO → [1/5] → [2/5] → [3/5] → [4/5] → [5/5] → End
|
||||
|
||||
### 2.1 功能演示项说明
|
||||
|
||||
1. **[1/5] 初始化** - 初始化传感器(I2C 地址自动探测、芯片 ID 校验、校准系数读取、过采样率配置、缩放基准建立)
|
||||
2. **[2/5] 数据读取** - 连续读取 5 次气压(hPa)和温度(℃),并演示单次读取接口
|
||||
3. **[3/5] 海拔高度计算** - 按国际气压测高公式计算海拔高度,支持自定义海平面气压
|
||||
4. **[4/5] 过采样率切换** - 依次切换气压过采样率 1x/16x/64x(含缩放因子动态自校准),观察不同精度下的数据
|
||||
5. **[5/5] 模式切换与休眠唤醒** - 切换待机/单次/连续测量模式,演示休眠唤醒与资源释放
|
||||
|
||||
## 三、演示硬件环境
|
||||
|
||||
### 3.1 硬件清单
|
||||
|
||||
- Air780EPM 核心板 × 1
|
||||
- SPL06-001 数字气压传感器模块 × 1
|
||||
demo所演示的SPL06-001 数字气压传感器模块[购买链接](https://item.taobao.com/item.htm?abbucket=12&id=754082120547&mi_id=00002cEFf0br1iAbdFxAZR2wZA_t7gtaASLPpQM39JfcWTs&ns=1&priceTId=214783cd17873034704783015e0fdd&skuId=5372558067929&spm=a21n57.1.hoverItem.2&utparam=%7B%22aplus_abtest%22%3A%222783bdd13dde62ac2d7099c56862328f%22%7D&xxc=taobaoSearch)
|
||||
- 母对母杜邦线 × 4
|
||||
- TYPE-C 数据线 × 1
|
||||
|
||||
### 3.2 接线配置
|
||||
|
||||
#### 3.2.1 I2C 模式接线
|
||||
|
||||
| Air780EPM 核心板 | SPL06-001 模块 |
|
||||
|------------------|--------------|
|
||||
| 32/GPIO31 | SCL |
|
||||
| 31/GPIO30 | SDA |
|
||||
| VDD_EXT | VCC(3.3V) |
|
||||
| GND | GND |
|
||||
|
||||
> 说明:
|
||||
> 1. 接线时注意杜邦线不宜过长,以免通信不稳定
|
||||
> 2. SCL 和 SDA 需外接 4.7kΩ~10kΩ 上拉电阻到 VCC(部分模块已自带)
|
||||
> 3. 模块 SDO 引脚悬空(或接高电平)时 I2C 地址为 0x77,接 GND 时地址为 0x76;扩展库会自动探测,无需关心
|
||||
|
||||

|
||||
|
||||
## 四、演示软件环境
|
||||
|
||||
### 4.1 开发工具
|
||||
|
||||
- [Luatools下载调试工具](https://docs.openluat.com/air780epm/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. **spl06_app.lua** - SPL06-001 功能演示模块
|
||||
3. **exs_spl06** - SPL06-001 扩展库
|
||||
|
||||
## 五、演示核心步骤
|
||||
|
||||
### 5.1 硬件准备
|
||||
|
||||
1. 按照接线表将 SPL06-001 模块连接到核心板
|
||||
2. 确保电源连接正确,通过 TYPE-C USB 口供电
|
||||
3. 检查所有接线无误,避免短路
|
||||
|
||||
### 5.2 软件配置
|
||||
|
||||
在 `main.lua` 中加载对应的演示模块:
|
||||
|
||||
```lua
|
||||
-- 加载 spl06_app.lua 演示模块
|
||||
require "spl06_app"
|
||||
```
|
||||
|
||||
如需切换通信模式,修改 `spl06_app.lua` 中的 `MODE` 变量(1=软件 I2C,2=硬件 I2C)。
|
||||
|
||||
### 5.3 软件烧录
|
||||
|
||||
1. 使用 Luatools 选择最新内核固件
|
||||
2. 下载本项目所有脚本文件
|
||||
3. 将固件和脚本一起烧录到设备
|
||||
4. 烧录成功后设备自动重启后开始运行
|
||||
|
||||
### 5.4 功能测试
|
||||
|
||||
#### 5.4.1 初始化演示
|
||||
|
||||
1. 设备启动后打印 "HELLO",随后自动进入 [1/5] 初始化
|
||||
2. 观察日志输出,确认初始化成功(应看到 `芯片地址自适应:0x76/0x77` 和 `初始化完成`)
|
||||
|
||||
#### 5.4.2 数据读取演示
|
||||
|
||||
1. 自动进入 [2/5] 数据读取
|
||||
2. 观察气压(hPa)和温度(℃)的连续读取,共 5 次,再观察单次读取接口结果
|
||||
|
||||
#### 5.4.3 海拔计算演示
|
||||
|
||||
1. 自动进入 [3/5] 海拔高度计算
|
||||
2. 观察气压值与两种海平面气压基准(默认 1013.25hPa / 自定义 1005hPa)下的海拔高度
|
||||
|
||||
#### 5.4.4 过采样率切换演示
|
||||
|
||||
1. 自动进入 [4/5] 过采样率切换演示
|
||||
2. 依次观察气压 OSR=0(1x 最快)、OSR=4(16x 默认)、OSR=6(64x 高精度)下的数据
|
||||
3. 切换高过采样时观察缩放因子动态自校准日志(`缩放因子动态校准: kP ... kT ...`)
|
||||
4. 注意 OSR 越高,数据跳动越小,但单次测量耗时越长
|
||||
|
||||
#### 5.4.5 模式切换与休眠唤醒演示
|
||||
|
||||
1. 自动进入 [5/5] 模式切换与休眠唤醒
|
||||
2. 依次观察待机(standby)/单次气压(pressure)/连续(both)模式的切换日志
|
||||
3. 观察睡眠 3 秒后唤醒、唤醒后数据恢复输出、最后关闭传感器
|
||||
|
||||
### 5.5 预期效果
|
||||
|
||||
- **初始化**:SPL06-001 初始化成功,芯片地址自动探测锁定、校准系数读取正常
|
||||
- **数据读取**:气压与温度数据正常输出(气压约 1002.87hPa,温度约 23.6℃)
|
||||
- **海拔计算**:基于实测气压输出海拔高度(默认/自定义海平面气压两种)
|
||||
- **过采样率切换**:不同 OSR 下精度不同,OSR 越高数据越稳定;切换高过采样时自动动态校准
|
||||
- **模式切换与休眠唤醒**:待机/单次/连续模式切换正常,睡眠后唤醒数据恢复输出
|
||||
|
||||
- **日志如下:**
|
||||
```lua
|
||||
[2026-08-21 17:28:45.888][000000000.200] I/user.main sensor_spl06 001.999.000
|
||||
[2026-08-21 17:28:45.899][000000000.216] D/user.exs_spl06 version -> 202608211700
|
||||
[2026-08-21 17:28:45.942][000000000.217] I/user.spl06_app HELLO
|
||||
[2026-08-21 17:28:47.219][000000001.217] I/user.spl06_app ===== [1/5] 初始化 =====
|
||||
[2026-08-21 17:28:47.638][000000001.225] I/user.exs_spl06 芯片地址自适应:0x76
|
||||
[2026-08-21 17:28:47.681][000000001.294] I/user.exs_spl06 缩放基准原始值: P -112660 T 2295708
|
||||
[2026-08-21 17:28:47.761][000000001.294] I/user.exs_spl06 初始化完成, prs_osr=4 tmp_osr=3
|
||||
[2026-08-21 17:28:47.833][000000001.295] I/user.spl06_app SPL06-001 初始化成功,版本: 202608211700
|
||||
[2026-08-21 17:28:47.882][000000001.795] I/user.spl06_app ===== [2/5] 数据读取 =====
|
||||
[2026-08-21 17:28:47.899][000000001.795] I/user.spl06_app 连续读取 5 次气压/温度(单位 hPa / ℃)
|
||||
[2026-08-21 17:28:48.336][000000001.802] I/user.spl06_app 第1次: 气压=1002.86hPa 温度=23.8℃
|
||||
[2026-08-21 17:28:48.366][000000002.808] I/user.spl06_app 第2次: 气压=1002.85hPa 温度=23.8℃
|
||||
[2026-08-21 17:28:48.408][000000003.814] I/user.spl06_app 第3次: 气压=1002.86hPa 温度=23.8℃
|
||||
[2026-08-21 17:28:48.588][000000004.820] I/user.spl06_app 第4次: 气压=1002.86hPa 温度=23.8℃
|
||||
[2026-08-21 17:28:49.571][000000005.826] I/user.spl06_app 第5次: 气压=1002.86hPa 温度=23.8℃
|
||||
[2026-08-21 17:28:50.691][000000006.928] I/user.spl06_app 单次气压=1002.86hPa 单次温度=23.8℃
|
||||
[2026-08-21 17:28:51.194][000000007.428] I/user.spl06_app ===== [3/5] 海拔高度计算 =====
|
||||
[2026-08-21 17:28:51.240][000000007.440] I/user.spl06_app 气压=1002.87hPa,默认海平面气压海拔=86.8米,自定义1005hPa海拔=17.9米
|
||||
[2026-08-21 17:28:51.687][000000007.940] I/user.spl06_app ===== [4/5] 过采样率切换 =====
|
||||
[2026-08-21 17:28:51.709][000000007.940] I/user.spl06_app 依次切换气压过采样率 1x/16x/64x(温度保持 8x),观察数据精度
|
||||
[2026-08-21 17:28:51.749][000000007.985] I/user.exs_spl06 缩放因子动态校准: kP 524310 kT 7864779
|
||||
[2026-08-21 17:28:51.765][000000007.986] I/user.exs_spl06 过采样切换成功, prs_osr=0 tmp_osr=3
|
||||
[2026-08-21 17:28:51.802][000000007.986] I/user.spl06_app 气压OSR=0(1x),开始采集
|
||||
[2026-08-21 17:28:52.186][000000008.442] I/user.spl06_app OSR=0 第1次: 气压=1002.83hPa 温度=23.8℃
|
||||
[2026-08-21 17:28:53.202][000000009.448] I/user.spl06_app OSR=0 第2次: 气压=1002.88hPa 温度=23.8℃
|
||||
[2026-08-21 17:28:54.196][000000010.454] I/user.spl06_app OSR=0 第3次: 气压=1002.87hPa 温度=23.8℃
|
||||
[2026-08-21 17:28:55.210][000000011.460] I/user.spl06_app OSR=0 第4次: 气压=1002.84hPa 温度=23.8℃
|
||||
[2026-08-21 17:28:56.213][000000012.466] I/user.spl06_app OSR=0 第5次: 气压=1002.84hPa 温度=23.8℃
|
||||
[2026-08-21 17:28:57.208][000000013.466] I/user.spl06_app OSR=0 平均气压=1002.85hPa
|
||||
[2026-08-21 17:28:57.286][000000013.536] I/user.exs_spl06 缩放因子动态校准: kP 253984 kT 7868382
|
||||
[2026-08-21 17:28:57.294][000000013.537] I/user.exs_spl06 过采样切换成功, prs_osr=4 tmp_osr=3
|
||||
[2026-08-21 17:28:57.304][000000013.537] I/user.spl06_app 气压OSR=4(16x),开始采集
|
||||
[2026-08-21 17:28:57.800][000000014.047] I/user.spl06_app OSR=4 第1次: 气压=1002.85hPa 温度=23.8℃
|
||||
[2026-08-21 17:28:58.805][000000015.053] I/user.spl06_app OSR=4 第2次: 气压=1002.85hPa 温度=23.8℃
|
||||
[2026-08-21 17:28:59.823][000000016.059] I/user.spl06_app OSR=4 第3次: 气压=1002.85hPa 温度=23.8℃
|
||||
[2026-08-21 17:29:00.819][000000017.065] I/user.spl06_app OSR=4 第4次: 气压=1002.85hPa 温度=23.8℃
|
||||
[2026-08-21 17:29:01.814][000000018.071] I/user.spl06_app OSR=4 第5次: 气压=1002.85hPa 温度=23.8℃
|
||||
[2026-08-21 17:29:02.822][000000019.071] I/user.spl06_app OSR=4 平均气压=1002.85hPa
|
||||
[2026-08-21 17:29:02.963][000000019.219] I/user.exs_spl06 缩放因子动态校准: kP 1040493 kT 7864292
|
||||
[2026-08-21 17:29:02.970][000000019.220] I/user.exs_spl06 过采样切换成功, prs_osr=6 tmp_osr=3
|
||||
[2026-08-21 17:29:02.976][000000019.220] I/user.spl06_app 气压OSR=6(64x),开始采集
|
||||
[2026-08-21 17:29:03.476][000000019.730] I/user.spl06_app OSR=6 第1次: 气压=1002.85hPa 温度=23.8℃
|
||||
[2026-08-21 17:29:04.489][000000020.736] I/user.spl06_app OSR=6 第2次: 气压=1002.85hPa 温度=23.8℃
|
||||
[2026-08-21 17:29:05.495][000000021.742] I/user.spl06_app OSR=6 第3次: 气压=1002.85hPa 温度=23.8℃
|
||||
[2026-08-21 17:29:06.493][000000022.748] I/user.spl06_app OSR=6 第4次: 气压=1002.84hPa 温度=23.8℃
|
||||
[2026-08-21 17:29:07.495][000000023.754] I/user.spl06_app OSR=6 第5次: 气压=1002.84hPa 温度=23.8℃
|
||||
[2026-08-21 17:29:08.504][000000024.754] I/user.spl06_app OSR=6 平均气压=1002.85hPa
|
||||
[2026-08-21 17:29:09.033][000000025.292] I/user.exs_spl06 缩放因子动态校准: kP 253960 kT 7869000
|
||||
[2026-08-21 17:29:09.044][000000025.293] I/user.exs_spl06 过采样切换成功, prs_osr=4 tmp_osr=3
|
||||
[2026-08-21 17:29:09.548][000000025.793] I/user.spl06_app ===== [5/5] 模式切换与休眠唤醒 =====
|
||||
[2026-08-21 17:29:09.557][000000025.795] I/user.spl06_app 已切换待机模式(standby)
|
||||
[2026-08-21 17:29:09.565][000000025.796] I/user.spl06_app 已切换单次气压测量模式(pressure)
|
||||
[2026-08-21 17:29:09.573][000000025.797] I/user.spl06_app 已切换连续气压+温度测量模式(both)
|
||||
[2026-08-21 17:29:10.046][000000026.303] I/user.spl06_app 连续模式数据: 气压=1002.85hPa 温度=23.8℃
|
||||
[2026-08-21 17:29:10.056][000000026.304] I/user.exs_spl06 已进入待机(睡眠)
|
||||
[2026-08-21 17:29:10.066][000000026.305] I/user.spl06_app 已进入睡眠(待机),3 秒后唤醒
|
||||
[2026-08-21 17:29:13.063][000000029.306] I/user.exs_spl06 已唤醒,恢复连续测量
|
||||
[2026-08-21 17:29:13.073][000000029.306] I/user.spl06_app 已唤醒,恢复连续测量
|
||||
[2026-08-21 17:29:13.561][000000029.812] I/user.spl06_app 唤醒后数据: 气压=1002.85hPa 温度=23.8℃
|
||||
[2026-08-21 17:29:13.573][000000029.813] I/user.exs_spl06 传感器已关闭
|
||||
[2026-08-21 17:29:13.590][000000029.813] I/user.spl06_app 已关闭传感器
|
||||
[2026-08-21 17:29:13.619][000000029.814] I/user.spl06_app ===== [演示完毕] =====
|
||||
[2026-08-21 17:29:13.631][000000029.814] I/user.spl06_app End
|
||||
```
|
||||
|
||||
|
||||
### 5.6 故障排除
|
||||
|
||||
1. **传感器初始化失败**:
|
||||
|
||||
- 检查 SPL06-001 接线是否正确(SCL、SDA、VCC、GND)
|
||||
- 确认 GPIO 引脚配置与接线一致
|
||||
- 检查电源电压是否稳定(3.3V)
|
||||
- 确认 SCL/SDA 上拉电阻是否连接
|
||||
- 确认 exs_spl06 扩展库已正常加载
|
||||
|
||||
2. **读取数据始终为 0 或异常**:
|
||||
|
||||
- 检查传感器供电是否正常
|
||||
- 确认 I2C 地址是否正确(SPL06-001 支持 0x76/0x77,由 SDO 引脚决定,扩展库会自动探测)
|
||||
- 确认接线无松动
|
||||
- 检查 SCL/SDA 上拉电阻
|
||||
|
||||
3. **气压数据跳动过大**:
|
||||
|
||||
- 提高过采样率(如 `set_osr(6, 4)` 对应 64x),数据更稳定但耗时更长
|
||||
- 传感器附近避免风吹、空调等气压扰动源
|
||||
|
||||
### 5.7 扩展功能建议
|
||||
|
||||
exs_spl06 更多接口的使用可以查看 [exs_spl06 扩展库说明](https://docs.openluat.com/osapi/ext/sensor/exs_spl06/)
|
||||
@@ -0,0 +1,221 @@
|
||||
--[[
|
||||
@module spl06_app
|
||||
@summary SPL06-001 数字气压传感器演示模块,包含初始化、数据读取、海拔计算、过采样切换、模式切换与休眠唤醒演示用例
|
||||
@version 1.0
|
||||
@date 2026.08.21
|
||||
@author 江访
|
||||
@usage
|
||||
本文件包含 SPL06-001 的逐项功能演示。
|
||||
通过 exs_spl06 扩展库的 API 逐一演示初始化、数据读取、海拔计算、
|
||||
过采样率切换、测量模式切换与休眠唤醒等功能。
|
||||
|
||||
通过 MODE 变量选择通信模式(改 MODE 的值即可,无需注释/取消注释代码):
|
||||
MODE = 1 软件 I2C(默认推荐,仅需 scl/sda 引脚,任意 GPIO 均可,接线最灵活)
|
||||
MODE = 2 硬件 I2C(指定 i2c_id,占用 CPU 少)
|
||||
|
||||
Air780EPM 接线(软件 I2C):
|
||||
SCL = GPIO31
|
||||
SDA = GPIO30
|
||||
]]
|
||||
|
||||
-- 加载 exs_spl06 扩展库
|
||||
local exs_spl06 = require "exs_spl06"
|
||||
|
||||
-- ==================== 通信模式选择 ====================
|
||||
-- 改 MODE 的值选择通信模式:
|
||||
-- 1 = 软件 I2C(默认) 2 = 硬件 I2C
|
||||
-- 各模式所需引脚/参数见下方 init_config,接线说明见 readme.md
|
||||
local MODE = 1
|
||||
|
||||
local init_config
|
||||
if MODE == 1 then
|
||||
-- 软件 I2C:SCL/SDA 用任意 GPIO,Air780EPM 接线示例用 GPIO31/GPIO30
|
||||
-- SPL06-001 支持双地址 0x76/0x77(由 SDO 引脚决定),不传 addr 时扩展库自动探测
|
||||
init_config = {scl = 31, sda = 30}
|
||||
elseif MODE == 2 then
|
||||
-- 硬件 I2C:i2c_id 为总线号(Air780EPM 用 1),不传 scl/sda 时无总线恢复能力
|
||||
init_config = {i2c_id = 1}
|
||||
else
|
||||
log.error("spl06_app", "MODE 取值错误,应为 1/2")
|
||||
return
|
||||
end
|
||||
|
||||
--------------------------------------------------------------
|
||||
-- [1/5] 初始化
|
||||
-- - setup() 自动完成 I2C 地址自动探测、芯片 ID 校验、校准系数读取、
|
||||
-- 过采样率配置、缩放基准建立(16x 气压/8x 温度)
|
||||
--------------------------------------------------------------
|
||||
local function demo_init()
|
||||
log.info("spl06_app", "===== [1/5] 初始化 =====")
|
||||
|
||||
local result = exs_spl06.setup(init_config)
|
||||
if not result then
|
||||
log.error("spl06_app", "初始化失败")
|
||||
log.error("spl06_app", "检查接线: VCC=3.3V GND SCL SDA,I2C 地址是否正确(如 0x76/0x77)")
|
||||
return false -- 初始化失败必须返回 false
|
||||
end
|
||||
log.info("spl06_app", "SPL06-001 初始化成功,版本:", exs_spl06.version())
|
||||
return true
|
||||
end
|
||||
|
||||
--------------------------------------------------------------
|
||||
-- [2/5] 数据读取
|
||||
-- - get_data() 返回气压(hPa)与温度(℃),get_pressure()/get_temperature() 单次读取
|
||||
--------------------------------------------------------------
|
||||
local function demo_read_data()
|
||||
log.info("spl06_app", "===== [2/5] 数据读取 =====")
|
||||
log.info("spl06_app", "连续读取 5 次气压/温度(单位 hPa / ℃)")
|
||||
|
||||
-- 连续读取 5 次气压/温度
|
||||
for i = 1, 5 do
|
||||
local data = exs_spl06.get_data()
|
||||
if data then
|
||||
log.info("spl06_app", string.format("第%d次: 气压=%.2fhPa 温度=%.1f℃",
|
||||
i, data.pressure, data.temperature))
|
||||
else
|
||||
log.error("spl06_app", string.format("第%d次读取失败", i))
|
||||
end
|
||||
sys.wait(1000) -- 每隔 1 秒读取一次,1000ms
|
||||
end
|
||||
|
||||
-- 演示单次读取接口
|
||||
local pressure = exs_spl06.get_pressure()
|
||||
local temperature = exs_spl06.get_temperature()
|
||||
log.info("spl06_app", string.format("单次气压=%.2fhPa 单次温度=%.1f℃",
|
||||
pressure or 0, temperature or 0))
|
||||
end
|
||||
|
||||
--------------------------------------------------------------
|
||||
-- [3/5] 海拔高度计算
|
||||
-- - get_altitude() 按国际气压测高公式计算海拔(纯计算接口,不耗时)
|
||||
-- - 默认海平面气压 1013.25hPa,也可传当地海平面气压提高精度
|
||||
--------------------------------------------------------------
|
||||
local function demo_altitude()
|
||||
log.info("spl06_app", "===== [3/5] 海拔高度计算 =====")
|
||||
|
||||
local pressure = exs_spl06.get_pressure()
|
||||
if not pressure then
|
||||
log.error("spl06_app", "气压读取失败,跳过海拔计算")
|
||||
return
|
||||
end
|
||||
local h_default = exs_spl06.get_altitude(pressure) -- 默认 1013.25hPa
|
||||
local h_custom = exs_spl06.get_altitude(pressure, 1005) -- 自定义 1005hPa
|
||||
log.info("spl06_app", string.format("气压=%.2fhPa,默认海平面气压海拔=%.1f米,自定义1005hPa海拔=%.1f米",
|
||||
pressure, h_default, h_custom))
|
||||
end
|
||||
|
||||
--------------------------------------------------------------
|
||||
-- [4/5] 过采样率切换
|
||||
-- - set_osr() 在线切换气压过采样率,切换后扩展库自动完成缩放因子动态自校准
|
||||
-- - OSR 越高数据越稳定,但单次测量耗时越长;校准失败自动回退默认 16x/8x
|
||||
--------------------------------------------------------------
|
||||
local function demo_switch_osr()
|
||||
log.info("spl06_app", "===== [4/5] 过采样率切换 =====")
|
||||
log.info("spl06_app", "依次切换气压过采样率 1x/16x/64x(温度保持 8x),观察数据精度")
|
||||
|
||||
-- 依次切换 3 档气压过采样率(1x/16x/64x)
|
||||
local osr_list = {0, 4, 6}
|
||||
local osr_names = {"1x", "16x", "64x"}
|
||||
for i = 1, #osr_list do
|
||||
local ok = exs_spl06.set_osr(osr_list[i], 3)
|
||||
if not ok then
|
||||
log.error("spl06_app", string.format("气压OSR切换为%d(%s)失败,已回退默认16x/8x", osr_list[i], osr_names[i]))
|
||||
end
|
||||
log.info("spl06_app", string.format("气压OSR=%d(%s),开始采集", osr_list[i], osr_names[i]))
|
||||
local sum = 0
|
||||
local cnt = 0
|
||||
for j = 1, 5 do
|
||||
local data = exs_spl06.get_data()
|
||||
if data then
|
||||
sum = sum + data.pressure
|
||||
cnt = cnt + 1
|
||||
log.info("spl06_app", string.format("OSR=%d 第%d次: 气压=%.2fhPa 温度=%.1f℃",
|
||||
osr_list[i], j, data.pressure, data.temperature))
|
||||
else
|
||||
log.error("spl06_app", "读取失败")
|
||||
end
|
||||
sys.wait(1000) -- 每隔 1 秒读取一次,1000ms
|
||||
end
|
||||
if cnt > 0 then
|
||||
log.info("spl06_app", string.format("OSR=%d 平均气压=%.2fhPa", osr_list[i], sum / cnt))
|
||||
end
|
||||
end
|
||||
|
||||
-- 恢复默认过采样(16x/8x)
|
||||
exs_spl06.set_osr(4, 3)
|
||||
end
|
||||
|
||||
--------------------------------------------------------------
|
||||
-- [5/5] 测量模式切换与休眠唤醒
|
||||
-- - set_mode() 切换待机/单次气压/连续气压+温度测量模式
|
||||
-- - sleep() 进入低功耗待机(电流<1µA),wakeup() 唤醒恢复连续测量
|
||||
-- - 最后 close() 释放资源
|
||||
--------------------------------------------------------------
|
||||
local function demo_mode_and_sleep()
|
||||
log.info("spl06_app", "===== [5/5] 模式切换与休眠唤醒 =====")
|
||||
|
||||
-- 待机模式(电流 < 1µA)
|
||||
exs_spl06.set_mode("standby")
|
||||
log.info("spl06_app", "已切换待机模式(standby)")
|
||||
|
||||
-- 单次气压测量模式(测完自动回待机)
|
||||
exs_spl06.set_mode("pressure")
|
||||
log.info("spl06_app", "已切换单次气压测量模式(pressure)")
|
||||
|
||||
-- 连续气压+温度测量模式(后台模式)
|
||||
exs_spl06.set_mode("both")
|
||||
log.info("spl06_app", "已切换连续气压+温度测量模式(both)")
|
||||
sys.wait(500) -- 等待后台连续测量稳定,500ms
|
||||
local data = exs_spl06.get_data()
|
||||
if data then
|
||||
log.info("spl06_app", string.format("连续模式数据: 气压=%.2fhPa 温度=%.1f℃", data.pressure, data.temperature))
|
||||
end
|
||||
|
||||
-- 休眠唤醒(睡眠 3 秒后唤醒)
|
||||
exs_spl06.sleep()
|
||||
log.info("spl06_app", "已进入睡眠(待机),3 秒后唤醒")
|
||||
sys.wait(3000) -- 睡眠 3 秒,3000ms
|
||||
exs_spl06.wakeup()
|
||||
log.info("spl06_app", "已唤醒,恢复连续测量")
|
||||
sys.wait(500) -- 等待连续测量恢复,500ms
|
||||
data = exs_spl06.get_data()
|
||||
if data then
|
||||
log.info("spl06_app", string.format("唤醒后数据: 气压=%.2fhPa 温度=%.1f℃", data.pressure, data.temperature))
|
||||
end
|
||||
|
||||
-- 关闭传感器(进入待机并释放 I2C 资源)
|
||||
exs_spl06.close()
|
||||
log.info("spl06_app", "已关闭传感器")
|
||||
end
|
||||
|
||||
--------------------------------------------------------------
|
||||
-- 主任务:按 [1/5]~[5/5] 顺序执行全部演示
|
||||
--------------------------------------------------------------
|
||||
local function spl06_demo_task_func()
|
||||
log.info("spl06_app", "HELLO")
|
||||
sys.wait(1000) -- 等待系统稳定,1000ms
|
||||
|
||||
-- HELLO 开始 → [1/5] → [2/5] → [3/5] → [4/5] → [5/5] → End
|
||||
local ok = demo_init()
|
||||
if not ok then
|
||||
log.error("spl06_app", "初始化失败,演示终止")
|
||||
return
|
||||
end
|
||||
sys.wait(500) -- 步骤间隔,500ms
|
||||
|
||||
demo_read_data()
|
||||
sys.wait(500) -- 步骤间隔,500ms
|
||||
|
||||
demo_altitude()
|
||||
sys.wait(500) -- 步骤间隔,500ms
|
||||
|
||||
demo_switch_osr()
|
||||
sys.wait(500) -- 步骤间隔,500ms
|
||||
|
||||
demo_mode_and_sleep()
|
||||
|
||||
log.info("spl06_app", "===== [演示完毕] =====")
|
||||
log.info("spl06_app", "End")
|
||||
end
|
||||
|
||||
sys.taskInit(spl06_demo_task_func)
|
||||
Reference in New Issue
Block a user