• 已删除用户
创客孙老师
创客孙老师
发布于 2024-09-27 / 50 阅读
0
0

ESP32+BMP280读取温度、气压和海拔高度数据

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获取温度、压力和海拔高度的内容,欢迎收藏关注。


评论