旧乡故客
发表于: 前天 12:30 | 显示全部楼层

在无人机、气象站、智能穿戴等众多设备中,大气压力和高度的测量非常重要。在本篇文章中,在本篇文章中,我们将使用Arduino开发板通过SPI和I2C方式连接YBX-BMP581模块实现大气压力的测量,同时采集当前的环境温度。


所需的组件

●    Arduino UNO R3开发板

●    YBX-BMP581大气压力传感器模块(淘宝链接

●    连接跳线

●    USB线缆

●    Arduino IDE


YBX-BMP581大气压力传感器模块

该模块采用博世的BMP581传感器。该气压传感器具有300hPa至1250hPa的宽测量范围和±30Pa的绝对精度。 BMP581针对高性能应用进行了优化,如±6Pa的适应测量。这一特性相当于±50cm的高度差和0.5Pa/K的偏移温度系数(TCO)。采用2.0mm x 2.0mm紧凑型金属盖焊盘栅格阵列 (LGA) 封装。

BMP581.png


YBX-BMP581模块板载一颗电压LDO,支持3.3V-5V电源输入。模块支持SPI和I2C接口连接,并通过8针2.54mm间距的排针引出。该模块默认的I2C地址是0x47,可以将SDO(ADR引脚)拉高IC地址变成0x46。

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


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

●  采用Bosch高性能气压传感器BMP581

    ●  测量范围:300hPa至1250hPa(全精度)

    ●  ±30Pa绝对精度

    ●  ±6Pa相对精度压力

    ●  平均电流:1.3nA

    ●  压力噪声0.08Pa,最低带宽,最高分辨率

    ●  温度系数偏移:±0.5Pa/K

●  SPI和I2C接口

●  板载一颗高精度DC-DC芯片

●  支持Arduino和STM32等微控制器

●  外形尺寸:24mm x 24mm x 5mm


BMP581模块与Arduino开发板的硬件连接

YBX-BMP581模块支持SPI和I2C两种硬件连接方式,您可以根据实际需要选择合适的接线方式。


I2C接线

该接线方法比较简单,只需要连接4根线即可。首先将模块的VCC引脚连接到电源,3V-5V就可以了。 使用与您的微控制器逻辑相同的电压。对于大多数Arduino,使用5V。 对3.3V逻辑设备,使用3.3V。然后将模块的GND引脚连接到公共地。


将SCL引脚连接到I2C时钟引脚,将SDA引脚连接到Arduino的I2C数据引脚。在Arduino UNO R3开发板上,SDA和 SCL位于靠近AREF引脚的排针上。 它们也被称为 A5 (SCL) 和 A4 (SDA)。

YBX-BMP581大气压力传感器模块 - I2C连接.jpg


该模块的默认I2C设备地址为0x47。如果将SDO/ADR引脚设置为低电平,那么I2C地址将改成0x46。



SPI接线

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


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

YBX-BMP581大气压力传感器模块 - SPI连接.jpg


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


安装Arduino库文件

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


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


在库管理中,输入“bmp581”,可以看到BMP581相关的库文件,选择SparkFun_BMP581_Arduino_Library by SparkFun Electronics,然后点击旁边的安装按钮。


Arduino代码

SparkFun_BMP581_Arduino_Library库文件自带一个示例工程Example2_BasicReadingsSPI,该代码可以通过SPI方式读取BMP581传感器模块的温度和大气压力值,我们可以使用该代码进行测试。

  1. #include <SPI.h>
  2. #include "SparkFun_BMP581_Arduino_Library.h"

  3. // Create a new sensor object
  4. BMP581 pressureSensor;

  5. // SPI parameters
  6. uint8_t chipSelectPin = 10;
  7. uint32_t clockFrequency = 100000;

  8. void setup()
  9. {
  10.     // Start serial
  11.     Serial.begin(115200);
  12.     Serial.println("BMP581 Example2 begin!");

  13.     // Initialize the SPI library
  14.     SPI.begin();

  15.     // Check if sensor is connected and initialize
  16.     // Clock frequency is optional (defaults to 100kHz)
  17.     while(pressureSensor.beginSPI(chipSelectPin, clockFrequency) != BMP5_OK)
  18.     {
  19.         // Not connected, inform user
  20.         Serial.println("Error: BMP581 not connected, check wiring and CS pin!");

  21.         // Wait a bit to see if connection is established
  22.         delay(1000);
  23.     }

  24.     Serial.println("BMP581 connected!");
  25. }

  26. void loop()
  27. {
  28.     // Get measurements from the sensor
  29.     bmp5_sensor_data data = {0,0};
  30.     int8_t err = pressureSensor.getSensorData(&data);

  31.     // Check whether data was acquired successfully
  32.     if(err == BMP5_OK)
  33.     {
  34.         // Acquisistion succeeded, print temperature and pressure
  35.         Serial.print("Temperature (C): ");
  36.         Serial.print(data.temperature);
  37.         Serial.print("\t\t");
  38.         Serial.print("Pressure (Pa): ");
  39.         Serial.println(data.pressure);
  40.     }
  41.     else
  42.     {
  43.         // Acquisition failed, most likely a communication error (code -2)
  44.         Serial.print("Error getting data from sensor! Error code: ");
  45.         Serial.println(err);
  46.     }

  47.     // Only print every second
  48.     delay(1000);
  49. }
复制代码

代码说明

首先在示例中包括两个必要的库 - SPI.h(用于SPI)和SparkFun_BMP581_Arduino_Library.h。

  1. #include <SPI.h>
  2. #include "SparkFun_BMP581_Arduino_Library.h"
复制代码

以下代码行创建BMP581对象pressureSensor

  1. // Create a new sensor object
  2. BMP581 pressureSensor;
复制代码

然后定义SPI通讯中使用的CS引脚编号和通讯速率。

  1. // SPI parameters
  2. uint8_t chipSelectPin = 10;
  3. uint32_t clockFrequency = 100000;
复制代码

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


pressureSensor.beginSPI() 函数初始化SPI接口。 如果该函数返回BMP5_OK,则表示BMP581已连接。

  1.   // Initialize the SPI library
  2.     SPI.begin();

  3.     // Check if sensor is connected and initialize
  4.     // Clock frequency is optional (defaults to 100kHz)
  5.     while(pressureSensor.beginSPI(chipSelectPin, clockFrequency) != BMP5_OK)
  6.     {
  7.         // Not connected, inform user
  8.         Serial.println("Error: BMP581 not connected, check wiring and CS pin!");

  9.         // Wait a bit to see if connection is established
  10.         delay(1000);
  11.     }
复制代码

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

pressureSensor.temperature 返回温度读数。

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

  1. // Get measurements from the sensor
  2.     bmp5_sensor_data data = {0,0};
  3.     int8_t err = pressureSensor.getSensorData(&data);

  4.     // Check whether data was acquired successfully
  5.     if(err == BMP5_OK)
  6.     {
  7.         // Acquisistion succeeded, print temperature and pressure
  8.         Serial.print("Temperature (C): ");
  9.         Serial.print(data.temperature);
  10.         Serial.print("\t\t");
  11.         Serial.print("Pressure (Pa): ");
  12.         Serial.println(data.pressure);
  13.     }
  14.     else
  15.     {
  16.         // Acquisition failed, most likely a communication error (code -2)
  17.         Serial.print("Error getting data from sensor! Error code: ");
  18.         Serial.println(err);
  19.     }
复制代码

测试结果

硬件连接完成后,选择正确的串口号和开发板型号,下载示例代码。然后打开串口监控器,就可以看到输出的数据了:





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

本版积分规则

主题 20 | 回复: 24



手机版|

GMT+8, 2025-6-13 08:38 , Processed in 0.046259 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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