当前位置: 首页 > news >正文

Beetle 树莓派RP2350 - 随身气压计

Beetle 树莓派RP2350 - 随身气压计

🧭 本文介绍了 DFRobot Beetle RP2350 开发板结合 BMP280 模块和锂电池模块实现环境大气压强、温度、海拔实时OLED显示的便携随身气压计的项目设计。

项目介绍

🌊 本项目包括 BMP280 传感器模块介绍、工作原理、参数特点等信息,在此基础上实现工程代码编写、硬件测试等流程,最终实现气压计的制作。

BMP280 模块

BMP280 是一款由 博世(Bosch) 开发的高精度数字气压传感器,广泛应用于移动设备、气象监测、无人机、室内导航等领域。

在这里插入图片描述

它集成了 气压温度 测量功能,具有低功耗、小尺寸和高精度的特点,适用于电池供电设备。

原理图

在这里插入图片描述

特点
  1. 高精度测量
    • 气压测量范围:300~1100 hPa(海拔 -500m 至 +9000m)
    • 相对精度:±0.12 hPa(高度误差 ±1 米)
    • 温度测量范围:-40°C ~ +85°C,精度 ±0.01°C
  2. 低功耗设计
    • 工作电流仅 2.7μA @1Hz,适合电池供电设备;
  3. 支持多种通信接口
    • I²C(默认地址 0x76 或 0x77)和 SPI,方便与微控制器连接;
  4. 紧凑封装
    • 采用 8 引脚 LGA 封装(2.0×2.5mm,高度 0.95mm),适合空间受限的应用。
  5. 内置温度补偿
    • 温度数据可用于校准气压测量,提高精度。
应用
  • 气象站:用于气压趋势监测和天气预报;
  • 无人机 & 飞行控制器:测量高度和垂直速度;
  • 室内导航:检测楼层变化(如电梯、商场导航);
  • 智能穿戴设备(如运动手表):计算海拔变化和运动数据;
  • 健康监测:如肺活量检测(气压变化反映呼吸情况).
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 开发板的开发设计和产品应用提供了参考。

相关文章:

  • Spring Boot中如何对密码等敏感信息进行脱敏处理
  • PCB设计教程【入门篇】——PCB设计基础-PCB构成与组成
  • 国际前沿知识系列五:时间序列建模方法在头部撞击运动学测量数据降噪中的应用
  • linux 内存碎片分析
  • 2025年电工杯数学建模B题【垃圾运输】原创论文分享
  • python第三方库安装错位
  • 机器学习第二十六讲:官方示例 → 跟着菜谱学做经典菜肴
  • Vue中的事件绑定【3】
  • 天地图实景三维数据分享(江苏)
  • 同为科技 智能PDU产品选型介绍 EN10/I801CI
  • 【IEEE 2025】低光增强KANT(使用KAN代替MLP)----论文详解与代码解析
  • docker虚拟化、容器化
  • 从零开始:Python语言进阶之多态
  • redis配置带验证的主从复制
  • 再谈Linux进程:进程等待、进程替换与环境变量
  • C++ 继承详解:基础篇(含代码示例)
  • NRM:快速切换 npm 镜像源的管理工具指南
  • RPG游戏设计战斗篇——战法牧协同作战体系研究
  • 如何把vue项目部署在nginx上
  • IP查询基础介绍
  • 新疆生产建设兵团教育局官方网站/目前搜索引擎排名
  • 一站式做网站开发/网络推广运营是做什么
  • 公司网站做地图地址/北京seo诊断
  • 宁夏电力建设工程公司外部网站/好的在线crm系统
  • 德州网站优化/徐州seo外包平台
  • 网站制作./关键词优化策略