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,70 @@
--[[
@module main
@summary SC7A20H 三轴加速度传感器 Demo 入口
@version 1.0
@date 2026.07.23
@author 江访
]]
--[[
=== 演示内容 ===
本 demo 演示 exs_sc7a20h 扩展库的完整功能,顺序为:
HELLO→[1/4]→[2/4]→[3/4]→[4/4]→End
1、初始化和数据读取([1/4]
2、量程切换演示([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 = "SC7A20H_Demo" -- 项目命名
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秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
-- 方便分析内存使用是否有异常
-- sys.timerLoopStart(function()
-- log.info("mem.lua", rtos.meminfo())
-- log.info("mem.sys", rtos.meminfo("sys"))
-- end, 3000)
-- 加载 sc7a20h_demo.lua 演示模块
require "sc7a20h_demo"
-- 用户代码已结束
-- 结尾总是这一句
sys.run()
-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行
@@ -0,0 +1,216 @@
# SC7A20H 三轴加速度传感器演示
## 一、功能模块介绍
### 1.1 核心主程序模块
1. **main.lua** - 主程序入口,负责项目初始化、版本定义和任务调度
2. **sc7a20h_demo.lua** - SC7A20H 功能演示模块,包含数据读取、量程切换、输出速率切换、休眠唤醒等所有功能的演示用例
### 1.2 扩展库模块
1. **exs_sc7a20h** - SC7A20H 扩展库,提供初始化、三轴加速度数据读取、量程切换、输出速率切换、功耗模式切换、睡眠/唤醒、关闭等 API
### 1.3 I2C 模式说明
**推荐使用软件 I2C 模式**SC7A20H 在异常 I2C 通信后可能锁死 SDA 总线。本库已内置 I2C 总线卡死自动检测与恢复功能。本 demo 使用软件 I2C 模式演示。
## 二、演示流程介绍
本 demo 按顺序演示 exs_sc7a20h 扩展库的 4 项功能:HELLO → [1/4] → [2/4] → [3/4] → [4/4] → End
### 2.1 功能演示项说明
1. **[1/4] 初始化与数据读取** - 初始化 SC7A20H 传感器并读取三轴加速度数据(X/Y/Z,单位 g)
2. **[2/4] 量程切换演示** - 在 ±2g(高精度)和 ±4g(宽范围)量程之间切换,观察数据变化
3. **[3/4] 输出速率切换** - 依次切换 25Hz / 50Hz / 100Hz / 200Hz 输出速率
4. **[4/4] 休眠与唤醒演示** - 演示 sleep()/wakeup() 待机与唤醒
## 三、显示效果
![](https://docs.openluat.com/cdn/image/Air780EHM_exs_sc7a20h.png)
## 四、演示硬件环境
### 4.1 硬件清单
- Air780EPM 核心板 × 1
- SC7A20H 三轴加速度传感器模块 × 1
demo所演示的SC7A20H 三轴加速度传感器模块[购买链接](https://item.taobao.com/item.htm?abbucket=12&id=952174888778&mi_id=0000k9PlrHnaylHxzFwS6fLcPWcOuAeIBtBNy8ctxSmKAXs&ns=1&priceTId=215045e417839190910407222e1198&spm=a21n57.1.hoverItem.3&utparam=%7B%22aplus_abtest%22%3A%22c1f47c9c4ac843532d170075a796f4a9%22%7D&xxc=taobaoSearch)
- 母对母杜邦线 × 6
- TYPE-C 数据线 × 1
### 4.2 接线配置
#### 4.2.1 SC7A20H 模块接线
<table>
<tr>
<td>Air780EPM 核心板<br/></td><td>SC7A20H 模块<br/></td></tr>
<tr>
<td>32/GPIO31<br/></td><td>SCL<br/></td></tr>
<tr>
<td>31/GPIO30<br/></td><td>SDA<br/></td></tr>
<tr>
<td>30/GPIO29<br/></td><td>INT1<br/></td></tr>
<tr>
<td>VDD_EXT<br/></td><td>VCC<br/></td></tr>
<tr>
<td>GND<br/></td><td>GND<br/></td></tr>
</table>
> 说明:接线时注意杜邦线不宜过长,以免通信不稳定。
## 五、演示软件环境
### 5.1 开发工具
- [Luatools下载调试工具](https://docs.openluat.com/air780egh/luatos/common/download/) - 固件烧录和代码调试
### 5.2 内核固件
- [点击下载Air780EPM系列最新版本内核固件](https://docs.openluat.com/air780epm/luatos/firmware/780epm_version/)demo所使用的是 LuatOS-SoC_V2046_Air780EPM 1号固件
### 5.3 脚本文件
1. **main.lua** - 程序入口
2. **sc7a20h_demo.lua** - SC7A20H 功能演示模块
3. **exs_sc7a20h** - SC7A20H 扩展库
## 六、演示核心步骤
### 6.1 硬件准备
1. 按照接线表将 SC7A20H 模块连接到核心板
2. 确保电源连接正确,通过 TYPE-C USB 口供电
3. 检查所有接线无误,避免短路
### 6.2 软件配置
`main.lua` 中加载对应的演示模块:
```lua
-- 加载 sc7a20h_demo.lua 演示模块
require "sc7a20h_demo"
```
### 6.3 软件烧录
1. 使用 Luatools 选择最新内核固件
2. 下载本项目所有脚本文件
3. 将固件和脚本一起烧录到设备
4. 烧录成功后设备自动重启后开始运行
### 6.4 功能测试
#### 6.4.1 初始化与数据读取演示
1. 设备启动后打印 "HELLO",随后自动进入 [1/4] 初始化与数据读取
2. 观察日志输出,确认初始化成功
3. 观察三轴加速度数据(X/Y/Z,单位 g)的连续读取
#### 6.4.2 量程切换演示
1. 自动进入 [2/4] 量程切换演示
2. 观察 ±4g 宽范围量程下的数据
3. 观察 ±2g 高精度量程下的数据
#### 6.4.3 输出速率切换演示
1. 自动进入 [3/4] 输出速率切换演示
2. 依次观察 25Hz / 50Hz / 100Hz / 200Hz 下的数据读取
3. 最终恢复为 100Hz
#### 6.4.4 休眠与唤醒演示
1. 自动进入 [4/4] 休眠与唤醒演示
2. 观察 sleep() 进入待机模式
3. 观察 wakeup() 唤醒后数据恢复
### 6.5 预期效果
- **初始化与数据读取**:SC7A20H 初始化成功,三轴加速度数据正常输出
- **量程切换**:量程切换后数据范围随之变化,灵敏度不同
- **输出速率切换**:不同速率下均能正常读取数据
- **休眠与唤醒**sleep 后进入低功耗,wakeup 后数据读取正常
- **打印日志**
```lua
[2026-07-23 14:13:19.999][000000000.246] I/user.main SC7A20H_Demo 001.999.000
[2026-07-23 14:13:20.005][000000000.262] D/user.exs_sc7a20h version -> 202607180900
[2026-07-23 14:13:20.014][000000000.264] I/user.sc7a20h_demo HELLO
[2026-07-23 14:13:20.506][000000001.265] I/user.sc7a20h_demo ===== [1/4] =====
[2026-07-23 14:13:20.521][000000001.274] I/user.exs_sc7a20h SC7A20H @ I2C 0x18
[2026-07-23 14:13:20.537][000000001.295] I/user.exs_sc7a20h REG读回 CTRL1=0x57 CTRL4=0x88 STATUS=0xFF INT1_CFG=0x00
[2026-07-23 14:13:20.548][000000001.302] I/user.exs_sc7a20h INT1 , gpio=29
[2026-07-23 14:13:20.555][000000001.303] I/user.exs_sc7a20h mode=I2C range=2g odr=100Hz mode=highres
[2026-07-23 14:13:20.564][000000001.303] I/user.sc7a20h_demo SC7A20H : 202607180900
[2026-07-23 14:13:20.570][000000001.318] I/user.exs_sc7a20h CTRL1=0x57 CTRL2=0x01 CTRL3=0x40 CTRL4=0x88 CTRL5=0x08 CTRL6=0x00 STATUS=0xFF INT1_SRC=0x15 INT2_SRC=0x00 FIFO_SRC=0x20
[2026-07-23 14:13:20.757][000000001.521] I/user.sc7a20h_demo X=-0.660 Y=0.545 Z=0.551 g
[2026-07-23 14:13:22.264][000000003.024] I/user.sc7a20h_demo 1: X=-0.660 Y=0.549 Z=0.555 g
[2026-07-23 14:13:22.774][000000003.527] I/user.sc7a20h_demo 2: X=-0.666 Y=0.552 Z=0.552 g
[2026-07-23 14:13:23.269][000000004.030] I/user.sc7a20h_demo 3: X=-0.661 Y=0.545 Z=0.551 g
[2026-07-23 14:13:23.273][000000004.030] I/user.sc7a20h_demo ---- [1/4] 完成 ----
[2026-07-23 14:13:23.769][000000004.531] I/user.sc7a20h_demo ===== [2/4] =====
[2026-07-23 14:13:23.773][000000004.531] I/user.sc7a20h_demo 4g
[2026-07-23 14:13:23.776][000000004.534] I/user.exs_sc7a20h 4g
[2026-07-23 14:13:24.080][000000004.836] I/user.sc7a20h_demo 4g : X=-0.662 Y=0.545 Z=0.551 g
[2026-07-23 14:13:25.076][000000005.837] I/user.sc7a20h_demo 2g
[2026-07-23 14:13:25.081][000000005.839] I/user.exs_sc7a20h 2g
[2026-07-23 14:13:25.387][000000006.142] I/user.sc7a20h_demo 2g : X=-0.663 Y=0.546 Z=0.556 g
[2026-07-23 14:13:26.385][000000007.143] I/user.sc7a20h_demo ---- [2/4] 完成 ----
[2026-07-23 14:13:26.882][000000007.643] I/user.sc7a20h_demo ===== [3/4] =====
[2026-07-23 14:13:26.898][000000007.643] I/user.sc7a20h_demo 25Hz
[2026-07-23 14:13:26.913][000000007.646] I/user.exs_sc7a20h 25Hz
[2026-07-23 14:13:27.395][000000008.149] I/user.sc7a20h_demo 25Hz : X=-0.670 Y=0.551 Z=0.559 g
[2026-07-23 14:13:27.891][000000008.650] I/user.sc7a20h_demo 50Hz
[2026-07-23 14:13:27.903][000000008.653] I/user.exs_sc7a20h 50Hz
[2026-07-23 14:13:28.092][000000008.856] I/user.sc7a20h_demo int1: =down X=0.125 Y=0.323 Z=0.513 g
[2026-07-23 14:13:28.373][000000009.133] I/user.sc7a20h_demo int1: =back X=0.475 Y=0.291 Z=0.404 g
[2026-07-23 14:13:28.389][000000009.155] I/user.sc7a20h_demo 50Hz : X=0.208 Y=0.180 Z=0.390 g
[2026-07-23 14:13:28.656][000000009.410] I/user.sc7a20h_demo int1: =down X=0.075 Y=1.164 Z=1.317 g
[2026-07-23 14:13:28.876][000000009.628] I/user.sc7a20h_demo int1: =down X=0.281 Y=0.115 Z=0.308 g
[2026-07-23 14:13:28.891][000000009.656] I/user.sc7a20h_demo 100Hz
[2026-07-23 14:13:28.903][000000009.659] I/user.exs_sc7a20h 100Hz
[2026-07-23 14:13:28.937][000000009.693] I/user.sc7a20h_demo int1: =down X=-0.659 Y=1.035 Z=1.466 g
[2026-07-23 14:13:29.404][000000010.161] I/user.sc7a20h_demo 100Hz : X=-0.659 Y=0.357 Z=0.859 g
[2026-07-23 14:13:29.905][000000010.662] I/user.sc7a20h_demo 200Hz
[2026-07-23 14:13:29.921][000000010.665] I/user.exs_sc7a20h 200Hz
[2026-07-23 14:13:30.404][000000011.167] I/user.sc7a20h_demo 200Hz : X=-0.440 Y=0.722 Z=0.582 g
[2026-07-23 14:13:30.918][000000011.670] I/user.exs_sc7a20h 100Hz
[2026-07-23 14:13:30.933][000000011.670] I/user.sc7a20h_demo ---- [3/4] 完成 ----
[2026-07-23 14:13:31.416][000000012.171] I/user.sc7a20h_demo ===== [4/4] =====
[2026-07-23 14:13:31.432][000000012.171] I/user.sc7a20h_demo power-down
[2026-07-23 14:13:31.444][000000012.174] I/user.exs_sc7a20h power-down
[2026-07-23 14:13:41.913][000000022.674] I/user.sc7a20h_demo power-down
[2026-07-23 14:13:41.932][000000022.676] I/user.exs_sc7a20h power-down ODR=100Hz
[2026-07-23 14:13:42.116][000000022.879] I/user.sc7a20h_demo : X=-0.614 Y=0.165 Z=0.852 g
[2026-07-23 14:13:42.132][000000022.879] I/user.sc7a20h_demo ---- [4/4] 完成 ----
[2026-07-23 14:13:42.613][000000023.380] I/user.sc7a20h_demo ===== [] =====
[2026-07-23 14:13:42.628][000000023.386] I/user.exs_sc7a20h
[2026-07-23 14:13:42.640][000000023.386] I/user.sc7a20h_demo End
```
### 6.6 故障排除
1. **传感器初始化失败**
- 检查 SC7A20H 接线是否正确(SCL、SDA、VCC、GND
- 确认 GPIO 引脚配置与接线一致
- 检查电源电压是否稳定(3.3V
- 确认 exs_sc7a20h 扩展库已正常加载
2. **读取数据始终为零**
- 检查传感器供电是否正常
- 检查 I2C 地址是否正确(SA0=GND 时地址 0x18SA0=VCC 时地址 0x19
- 确认接线无松动
3. **量程切换无效果**
- 确认 `set_range()` 参数为 "2g"、"4g"、"8g" 或 "16g"
- 切换后需等待传感器稳定再读取数据
### 6.7 扩展功能建议
exs_sc7a20h 更多接口的使用可以查看 [exs_sc7a20h 扩展库说明](https://docs.openluat.com/osapi/ext/sensor/exs_sc7a20h/)
@@ -0,0 +1,154 @@
--[[
@module sc7a20h_demo
@summary SC7A20H 三轴加速度传感器演示模块,包含所有功能的演示用例
@version 1.1
@date 2026.07.23
@author 江访
@usage
本文件包含 SC7A20H 的逐项功能演示。
通过 exs_sc7a20h 扩展库的 API 逐一演示数据读取、量程切换、输出速率切换、休眠唤醒等功能。
]]
local exs_sc7a20h = require "exs_sc7a20h"
local function sc7a20h_int1_cb(data)
if data.dir then
log.info("sc7a20h_demo", string.format("int1: 朝向=%s X=%.3f Y=%.3f Z=%.3f g", data.dir, data.x, data.y, data.z))
else
log.info("sc7a20h_demo", string.format("int1: X=%.3f Y=%.3f Z=%.3f g", data.x, data.y, data.z))
end
end
-- [1/4] 初始化与数据读取
local function demo_init_and_read()
log.info("sc7a20h_demo", "===== [1/4] 初始化与数据读取 =====")
local result = exs_sc7a20h.setup("I2C", {
scl = 31,
sda = 30,
powermode = "highres",
enable_direction = "6d",
int1 = { int_gpio = 29, activity = true, threshold_mg = 500, cb = sc7a20h_int1_cb },
})
if not result then
log.error("sc7a20h_demo", "SC7A20H 初始化失败,请检查接线")
return false
end
log.info("sc7a20h_demo", "SC7A20H 初始化成功,版本:", exs_sc7a20h.version())
exs_sc7a20h.dump_regs()
sys.wait(200)
local data = exs_sc7a20h.get_data()
if data then
log.info("sc7a20h_demo", string.format("X=%.3f Y=%.3f Z=%.3f g", data.x, data.y, data.z))
else
log.error("sc7a20h_demo", "读取数据失败")
end
sys.wait(1000)
for i = 1, 3 do
sys.wait(500)
local d = exs_sc7a20h.get_data()
if d then
log.info("sc7a20h_demo", string.format("第%d次读取: X=%.3f Y=%.3f Z=%.3f g", i, d.x, d.y, d.z))
end
end
log.info("sc7a20h_demo", "---- [1/4] 完成 ----")
return true
end
-- [2/4] 量程切换演示
local function demo_range_switch()
log.info("sc7a20h_demo", "===== [2/4] 量程切换演示 =====")
log.info("sc7a20h_demo", "切换量程为 4g")
exs_sc7a20h.set_range("4g")
sys.wait(300)
local data = exs_sc7a20h.get_data()
if data then
log.info("sc7a20h_demo", string.format("4g 量程: X=%.3f Y=%.3f Z=%.3f g", data.x, data.y, data.z))
end
sys.wait(1000)
log.info("sc7a20h_demo", "切换量程为 2g(高精度)")
exs_sc7a20h.set_range("2g")
sys.wait(300)
data = exs_sc7a20h.get_data()
if data then
log.info("sc7a20h_demo", string.format("2g 量程: X=%.3f Y=%.3f Z=%.3f g", data.x, data.y, data.z))
end
sys.wait(1000)
log.info("sc7a20h_demo", "---- [2/4] 完成 ----")
end
-- [3/4] 输出速率切换
local function demo_odr_switch()
log.info("sc7a20h_demo", "===== [3/4] 输出速率切换 =====")
local odr_list = { 25, 50, 100, 200 }
for _, odr in ipairs(odr_list) do
log.info("sc7a20h_demo", string.format("设置输出速率为 %dHz", odr))
exs_sc7a20h.set_odr(odr)
sys.wait(500)
local data = exs_sc7a20h.get_data()
if data then
log.info("sc7a20h_demo", string.format("%dHz 下: X=%.3f Y=%.3f Z=%.3f g", odr, data.x, data.y, data.z))
end
sys.wait(500)
end
exs_sc7a20h.set_odr(100)
log.info("sc7a20h_demo", "---- [3/4] 完成 ----")
end
-- [4/4] 休眠与唤醒演示
local function demo_sleep_wakeup()
log.info("sc7a20h_demo", "===== [4/4] 休眠与唤醒演示 =====")
log.info("sc7a20h_demo", "进入 power-down 模式(低功耗)")
exs_sc7a20h.sleep(); sys.wait(10000)
sys.wait(500)
log.info("sc7a20h_demo", "从 power-down 模式唤醒")
exs_sc7a20h.wakeup()
sys.wait(200)
local data = exs_sc7a20h.get_data()
if data then
log.info("sc7a20h_demo", string.format("唤醒后数据: X=%.3f Y=%.3f Z=%.3f g", data.x, data.y, data.z))
end
log.info("sc7a20h_demo", "---- [4/4] 完成 ----")
end
local function sc7a20h_demo_task_func()
log.info("sc7a20h_demo", "HELLO")
sys.wait(1000)
local ok = demo_init_and_read()
if not ok then
log.error("sc7a20h_demo", "初始化失败,演示终止")
return
end
sys.wait(500)
demo_range_switch()
sys.wait(500)
demo_odr_switch()
sys.wait(500)
demo_sleep_wakeup()
sys.wait(500)
log.info("sc7a20h_demo", "===== [演示完毕] =====")
exs_sc7a20h.close()
log.info("sc7a20h_demo", "End")
end
sys.taskInit(sc7a20h_demo_task_func)