exs_da267扩展库
作者:王世豪 | 最后修改:2026-07-20
一、概述
exs_da267 是 DA267 三轴加速度传感器的 LuatOS 扩展库。DA267 是一款低功耗、高性能的三轴加速度传感器,支持运动检测、计步器等功能。
1.1 主要特性
-
12位高精度 ADC,支持 ±2g/±4g/±8g/±16g 四档可调量程
-
I2C 接口通信,默认 7 位地址 0x26
-
支持计步器功能,可读取和清零计步数
-
内置运动检测中断,支持三轴独立阈值设置
-
支持运动状态管理,自动判断静止/运动状态
-
低功耗设计,支持休眠模式
-
集成运动检测算法,可通过中断触发运动状态变化
-
支持硬件 I2C 模式
1.2 注意事项
-
DA267 芯片ID固定为 0x13,初始化时会自动校验
-
运动状态判断基于中断历史统计,默认窗口为20秒,阈值为4次中断
-
计步器功能与运动状态联动,静止时会自动停止计步
1.3 加载方式
-- 扩展库需要 require 加载后才能调用
local exs_da267 = require "exs_da267"
1.4 硬件连接
┌──────────────┐ ┌──────────────────┐
│ 主控 │ │ DA267 │
│ │ │ 加速度传感器 │
│ │ │ │
│ I2C_SCL ─────┼────────────────────┼──→ SCL │
│ │ │ │
│ I2C_SDA ←─── ┼────────────────────┼──→ SDA │
│ │ │ │
│ VCC ────┼────────────────────┼──→ VCC (3.3V) │
│ │ │ │
│ GND ────┼────────────────────┼──→ GND │
│ │ │ │
│ GPIO_INT ────┼────────────────────┼──→ INT │
└──────────────┘ └──────────────────┘
SCL 和 SDA 需外接上拉电阻到 VCC。默认 7 位 I2C 地址 0x26。
二、核心示例
2.1 基础读取示例
-- 加载扩展库
local exs_da267 = require "exs_da267"
-- DA267 传感器初始化配置表
local DA267_CONFIG = {
i2c_id = 1, -- I2C 总线
addr = 0x26, -- I2C 从设备地址,DA267 默认地址为 0x26
int_pin = 39, -- 中断引脚,连接到 Air8201H 的 GPIO39
motion_enable = true, -- 是否启用运动检测功能
step_counter_enable = true -- 是否启用计步器功能
}
-- 应用主函数
local function da267_demo()
-- 初始化 DA267
local result = exs_da267.setup(DA267_CONFIG)
if not result then
log.error("exs_da267", "DA267 初始化失败")
return
end
log.info("exs_da267", "DA267 初始化成功")
-- 循环读取加速度数据和计步数
while true do
local data = exs_da267.get_data()
local steps = exs_da267.get_steps()
local is_moving = exs_da267.is_moving()
if data and steps ~= nil then
log.info("exs_da267", string.format("X=%.3f Y=%.3f Z=%.3f g, 步数: %d, 运动状态: %s",
data.x, data.y, data.z, steps, is_moving and "运动" or "静止"))
else
log.error("exs_da267", "读取数据失败")
end
sys.wait(1000)
end
end
-- 启动任务
sys.taskInit(da267_demo)
2.2 运动状态监听示例
-- 加载扩展库
local exs_da267 = require "exs_da267"
-- DA267 传感器初始化配置表
local DA267_CONFIG = {
i2c_id = 1, -- I2C 总线
addr = 0x26, -- I2C 从设备地址,DA267 默认地址为 0x26
int_pin = 39, -- 中断引脚,连接到 Air8201H 的 GPIO39
motion_enable = true, -- 是否启用运动检测功能
step_counter_enable = true -- 是否启用计步器功能
}
-- 运动状态变化事件处理函数
function motion_state_event_handler(state)
log.debug("da267", "运动状态变化: " .. (state and "运动" or "静止"))
end
-- 初始化传感器
exs_da267.setup(DA267_CONFIG)
-- 监听运动状态变化事件
sys.subscribe("DA267_MOTION_STATE", motion_state_event_handler)
2.3 量程切换示例
-- 加载扩展库
local exs_da267 = require "exs_da267"
-- DA267 传感器初始化配置表
local DA267_CONFIG = {
i2c_id = 1, -- I2C 总线
addr = 0x26, -- I2C 从设备地址,DA267 默认地址为 0x26
int_pin = 39, -- 中断引脚,连接到 Air8201H 的 GPIO39
range = exs_da267.RANGE_2G, -- 初始化为±2g量程
motion_enable = true, -- 是否启用运动检测功能
step_counter_enable = true -- 是否启用计步器功能
}
function range_switch_demo()
-- 初始化传感器
exs_da267.setup(DA267_CONFIG)
-- 切换为±4g量程(适合运动检测)
exs_da267.set_range(exs_da267.RANGE_4G)
sys.wait(100)
local data = exs_da267.get_data()
if data then
log.info("exs_da267", string.format("±4g量程: X=%.3f Y=%.3f Z=%.3f g",
data.x, data.y, data.z))
end
-- 切换为±8g量程(适合跌倒检测)
exs_da267.set_range(exs_da267.RANGE_8G)
sys.wait(100)
data = exs_da267.get_data()
if data then
log.info("exs_da267", string.format("±8g量程: X=%.3f Y=%.3f Z=%.3f g",
data.x, data.y, data.z))
end
end
sys.taskInit(range_switch_demo)
2.4 计步器控制示例
-- 加载扩展库
local exs_da267 = require "exs_da267"
-- DA267 传感器初始化配置表
local DA267_CONFIG = {
i2c_id = 1, -- I2C 总线
addr = 0x26, -- I2C 从设备地址,DA267 默认地址为 0x26
int_pin = 39, -- 中断引脚,连接到 Air8201H 的 GPIO39
step_counter_enable = true -- 是否启用计步器功能
}
function step_counter_demo()
-- 初始化传感器
exs_da267.setup(DA267_CONFIG)
-- 读取当前计步数
local steps = exs_da267.get_steps()
log.info("exs_da267", "当前步数: " .. steps)
-- 清零计步器
exs_da267.reset_steps()
log.info("exs_da267", "计步器已清零")
-- 禁用计步器功能
exs_da267.enable_step_counter(false)
log.info("exs_da267", "计步器已禁用")
-- 重新启用计步器功能
exs_da267.enable_step_counter(true)
log.info("exs_da267", "计步器已启用")
end
sys.taskInit(step_counter_demo)
三、常量详解
扩展库常量,顾名思义是由 exs_da267 扩展库中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;
每个常量对应的常量取值仅做日志打印时查询使用,不要将这个常量取值用做具体的业务逻辑判断,因为扩展库可能会变更每个常量对应的常量取值;
如果用做具体的业务逻辑判断,一旦常量取值发生改变,业务逻辑就会出错;
3.1 exs_da267.RANGE_2G
常量含义:±2g 量程(3.91mg/LSB),用于微小震动检测,例如用手敲击桌面;
数据类型:number;
注意事项:量程最小,灵敏度越高,适合检测微小振动;
示例代码:range = exs_da267.RANGE_2G;
3.2 exs_da267.RANGE_4G
常量含义:±4g 量程(7.81mg/LSB),用于运动检测,例如电动车或汽车行驶、人行走和跑步;
数据类型:number;
注意事项:量程中,兼顾灵敏度和测量范围,是运动检测的常用选择;
示例代码:range = exs_da267.RANGE_4G;
3.3 exs_da267.RANGE_8G
常量含义:±8g 量程(15.63mg/LSB),用于跌倒检测,例如人或物体瞬间跌倒;
数据类型:number;
注意事项:量程较大,适合检测较大加速度变化;
示例代码:range = exs_da267.RANGE_8G;
3.4 exs_da267.RANGE_16G
常量含义:±16g 量程(31.25mg/LSB),用于高冲击场景检测,例如安全监测、碰撞检测;
数据类型:number;
注意事项:量程最大,灵敏度最低,仅适用于高冲击场景;
示例代码:range = exs_da267.RANGE_16G;
四、函数详解
4.1 初始化
4.1.1 exs_da267.setup(config)
功能
初始化 DA267 加速度传感器,配置 I2C 通信参数、量程、运动检测和计步器功能;
配置了运动状态参数后,扩展库内部自动处理运动和静止状态的切换逻辑;
运动和静止判断原则为:
window内产生的中断次数到达threshold,则处于运动状态,反之,则处于静止状态。
| 触发事件 | 当前累计值 | 判定动作 | 后续处理(窗口重置) |
|---|---|---|---|
| 中断事件 | +1后>=threshold |
立即判定为运动状态 | 清零定时器; 重置定时器(重新计时); 注意:使用 重置触发机制 ,只要任意连续区间内出现 threshold 次,就立即响应,无需等到 window 定时器结束。 |
| 中断事件 | +1后>=threshold | 无状态变更 | 保持定时器继续运行,继续等待后续中断或超时。 |
| window定时器超时 | 必然 |
判定为静止状态 |
清零定时器; 重启定时器(开启下一个检测周期); 注意:过去window定时器内未达标,判定静止并开启新一轮监测。 |
参数
config
```Plain Text 参数含义:初始化配置表 数据类型:table 取值范围:包含以下子参数: { 参数含义:硬件 I2C 总线 ID 数据类型:number 取值范围:有效的 I2C 总线编号(如 1 表示 I2C1) 是否必选:是 参数示例:1 config.i2c_id,
参数含义:I2C 设备地址(7 位)
数据类型:number
取值范围:有效的 7 位 I2C 地址
是否必选:否
注意事项:默认 0x26,无需修改
参数示例:0x26
config.addr,
参数含义:中断引脚
数据类型:number
取值范围:有效的 GPIO 引脚编号
是否必选:否
注意事项:无默认值,需手动配置
参数示例:39
config.int_pin,
参数含义:测量量程(g值)
数据类型:number
取值范围:exs_da267.RANGE_2G/exs_da267.RANGE_4G/exs_da267.RANGE_8G/exs_da267.RANGE_16G
是否必选:否
注意事项:默认 exs_da267.RANGE_2G(±2g)
各量程对应使用场景:
- exs_da267.RANGE_2G(±2g,3.91mg/LSB):微小震动检测,用于检测轻微震动的场景,例如用手敲击桌面
- exs_da267.RANGE_4G(±4g,7.81mg/LSB):运动检测,用于电动车或汽车行驶时的检测和人行走和跑步时的检测
- exs_da267.RANGE_8G(±8g,15.63mg/LSB):跌倒检测,用于人或物体瞬间跌倒时的检测
- exs_da267.RANGE_16G(±16g,31.25mg/LSB):适合高冲击场景(如安全监测、碰撞检测)
注意:量程主要决定测量范围和灵敏度,但实际触发加速度由「量程×阈值」共同决定
参数示例:exs_da267.RANGE_4G
config.range,
参数含义:是否启用运动状态管理
数据类型:boolean
取值范围:true/false
是否必选:否
注意事项:默认 false
参数示例:true
config.motion_enable,
参数含义:运动状态判断历史窗口(秒)
数据类型:number
取值范围:1-60
是否必选:否
注意事项:默认 8 秒
历史窗口参数范围说明:
- 窗口越小,运动状态判断越敏感
- 窗口越大,运动状态判断越迟钝
参数示例:8
config.motion_window,
参数含义:进入运动状态的中断次数
数据类型:number
取值范围:1-20
是否必选:否
注意事项:默认 4 次
中断次数参数范围说明:
- 中断次数越小,运动状态判断越敏感
- 中断次数越大,运动状态判断越迟钝
参数示例:3
config.motion_threshold,
参数含义:是否启用计步器功能
数据类型:boolean
取值范围:true/false
是否必选:否
注意事项:默认 false
参数示例:true
config.step_counter_enable,
} 是否必选:是 参数示例: -- 最小化初始化(默认参数) exs_da267.setup({i2c_id = 1, int_pin = 39})
-- 完整配置
exs_da267.setup({
i2c_id = 1,
addr = 0x26,
int_pin = 39,
range = exs_da267.RANGE_4G,
motion_enable = true,
motion_window = 10,
motion_threshold = 4,
step_counter_enable = true
})
**返回值**
local init_result = exs_da267.setup(config)
init_resultPlain Text
含义说明:初始化是否成功
数据类型:boolean
取值范围:true(成功), false(失败)
注意事项:失败时请检查 I2C 接线、设备地址和供电
返回示例:true
```
示例
-- DA267 传感器初始化配置表(最小化)
local DA267_MIN_CONFIG = {
i2c_id = 1, -- I2C 总线
int_pin = 39 -- 中断引脚
}
-- DA267 传感器初始化配置表(完整)
local DA267_FULL_CONFIG = {
i2c_id = 1, -- I2C 总线
addr = 0x26, -- I2C 从设备地址
int_pin = 39, -- 中断引脚
range = exs_da267.RANGE_4G, -- 量程设置为±4g
motion_enable = true, -- 启用运动检测功能
motion_window = 10, -- 运动状态判断历史窗口10秒
motion_threshold = 4, -- 进入运动状态的中断次数阈值4次
step_counter_enable = true -- 启用计步器功能
}
-- 使用默认参数初始化
function setup_min()
local result = exs_da267.setup(DA267_MIN_CONFIG)
return result
end
-- 使用自定义配置
function setup_full()
local result = exs_da267.setup(DA267_FULL_CONFIG)
return result
end
4.2 数据读取
4.2.1 exs_da267.get_data()
功能
读取三轴加速度数据,返回已转换为 g 值的结果(重力加速度单位)
参数
无
返回值
local data = exs_da267.get_data()
data
```Plain Text 含义说明:三轴加速度数据表 数据类型:table 或 nil,table内的x、y、z均为 number类型 取值范围:x、y、z:-16~16 g,保留 3 位小数 注意事项:单位为 g(重力加速度)。若初始化后未调用 setup() 也会返回 nil 返回示例:{x = 0.123, y = -0.456, z = 0.987}
**示例**
```Lua
function read_acceleration_data()
local data = exs_da267.get_data()
if data then
log.info("exs_da267", string.format("X=%.3f Y=%.3f Z=%.3f g",
data.x, data.y, data.z))
else
log.error("exs_da267", "读取数据失败")
end
return data
end
4.2.2 exs_da267.get_steps()
功能
读取计步数,返回当前计步器数值
参数
无
返回值
local steps = exs_da267.get_steps()
steps
```Plain Text 含义说明:计步数 数据类型:number 或 nil 取值范围:0~65535 注意事项:需要先调用 setup() 并设置 step_counter_enable = true。若计步器未启用或读取失败,返回 nil。 返回示例:125
**示例**
```Lua
function read_step_count()
local steps = exs_da267.get_steps()
if steps then
log.info("exs_da267", "计步数: " .. steps)
end
return steps
end
4.2.3 exs_da267.reset_steps()
功能
清零计步器
参数
无
返回值
local result = exs_da267.reset_steps()
result
```Plain Text 含义说明:操作是否成功 数据类型:boolean 取值范围:true(成功), false(失败) 返回示例:true
**示例**
```Lua
function reset_step_counter()
if exs_da267.reset_steps() then
log.info("exs_da267", "计步器已清零")
end
end
4.3 参数配置
4.3.1 exs_da267.set_range(range)
功能
在线切换测量量程,无需重新初始化
参数
range
```Plain Text 参数含义:量程(g值) 数据类型:number 取值范围:exs_da267.RANGE_2G/exs_da267.RANGE_4G/exs_da267.RANGE_8G/exs_da267.RANGE_16G,对应±2g/±4g/±8g/±16g 是否必选:是 注意事项:各量程对应使用场景: - exs_da267.RANGE_2G(±2g,3.91mg/LSB):微小震动检测,用于检测轻微震动的场景,例如用手敲击桌面 - exs_da267.RANGE_4G(±4g,7.81mg/LSB):运动检测,用于电动车或汽车行驶时的检测和人行走和跑步时的检测 - exs_da267.RANGE_8G(±8g,15.63mg/LSB):跌倒检测,用于人或物体瞬间跌倒时的检测 - exs_da267.RANGE_16G(±16g,31.25mg/LSB):适合高冲击场景(如安全监测、碰撞检测) 参数示例:exs_da267.RANGE_8G
**返回值**
local result = exs_da267.set_range(range)
result
```Plain Text
含义说明:操作是否成功
数据类型:boolean
取值范围:true(成功), false(失败)
返回示例:true
示例
-- 设置为±4g量程
exs_da267.set_range(exs_da267.RANGE_4G)
-- 设置为±8g量程
exs_da267.set_range(exs_da267.RANGE_8G)
4.3.2 exs_da267.set_int_threshold(x, y, z)
功能
设置运动检测中断阈值,阈值越小越敏感;
与 setup 中运动状态参数配置的区别和联系:
硬件中断容易受到单次误触发(如瞬间震动、噪声干扰)的影响,所以通过软件层的历史统计判断,来过滤这些误触发,实现更准确的运动状态识别。
| exs_da267.set_int_threshold | setup 运动状态参数配置 | |
|---|---|---|
| 作用层级 | 硬件级(传感器内部) | 软件级(Lua脚本) |
| 检测机制 | 加速度变化超过阈值立即触发GPIO中断 | 根据中断历史统计进行判断 |
| 配置内容 | X/Y/Z轴的加速度变化阈值(1-255) | motion_window、motion_threshold |
| 判断依据 | 单次加速度变化 | 历史中断频率统计 |
| 敏感性调节 | 阈值越小,硬件越容易触发中断 | 参数组合决定算法判断的敏感性 |
参数
x, y, z
```Plain Text 参数含义:X/Y/Z轴中断阈值 数据类型:number 取值范围:1-255 是否必选:否(可选参数,未设置则保持默认值6) 注意事项:阈值单位为LSB(最低有效位),实际触发加速度=阈值×量程LSB系数 各量程LSB系数:±2g=3.91mg, ±4g=7.81mg, ±8g=15.63mg, ±16g=31.25mg 示例(阈值=6):6(±2g)→23.5mg, 6(±4g)→46.9mg, 6(±8g)→93.8mg, 6(±16g)→187.5mg 规律:量程越大,相同阈值的触发加速度越大,灵敏度越低 阈值与量程的关系说明: - 量程决定了传感器测量加速度的范围(如±2g、±4g等) - 阈值决定了触发运动检测中断的加速度变化幅度 - 相同阈值在不同量程下,实际触发加速度不同(量程越大,触发加速度越大)
各阈值范围对应使用场景:
- 1-8:高灵敏(微小震动检测,用于检测轻微震动的场景,例如用手敲击桌面)
- 9-24:中灵敏(运动检测,用于电动车或汽车行驶时的检测和人行走和跑步时的检测)
- 25-48:较高灵敏(跌倒检测,用于人或物体瞬间跌倒时的检测)
- 49-255:低灵敏(高冲击场景检测,如安全监测、碰撞检测)
参数示例:6
**返回值**
local result = exs_da267.set_int_threshold(x, y, z)
resultPlain Text
含义说明:操作是否成功
数据类型:boolean
取值范围:true(成功), false(失败)
返回示例:true
```
示例
-- DA267 阈值配置表
local DA267_THRESHOLD_CONFIG = {
default = {6, 6, 6}, -- 默认敏感度
high = {3, 3, 3}, -- 高灵敏度(检测微小振动)
low = {16, 16, 16} -- 低灵敏度(检测较大动作)
}
-- 设置默认敏感度
function set_default_threshold()
exs_da267.set_int_threshold(
DA267_THRESHOLD_CONFIG.default[1],
DA267_THRESHOLD_CONFIG.default[2],
DA267_THRESHOLD_CONFIG.default[3]
)
end
-- 检测微小振动(高灵敏度)
function set_high_sensitivity()
exs_da267.set_int_threshold(
DA267_THRESHOLD_CONFIG.high[1],
DA267_THRESHOLD_CONFIG.high[2],
DA267_THRESHOLD_CONFIG.high[3]
)
end
-- 检测较大动作(低灵敏度)
function set_low_sensitivity()
exs_da267.set_int_threshold(
DA267_THRESHOLD_CONFIG.low[1],
DA267_THRESHOLD_CONFIG.low[2],
DA267_THRESHOLD_CONFIG.low[3]
)
end
4.3.3 exs_da267.set_motion_params(params)
功能
设置运动状态管理参数,包括历史窗口、中断阈值
参数
params
```Plain Text 参数含义:运动状态管理参数表 数据类型:table 取值范围:包含以下子参数: { 参数含义:历史窗口(秒) 数据类型:number 取值范围:1-60 是否必选:否 注意事项:默认 8 秒 历史窗口参数范围说明: - 窗口越小,运动状态判断越敏感 - 窗口越大,运动状态判断越迟钝 参数示例:8 params.window,
参数含义:中断阈值(次)
数据类型:number
取值范围:1-20
是否必选:否
注意事项:默认 4 次
中断阈值参数范围说明:
- 阈值越小,运动状态判断越敏感
- 阈值越大,运动状态判断越迟钝
参数示例:3
params.threshold
}
是否必选:是
参数示例:exs_da267.set_motion_params({
window = 60,
threshold = 3
})
**返回值**
local result = exs_da267.set_motion_params(params)
resultPlain Text
含义说明:操作是否成功
数据类型:boolean
取值范围:true(成功), false(失败)
返回示例:true
```
示例
-- DA267 运动状态参数配置表
local DA267_MOTION_CONFIG = {
default = {
window = 20,
threshold = 4
},
sensitive = {
window = 10,
threshold = 2
}
}
-- 调整运动状态判断参数
function adjust_motion_params()
exs_da267.set_motion_params({
window = DA267_MOTION_CONFIG.sensitive.window, -- 历史窗口改为10秒
threshold = DA267_MOTION_CONFIG.sensitive.threshold -- 进入运动状态阈值改为2次
})
end
4.4 功能控制
4.4.1 exs_da267.enable_step_counter(enable)
功能
启用/禁用计步器功能
参数
enable
```Plain Text 参数含义:是否启用计步器 数据类型:boolean 取值范围:true(启用)/ false(禁用) 是否必选:是 参数示例:true
**返回值**
local result = exs_da267.enable_step_counter(enable)
result
```Plain Text
含义说明:操作是否成功
数据类型:boolean
取值范围:true(成功), false(失败)
返回示例:true
示例
-- DA267 计步器配置表
local DA267_STEP_CONFIG = {
enabled = true,
disabled = false
}
-- 启用计步器
function enable_step_counter()
exs_da267.enable_step_counter(DA267_STEP_CONFIG.enabled)
end
-- 禁用计步器
function disable_step_counter()
exs_da267.enable_step_counter(DA267_STEP_CONFIG.disabled)
end
4.4.2 exs_da267.enable_motion(enable)
功能
启用/禁用运动状态管理功能;
启用运动状态管理时:
系统会创建一个
zbuff循环缓冲区来存储运动中断历史配置 GPIO 中断处理函数,当检测到运动时触发
motion_check函数启用定时器管理,用于自动超时处理静止状态
用户可以订阅
DA267_MOTION_STATE消息,接收运动状态变化通知可以使用
exs_da267.is_moving()函数获取当前运动状态
禁用运动状态管理时:
停止并清除运动状态管理定时器
清除运动中断历史缓冲区
用户可以订阅
DA267_MOTION_STATE消息,接收运动状态变化通知可以使用
exs_da267.is_moving()函数获取当前运动状态
参数
enable
```Plain Text 参数含义:是否启用运动状态管理 数据类型:boolean 取值范围:true(启用)/ false(禁用) 是否必选:是 参数示例:true
**返回值**
local result = exs_da267.enable_motion(enable)
result
```Plain Text
含义说明:操作是否成功
数据类型:boolean
取值范围:true(成功), false(失败)
返回示例:true
示例
-- DA267 运动状态管理配置表
local DA267_MOTION_DETECTION_CONFIG = {
enabled = true,
disabled = false
}
-- 启用运动状态管理
function enable_motion_detection()
exs_da267.enable_motion(DA267_MOTION_DETECTION_CONFIG.enabled)
end
-- 禁用运动状态管理
function disable_motion_detection()
exs_da267.enable_motion(DA267_MOTION_DETECTION_CONFIG.disabled)
end
4.4.3 exs_da267.set_callback(callback)
功能
设置中断回调函数,中断触发时会调用该函数;
中断处理流程:
```Plain Text 加速度变化 > set_int_threshold设置的阈值 ↓ DA267传感器内部硬件检测到变化 ↓ INT引脚输出高电平触发GPIO中断 ↓ 调用 gpio_int_callback(内部函数) ↓ 如果 ctx.motion_enable=true → 调用 motion_check() 进行运动状态判断 ↓ 如果 ctx.int_callback 已设置 → 调用用户设置的回调函数
触发机制:
> 1. **物理触发条件**:X/Y/Z轴的加速度变化幅度超过 `exs_da267.set_int_threshold` 设置的阈值(这是最底层的物理条件)
>
> 2. **硬件内部检测**:DA267传感器内部的加速度检测电路实时监测三轴数据,当检测到变化超过阈值时,自动置位中断标志位
>
> 3. **外部信号输出**:传感器通过INT引脚输出高电平(或低电平,根据配置),触发主控芯片的GPIO中断
>
> 4. **软件中断响应**:主控芯片的GPIO中断服务程序被激活,执行相应的中断处理逻辑
>
>
**参数**
callback
```Plain Text
参数含义:中断回调函数
数据类型:function
取值范围:有效的 Lua 函数
是否必选:是
参数示例:
local function da267_callback()
log.info("da267", "中断触发")
end
返回值
local result = exs_da267.set_callback(callback)
result
```Plain Text 含义说明:操作是否成功 数据类型:boolean 取值范围:true(成功), false(失败) 返回示例:true
**示例**
```Lua
-- DA267 中断回调函数
function da267_interrupt_handler()
log.info("da267", "中断触发")
local data = exs_da267.get_data()
if data then
log.debug("da267", string.format("X=%.3f Y=%.3f Z=%.3f g",
data.x, data.y, data.z))
end
end
-- 设置回调函数
function set_interrupt_callback()
exs_da267.set_callback(da267_interrupt_handler)
end
4.5 状态查询
4.5.1 exs_da267.is_moving()
功能
获取当前运动状态
参数
无
返回值
local is_moving = exs_da267.is_moving()
is_moving
```Plain Text 含义说明:当前运动状态 数据类型:boolean 取值范围:true(运动), false(静止) 返回示例:true
**示例**
```Lua
-- 检查运动状态
function check_motion_state()
local state = exs_da267.is_moving()
log.info("exs_da267", "运动状态: " .. (state and "运动" or "静止"))
if exs_da267.is_moving() then
log.info("exs_da267", "设备正在运动")
else
log.info("exs_da267", "设备处于静止状态")
end
return state
end
4.5.2 exs_da267.get_chip_id()
功能
获取 DA267 芯片ID,用于芯片识别和自检
参数
无
返回值
local chip_id = exs_da267.get_chip_id()
chip_id
```Plain Text 含义说明:芯片ID 数据类型:number 或 nil 取值范围:DA267 芯片固定为 0x13 返回示例:0x13
**示例**
```Lua
-- DA267 芯片ID配置表
local DA267_CHIP_CONFIG = {
expected_chip_id = 0x13
}
-- 验证芯片ID
function verify_chip_id()
local chip_id = exs_da267.get_chip_id()
if chip_id == DA267_CHIP_CONFIG.expected_chip_id then
log.info("exs_da267", "芯片ID验证成功")
else
log.error("exs_da267", "芯片ID验证失败")
end
return chip_id
end
4.5.3 exs_da267.get_config()
功能
获取当前传感器配置信息
参数
无
返回值
local config = exs_da267.get_config()
config
```Plain Text 含义说明:当前配置表 数据类型:table 或 nil 注意事项:返回 nil 表示传感器未初始化 返回示例:{ i2c_id = 1, -- I2C总线编号 addr = 0x26, -- I2C设备地址 int_pin = 39, -- 中断引脚(nil表示未设置) range = 2, -- 量程:2/4/8/16(对应±2g/±4g/±8g/±16g) sensitivity = 16384, -- 灵敏度系数(LSB/g,由量程计算得出) inited = true, -- 是否已初始化 motion_enable = true, -- 是否启用运动状态管理 motion_state = false, -- 当前运动状态:false=静止, true=运动 motion_window = 20, -- 运动状态判断历史窗口(秒) motion_threshold = 4, -- 进入运动状态的中断次数阈值 }
**示例**
```Lua
-- 获取传感器配置信息
function get_sensor_config()
local config = exs_da267.get_config()
if config then
log.info("exs_da267", "量程: " .. config.range .. "g")
log.info("exs_da267", "运动状态管理: " .. (config.motion_enable and "已启用" or "已禁用"))
end
return config
end
4.6 控制与版本
4.6.1 exs_da267.close()
功能
关闭传感器,使其进入休眠模式以降低功耗。关闭后需重新调用 exs_da267.setup(config) 才能恢复使用。
参数
无
返回值
local result = exs_da267.close()
result
```Plain Text 含义说明:操作是否成功 数据类型:boolean 取值范围:true(成功), false(失败) 返回示例:true
**示例**
```Lua
-- 关闭传感器
function close_sensor()
exs_da267.close()
end
-- 验证传感器关闭状态
function verify_sensor_closed()
-- 关闭传感器
close_sensor()
-- 关闭后再读返回 nil
local data = exs_da267.get_data() -- 返回 nil
log.info("exs_da267", "传感器已关闭,读取数据返回: " .. tostring(data))
end
4.6.2 exs_da267.version()
功能
获取 exs_da267 库的版本号
参数
无
返回值
local ver = exs_da267.version()
ver
```Plain Text 含义说明:版本号字符串 数据类型:string 取值范围:格式 "yyyymmddhhmm",表示 yyyy年mm月dd日hh时mm分发布的版本 注意事项:无需 setup() 即可调用 返回示例:"202607171813"
**示例**
```Lua
-- 获取并显示版本号
function get_version_info()
local ver = exs_da267.version()
log.info("exs_da267", "版本号:", ver)
return ver
end
五、版本更新说明
版本号:202607201700
-
更新时间:2026-07-20
-
更新内容:
- 优化 DA267 运动状态判断机制,去掉运动状态管理中的超时参数
版本号:202607171813
-
更新时间:2026-07-17
-
更新内容:
-
初版,实现 DA267 驱动所有基础功能
-
遵循 exs_ 扩展库设计规范
-
支持 I2C 通信和中断处理
-
支持 ±2g/±4g/±8g/±16g 四档量程
-
实现运动状态管理和计步器功能
-
支持运动检测中断和阈值配置
-
提供完整的 Lua 接口和示例代码
-
六、产品支持说明
所有支持 LuatOS 二次开发的模块,具体可以查看选型手册。