跳转至

exs_spl06 扩展库

作者:江访 | 最后修改:2026-08-21

一、概述

exs_spl06 是歌尔微电子(Goertek)SPL06-001 数字气压传感器的 LuatOS 扩展库。 SPL06-001 是一款高精度、低功耗的电容式气压传感器,内部集成 24 位 ADC, 同时测量气压与温度,广泛应用于气压测高、室内外导航、天气预报、垂直速度检测等领域。

1.1 主要特性

  • 压力范围 300~1100hPa(对应海拔 +9000m ~ -500m)

  • 温度范围 -40~+85°C,温度精度 ±0.5°C(+25°C 时)

  • 气压绝对精度典型值 ±1hPa(0~+65°C,300~1100hPa 范围内)

  • 气压相对精度 ±0.06hPa(等效 ±0.5 米海拔)

  • 输出分辨率:气压 0.06Pa,温度 0.01°C

  • I2C 接口通信,支持双地址 0x77/0x76(由 SDO 引脚决定),不传地址时自动探测

  • 内置 E2PROM 出厂校准系数,每颗芯片独立校准,扩展库自动读取并完成补偿计算

  • 支持 8 级过采样率(1x~128x),精度/速度/功耗可调

  • 内置 FIFO 可缓存最新 32 次测量结果

  • 工作电压 VDD 1.7~3.6V,待机电流小于 1μA

  • 支持软件 I2C 和硬件 I2C 两种模式,内置 I2C 总线卡死自动检测与恢复

  • 支持海拔高度计算、测量模式切换(待机/单次/连续)、休眠唤醒等附加功能

1.2 注意事项

  • 推荐使用软件 I2C 模式:SPL06-001 在异常 I2C 通信后可能锁死 SDA 总线, 软件 I2C 模式可以通过 GPIO 直接脉冲 SCL 恢复总线。

  • 初始化总线恢复:每次调用 setup() 时,如果传入了 scl/sda 引脚号, 驱动会先进行总线恢复,确保总线在通信开始前处于空闲状态。

  • 运行时自动恢复:当 i2c.send()i2c.recv() 返回失败时, 驱动自动执行总线恢复并重试。

  • I2C 模式下 SCL 和 SDA 需外接 4.7kΩ~10kΩ 上拉电阻到 VCC(部分模块已自带)。

  • 双地址说明:SPL06-001 有两个 I2C 地址,由 SDO 引脚决定: SDO 悬空或接高电平时地址为 0x77,SDO 接 GND 时地址为 0x76。 不传 addr 参数时扩展库自动探测并锁定实际地址,接线改变后需重新上电。

  • 过采样率大于 8 倍(16x~128x)时,芯片需配合移位处理,扩展库已自动完成, 无需用户干预。

  • 首次上电等待校准:芯片上电后约 40ms 校准系数才就绪, 扩展库的 setup() 会等待就绪后再读取,期间请勿断电。

  • 未实现 FIFO 与中断功能:SPL06-001 的 INT 引脚在 I2C 模式下与地址选择 引脚复用(SDO),启用中断会影响地址配置;FIFO 仅缓存 32 次结果,本扩展库 采用即时读取模式,轮询下无使用 FIFO 的必要。

1.3 过采样率说明

通过 setup()config.prs_osr/config.tmp_osrset_osr() 配置,默认气压 4(16x)、温度 3(8x)。

OSR 倍数 测量时间(ms) 精度(PaRMS) 适用场景
0 1x 3.6 5 最快,适合仅看气压趋势
1 2x 5.2 2.5 低功耗周期监测
2 4x 8.4 1.2 常规监测
3 8x 14.8 0.9 常规测量
4 16x 27.6 0.5 默认,适合大多数场景
5 32x 53.2 - 较高精度
6 64x 104.4 - 高精度气象站
7 128x 206.8 - 最高精度,最慢
  • OSR 越高,精度越高,但测量时间越长、功耗越高

  • 便携/低功耗应用推荐 OSR=0 或 1

  • 气象站等高精度应用推荐 OSR=6 或 7

  • 温度过采样对功耗影响小,推荐保持默认值

  • 高过采样动态自校准:规格书缩放因子表在 32x/64x/128x 下真机实测存在偏差, 扩展库以默认过采样(16x 气压/8x 温度)实测原始值为基准,切换过采样时读取 新原始值按比例自动校准缩放因子(kP/kT),无需用户干预,数据始终准确

  • 切换高过采样(32x/64x/128x)时若动态校准失败(芯片数据异常),扩展库自动 回退默认过采样(16x/8x)并返回 false,保证数据正常输出

