BMP280简介
BMP280是一种专为移动应用设计的绝对大气压传感器。传感器模块被封装在一个极其紧凑的封装中。其小尺寸和低功耗允许在电池驱动的设备中实现,如手机、GPS模块或手表。
作为其前身BMP180,BMP280基于博世经过验证的压阻式压力传感器技术,具有高精度和线性、长期稳定性和高EMC鲁棒性。
许多设备操作选项提供了最高的灵活性,可以优化设备的功耗、分辨率和滤波器性能等。为了让设计和使用尽可能简单,BMP280向开发人员提供了一组经过测试的默认设置和示例。
BMP280典型应用
- 增强GPS导航(例如,改进首次定位时间、航位推算、坡度检测)
- 室内导航(楼层检测、电梯检测)
- 户外导航、休闲和运动应用
- 天气预报
- 垂直速度指示(例如上升/下降速度)
BMP280的技术指标
指标 | 数据 |
---|---|
封装尺寸 | 8针LGA,金属外壳 2.0 x 2.5 x 0.95 mm³ |
测量范围(全精度) | 压力:300 ... 1100 hPa,温度:0 … +65 °C |
VDDIO供电电压 | 1.2 ... 3.6 V |
VDD供电电压 | 1.71 ... 3.6 V |
通信接口 | I²C 和 SPI |
平均电流(典型值)(1 Hz数据刷新率) | 2.74 μA |
睡眠模式下的平均电流 | 0.1 µA |
平均测量时间 | 5.5毫秒(超低功耗预设) |
测量精度 | 压力:0.18 Pa(相当于<10 cm)温度:0.01 K |
绝对精度P 950 ... 1100 hPa(T 0 ... +65°) | ~ ±1 hPa |
相对准确压力(典型值)p=950 ... 1050 hP(+25 °) | ± 0.12 hPa(相当于 ±1m) |
温度系数偏移(+25°…+40°C@900hPa) | 1.5 Pa/K (相当于 12.6 cm/K) |
同时,BMP280具有更大的应用灵活性、新的过滤模式和SPI接口,此外其面积比BMP180缩小了63%。
MicroPython使用BMP280
BMP280数据读取
经过测试,下面的源代码可以正常工作:
'''
mpy drive for BMP280 Digital Pressure Sensor
Author: shaoziyang
Date: 2018.2
http://www.micropython.org.cn
'''
from machine import I2C
class BMP280():
def __init__(self, i2c, addr = 0x76, SDO = None):
self.i2c = i2c
if SDO == None:
self.addr = addr
elif SDO:
self.addr = 0x77
else:
self.addr = 0x76
self.tb = bytearray(1)
self.rb = bytearray(1)
self.dig_T1 = self.get2Reg(0x88)
self.dig_T2 = self.short(self.get2Reg(0x8A))
self.dig_T3 = self.short(self.get2Reg(0x8C))
self.dig_P1 = self.get2Reg(0x8E)
self.dig_P2 = self.short(self.get2Reg(0x90))
self.dig_P3 = self.short(self.get2Reg(0x92))
self.dig_P4 = self.short(self.get2Reg(0x94))
self.dig_P5 = self.short(self.get2Reg(0x96))
self.dig_P6 = self.short(self.get2Reg(0x98))
self.dig_P7 = self.short(self.get2Reg(0x9A))
self.dig_P8 = self.short(self.get2Reg(0x9C))
self.dig_P9 = self.short(self.get2Reg(0x9E))
self.mode = 3
self.osrs_p = 3
self.osrs_t = 1
self.setReg(0xF4, 0x2F)
self.setReg(0xF5, 0x0C)
self.filter = 3
self.T = 0
self.P = 0
self.version = '1.0'
def short(self, dat):
if dat > 32767:
return dat - 65536
else:
return dat
# set reg
def setReg(self, reg, dat):
self.tb[0] = dat
self.i2c.writeto_mem(self.addr, reg, self.tb)
# get reg
def getReg(self, reg):
self.i2c.readfrom_mem_into(self.addr, reg, self.rb)
return self.rb[0]
# get two reg
def get2Reg(self, reg):
return self.getReg(reg) + self.getReg(reg+1) * 256
def get(self):
adc_T = (self.getReg(0xFA)<<12) + (self.getReg(0xFB)<<4) + (self.getReg(0xFC)>>4)
var1 = (((adc_T>>3)-(self.dig_T1<<1))*self.dig_T2)>>11
var2 = (((((adc_T>>4)-self.dig_T1)*((adc_T>>4) - self.dig_T1))>>12)*self.dig_T3)>>14
t = var1+var2
self.T = ((t * 5 + 128) >> 8)/100
var1 = (t>>1) - 64000
var2 = (((var1>>2) * (var1>>2)) >> 11 ) * self.dig_P6
var2 = var2 + ((var1*self.dig_P5)<<1)
var2 = (var2>>2)+(self.dig_P4<<16)
var1 = (((self.dig_P3*((var1>>2)*(var1>>2))>>13)>>3) + (((self.dig_P2) * var1)>>1))>>18
var1 = ((32768+var1)*self.dig_P1)>>15
if var1 == 0:
return # avoid exception caused by division by zero
adc_P = (self.getReg(0xF7)<<12) + (self.getReg(0xF8)<<4) + (self.getReg(0xF9)>>4)
p=((1048576-adc_P)-(var2>>12))*3125
if p < 0x80000000:
p = (p << 1) // var1
else:
p = (p // var1) * 2
var1 = (self.dig_P9 * (((p>>3)*(p>>3))>>13))>>12
var2 = (((p>>2)) * self.dig_P8)>>13
self.P = p + ((var1 + var2 + self.dig_P7) >> 4)
return [self.T, self.P]
# get Temperature in Celsius
def getTemp(self):
self.get()
return self.T
# get Pressure in Pa
def getPress(self):
self.get()
return self.P
# Calculating absolute altitude
def getAltitude(self):
return 44330*(1-(self.getPress()/101325)**(1/5.255))
# sleep mode
def poweroff(self):
self.setReg(0xF4, 0)
# normal mode
def poweron(self):
self.setReg(0xF4, 0x2F)
使用MicroPython读取BMP280数据
下面是bmp280读取数据的例子代码
import bmp280
from machine import Pin, I2C
#初始化气压和温度传感器bmp280
bus = I2C(1, scl=Pin(12), sda=Pin(15)) #初始化i2c总线
bmp = bmp280.BMP280(bus) #初始化压力和温度传感器
print("温度:", bmp.getTemp())
print("压力:", bmp.getPress())
print("海拔:", bmp.getAltitude())
以上就是使用esp32+bmp280获取温度、压力和海拔高度的内容,欢迎收藏关注。