|
在无人机、气象站、智能穿戴等众多设备中,大气压力和高度的测量非常重要。在本篇文章中,在本篇文章中,我们将使用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) 封装。
YBX-BMP581模块板载一颗电压LDO,支持3.3V-5V电源输入。模块支持SPI和I2C接口连接,并通过8针2.54mm间距的排针引出。该模块默认的I2C地址是0x47,可以将SDO(ADR引脚)拉高IC地址变成0x46。
该模块包含以下主要特性: ● 采用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)。
该模块的默认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)。
模块连接到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传感器模块的温度和大气压力值,我们可以使用该代码进行测试。 - #include <SPI.h>
- #include "SparkFun_BMP581_Arduino_Library.h"
- // Create a new sensor object
- BMP581 pressureSensor;
- // SPI parameters
- uint8_t chipSelectPin = 10;
- uint32_t clockFrequency = 100000;
- void setup()
- {
- // Start serial
- Serial.begin(115200);
- Serial.println("BMP581 Example2 begin!");
- // Initialize the SPI library
- SPI.begin();
- // Check if sensor is connected and initialize
- // Clock frequency is optional (defaults to 100kHz)
- while(pressureSensor.beginSPI(chipSelectPin, clockFrequency) != BMP5_OK)
- {
- // Not connected, inform user
- Serial.println("Error: BMP581 not connected, check wiring and CS pin!");
- // Wait a bit to see if connection is established
- delay(1000);
- }
- Serial.println("BMP581 connected!");
- }
- void loop()
- {
- // Get measurements from the sensor
- bmp5_sensor_data data = {0,0};
- int8_t err = pressureSensor.getSensorData(&data);
- // Check whether data was acquired successfully
- if(err == BMP5_OK)
- {
- // Acquisistion succeeded, print temperature and pressure
- Serial.print("Temperature (C): ");
- Serial.print(data.temperature);
- Serial.print("\t\t");
- Serial.print("Pressure (Pa): ");
- Serial.println(data.pressure);
- }
- else
- {
- // Acquisition failed, most likely a communication error (code -2)
- Serial.print("Error getting data from sensor! Error code: ");
- Serial.println(err);
- }
- // Only print every second
- delay(1000);
- }
复制代码
代码说明 首先在示例中包括两个必要的库 - SPI.h(用于SPI)和SparkFun_BMP581_Arduino_Library.h。 - #include <SPI.h>
- #include "SparkFun_BMP581_Arduino_Library.h"
复制代码以下代码行创建BMP581对象pressureSensor。 - // Create a new sensor object
- BMP581 pressureSensor;
复制代码然后定义SPI通讯中使用的CS引脚编号和通讯速率。 - // SPI parameters
- uint8_t chipSelectPin = 10;
- uint32_t clockFrequency = 100000;
复制代码
在setup()函数中,我们初始化串口通信并调用begin()函数。
pressureSensor.beginSPI() 函数初始化SPI接口。 如果该函数返回BMP5_OK,则表示BMP581已连接。 - // Initialize the SPI library
- SPI.begin();
- // Check if sensor is connected and initialize
- // Clock frequency is optional (defaults to 100kHz)
- while(pressureSensor.beginSPI(chipSelectPin, clockFrequency) != BMP5_OK)
- {
- // Not connected, inform user
- Serial.println("Error: BMP581 not connected, check wiring and CS pin!");
- // Wait a bit to see if connection is established
- delay(1000);
- }
复制代码
在loop()中,我们调用getSensorData()函数来执行读取。 完成后,我们可以使用点运算符访问对象的 (pressureSensor) 实例变量。 pressureSensor.temperature 返回温度读数。 pressureSensor.pressure 返回大气压力读数。 - // Get measurements from the sensor
- bmp5_sensor_data data = {0,0};
- int8_t err = pressureSensor.getSensorData(&data);
- // Check whether data was acquired successfully
- if(err == BMP5_OK)
- {
- // Acquisistion succeeded, print temperature and pressure
- Serial.print("Temperature (C): ");
- Serial.print(data.temperature);
- Serial.print("\t\t");
- Serial.print("Pressure (Pa): ");
- Serial.println(data.pressure);
- }
- else
- {
- // Acquisition failed, most likely a communication error (code -2)
- Serial.print("Error getting data from sensor! Error code: ");
- Serial.println(err);
- }
复制代码
测试结果 硬件连接完成后,选择正确的串口号和开发板型号,下载示例代码。然后打开串口调试助手,就可以看到输出的数据了:
视频 详细操作视频可以参考(哔哩哔哩):
|