跳转至

exs_bmx280 扩展库

作者:江访 | 最后修改:2026-07-23

一、概述

exs_bmx280 是 Bosch Sensortec BMP280/BME280 数字气压传感器的 LuatOS 扩展库。BMP280/BME280 是一款高精度、低功耗的数字气压传感器,广泛应用于海拔测量、室内外导航、天气预报、无人机定高、运动监测等领域。

1.1 主要特性

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

  • 温度测量精度 ±0.5°C(典型值)

  • 气压测量精度 ±0.12hPa(典型值,高精度模式)

  • I2C 接口通信,7 位地址可选 0x76(SDO=GND)或 0x77(SDO=VCC)

  • 内置 E2PROM 存储 12 个校准参数,每颗芯片独立校准

  • 支持 IIR 滤波器(系数 0~4),有效降低噪声

  • 20 位 ADC 分辨率

  • 工作电压 1.71~3.6V

  • 待机电流 0.1μA(典型值)

  • 支持软件 I2C 和硬件 I2C 两种模式

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

1.2 注意事项

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

  • 初始化总线恢复:每次调用 setup() 时,如果传入了 scl/sda 引脚号,驱动会先进行总线恢复。

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

  • I2C 模式下 SCL 和 SDA 需外接 4.7kΩ~10kΩ 上拉电阻到 VCC

  • BMP280/BME280 的 I2C 地址:SDO=GND 时 0x76,SDO=VCC 时 0x77

  • CHIP_ID 为 0x58(BMP280) 或 0x60(BME280),自动识别,可用于验证芯片是否正常通信

1.3 IIR 滤波器说明

BMP280 内置 IIR(无限脉冲响应)低通滤波器,通过对连续多次采样进行加权平均,有效降低数据噪声。

通过 setup()config.filterset_filter() 参数配置:

filter 值 采样平均次数 适用场景
0 关闭 快速响应,适合变化频繁的环境
1 2 次 轻度滤波
2 4 次 中等滤波
3 8 次 较强滤波
4 16 次 最强滤波,适合静态测量

1.4 海拔计算说明

计算公式:altitude = 44330 * (1 - (p/p0)^(1/5.255))

其中 p 为当前气压,p0 为海平面标准气压,通过 set_sea_level_pressure() 设置。get_altitude() 传入当前气压 p 即可自动使用已设置的 p0 计算海拔。

  • 默认海平面标准气压 101325 Pa(1013.25 hPa),可通过 set_sea_level_pressure() 设置校正值

  • 不同天气条件下海平面气压会变化,建议通过联网或本地气象站获取实时海平面气压校正

1.5 硬件连接

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

  ┌──────────────┐                    ┌──────────────────┐
  │    主控      │                    │    BMP280        │
  │  (AirXXX)    │                    │  数字气压传感器   │
  │              │                    │                  │
  │ GPIO_SCL ────┼────────────────────┼──→ SCL           │
  │              │                    │                  │
  │ GPIO_SDA ←───┼────────────────────┼──→ SDA           │
  │              │                    │ (需外接上拉电阻)│
  │              │                    │                  │
  │ VCC 3.3V ────┼────────────────────┼──→ VCC           │
  │              │                    │                  │
  │ GND      ────┼────────────────────┼──→ GND           │
  └──────────────┘                    └──────────────────┘

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

  • Air8101:SCL=GPIO4, SDA=GPIO5

1.6 加载方式

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

二、核心示例

2.1 按使用接口划分

2.1.1 软件 I2C 模式(推荐)

主动轮询读取:

local exs_bmx280 = require "exs_bmx280"
local result = exs_bmx280.setup("I2C", {scl = 27, sda = 26})
if not result then return end

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

2.1.2 硬件 I2C 模式

local exs_bmx280 = require "exs_bmx280"
local result = exs_bmx280.setup("I2C", {i2c_id = 0, scl = 27, sda = 26})
if not result then return end

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

2.2 按使用场景划分

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

local result = exs_bmx280.setup("I2C", {
    scl = 4, sda = 5,
})
if not result then return end

sys.wait(200)  -- 等待传感器稳定,200ms 为数据手册推荐值
local data = exs_bmx280.get_data()
if data then
    log.info("exs_bmx280", string.format("温度=%.2f°C 气压=%.1fPa", data.temperature, data.pressure))
end

2.2.2 高精度气压测量(开启 IIR 滤波)

local result = exs_bmx280.setup("I2C", {
    scl = 4, sda = 5,
    filter = 4,         -- 16 次采样平均,噪声最低
})
if not result then return end

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

2.2.3 海拔高度测量

local result = exs_bmx280.setup("I2C", {scl = 4, sda = 5})
if not result then return end

sys.wait(200)  -- 等待传感器稳定,200ms 为数据手册推荐值
local data = exs_bmx280.get_data()
if data then
    local alt = exs_bmx280.get_altitude(data.pressure)
    log.info("exs_bmx280", string.format("温度=%.2f°C 气压=%.1fPa 海拔=%.1f米", data.temperature, data.pressure, alt))
end

2.2.4 IIR 滤波切换示例

-- 关闭滤波(快速响应)
exs_bmx280.set_filter(0)

-- 最强滤波(最平滑)
exs_bmx280.set_filter(4)

三、常量解释

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


四、函数详解

4.1 初始化

4.1.1 exs_bmx280.setup(model, config)

功能

初始化 BMP280/BME280 气压传感器,配置通信接口和采样参数。

参数

model