1.4 硬件连接

SPL06-001 通过 I2C 接口与主控连接,SCL/SDA 需外接 4.7kΩ~10kΩ 上拉电阻。

接线图(以 Air780EHM/Air780EHV/Air780EGH 为例,软件 I2C:SCL=GPIO31, SDA=GPIO30):

  ┌──────────────┐                    ┌──────────────────┐
  │    主控      │                    │    SPL06-001     │
  │  (Air780EHM) │                    │  数字气压传感器   │
  │              │                    │                  │
  │ GPIO31 ──────┼────────────────────┼──→ SCL           │
  │              │                    │                  │
  │ GPIO30 ──────┼────────────────────┼──→ SDA           │
  │              │                    │ (需外接上拉电阻)│
  │              │                    │                  │
  │ VDD_EXT ─────┼────────────────────┼──→ VCC           │
  │              │                    │                  │
  │ GND      ────┼────────────────────┼──→ GND           │
  │              │                    │                  │
  │ GND      ────┼────────────────────┼──→ SDO(可选,   │
  │              │                    │     接 GND=0x76) │
  └──────────────┘                    └──────────────────┘

各平台示例接线(以软件 I2C 模式为例):

  • Air780EHM/Air780EHV/Air780EGH:SCL=GPIO31, SDA=GPIO30
  • Air780EPM:SCL=GPIO31, SDA=GPIO30
  • Air8000:SCL=GPIO1, SDA=GPIO2
  • Air8101:SCL=GPIO4, SDA=GPIO5

1.5 加载方式

-- 扩展库需要 require 加载后才能调用
local exs_spl06 = require "exs_spl06"

二、核心示例

2.1 按使用接口划分

2.1.1 软件 I2C 模式(推荐)

主动轮询读取:

local exs_spl06 = require "exs_spl06"
local result = exs_spl06.setup({scl = 31, sda = 30})
if not result then return end

while true do
    local data = exs_spl06.get_data()
    if data then
        log.info("exs_spl06", string.format("温度=%.1f°C 气压=%.1fhPa", data.temperature, data.pressure))
    end
    sys.wait(5000)  -- 等待 5 秒后再次读取
end

2.1.2 硬件 I2C 模式

主动轮询读取:

local exs_spl06 = require "exs_spl06"
local result = exs_spl06.setup({i2c_id = 0, scl = 31, sda = 30})
-- 或仅使用硬件 I2C(无总线恢复)
-- local result = exs_spl06.setup({i2c_id = 0})
if not result then return end

while true do
    local data = exs_spl06.get_data()
    if data then
        log.info("exs_spl06", string.format("温度=%.1f°C 气压=%.1fhPa", data.temperature, data.pressure))
    end
    sys.wait(5000)  -- 等待 5 秒后再次读取
end

2.2 按使用场景划分

2.2.1 气压与温度轮询读取(省电)

适用场景:每隔几秒读一次气压和温度,不关心实时变化。

local result = exs_spl06.setup({
    scl = 31, sda = 30,
    prs_osr = 0,            -- 1x 超低功耗,单次测量仅 3.6ms
})
if not result then return end

local data = exs_spl06.get_data()
if data then
    log.info("exs_spl06", string.format("温度=%.1f°C 气压=%.1fhPa", data.temperature, data.pressure))
end

2.2.2 高精度气压测量(气象站)

适用场景:气象观测、室内外气压监测,需要高精度数据。

local result = exs_spl06.setup({
    scl = 31, sda = 30,
    prs_osr = 6,            -- 64x 高精度,单次测量约 104ms
})
if not result then return end

while true do
    local data = exs_spl06.get_data()
    if data then
        log.info("exs_spl06", string.format("温度=%.1f°C 气压=%.2fhPa", data.temperature, data.pressure))
    end
    sys.wait(10000)  -- 等待 10 秒后再次读取
