风筝
发表于: 2023-8-23 21:36:59 | 显示全部楼层

在无人机、气象站、智能穿戴等众多设备中,大气压力和高度的测量非常重要。在本篇文章中,您将学习如何使用Arduino开发板和BMP388传感器实现大气压力的测量,并将气压值转换成高度值,同时采集当前的环境温度。BMP388是最常用的气压传感器之一。


所需的材料

●    Arduino UNO R3开发板

●    YBX-BMP388模块

●    跳线

●    Arduino IDE


BMP388模块简介

YBX-BMP388模块采用博世传感器的最新一代气压传感器BMP388。它精度卓越、功耗超低,适用于健身追踪、室内定位等诸多环境,为高度追踪应用提供卓越精度。它具有出色的设计灵活性,客户可以轻松集成到多种设备中,例如GPS模块、可穿戴设备、可听设备、智能家居、物联网和工业产品。该模块支持SPI和I2C接口进行系统集成,可以快速实现与Arduino和STM32等控制器直接相连。该模块板载一颗电源芯片,支持3.3-5V供电。

YBX-BMP388大气压力传感器模块.jpg


该模块包含以下主要特性:

●  采用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。

YBX-BMP388模块通过I2C接口与Arduino Uno的硬件连接.jpg


SPI接线

BMP388传感器支持SPI连接,您可以使用硬件或软件SPI。 相对于I2C连接方式,SPI的通讯速度要快得多。


同样,每个Arduino开发板都有不同的SPI引脚,应相应地进行连接。 对于UNO/Nano V3.0等Arduino,SPI引脚是数字13 (SCK)、12 (MISO)、11 (MOSI) 和 10 (SS)。

YBX-BMP388模块通过SPI接口与Arduino Uno的硬件连接.jpg


模块连接到Arduino开发板后,就可以编写一些代码了!


安装Arduino库文件

使用库文件可以实现快速读取传感器数据,因此我们需要安装Adafruit BMP3XX库。该库可以在GitHub上下载,也可以使用Arduino库管理器方式进行安装。


Arduino IDE提供两种方式安装库文件,一种是使用菜单"工具"->“管理库...”或者菜单“项目”->“导入库”->“管理库...”,另一种是使用左侧的库管理工具图标,使用这两种方法都可以打开库管理器。

库管理.jpg

在库管理中,输入“bmp3”,可以看到有多个关于BMP388的库文件,选择Adafruit BMP3XX Library by Adafruit,并点击旁边的安装按钮。

bmp3结果.jpg


Arduino代码

Adafruit BMP3XX库文件自带一个示例工程bmp3xx_simpletest,该代码可以读取BMP388传感器模块的温度、大气压力和高度值,我们可以使用该代码进行测试。

  1. #include <Wire.h>
  2. #include <SPI.h>
  3. #include <Adafruit_Sensor.h>
  4. #include "Adafruit_BMP3XX.h"

  5. #define BMP_SCK 13
  6. #define BMP_MISO 12
  7. #define BMP_MOSI 11
  8. #define BMP_CS 10

  9. #define SEALEVELPRESSURE_HPA (1013.25)

  10. Adafruit_BMP3XX bmp;

  11. void setup() {
  12.   Serial.begin(115200);
  13.   while (!Serial);
  14.   Serial.println("Adafruit BMP388 / BMP390 test");

  15.   if (!bmp.begin_I2C()) {   // hardware I2C mode, can pass in address & alt Wire
  16.   //if (! bmp.begin_SPI(BMP_CS)) {  // hardware SPI mode  
  17.   //if (! bmp.begin_SPI(BMP_CS, BMP_SCK, BMP_MISO, BMP_MOSI)) {  // software SPI mode
  18.     Serial.println("Could not find a valid BMP3 sensor, check wiring!");
  19.     while (1);
  20.   }

  21.   // Set up oversampling and filter initialization
  22.   bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
  23.   bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X);
  24.   bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
  25.   bmp.setOutputDataRate(BMP3_ODR_50_HZ);
  26. }

  27. void loop() {
  28.   if (! bmp.performReading()) {
  29.     Serial.println("Failed to perform reading :(");
  30.     return;
  31.   }
  32.   Serial.print("Temperature = ");
  33.   Serial.print(bmp.temperature);
  34.   Serial.println(" *C");

  35.   Serial.print("Pressure = ");
  36.   Serial.print(bmp.pressure / 100.0);
  37.   Serial.println(" hPa");

  38.   Serial.print("Approx. Altitude = ");
  39.   Serial.print(bmp.readAltitude(SEALEVELPRESSURE_HPA));
  40.   Serial.println(" m");

  41.   Serial.println();
  42.   delay(2000);
  43. }
