Beetle 树莓派RP2350 - 随身气压计
Beetle 树莓派RP2350 - 随身气压计
🧭 本文介绍了 DFRobot Beetle RP2350 开发板结合 BMP280 模块和锂电池模块实现环境大气压强、温度、海拔实时OLED显示的便携随身气压计的项目设计。
项目介绍
🌊 本项目包括 BMP280 传感器模块介绍、工作原理、参数特点等信息,在此基础上实现工程代码编写、硬件测试等流程,最终实现气压计的制作。
BMP280 模块
BMP280 是一款由 博世(Bosch) 开发的高精度数字气压传感器,广泛应用于移动设备、气象监测、无人机、室内导航等领域。
它集成了 气压 和 温度 测量功能,具有低功耗、小尺寸和高精度的特点,适用于电池供电设备。
原理图
特点
- 高精度测量
- 气压测量范围:300~1100 hPa(海拔 -500m 至 +9000m)
- 相对精度:±0.12 hPa(高度误差 ±1 米)
- 温度测量范围:-40°C ~ +85°C,精度 ±0.01°C
- 低功耗设计
- 工作电流仅 2.7μA @1Hz,适合电池供电设备;
- 支持多种通信接口
- I²C(默认地址 0x76 或 0x77)和 SPI,方便与微控制器连接;
- 紧凑封装
- 采用 8 引脚 LGA 封装(2.0×2.5mm,高度 0.95mm),适合空间受限的应用。
- 内置温度补偿
- 温度数据可用于校准气压测量,提高精度。
应用
- 气象站:用于气压趋势监测和天气预报;
- 无人机 & 飞行控制器:测量高度和垂直速度;
- 室内导航:检测楼层变化(如电梯、商场导航);
- 智能穿戴设备(如运动手表):计算海拔变化和运动数据;
- 健康监测:如肺活量检测(气压变化反映呼吸情况).
IIC 时序图
详见:BMP280 Datasheet - BST .
硬件连接
- GP4 ---- SDA (BMP280)
- GP5 ---- SCL (BMP280)
- GP4 ---- SDA (OLED_SSD1306)
- GP5 ---- SCL (OLED_SSD1306)
- BAT -> Battery Positive
- GND -> Battery Negative
示意图
实物连接
代码
通过复用 IIC 引脚 GPIO4 和 GPIO5 ,实现 BMP280 模块的数据采集、终端打印以及 OLED 显示。
打开 Thonny IDE
软件,连接开发板,新建 main.py
文件,并添加如下代码
from machine import Pin, I2C
import utime
import math
from ssd1306 import SSD1306_I2C# BMP280 I2C地址
BMP280_I2C_ADDR = 0x76 # 如果使用0x77地址,请修改此值# BMP280寄存器地址
BMP280_REGISTER_DIG_T1 = 0x88
BMP280_REGISTER_DIG_T2 = 0x8A
BMP280_REGISTER_DIG_T3 = 0x8C
BMP280_REGISTER_DIG_P1 = 0x8E
BMP280_REGISTER_DIG_P2 = 0x90
BMP280_REGISTER_DIG_P3 = 0x92
BMP280_REGISTER_DIG_P4 = 0x94
BMP280_REGISTER_DIG_P5 = 0x96
BMP280_REGISTER_DIG_P6 = 0x98
BMP280_REGISTER_DIG_P7 = 0x9A
BMP280_REGISTER_DIG_P8 = 0x9C
BMP280_REGISTER_DIG_P9 = 0x9E
BMP280_REGISTER_CHIPID = 0xD0
BMP280_REGISTER_CONTROL = 0xF4
BMP280_REGISTER_CONFIG = 0xF5
BMP280_REGISTER_PRESSUREDATA = 0xF7
BMP280_REGISTER_TEMPDATA = 0xFA# 初始化I2C
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400000)devices = i2c.scan()
# scan iic devices and print address name
if len(devices) == 0:print("No i2c device found.")
else:print("i2c devices found:", len(devices))for device in devices:print("i2c scan:", hex(device))oled_width = 128
oled_height = 64
oled = SSD1306_I2C(oled_width, oled_height, i2c, addr=devices[0])# 读取校准数据
def read_calibration_data():calib = {}# 读取温度校准数据calib["dig_T1"] = read_unsigned_short(BMP280_REGISTER_DIG_T1)calib["dig_T2"] = read_signed_short(BMP280_REGISTER_DIG_T2)calib["dig_T3"] = read_signed_short(BMP280_REGISTER_DIG_T3)# 读取压力校准数据calib["dig_P1"] = read_unsigned_short(BMP280_REGISTER_DIG_P1)calib["dig_P2"] = read_signed_short(BMP280_REGISTER_DIG_P2)calib["dig_P3"] = read_signed_short(BMP280_REGISTER_DIG_P3)calib["dig_P4"] = read_signed_short(BMP280_REGISTER_DIG_P4)calib["dig_P5"] = read_signed_short(BMP280_REGISTER_DIG_P5)calib["dig_P6"] = read_signed_short(BMP280_REGISTER_DIG_P6)calib["dig_P7"] = read_signed_short(BMP280_REGISTER_DIG_P7)calib["dig_P8"] = read_signed_short(BMP280_REGISTER_DIG_P8)calib["dig_P9"] = read_signed_short(BMP280_REGISTER_DIG_P9)return calib# 读取无符号16位数据
def read_unsigned_short(reg):data = i2c.readfrom_mem(BMP280_I2C_ADDR, reg, 2)return (data[1] << 8) | data[0]# 读取有符号16位数据
def read_signed_short(reg):data = i2c.readfrom_mem(BMP280_I2C_ADDR, reg, 2)value = (data[1] << 8) | data[0]if value > 32767:value -= 65536return value# 初始化BMP280
def init_bmp280():# 检查设备IDchip_id = i2c.readfrom_mem(BMP280_I2C_ADDR, BMP280_REGISTER_CHIPID, 1)[0]if chip_id != 0x58: # BMP280芯片ID应为0x58print("错误的芯片ID: 0x%02X" % chip_id)return False# 设置工作模式# osrs_t x2, osrs_p x16, normal modei2c.writeto_mem(BMP280_I2C_ADDR, BMP280_REGISTER_CONTROL, bytes([0b01011011]))return True# 读取原始温度和压力数据
def read_raw_data():# 读取压力数据(20位)data = i2c.readfrom_mem(BMP280_I2C_ADDR, BMP280_REGISTER_PRESSUREDATA, 3)adc_p = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)# 读取温度数据(20位)data = i2c.readfrom_mem(BMP280_I2C_ADDR, BMP280_REGISTER_TEMPDATA, 3)adc_t = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)return (adc_t, adc_p)# 计算补偿后的温度
def compensate_temperature(adc_t, calib):var1 = ((adc_t) / 16384.0 - (calib["dig_T1"]) / 1024.0) * (calib["dig_T2"])var2 = (((adc_t) / 131072.0 - (calib["dig_T1"]) / 8192.0) * ((adc_t)/131072.0 - (calib["dig_T1"])/8192.0)) * (calib["dig_T3"])t_fine = var1 + var2temperature = (var1 + var2) / 5120.0return (temperature, t_fine)# 计算补偿后的压力
def compensate_pressure(adc_p, t_fine, calib):var1 = (t_fine / 2.0) - 64000.0var2 = var1 * var1 * (calib["dig_P6"]) / 32768.0var2 = var2 + var1 * (calib["dig_P5"]) * 2.0var2 = (var2 / 4.0) + ((calib["dig_P4"]) * 65536.0)var1 = ((calib["dig_P3"]) * var1 * var1 / 524288.0 + (calib["dig_P2"]) * var1) / 524288.0var1 = (1.0 + var1 / 32768.0) * (calib["dig_P1"])if var1 == 0:return 0 # 避免除以零p = 1048576.0 - adc_pp = (p - (var2 / 4096.0)) * 6250.0 / var1var1 = (calib["dig_P9"]) * p * p / 2147483648.0var2 = p * (calib["dig_P8"]) / 32768.0p = p + (var1 + var2 + (calib["dig_P7"])) / 16.0return p / 100.0 # 转换为hPa# 计算海拔高度(简化版)
def calculate_altitude(pressure_hpa, sea_level_hpa=1013.25):# 使用国际标准大气压公式简化计算altitude = 44330.0 * (1.0 - pow(pressure_hpa / sea_level_hpa, 0.1903))return altitude# 主程序
def main():# 初始化BMP280if not init_bmp280():print("BMP280初始化失败")return# 读取校准数据calib = read_calibration_data()while True:# 读取原始数据adc_t, adc_p = read_raw_data()# 计算补偿后的温度和压力temperature, t_fine = compensate_temperature(adc_t, calib)pressure_hpa = compensate_pressure(adc_p, t_fine, calib)# 计算海拔高度altitude = calculate_altitude(pressure_hpa)# 打印结果print("Temperature: {:.2f} °C".format(temperature))print("Pressure: {:.2f} hPa".format(pressure_hpa))print("Altitude: {:.2f} m".format(altitude))print("----------------------")oled.fill(0)oled.text('Temp: ' + '{:.2f} C'.format(temperature), 0, 0)oled.text('Press: ' + '{:.1f} hPa'.format(pressure_hpa), 0, 16)oled.text('Alt: ' + '{:.1f} m'.format(altitude), 0, 32)oled.rotate(0) # rotate the screen display for a more comfortable positionoled.show()# 延时2秒utime.sleep(2)if __name__ == "__main__":main()
将该文件上传至 Beetle RP2350 开发板根目录,上电自动运行程序。
效果
终端打印温度、压强和海拔信息,同时 OLED 显示三组数据。
充电状态
绿色指示灯常亮
充电指示灯为绿色 LED ,充电状态:
- 充满电或未接入电源时熄灭;
- 充电时常亮;
- USB供电,未连接锂电池时高频闪烁
充满状态:绿色指示灯熄灭
3.7V 锂电池可置于外壳内,实现便携设计
安装完成后的效果
扩展板及外壳详见:Beetle-RP2350 扩展板 - 立创开源硬件平台 .
总结
本文介绍了 DFRobot Beetle RP2350 开发板结合 BMP280 模块和锂电池模块实现环境大气压强、温度、海拔实时OLED显示的便携随身气压计的项目设计,为 Beetle RP2350 开发板的开发设计和产品应用提供了参考。