使用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)