|
在无人机、气象站、智能穿戴等众多设备中,大气压力和高度的测量非常重要。在本篇文章中,您将学习如何使用Arduino开发板和BMP388传感器实现大气压力的测量,并将气压值转换成高度值,同时采集当前的环境温度。BMP388是最常用的气压传感器之一。
所需的材料 ● Arduino UNO R3开发板 ● YBX-BMP388模块 ● 跳线 ● Arduino IDE
BMP388模块简介
YBX-BMP388模块采用博世传感器的最新一代气压传感器BMP388。它精度卓越、功耗超低,适用于健身追踪、室内定位等诸多环境,为高度追踪应用提供卓越精度。它具有出色的设计灵活性,客户可以轻松集成到多种设备中,例如GPS模块、可穿戴设备、可听设备、智能家居、物联网和工业产品。该模块支持SPI和I2C接口进行系统集成,可以快速实现与Arduino和STM32等控制器直接相连。该模块板载一颗电源芯片,支持3.3-5V供电。
该模块包含以下主要特性: ● 采用Bosch高性能气压传感器BMP388 ● 测量范围:300hPa至1250hPa(全精度) ● ±30Pa绝对精度 ● ±6Pa相对精度压力 ● 平均电流:1.3nA ● 压力噪声0.08Pa,最低带宽,最高分辨率 ● 温度系数偏移:±0.5Pa/K ● SPI和I2C接口 ● 板载一颗高精度DC-DC芯片 ● 支持Arduino和STM32等微控制器 ● 外形尺寸:24mm x 24mm x 5mm
BMP388模块与Arduino开发板的硬件连接 YBX-BMP388模块支持SPI和I2C两种硬件连接方式,您可以根据实际需要选择合适的接线方式。
I2C接线 该接线方法比较简单,只需要连接4根线即可。首先将模块的VCC引脚连接到电源,3V-5V就可以了。 使用与您的微控制器逻辑相同的电压。对于大多数Arduino,使用5V。 对3.3V逻辑设备,使用3.3V。然后将模块的GND连接到公共地。
将SCK引脚连接到I2C时钟引脚,将SDI引脚连接到Arduino的I2C数据引脚。在Arduino UNO R3开发板上,SDA和 SCL位于靠近AREF引脚的排针上。 它们也被称为 A5 (SCL) 和 A4 (SDA)。
该模块的默认I2C设备地址为0x77。如果将SDO/ADR引脚设置为低电平,那么I2C地址将改成0x76。
SPI接线 BMP388传感器支持SPI连接,您可以使用硬件或软件SPI。 相对于I2C连接方式,SPI的通讯速度要快得多。
同样,每个Arduino开发板都有不同的SPI引脚,应相应地进行连接。 对于UNO/Nano V3.0等Arduino,SPI引脚是数字13 (SCK)、12 (MISO)、11 (MOSI) 和 10 (SS)。
模块连接到Arduino开发板后,就可以编写一些代码了!
安装Arduino库文件 使用库文件可以实现快速读取传感器数据,因此我们需要安装Adafruit BMP3XX库。该库可以在GitHub上下载,也可以使用Arduino库管理器方式进行安装。
Arduino IDE提供两种方式安装库文件,一种是使用菜单"工具"->“管理库...”或者菜单“项目”->“导入库”->“管理库...”,另一种是使用左侧的库管理工具图标,使用这两种方法都可以打开库管理器。
在库管理中,输入“bmp3”,可以看到有多个关于BMP388的库文件,选择Adafruit BMP3XX Library by Adafruit,并点击旁边的安装按钮。
Arduino代码 Adafruit BMP3XX库文件自带一个示例工程bmp3xx_simpletest,该代码可以读取BMP388传感器模块的温度、大气压力和高度值,我们可以使用该代码进行测试。 - #include <Wire.h>
- #include <SPI.h>
- #include <Adafruit_Sensor.h>
- #include "Adafruit_BMP3XX.h"
- #define BMP_SCK 13
- #define BMP_MISO 12
- #define BMP_MOSI 11
- #define BMP_CS 10
- #define SEALEVELPRESSURE_HPA (1013.25)
- Adafruit_BMP3XX bmp;
- void setup() {
- Serial.begin(115200);
- while (!Serial);
- Serial.println("Adafruit BMP388 / BMP390 test");
- if (!bmp.begin_I2C()) { // hardware I2C mode, can pass in address & alt Wire
- //if (! bmp.begin_SPI(BMP_CS)) { // hardware SPI mode
- //if (! bmp.begin_SPI(BMP_CS, BMP_SCK, BMP_MISO, BMP_MOSI)) { // software SPI mode
- Serial.println("Could not find a valid BMP3 sensor, check wiring!");
- while (1);
- }
- // Set up oversampling and filter initialization
- bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
- bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X);
- bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
- bmp.setOutputDataRate(BMP3_ODR_50_HZ);
- }
- void loop() {
- if (! bmp.performReading()) {
- Serial.println("Failed to perform reading :(");
- return;
- }
- Serial.print("Temperature = ");
- Serial.print(bmp.temperature);
- Serial.println(" *C");
- Serial.print("Pressure = ");
- Serial.print(bmp.pressure / 100.0);
- Serial.println(" hPa");
- Serial.print("Approx. Altitude = ");
- Serial.print(bmp.readAltitude(SEALEVELPRESSURE_HPA));
- Serial.println(" m");
- Serial.println();
- delay(2000);
- }
复制代码
代码说明 首先在示例中包括四个必要的库 - Wire.h(用于I2C)、SPI.h(用于SPI)、Adafruit_Sensor.h和Adafruit_BMP3XX.h。 - #include <Wire.h>
- #include <SPI.h>
- #include <Adafruit_Sensor.h>
- #include "Adafruit_BMP3XX.h"
复制代码示例默认采用I2C通信协议与传感器通信。 但是,如果您想使用 SPI,只需取消注释以下定义SPI引脚的代码行。 - //#define BMP_SCK 13
- //#define BMP_MISO 12
- //#define BMP_MOSI 11
- //#define BMP_CS 10
复制代码接下来,定义一个名为SEALEVELPRESSURE_HPA的变量。 此变量以milibar为单位保存海平面气压,并用于通过将给定气压与海平面气压进行比较来估算高度。 此示例使用默认值,但为了获得准确的结果,请将该值替换为您所在位置的当前海平面气压。 - #define SEALEVELPRESSURE_HPA (1013.25)
复制代码以下代码行创建Adafruit_BMP3XX对象bmp。
在setup()函数中,我们初始化串口通信并调用begin()函数。
bmp.begin_I2C()函数初始化I2C接口并检查芯片ID是否正确。 然后它使用软复位重置芯片并等待传感器在唤醒后进行校准。 同样,bmp.begin_SPI() 函数初始化SPI接口。 如果要使用SPI,需要取消对应if的注释。 - Serial.begin(115200);
- while (!Serial);
- Serial.println("Adafruit BMP388 / BMP390 test");
- if (!bmp.begin_I2C()) { // hardware I2C mode, can pass in address & alt Wire
- //if (! bmp.begin_SPI(BMP_CS)) { // hardware SPI mode
- //if (! bmp.begin_SPI(BMP_CS, BMP_SCK, BMP_MISO, BMP_MOSI)) { // software SPI mode
- Serial.println("Could not find a valid BMP3 sensor, check wiring!");
- while (1);
- }
复制代码接下来,我们为传感器设置一些参数。 - bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
- bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X);
- bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
- bmp.setOutputDataRate(BMP3_ODR_50_HZ);
复制代码
在loop()中,我们调用bmp.performReading()函数来执行读取。 完成后,我们可以使用点运算符访问对象的 (bmp) 实例变量。 bmp.temperature 返回温度读数。 bmp.pressure 返回大气压力读数。 bmp.readAltitude(SEALEVELPRESSURE_HPA) 函数根据指定的大气压力(以 hPa 为单位)和海平面气压(以 hPa 为单位)计算高度(以米为单位)。 - void loop() {
- if (! bmp.performReading()) {
- Serial.println("Failed to perform reading :(");
- return;
- }
- Serial.print("Temperature = ");
- Serial.print(bmp.temperature);
- Serial.println(" *C");
- Serial.print("Pressure = ");
- Serial.print(bmp.pressure / 100.0);
- Serial.println(" hPa");
- Serial.print("Approx. Altitude = ");
- Serial.print(bmp.readAltitude(SEALEVELPRESSURE_HPA));
- Serial.println(" m");
- Serial.println();
- delay(2000);
- }
复制代码
|