end

2.2.3 过采样率动态切换

适用场景:在低功耗和高精度模式之间动态切换。

-- 高精度模式测量(64x)
exs_spl06.set_osr(6, 4)
local data = exs_spl06.get_data()
if data then
    log.info("exs_spl06", string.format("高精度: 温度=%.1f°C 气压=%.2fhPa", data.temperature, data.pressure))
end

-- 切回低功耗模式(1x)
exs_spl06.set_osr(0, 4)
data = exs_spl06.get_data()
if data then
    log.info("exs_spl06", string.format("低功耗: 温度=%.1f°C 气压=%.1fhPa", data.temperature, data.pressure))
end

2.2.4 海拔高度计算

适用场景:气压测高、室内外导航。

local pressure = exs_spl06.get_pressure()
if pressure then
    -- 默认海平面气压 1013.25 hPa
    local h = exs_spl06.get_altitude(pressure)
    -- 可传自定义海平面气压(更准)
    local h2 = exs_spl06.get_altitude(pressure, 1005)
    log.info("exs_spl06", string.format("气压=%.2fhPa 海拔=%.1f米(默认) %.1f米(1005hPa)", pressure, h, h2))
end

2.2.5 测量模式切换

适用场景:需要连续采集时用连续模式,需要低功耗时用待机/单次模式。

-- 连续气压+温度测量(后台模式)
exs_spl06.set_mode("both")
local data = exs_spl06.get_data()
if data then
    log.info("exs_spl06", string.format("连续模式: 温度=%.1f°C 气压=%.2fhPa", data.temperature, data.pressure))
end

-- 待机模式(电流 < 1µA)
exs_spl06.set_mode("standby")

2.2.6 休眠唤醒

适用场景:低功耗场景下临时睡眠,唤醒后恢复测量(无需重新初始化)。

-- 进入待机(等效睡眠,电流 < 1µA,校准系数不丢失)
exs_spl06.sleep()
sys.wait(3000)  -- 睡眠 3 秒

-- 唤醒并恢复连续测量(无需重新读取校准系数)
exs_spl06.wakeup()
local data = exs_spl06.get_data()
if data then
    log.info("exs_spl06", string.format("唤醒后: 温度=%.1f°C 气压=%.2fhPa", data.temperature, data.pressure))
end

三、常量解释

扩展库常量,顾名思义是由 exs_spl06 扩展库中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;

每个常量对应的常量取值仅做日志打印时查询使用,不要将这个常量取值用做具体的业务逻辑判断,因为扩展库可能会变更每个常量对应的常量取值;

如果用做具体的业务逻辑判断,一旦常量取值发生改变,业务逻辑就会出错;

3.1 exs_spl06.I2C_ADDR_H

常量含义:I2C 设备高地址,SDO 引脚悬空或接高电平时芯片默认使用该地址
数据类型:number
注意事项:取值为 0x77;setup() 不传 addr 时扩展库自动探测本地址与 I2C_ADDR_L,无需手动指定
示例代码:local result = exs_spl06.setup({scl = 31, sda = 30, addr = exs_spl06.I2C_ADDR_H})

3.2 exs_spl06.I2C_ADDR_L

常量含义:I2C 设备低地址,SDO 引脚接 GND 时芯片使用该地址
数据类型:number
注意事项:取值为 0x76;与 I2C_ADDR_H 的差异由 SDO 引脚决定,接线固定后地址即固定,一般不需手动指定
示例代码:local result = exs_spl06.setup({scl = 31, sda = 30, addr = exs_spl06.I2C_ADDR_L})

3.3 exs_spl06.OSR_1X

常量含义:过采样率 1x,单次测量最快(气压约 3.6ms),精度最低
数据类型:number
注意事项:取值为 0;适合低功耗、高刷新率场景(如气压变化趋势监测);与 OSR_2X 相比噪声更大
示例代码:exs_spl06.set_osr(exs_spl06.OSR_1X, exs_spl06.OSR_8X)

3.4 exs_spl06.OSR_2X

常量含义:过采样率 2x,单次测量较快(气压约 3.7ms),精度较低
数据类型:number
注意事项:取值为 1;适合低功耗场景,精度略优于 OSR_1X
示例代码:exs_spl06.set_osr(exs_spl06.OSR_2X, exs_spl06.OSR_8X)

