使用树莓派+python+bmp280读取气压和温度

使用BMP280读取气压和温度

BMP280基础介绍

在这里插入图片描述
非常便宜,只有2、3块钱

它是——一个内置气压计和温度计的芯片

非常小,只有2.0 * 2.5 mm

经常用在手表、航空模型上面

它可以通过IIC或者SPI的方式与上位机进行通信

可测量最低温度:-40°c

可测量最高温度:+85°c

可测量最低大气压:300hpa

可策奖最高大气压:1100hpa

最大承受电压是3.6v

千万不要给它通5v的电!!

工作电流什么的不提了,我没有用到。

按照官方给出的数据,

温度的精度是±1°c

大气压的测量误差是:正负1hpa

本来我打算用它给无人机做定高用的

但是我测试之后,它计算出来的高度误差有m级别,因此不能委以重任(我见其他无人机上也有这东西,估计只是做一个高度估计,几百米几千米之类的)

接下来讲一讲如何通过raspi使用bmp280

群里一老哥说:就几块钱的芯片,你还想让人家怎么样?!!

bmp280重要寄存器

它自身的寄存器并没有多少

复位寄存器0xe0

在这里插入图片描述
图片来源于官方手册

复位寄存器0xe0顾名思义,就是当你写入0xb6的时候,它会将芯片复位,如果读取它的值的话,经常是0x00

补偿寄存器

在这里插入图片描述

别看寄存器多,这些是芯片出厂的时候写死的寄存器

**也就是说,这些是只读寄存器READ ONLY **

它的值是16位的,除了T1和P1都是有符号数

lsb的是低位,msb的是高位

比如我的BMP280

从0x88中读取的数据是49

从0x89中读取的数据是108

所以t1应该是msb左移8位加lsb

(108<<8) + 49

它们的作用是为温度计和气压计读出的数据进行校准补偿

具体的计算公式官方已经给出,只需要套用就可以

(在之后的代码里)

气压计寄存器press

在这里插入图片描述

从这几个寄存器中读取出来msb lsb xlsb

这三个数据需要和上面的补偿寄存器中的数据搭配,才可以显示出传感器感受到的气压

(公式在之后的代码里)

温度寄存器temp

在这里插入图片描述

和气压计寄存器类似,也是需要和补偿寄存器中的数据进行搭配

控制寄存器0xf4

在这里插入图片描述

通过控制式寄存器中写值,可以设置过采样速率,模式等等

过采样好像是用来滤波的,官方文档上说是防止窗户、门的突然开关或者气流的变化对气压和温度的影响。

bmp280的模式有4个

分别是:

  • 睡眠模式 不工作
  • 只测量一次就睡眠模式 间断性工作
  • 工作模式 一直工作
  • 这个模式我没看懂,挖坑之后填

不过写代码的时候并没有太考虑过采样,234567位全用1(0x3f,也就是0011 1111)来覆盖(也就是oversample x16),用 mode << 6来设置0、1位,进行模式的选择。

id寄存器0xd0

为了验证bmp280连接正常,需要在连接好之后读取他的id(这也是一个Read only寄存器),官方文档中给出的如果不是0x58,就不正确

但是我读出来的是0x88,我看的资料也有不少人读出来是0x88的,不必在意。

其他

我用到的寄存器就是上面几个,还剩下

0xf3(status)

0xf5(config)

这几个寄存器没有解释,主要是我没有用到,因此也不大懂,文章下面给出官网文档,大家可以自己研究。

raspi-bmp280连线

在这里插入图片描述
3.3v 连接 vcc

gnd 连接 gnd

3号引脚 接 sda

5号引脚 接 scl

如果你想使用iic和芯片通信,则芯片的csb接入高电平,反之,接入低电平

芯片的SD0是校验位,iic中需要和地址的最低有效位电平一样。

raspi-bmp280代码

1.先把刚才介绍的寄存器放上去

""" bmp280 基地址 模式 寄存器 """
# BMP280 寄存器基地址
BMP280_I2CADDR           = 0x76

# 工作模式,分别是超低功率博士 标准模式 高功率博士 超高功率模式
BMP280_ULTRALOWPOWER     = 0
BMP280_STANDARD          = 1
BMP280_HIGHRES           = 2
BMP280_ULTRAHIGHRES      = 3

# BMP280 Temperature Registers
BMP280_REGISTER_DIG_T1 = 0x88
BMP280_REGISTER_DIG_T2 = 0x8A
BMP280_REGISTER_DIG_T3 = 0x8C
# BMP280 Pressure Registers
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_CONTROL = 0xF4
#Pressure measurments
BMP280_REGISTER_PRESSUREDATA_MSB = 0xF7
BMP280_REGISTER_PRESSUREDATA_LSB = 0xF8
BMP280_REGISTER_PRESSUREDATA_XLSB = 0xF9
#Temperature measurments
BMP280_REGISTER_TEMPDATA_MSB = 0xFA
BMP280_REGISTER_TEMPDATA_LSB = 0xFB
BMP280_REGISTER_TEMPDATA_XLSB = 0xFC

# Commands
BMP280_READCMD = 0x3F

树莓派可以通过SMBus来使用iic

只需要

from smbus2 import SMBus

bus = SMBus(1)

就可以了,不懂的朋友可以去补补smbus2的知识

2.写读取有符号16位,无符号16位的方法,然后将补偿寄存器中的值读出来

"""iic读取16位无符号数据"""
def _iic_readU16Reg(self, address):
    Lsb = self.bus.read_byte_data(BMP280_I2CADDR, address)          # 低8位
    Hsb = self.bus.read_byte_data(BMP280_I2CADDR, address + 1)      # 高8位
    data = [Hsb, Lsb]
    data_byte = bytes(data)
    ans = int.from_bytes(data_byte, byteorder="big", signed=False)
    return ans
"""iic读取16位有符号数据"""
def _iic_readS16Reg(self, address)
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值