Air8000-exvib 扩展库的使用
一、GSENSOR 概述
gsensor 即 G-sensor,重力传感器,又名加速度传感器。Air8000 使用的 G-sensor 传感器型号是 da221。
da221 传感器是一种低功耗、高性能的电容式三轴线性加速度计,采用微机械技术开发。该器件采用 2x2x1.1 mm 的 LGA 封装,保证在 -40°C 至 +85°C 的宽温度范围内工作。传感器元件采用单晶硅通过 DRIE 工艺制造,并通过密封的硅帽保护免受环境影响。该器件具有用户可选的 ±2g/±4g/±8g 满量程测量范围,数据输出速率从 1Hz 到 1 kHz,并集成了信号调节和主动检测功能。da221 具有断电模式,非常适合手机电源管理。一个独立且灵活的中断大大简化了各种运动状态检测的算法。
二、演示功能概述
使用 Air8000 开发板,本示例主要是展示 exvib 库的使用,提供了三种场景应用:
1,微小震动检测:用于检测轻微震动的场景,例如用手敲击桌面;加速度量程 2g;
2,运动检测:用于电动车或汽车行驶时的检测和人行走和跑步时的检测;加速度量程 4g;
3,跌倒检测:用于人或物体瞬间跌倒时的检测;加速度量程 8g;
在震动检测方面提供了两种模式,有效震动模式和持续震动检测模式:
持续震动检测模式:震动强度超过设定阈值时,会进入中断处理函数,获取 xyz 三轴的数据
有效震动模式:当 10 秒内触发 5 次震动强度超过设定阈值时,持续触发震动事件,并执行相应的处理函数,30 分钟内只能触发一次,直到 30 分钟之后,再重新开始检测
三、准备硬件环境
exvib 库,目前只有 Air8000、Air8000A、Air8000G、Air8000D 模块可以用,因为这几款是内置了 da221 三轴加速度传感器,所以本篇教程选用 Air8000 开发板来开发调试。也可以参考:Air8000 硬件环境清单,准备好硬件环境。
3.1 Air8000 开发板
淘宝购买链接:Air8000 开发板淘宝购买链接 ;
开发板使用教程参考:Air8000 开发板使用说明
四、准备软件环境
1. 烧录工具 Luatools;
2. 内核固件文件(底层 core 固件文件):LuatOS-SoC_V2014_Air8000;此页面有新版本固件的话选用最新版本固件,本次操作用的是 101 号固件,可以根据自己的需求选择自己需要的固件。
3. LuatOS 需要的脚本和资源文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/demo/vibration
4. lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件,如果没有下载最新的 lib,可以在 luatos 库里面下载最新的 lib 使用:https://gitee.com/openLuat/LuatOS/tree/master/script/libs;
准备好软件环境之后,接下来查看如何烧录项目文件到 Air8000 开发板中,将本篇文章中演示使用的项目文件烧录到 Air8000 开发板中。
五、软硬件参考
5.1 API 接口介绍
本教程使用 api 接口为:
https://docs.openluat.com/osapi/ext/exvib/
六、代码示例介绍
6.1 代码讲解
main.lua
主要是加载 vibration 模块
--[[
@module main
@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
@version 1.0
@date 2025.07.27
@author 李源龙
@usage
本demo演示的功能为:
使用Air8000整机开发板,本示例主要是展示exvib库的使用,提供了三种场景应用:
1,微小震动检测:用于检测轻微震动的场景,例如用手敲击桌面;加速度量程2g;
2,运动检测:用于电动车或汽车行驶时的检测和人行走和跑步时的检测;加速度量程4g;
3,跌倒检测:用于人或物体瞬间跌倒时的检测;加速度量程8g;
在震动检测方面提供了两种模式,有效震动模式和持续震动检测模式:
持续震动检测模式:震动强度超过设定阈值时,会进入中断处理函数,获取xyz三轴的数据
有效震动模式:当10秒内触发5次震动强度超过设定阈值时,持续触发震动事件,并执行相应的处理函数,30分钟内只能触发一次,直到30分钟之后,再重新开始检测
]]
--[[
必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
PROJECT:项目名,ascii string类型
可以随便定义,只要不使用,就行
VERSION:项目版本号,ascii string类型
如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
]]
PROJECT = "vibSingle"
VERSION = "001.000.000"
--添加硬狗防止程序卡死
if wdt then
wdt.init(9000)--初始化watchdog设置为9s
sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
end
-- 如果内核固件支持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)
require"vibration"
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
vibration.lua
加载了 exvib 库,开启 task 协程,调用 exvib.open(1)接口开启振动监测模式 1:微小震动检测,设置 gpio.WAKEUP2 防抖 100ms,防抖的作用是 100ms 只能触发一次,防止误触,然后设置中断模式触发,关于触发方式我们提供了两种场景的应用:
第一种场景是持续震动场景:只要检测到震动就会一直触发
第二种场景是有效震动场景:在 10 秒内检测到 5 次震动则判定为有效震动,有效震动触发之后,30 分钟之后才能再次触发,有效震动的逻辑大概是用循环定时器的方式每秒都把 tick 值 +1,然后每次触发震动则记录 tick 值到表里面,然后对表里面的最后一次触发的 tick 和第一次触发的 tick 进行对比,如果小于 10 并且第五次的值为有效值就判定为有效震动,也可以改动成自己项目的有效震动逻辑。
--[[
@module vibration
@summary 利用加速度传感器da221实现震动触发中断,然后处理逻辑
@version 1.0
@date 2025.08.01
@author 李源龙
@usage
使用Air8000整机开发板,本示例主要是展示exvib库的使用,提供了三种场景应用:
1,微小震动检测:用于检测轻微震动的场景,例如用手敲击桌面;加速度量程2g;
2,运动检测:用于电动车或汽车行驶时的检测和人行走和跑步时的检测;加速度量程4g;
3,跌倒检测:用于人或物体瞬间跌倒时的检测;加速度量程8g;
在震动检测方面提供了两种模式,有效震动模式和持续震动检测模式:
持续震动检测模式:震动强度超过设定阈值时,会进入中断处理函数,获取xyz三轴的数据
有效震动模式:当10秒内触发5次震动强度超过设定阈值时,持续触发震动事件,并执行相应的处理函数,30分钟内只能触发一次,直到30分钟之后,再重新开始检测
]]
exvib=require("exvib")
local intPin=gpio.WAKEUP2 --中断检测脚,内部固定wakeup2
local tid --获取定时打开的定时器id
local num=0 --计数器
local ticktable={0,0,0,0,0} --存放5次中断的tick值,用于做有效震动对比
local eff=false --有效震动标志位,用于判断是否触发定位
gpio.setup(164, 1, gpio.PULLUP) -- air8000整机板需要大概该电源控制i2c上电 和音频解码芯片共用,自己设计可以忽略掉
gpio.setup(147, 1, gpio.PULLUP) -- air8000整机板需要大概该电源控制i2c上电 camera的供电使能脚,自己设计可以忽略掉
--有效震动模式
--tick计数器,每秒+1用于存放5次中断的tick值,用于做有效震动对比
local function tick()
num=num+1
end
--每秒运行一次计时
sys.timerLoopStart(tick,1000)
--有效震动判断
local function ind()
log.info("int", gpio.get(intPin))
if gpio.get(intPin) == 1 then
--接收数据如果大于5就删掉第一个
if #ticktable>=5 then
log.info("table.remove",table.remove(ticktable,1))
end
--存入新的tick值
table.insert(ticktable,num)
log.info("tick",num,(ticktable[5]-ticktable[1]<10),ticktable[5]>0)
log.info("tick2",ticktable[1],ticktable[2],ticktable[3],ticktable[4],ticktable[5])
--表长度为5且,第5次中断时间间隔减去第一次间隔小于10s,且第5次值为有效值
if #ticktable>=5 and (ticktable[5]-ticktable[1]<10 and ticktable[1]>0) then
log.info("vib", "xxx")
--是否要去触发有效震动逻辑
if eff==false then
sys.publish("EFFECTIVE_VIBRATION")
end
end
end
end
--设置30s分钟之后再判断是否有效震动函数
local function num_cb()
eff=false
end
local function eff_vib()
log.info("触发有效震动")
--触发之后eff设置为true,30分钟之后再触发有效震动
eff=true
--30分钟之后再触发有效震动
sys.timerStart(num_cb,180000)
end
sys.subscribe("EFFECTIVE_VIBRATION",eff_vib)
--持续震动模式
--持续震动模式中断函数
-- local function ind()
-- log.info("int", gpio.get(intPin))
-- --上升沿为触发震动中断
-- if gpio.get(intPin) == 1 then
-- local x,y,z = exvib.read_xyz() --读取x,y,z轴的数据
-- log.info("x", x..'g', "y", y..'g', "z", z..'g')
-- end
-- end
local function vib_fnc()
-- 1,微小震动检测,用于检测轻微震动的场景,例如用手敲击桌面;加速度量程2g;
-- 2,运动检测,用于电动车或汽车行驶时的检测和人行走和跑步时的检测;加速度量程4g;
-- 3,跌倒检测,用于人或物体瞬间跌倒时的检测;加速度量程8g;
--打开震动检测功能
exvib.open(1)
--设置gpio防抖100ms
gpio.debounce(intPin, 100)
--设置gpio中断触发方式wakeup2唤醒脚默认为双边沿触发
gpio.setup(intPin, ind)
end
sys.taskInit(vib_fnc)
6.2 效果展示
有效震动模式日志:
持续震动模式日志:
七、总结
本示例介绍了如何用 Air8000 开发板展示内部三轴加速度传感器的震动触发功能
八、注意事项与常见问题
1.exvib.lua 可适用于合宙内部集成了 G-Sensor 加速度传感器 DA221 的模组型号,
目前仅有 Air8000 系列模组内置了 DA221,Air7000 推出时也会内置该型号 G-Sensor;
2.DA221 在 Air8000 内部通过 I2C1 与之通信,并通过 WAKEUP2 接收运动监测中断,
如您使用合宙其它型号模组外接 DA221 时,比如 Air780EGH,建议与 Air8000 保持一致也选用 I2C1 和 WAKEUP2
(该管脚即为 Air780EGH 的 PIN79:USIM_DET),这样便可以无缝使用本扩展库,DA221 的供应商为苏州明皜
如需采购 DA221 或者其他更高端的加速度传感器可以联系他们;
3.DA221 作为加速度传感器,LuatOS 仅支持运动检测这一功能,主要用于震动检测,运动检测,跌倒检测,
搭配 GNSS 实现震动然后定位的功能,其余功能请自行研究,合宙提供了三种应用场景,如果需要适配自己的场景需求,
请参考手册参数自行修改代码,调试适合自己场景的传感器值,合宙不提供 DA221 任何其它功能的任何形式的技术支持;
da221 手册:da221.pdf