3.5 exs_spl06.OSR_4X

常量含义:过采样率 4x,单次测量较快(气压约 4.8ms),精度中等
数据类型:number
注意事项:取值为 2;适合一般场景的功耗/精度折中
示例代码:exs_spl06.set_osr(exs_spl06.OSR_4X, exs_spl06.OSR_8X)

3.6 exs_spl06.OSR_8X

常量含义:过采样率 8x,单次测量约 7.5ms,精度较高
数据类型:number
注意事项:取值为 3;也是温度过采样的默认档位,适合常规应用
示例代码:exs_spl06.set_osr(exs_spl06.OSR_16X, exs_spl06.OSR_8X)

3.7 exs_spl06.OSR_16X

常量含义:过采样率 16x,单次测量约 27.6ms,精度高
数据类型:number
注意事项:取值为 4;为气压过采样的默认档位(setup 默认),也是缩放因子动态自校准的基准锚点
示例代码:exs_spl06.setup({scl = 31, sda = 30, prs_osr = exs_spl06.OSR_16X})

3.8 exs_spl06.OSR_32X

常量含义:过采样率 32x,单次测量约 54.4ms,精度更高
数据类型:number
注意事项:取值为 5;测量耗时明显增加,适合精度优先且刷新率要求不高的场景
示例代码:exs_spl06.set_osr(exs_spl06.OSR_32X, exs_spl06.OSR_8X)

3.9 exs_spl06.OSR_64X

常量含义:过采样率 64x,单次测量约 104ms,高精度
数据类型:number
注意事项:取值为 6;适合气象站、高度计等精度敏感场景;切换时扩展库自动完成缩放因子动态自校准
示例代码:exs_spl06.set_osr(exs_spl06.OSR_64X, exs_spl06.OSR_8X)

3.10 exs_spl06.OSR_128X

常量含义:过采样率 128x,单次测量最慢(约 208ms),精度最高
数据类型:number
注意事项:取值为 7;功耗与耗时最高,仅在需要极限精度的静态气压测量场景使用
示例代码:exs_spl06.set_osr(exs_spl06.OSR_128X, exs_spl06.OSR_8X)

四、函数详解

4.1 初始化

4.1.1 exs_spl06.setup(config)

功能

初始化 SPL06-001 气压传感器,配置 I2C 通信引脚,自动探测并锁定芯片地址, 等待校准系数就绪并读取,配置过采样率。

参数

config

参数含义:初始化配置表
数据类型:table
取值范围:包含以下子参数:
{
    参数含义:SCL 时钟引脚 GPIO 编号
    数据类型:number
    取值范围:有效的 GPIO 编号
    是否必选:与 sda 一起可选
    注意事项:与 sda 一起传入时无 i2c_id 则创建软件 I2C(推荐),
              有 i2c_id 则走硬件 I2C 并附带总线恢复
    参数示例:31
    config.scl ,

    参数含义:SDA 数据引脚 GPIO 编号
    数据类型:number
    取值范围:有效的 GPIO 编号
    是否必选:与 scl 一起可选
    注意事项:该引脚需外接 4.7kΩ~10kΩ 上拉电阻到 VCC
    参数示例:30
    config.sda ,

    参数含义:硬件 I2C 总线 ID
    数据类型:number
    取值范围:有效的 I2C 总线编号
    是否必选:可选
    注意事项:默认 0。与 scl/sda 一起传时使用硬件 I2C 通信 + 引脚恢复总线;
              不传 scl/sda 时使用硬件 I2C 但无总线恢复能力
    参数示例:1
    config.i2c_id ,

    参数含义:I2C 设备地址(芯片支持多个地址,可不传,自动探测)
    数据类型:number
    取值范围:0x77 / 0x76(由 SDO 引脚决定:SDO 悬空或接高电平 = 0x77,
              SDO 接 GND = 0x76)
    是否必选:否
    注意事项:不传时扩展库自动探测两个地址并校验芯片 ID,命中后锁定实际
              地址;接线改变后需重新上电探测。传了则直接使用该地址并跳过
              探测
    参数示例:0x76
    config.addr ,

    参数含义:气压过采样率
    数据类型:number
    取值范围:0~7,对应 1x/2x/4x/8x/16x/32x/64x/128x
    是否必选:否
    注意事项:默认 4(16x),适合大多数场景;低功耗选 0~1,
              高精度气象站选 6~7,详见"1.3 过采样率说明"
    参数示例:6
    config.prs_osr ,

    参数含义:温度过采样率
    数据类型:number
    取值范围:0~7,对应 1x/2x/4x/8x/16x/32x/64x/128x
    是否必选:否
    注意事项:默认 3(8x),与缩放校准锚点一致;温度测量功耗极低,
              一般保持默认即可
    参数示例:3
    config.tmp_osr ,
}
是否必选:否,可不传任何参数使用默认值(硬件 I2C,地址自动探测)
参数示例:
         -- 方式一:软件 I2C 模式(推荐)
         exs_spl06.setup({scl = 31, sda = 30})

         -- 方式二:硬件 I2C + 总线恢复
         exs_spl06.setup({i2c_id = 1, scl = 31, sda = 30})

         -- 方式三:指定地址 + 高精度过采样
         exs_spl06.setup({scl = 31, sda = 30, addr = 0x76, prs_osr = 6})