参数含义:通信模式选择
数据类型:string
取值范围:"I2C"(当前仅支持 I2C,SPI 预留)
是否必选:是
注意事项:"I2C" 模式使用 I2C 总线(可选用软件 I2C 或硬件 I2C)
参数示例:"I2C"

config

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

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

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

    参数含义:IIR 滤波器系数
    数据类型:number
    取值范围:0~4(默认 0=关闭,4=16 次平均最强滤波)
    是否必选:否
    注意事项:滤波系数越大数据越平滑,但对变化响应越慢
    参数示例:4
    config.filter ,
}
是否必选:否,可不传任何参数使用默认值(硬件 I2C)
参数示例:
         -- 方式一:软件 I2C 模式(推荐)
         exs_bmx280.setup("I2C", {scl = 30, sda = 29})

         -- 方式二:硬件 I2C + 总线恢复
         exs_bmx280.setup("I2C", {i2c_id = 1, scl = 18, sda = 19})

         -- 方式三:开启 IIR 滤波
         exs_bmx280.setup("I2C", {scl = 30, sda = 29, filter = 4})

返回值

local ok = exs_bmx280.setup(model, config)

ok

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

示例

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

4.2 数据读取

4.2.1 exs_bmx280.get_data()

功能

读取 BMP280/BME280 气压和温度数据,自动进行校准补偿。数据寄存器为 20 位,每次读取温度 ADC 和气压 ADC(共 6 字节)。

参数

返回值

local data = exs_bmx280.get_data()

data

含义说明:气压和温度数据表
数据类型:table 或 nil
取值范围:
    data.temperature - 温度,单位 °C,精确到 0.01°C,如 25.12
    data.pressure    - 气压,单位 Pa(帕斯卡),如 101325
注意事项:失败返回 nil,失败时请检查 I2C 通信
返回示例:{temperature = 25.12, pressure = 101325}

示例

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

4.3 参数配置

4.3.1 exs_bmx280.set_filter(coeff)

功能

设置 IIR 滤波器系数。系数越大,数据越平滑,但对环境变化的响应越慢。

参数

coeff

参数含义:滤波器系数
数据类型:number
取值范围:0~4
是否必选:是
注意事项:仅在 setup() 之后调用有效。IIR 滤波器系数选择参考:
            - 0=关闭,适合快速响应场景
            - 1=2 次平均,轻度滤波
            - 2=4 次平均,中等滤波
            - 3=8 次平均,较强滤波
            - 4=16 次平均,最强滤波,适合静态精密测量
参数示例:4

返回值

示例

-- 设置为最强滤波
exs_bmx280.set_filter(4)

-- 关闭滤波
exs_bmx280.set_filter(0)

4.4 海拔计算

4.4.1 exs_bmx280.get_altitude(pressure)

功能

通过当前气压值计算海拔高度,使用国际气压公式。 海平面标准气压通过 set_sea_level_pressure() 设置,默认 101325Pa。

参数

pressure

参数含义:当前气压值,单位 Pa
数据类型:number
取值范围:30000~110000
是否必选:是
注意事项:传入 get_data() 返回的 data.pressure
参数示例:101325

返回值

local altitude = exs_bmx280.get_altitude(pressure)

altitude

含义说明:海拔高度
数据类型:number(浮点数,小数点后一位)
取值范围:-500~9000(单位米)
返回示例:50.0(表示海拔 50 米)

示例

local data = exs_bmx280.get_data()
if data then
    local alt = exs_bmx280.get_altitude(data.pressure)
    log.info("exs_bmx280", string.format("海拔=%.1f 米", alt))
end

4.5 参数配置

4.5.1 exs_bmx280.set_sea_level_pressure(pressure)

功能

设置海平面标准气压,用于校准海拔计算精度。不同天气条件下海平面气压会变化,可通过本地气象站数据或联网获取校正值。

参数

pressure

参数含义:海平面标准气压,单位 Pa
数据类型:number
取值范围:95000~105000
是否必选:是
注意事项:默认 101325。可通过联网查询本地气象站数据获取更精确的值
参数示例:101800

返回值

示例

-- 从气象站获取当前的精确海平面气压
exs_bmx280.set_sea_level_pressure(101800)

-- 之后调用 get_altitude 会自动使用此值
local data = exs_bmx280.get_data()
if data then
    local alt = exs_bmx280.get_altitude(data.pressure)
    log.info("exs_bmx280", string.format("海拔=%.1f 米", alt))
end

4.6 传感器控制

4.6.1 exs_bmx280.close()

功能

关闭 BMP280/BME280/BME280 传感器,将传感器切换到待机模式,重置内部状态。 close 后需要重新调用 setup() 才能再次使用。 close 后调用 get_data() 会返回 nil 并提示"请先 setup()"。

参数

返回值

示例

exs_bmx280.close()

4.7 辅助函数

4.7.1 exs_bmx280.version()

功能

获取 exs_bmx280 库的版本号。

参数

返回值

local ver = exs_bmx280.version()

ver

含义说明:版本号字符串
数据类型:string
取值范围:格式 "yyyymmddhhmm",表示 yyyy年mm月dd日hh时mm分发布的版本
注意事项:无
返回示例:"202607230900"

示例

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

五、版本更新说明

版本号:202607230900

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

  2. 更新内容:

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

    • 支持软件 I2C 和硬件 I2C 两种模式

    • 支持 IIR 滤波器(系数 0~4)

    • 自动读取 E2PROM 校准补偿参数

    • 支持校准温度补偿算法(精度 0.01°C)

    • 支持校准气压补偿算法

    • 支持海拔高度计算(国际气压公式)

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


六、产品支持说明

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

AI问答