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

大气压计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_RES
  • 12
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!要在ESP32的Arduino环境下同时初始化两个软件IIC,一个用于获取BME280传感器的温度,另一个用于驱动OLED显示屏,您可以参考以下示例代码: ```cpp #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #include <Adafruit_SSD1306.h> // BME280传感器对象 Adafruit_BME280 bme; #define BME_SDA 21 #define BME_SCL 22 // OLED显示屏对象 Adafruit_SSD1306 display(128, 64, &Wire, -1); #define OLED_SDA 18 #define OLED_SCL 19 void setup() { Wire.begin(BME_SDA, BME_SCL); // 初始化BME280传感器的软件IIC总线 Wire.begin(OLED_SDA, OLED_SCL); // 初始化OLED显示屏的软件IIC总线 // 初始化BME280传感器 if (!bme.begin(0x76, &Wire)) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); while (1); } // 初始化OLED显示屏 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); for (;;); } // 其他初始化代码... } void loop() { // 获取BME280的温度 float temperature = bme.readTemperature(); // 在OLED显示屏上显示温度 display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.print("Temperature: "); display.print(temperature); display.print(" *C"); display.display(); // 其他代码... } ``` 在上面的示例中,我们使用了Adafruit的BME280和SSD1306库来分别操作BME280传感器和OLED显示屏。通过`Wire.begin()`函数初始化了两个不同的软件IIC总线,并传入对应的SDA和SCL引脚。在`setup()`函数中,我们还初始化了BME280传感器和OLED显示屏。在`loop()`函数中,我们通过`bme.readTemperature()`读取BME280的温度,并通过OLED显示屏显示温度信息。 需要注意的是,上述代码中的SDA和SCL引脚定义是示例,您需要根据您的具体硬件连接修改为实际使用的引脚。 希望这个示例能满足您的需求!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值