大气压计BMP280+BME280+BMP180 在ESP8266 (RTOS3.2)上初调的兼容驱动

本文介绍了如何在ESP8266 (RTOS 3.2) 上配置和驱动BMP280、BME280和BMP180大气压计传感器。内容包括传感器简介、基础环境设定、软件原理示意图、数据打印展示以及代码结构。通过I2C连接,实现了对三种传感器的兼容性程序,其中BMP280作为BMP180的升级版,增加了绝对精度。BME280则额外具备湿度检测功能。
摘要由CSDN通过智能技术生成

大气压计BMP280+BME280+BMP180 在ESP8266 (RTOS3.2)上初调的兼容驱动

大气压计BMP280简介

BMP280是一款博世的气压传感器,主要是测量环境大气压强的,量程是300hPa~1100hPa,这个什么概念,海平面气压,即标准大气压是1013.25hPa,海拔近似0,珠穆朗玛海拔8844米,大气压大约在304hPa,和市面上大气压计差不多,每1hPa换算成垂直高度8.43米,具体海拔和气压的关系图如下:
在这里插入图片描述

BMP280传感器从名称上看是停产了的BMP180(End of lifetime)的升级款,对比来看,BMP280在绝对精度上提升大约2~4倍,IO口电压BMP280已覆盖了1.2V的电压,适用性会更好些。

另外看手册BME280BMP280除了增加检测湿度的功能外,其他操作是一样的,顺便把湿度的一起加上了,做了一个根据ID判断的兼容程序。

BMP180的驱动相对简单,和BMP085相差不多,但与BME280或BMP280不通用,旧产品。

基础环境

  1. 硬件是esp8266+BMP280模块,通过I2C连接并通讯, 顺便测试了下BMP180;
  2. 软件方面是乐鑫带的RTOSv3.2,本次使用案例工程里I2C例程修改的;
  3. 博世官方的BME280BMP280BMP180驱动程序;

由于没有BME280模块测试,只是根据datasheet添加了读取湿度逻辑,没有实际测试,理论上是OK的。

软件原理示意图

  1. BMP280/BME280的Forced模式逻辑:
mode=0x01
读完自动转化状态
初始化IC
读取检验数据
Sleep模式
Forced模式读数据
  1. BMP280/BME280的Normal 模式逻辑:
mode=0x11
mode=0x00
初始化IC
读取检验数据
Sleep模式
Normal 模式读取数据
  1. BMP180的操作流程
初始化IC
读取检验数据
设置读温度模式
读温度ADC值
检验出实际温度
设置读大气压模式
读大气压ADC值
检验出实际数据

数据打印效果

BMP280的打印,内容有识别到的IC型号,参考温度,大气压的数值(hPa):
在这里插入图片描述
BME280:
未测

BMP180的数据打印,内容有识别到型号,温度,大气压数值(Pa),已知的当前检验海拔重新校验标准大气压数值,当前参考的海拔高度:

在这里插入图片描述

传感器配置参数

  1. I2C地址用的7位地址0x77,我把SDO上拉了,如果下拉或悬空会是0x76:
#define BMX280_I2C_ADDR 0x77
  1. 基本我放在了i2c_task_bme280_bmp280_bmp180初始化函数里面,做了一些变量,作为方便可配置.
    uint8_t osrs_t = 1;             //Temperature oversampling x 1
    uint8_t osrs_p = 1;             //Pressure oversampling x 1
    uint8_t osrs_h = 1;             //Humidity oversampling x 1
    uint8_t mode = 0;               //Sleep mode
    uint8_t t_sb = 7;               //Tstandby 4000ms
    uint8_t filter = 0;             //Filter off
    uint8_t spi3w_en = 0;           //3-wire SPI Disable
  1. BMP180的配置简单,只要改下模式就可以:
static uint8_t bmp180_mode = BMP180_OSS_1TIMES_RATE;

代码结构

代码分成3部分的文件,主文件、BMXx80驱动文件、标准I2C协议封装文件:

  • main.c
    • BME280_BMP280_BMP180.c
    • BME280_BMP280_BMP180.h
      • my_iic.h
      • my_iic.c
  1. main.c:
/* main
   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"

#include "esp_log.h"
#include "esp_system.h"
#include "esp_err.h"

#include "driver/i2c.h"
#include "BME280_BMP280_BMP180.h"




void app_main(void)
{
   
    //start i2c task
    xTaskCreate(i2c_task_bme280_bmp280_bmp180, "i2c_task_bme280_bmp280_bmp180", 2048, NULL, 10, NULL);
}
  1. BME280_BMP280_BMP180.h:
/* BME280 BMP280 BMX180 example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"

#include "esp_log.h"
#include "esp_system.h"
#include "esp_err.h"

#include "my_iic.h"

#define BMX280_I2C_ADDR 0x77

#define BMP180_CHIP_ID 0x55

#define BMP280_CHIP_ID 0x58
#define BME280_CHIP_ID 0x60
#define BMX280_RESET_VALUE 0xB6

#define BMP280_DIG_AC1_MSB_REG               0xAA

#define BMP280_DIG_T1_LSB_REG                0x88
#define BMP280_DIG_H1_LSB_REG                0xA1
#define BMP280_DIG_H2_LSB_REG                0xE1

#define BMX280_CHIPID_REG                    0xD0  /*Chip ID Register */
#define BMX280_RESET_REG                     0xE0  /*Softreset Register */
#define BME280_CTRLHUM_REG                   0xF2  /*Ctrl Humidity Register */
#define BMX280_STATUS_REG                    0xF3  /*Status Register */
#define BMX280_CTRLMEAS_REG                  
Arduino IDE是一个开源的集成开发环境,用于编写和上传程序到基于Arduino硬件平台的设备,比如ESP32和AHT20+BMP280这样的传感器模块。AHT20是一种温湿度传感器,而BMP280是一款高度精确的压力和温度传感器。 下面是一个简单的示例代码,展示了如何在Arduino IDE中使用这两个传感器: ```cpp #include <Adafruit_AHT20.h> #include <Adafruit_BME280.h> // AHT20实例化 Adafruit_AHT20 aht = Adafruit_AHT20(); // BMP280实例化,并设置I2C地址 Adafruit_BME280 bme; void setup() { // 初始化Serial通信 Serial.begin(9600); // AHT20初始化 if (!aht.begin()) { Serial.println("Failed to initialize AHT20!"); return; } // BMP280 I2C初始化 if (!bme.begin(0x76)) { // ESP32默认地址0x76 Serial.println("Failed to initialize BMP280!"); return; } } void loop() { // 读取AHT20数据 float humidity = aht.readHumidity(); int temperature = aht.readTemperature(); // 读取BMP280数据 float pressure = bme.readPressure() / 100; // 将压力值转换为Pa (1 hPa = 100 Pa) float temp = bme.readTemperature(); Serial.print("Temperature: "); Serial.print(temperature); Serial.println(" C"); Serial.print("Humidity: "); Serial.print(humidity); Serial.println("%"); Serial.print("Pressure: "); Serial.print(pressure); Serial.println(" Pa"); delay(1000); // 每秒更新一次数据 } ``` 在这个例子中,首先包含了两个库文件,然后在`setup()`函数中初始化传感器,接着在`loop()`函数里循环读取并打印温湿度和气压的数据。记得在实际应用前检查并连接好传感器。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值