跳转至

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定时器超时 必然=threshold早已触发重置) 判定为静止状态
清零定时器;
重启定时器(开启下一个检测周期);
注意:过去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

  1. 更新时间:2026-07-20

  2. 更新内容:

    • 优化 DA267 运动状态判断机制,去掉运动状态管理中的超时参数

版本号:202607171813

  1. 更新时间:2026-07-17

  2. 更新内容:

    • 初版,实现 DA267 驱动所有基础功能

    • 遵循 exs_ 扩展库设计规范

    • 支持 I2C 通信和中断处理

    • 支持 ±2g/±4g/±8g/±16g 四档量程

    • 实现运动状态管理和计步器功能

    • 支持运动检测中断和阈值配置

    • 提供完整的 Lua 接口和示例代码

六、产品支持说明

所有支持 LuatOS 二次开发的模块,具体可以查看选型手册

AI问答/AI搜索