返回值

local result = exs_spl06.setup(config)

result

含义说明:初始化是否成功
数据类型:boolean
取值范围:true(成功),false(失败)
注意事项:失败时请检查接线、供电和 I2C 地址
返回示例:true

示例

-- 软件 I2C 模式
local result = exs_spl06.setup({scl = 31, sda = 30})
if not result then return end

4.2 数据读取

4.2.1 exs_spl06.get_data()

功能

读取 SPL06-001 气压和温度数据,自动进行校准补偿。 采用连续测量模式:内部维持 BOTH_CONT 连续测量,等待最新气压/温度数据就绪后 读取(PRS_RDY/TMP_RDY 周期置位,一定能等到)。若当前处于待机/单次模式 (如 sleep 后),会自动恢复连续测量。单次测量耗时取决于过采样率 (16x 约 27.6ms,64x 约 104ms)。

⚠️ 协程限制:必须在 sys.taskInit 创建的协程中调用 原因:内部使用轮询等待测量完成,需要 sys.wait 让步 最长等待:最长约 2 秒(气压+温度各等待一次),每 5ms 检测一次

参数

返回值

local data = exs_spl06.get_data()

data

含义说明:气压和温度数据表
数据类型:table 或 nil
取值范围:
        data.temperature - 温度,单位 °C,精确到小数点后 1 位,
                           范围 -40.0~+85.0,如 25.1
        data.pressure    - 气压,单位 hPa,精确到小数点后 2 位,
                           范围 300.00~1100.00,如 1013.25
注意事项:失败返回 nil,失败时请检查 I2C 通信
返回示例:{temperature = 25.1, pressure = 1013.25}

示例

local data = exs_spl06.get_data()
if data then
    -- 温度单位 °C,气压单位 hPa
    log.info("exs_spl06", string.format("温度=%.1f°C 气压=%.2fhPa", data.temperature, data.pressure))
else
    log.error("exs_spl06", "读取数据失败")
end

4.2.2 exs_spl06.get_pressure()

功能

单次读取当前气压值,自动完成补偿计算。 内部基于 get_data() 实现:连续测量模式下等待最新气压/温度数据就绪后, 直接取其中的气压分量返回。

⚠️ 协程限制:必须在 sys.taskInit 创建的协程中调用 原因:内部使用轮询等待测量完成,需要 sys.wait 让步 最长等待:最长约 2 秒(气压+温度各等待一次),每 5ms 检测一次

参数

返回值

local pressure = exs_spl06.get_pressure()

pressure

含义说明:补偿后的气压值
数据类型:number 或 nil
取值范围:300.00~1100.00(单位 hPa,精确到小数点后 2 位)
注意事项:失败返回 nil
返回示例:1013.25

示例

local pressure = exs_spl06.get_pressure()
if pressure then
    log.info("exs_spl06", string.format("气压=%.2fhPa", pressure))
end

4.2.3 exs_spl06.get_temperature()

功能

