文章将介绍如何将 BME280 传感器模块与 Arduino 一起使用来读取压力、温度、湿度和估计高度。我们将向您展示如何连接传感器,安装所需的库,并编写一个简单的代码来显示传感器读数。
目录
BME280 传感器模块简介
BME280 传感器模块读取气压、温度和湿度。由于压力随海拔高度而变化,因此您还可以估计海拔高度。该传感器模块有多个版本。BME280 传感器使用 I2C 或 SPI 通信协议与微控制器交换数据。
我们使用的是下图所示的模块。
该传感器使用I2C通信协议进行通信,因此接线非常简单。将 BME280 传感器连接到 Arduino Uno I2C 引脚,如下表所示:
BME280 | Arduino UNO |
Vin | 5V |
GND | GND |
SCL | A5 |
SDA | A4 |
该传感器还有其他版本可以使用 SPI 或 I2C 通信协议,如下图所示的模块所示:
如果您使用的是这些传感器之一,要使用 I2C 通信协议,请使用以下引脚:
BME280 | Arduino UNO |
SCK(SCL 引脚) | A5 |
SDI(SDA引脚) | A4 |
如果使用SPI通信协议,则需要使用以下引脚:
BME280 | Arduino |
SCK (SPI Clock) | Pin 13 |
SDO (MISO) | Pin 12 |
SDI (MOSI) | Pin 11 |
CS (Chip Select) | Pin 10 |
所需零件
若要完成本教程,需要以下部分:
- BME280传感器模块
- Arduino
- 面包板
- 跳线
连接图
将 BME280 传感器连接到您的 Arduino 板,如下图所示。
安装 BME280 库
要从 BME280 传感器模块获取读数,您需要使用 Adafruit_BME280 库。按照以下步骤在Arduino IDE中安装库:
打开Arduino IDE,然后转到Sketch>包含库>管理库。库管理器应打开。
在搜索框中搜索“adafruit bme280”并安装库。
安装 Adafruit_Sensor 库
要使用 BME280 库,您还需要安装 Adafruit_Sensor 库。按照以下步骤在Arduino IDE中安装库:
安装库后,重新启动Arduino IDE。
读取压力、温度和湿度
为了读取压力、温度和湿度,我们将使用库中的代码示例。
安装 BME280 库和 Adafruit_Sensor 库后,打开 Arduino IDE,然后转到 Adafruit BME280 库>文件>示例> bme280 测试。
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
unsigned long delayTime;
void setup() {
Serial.begin(9600);
Serial.println(F("BME280 test"));
bool status;
// default settings
// (you can also pass in a Wire library object like &Wire2)
status = bme.begin();
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
Serial.println("-- Default Test --");
delayTime = 1000;
Serial.println();
}
void loop() {
printValues();
delay(delayTime);
}
void printValues() {
Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println(" *C");
// Convert temperature to Fahrenheit
/*Serial.print("Temperature = ");
Serial.print(1.8 * bme.readTemperature() + 32);
Serial.println(" *F");*/
Serial.print("Pressure = ");
Serial.print(bme.readPressure() / 100.0F);
Serial.println(" hPa");
Serial.print("Approx. Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");
Serial.print("Humidity = ");
Serial.print(bme.readHumidity());
Serial.println(" %");
Serial.println();
}
代码的工作原理
继续阅读本节以了解代码的工作原理,或跳到“演示”部分。
库说明
该代码首先包含所需的库:使用 I2C 的线库,以及与 BME280 传感器接口的 Adafruit_Sensor 和 Adafruit_BME280 库。
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
SPI通信
由于我们将使用 I2C 通信,因此注释了以下定义 SPI 引脚的行:
/*#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10*/
海平面压力
将创建一个名为 SEALEVELPRESSURE_HPA 的变量。
#define SEALEVELPRESSURE_HPA (1013.25)
该变量以百帕斯卡为单位保存海平面压力(相当于毫巴)。该变量用于通过将给定压力与海平面压力进行比较来估计给定压力的高度。此示例使用默认值,但要获得更准确的结果,请将该值替换为您所在位置的当前海平面压力。
I2C
此示例默认使用 I2C 通信协议。如您所见,您只需要创建一个名为 bme 的 Adafruit_BME280 对象。
Adafruit_BME280 bme; // I2C
要使用 SPI,您需要对上一行进行注释,并取消对以下行之一的注释。
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
setup()
在 setup() 中,启动串行通信:
Serial.begin(9600);
传感器初始化:
status = bme.begin();
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
注意:在测试传感器时,如果无法获得任何传感器读数,则可能需要找到 BME280 传感器 I2C 地址。将 BME280 连接到 Arduino 后,运行此 I2C 扫描仪代码以检查传感器的地址。然后,将地址传递给 begin() 方法。
打印值
在 loop() 中,printValues() 函数从 BME280 读取值并将结果打印到串行监视器中。
void loop() {
printValues();
delay(delayTime);
}
读取温度、湿度、压力和估计高度非常简单,只需在 bme 对象上使用以下方法即可:
- bme.readTemperature() – 读取以摄氏度为单位的温度;
- bme.readHumidity() – 读取绝对湿度;
- bme.readPressure() – 以 hPa 为单位读取压力 (hectoPascal = millibar);
- bme.readAltitude(SEALEVELPRESSURE_HPA) – 根据海平面压力估计海拔高度(以米为单位)。
示范
将代码上传到Arduino开发板。
以 9600 的波特率打开串行监视器。
您应该看到串行监视器上显示的读数。
结束语
BME280 提供了一种简单而廉价的方法来获取压力、温度和湿度读数。传感器通过I2C通信协议进行通信,这意味着接线非常简单,您只需要将传感器连接到Arduino I2C引脚即可。
借助 BME280_Adafruit 库,编写代码以获取传感器读数也非常简单。您只需要使用 readTemperature()、readHumidity() 和 readPressure() 方法。您还可以使用 readAltitude() 方法估计海拔高度。