复制代码

代码说明

首先在示例中包括四个必要的库 - Wire.h(用于I2C)、SPI.h(用于SPI)、Adafruit_Sensor.h和Adafruit_BMP3XX.h。

  1. #include <Wire.h>
  2. #include <SPI.h>
  3. #include <Adafruit_Sensor.h>
  4. #include "Adafruit_BMP3XX.h"
复制代码

示例默认采用I2C通信协议与传感器通信。 但是,如果您想使用 SPI,只需取消注释以下定义SPI引脚的代码行。

  1. //#define BMP_SCK 13
  2. //#define BMP_MISO 12
  3. //#define BMP_MOSI 11
  4. //#define BMP_CS 10
复制代码

接下来,定义一个名为SEALEVELPRESSURE_HPA的变量。 此变量以milibar为单位保存海平面气压,并用于通过将给定气压与海平面气压进行比较来估算高度。 此示例使用默认值,但为了获得准确的结果,请将该值替换为您所在位置的当前海平面气压。

  1. #define SEALEVELPRESSURE_HPA (1013.25)
复制代码

以下代码行创建Adafruit_BMP3XX对象bmp

  1. Adafruit_BMP3XX bmp;
复制代码

setup()函数中,我们初始化串口通信并调用begin()函数。


bmp.begin_I2C()函数初始化I2C接口并检查芯片ID是否正确。 然后它使用软复位重置芯片并等待传感器在唤醒后进行校准。 同样,bmp.begin_SPI() 函数初始化SPI接口。 如果要使用SPI,需要取消对应if的注释。

  1. Serial.begin(115200);
  2. while (!Serial);
  3. Serial.println("Adafruit BMP388 / BMP390 test");

  4. if (!bmp.begin_I2C()) {   // hardware I2C mode, can pass in address & alt Wire
  5.         //if (! bmp.begin_SPI(BMP_CS)) {  // hardware SPI mode  
  6.         //if (! bmp.begin_SPI(BMP_CS, BMP_SCK, BMP_MISO, BMP_MOSI)) {  // software SPI mode
  7.         Serial.println("Could not find a valid BMP3 sensor, check wiring!");
  8.         while (1);
  9. }
复制代码

接下来,我们为传感器设置一些参数。

  1. bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
  2. bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X);
  3. bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
  4. bmp.setOutputDataRate(BMP3_ODR_50_HZ);
复制代码

在loop()中,我们调用bmp.performReading()函数来执行读取。 完成后,我们可以使用点运算符访问对象的 (bmp) 实例变量。

bmp.temperature 返回温度读数。

bmp.pressure 返回大气压力读数。

bmp.readAltitude(SEALEVELPRESSURE_HPA) 函数根据指定的大气压力(以 hPa 为单位)和海平面气压(以 hPa 为单位)计算高度(以米为单位)。

  1. void loop() {
  2.   if (! bmp.performReading()) {
  3.     Serial.println("Failed to perform reading :(");
  4.     return;
  5.   }
  6.   Serial.print("Temperature = ");
  7.   Serial.print(bmp.temperature);
  8.   Serial.println(" *C");

  9.   Serial.print("Pressure = ");
  10.   Serial.print(bmp.pressure / 100.0);
  11.   Serial.println(" hPa");

  12.   Serial.print("Approx. Altitude = ");
  13.   Serial.print(bmp.readAltitude(SEALEVELPRESSURE_HPA));
  14.   Serial.println(" m");

  15.   Serial.println();
  16.   delay(2000);
  17. }
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 17:36 , Processed in 0.064359 second(s), 10 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表