单次读取当前温度值,自动完成补偿计算。 内部基于 get_data() 实现:连续测量模式下等待最新气压/温度数据就绪后, 直接取其中的温度分量返回。

⚠️ 协程限制:必须在 sys.taskInit 创建的协程中调用 原因:内部使用轮询等待测量完成,需要 sys.wait 让步 最长等待:最长约 2 秒(气压+温度各等待一次),每 5ms 检测一次

参数

返回值

local temperature = exs_spl06.get_temperature()

temperature

含义说明:补偿后的温度值
数据类型:number 或 nil
取值范围:-40.0~+85.0(单位 °C,精确到小数点后 1 位)
注意事项:失败返回 nil
返回示例:25.1

示例

local temperature = exs_spl06.get_temperature()
if temperature then
    log.info("exs_spl06", string.format("温度=%.1f°C", temperature))
end

4.3 参数配置

4.3.1 exs_spl06.set_osr(prs_osr, tmp_osr)

功能

动态修改气压和温度的过采样率,无需重新初始化。 过采样率越高,精度越高但测量时间越长、功耗越高。 切换后扩展库自动触发缩放因子动态自校准(以 16x 气压/8x 温度为基准 按比例校准 kP/kT),规避规格书高过采样缩放因子真机偏差,无需用户干预。

⚠️ 协程限制:必须在 sys.taskInit 创建的协程中调用 原因:内部需要重启连续测量并轮询等待新原始值,使用 sys.wait 让步 最长等待:最长约 2.5 秒(先丢弃切换过渡期前两轮测量结果,再重试 3 次,间隔 100ms)

参数

prs_osr

参数含义:气压目标过采样率
数据类型:number
取值范围:0~7,对应 1x/2x/4x/8x/16x/32x/64x/128x
是否必选:否
注意事项:不传则保持当前气压过采样率。超范围自动裁剪到 0~7。
          低功耗选 0~1,默认精度选 4,高精度选 6~7
参数示例:6

tmp_osr

参数含义:温度目标过采样率
数据类型:number
取值范围:0~7,对应 1x/2x/4x/8x/16x/32x/64x/128x
是否必选:否
注意事项:不传则保持当前温度过采样率。超范围自动裁剪到 0~7。
          温度测量功耗极低,一般保持默认即可
参数示例:3

返回值

local ok = exs_spl06.set_osr(6, 3)

ok

含义说明:切换是否成功
数据类型:boolean
取值范围:true(成功),false(失败)
注意事项:高过采样(32x/64x/128x)动态校准失败时,自动回退默认
          过采样(16x/8x)并返回 false,保证数据正常输出
返回示例:true

示例

-- 切换为 64x 高精度(气压 64x + 温度 16x)
local ok = exs_spl06.set_osr(6, 4)
if ok then
    local data = exs_spl06.get_data()
    if data then
        log.info("exs_spl06", string.format("高精度: 温度=%.1f°C 气压=%.2fhPa", data.temperature, data.pressure))
    end
end

-- 切换回 1x 低功耗(温度保持 8x)
exs_spl06.set_osr(0)

4.4 资源释放

4.4.1 exs_spl06.close()

功能

关闭 SPL06-001 传感器,令芯片进入待机模式(功耗小于 1μA), 并释放 I2C 资源、重置内部状态。

close 后需要重新调用 setup() 才能再次使用。 close 后调用 get_data() 会返回 nil 并提示"请先 setup()"。

参数

返回值

示例

exs_spl06.close()

4.5 海拔高度计算

4.5.1 exs_spl06.get_altitude(pressure, sea_level_pressure)

功能

根据气压值计算海拔高度(国际气压测高公式:h = 44330 × (1 − (P/P0)^(1/5.255)))。 为纯计算接口,不操作传感器硬件,无需协程限制。

参数

pressure

参数含义:实测气压值
数据类型:number
取值范围:300.00~1100.00(单位 hPa)
是否必选:是
注意事项:建议传入 get_pressure()/get_data() 的返回值
参数示例:1002.80

sea_level_pressure

参数含义:海平面气压基准值
数据类型:number
取值范围:900.00~1100.00(单位 hPa)
是否必选:否
注意事项:不传时默认 1013.25 hPa(标准大气压)。当地海平面气压
          可从气象局或气压校准获得,传入更准
参数示例:1005

返回值

local h = exs_spl06.get_altitude(1002.80)

h

含义说明:海拔高度
数据类型:number
取值范围:-500~9000(单位 米,粗略估计)
注意事项:输入的 pressure 或 sea_level_pressure 非法(<=0)时返回 0
返回示例:87.4

示例

local pressure = exs_spl06.get_pressure()
if pressure then
    local h = exs_spl06.get_altitude(pressure)          -- 默认海平面气压 1013.25hPa
    local h2 = exs_spl06.get_altitude(pressure, 1005)   -- 自定义海平面气压 1005hPa
    log.info("exs_spl06", string.format("气压=%.2fhPa 海拔=%.1f米(默认) %.1f米(1005hPa)", pressure, h, h2))
end

4.6 测量模式切换

4.6.1 exs_spl06.set_mode(mode)

功能

切换测量模式(写 MEAS_CFG 寄存器的 MEAS_CTRL 位): 待机(standby)/ 单次气压(pressure)/ 单次温度(temperature)/ 连续气压+温度(both)。

参数

mode

参数含义:目标测量模式
数据类型:string
取值范围:
        "standby"      - 待机,停止测量,电流 < 1µA
        "pressure"     - 单次气压测量,测完自动回待机
        "temperature"  - 单次温度测量,测完自动回待机
        "both"         - 连续气压+温度测量(后台模式)
是否必选:是
注意事项:不区分大小写
参数示例:"both"

返回值

local ok = exs_spl06.set_mode("both")

ok

含义说明:切换是否成功
数据类型:boolean
取值范围:true(成功),false(失败)
注意事项:传入非法模式(不在上述四个取值内)时返回 false
返回示例:true

示例

-- 连续气压+温度测量(后台模式)
local ok = exs_spl06.set_mode("both")
if ok then
    sys.wait(500)   -- 等待后台连续测量稳定
    local data = exs_spl06.get_data()
    if data then
        log.info("exs_spl06", string.format("连续模式: 温度=%.1f°C 气压=%.2fhPa", data.temperature, data.pressure))
    end
end

-- 回待机低功耗
exs_spl06.set_mode("standby")

4.7 休眠唤醒

4.7.1 exs_spl06.sleep()

功能

进入低功耗待机(等效睡眠,电流 < 1µA,校准系数不丢失)。 与 close 的区别:sleep 不释放 I2C 资源,wakeup 可直接恢复测量。

参数

返回值

示例

exs_spl06.sleep()
sys.wait(3000)   -- 睡眠 3 秒

4.7.2 exs_spl06.wakeup()

功能

从待机唤醒,恢复连续气压+温度测量(无需重新读取校准系数)。

参数

返回值

示例

exs_spl06.wakeup()
local data = exs_spl06.get_data()
if data then
    log.info("exs_spl06", string.format("唤醒后: 温度=%.1f°C 气压=%.2fhPa", data.temperature, data.pressure))
end

4.8 版本信息

4.8.1 exs_spl06.version()

功能

获取 exs_spl06 库的版本号。

参数

返回值

local ver = exs_spl06.version()

ver

含义说明:版本号字符串
数据类型:string
取值范围:格式 "yyyymmddhhmm"(年月日时分)
注意事项:无
返回示例:"202608211900"

示例

local ver = exs_spl06.version()
log.info("exs_spl06", "版本号:", ver)

五、功能特性说明

版本号:202608211700

  1. 发布时间:2026-08-21

  2. 支持功能:

    • 初始化:I2C 地址自动探测(0x76/0x77 双地址)-> 芯片 ID 校验 -> 校准系数读取 -> 过采样率配置 -> 缩放基准建立

    • 数据读取:气压/温度自动校准补偿(get_data/get_pressure/get_temperature)

    • 过采样率在线切换:0~7 档(1x~128x),切换时自动完成缩放因子动态自校准

    • 海拔高度计算:国际气压测高公式,支持自定义海平面气压

    • 测量模式切换:待机 / 单次气压 / 连续气压+温度

    • 休眠唤醒:sleep/wakeup 低功耗管理

    • I2C 总线卡死自动检测与恢复


六、产品支持说明

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

搜索