|
在上一篇帖子中,我们介绍了如何使用Arduino UNO开发板和YBX-BMP388传感器模块实现了大气压力的测量,并将气压值转换成高度值。在帖子中,我们使用了Adafruit BMP3XX库文件,并使用库文件中示例项目进行了简单测试。除了这个库文件外,还有很多其他的库文件也可以用来读取BMP388。
在本篇帖子,我们将使用BMP388_DEV库实现读取YBX-BMP388传感器模块。非常感谢MartinL1做出的贡献。
BMP388_DEV库简介
以下是该库的主要特性: ● 返回以摄氏度 (°C) 为单位的温度、以百帕/毫巴 (hPa) 为单位的气压值以及以米 (m) 为单位的海拔高度; ● 支持正常(NORMAL)和强制(FORCED)操作模式; ● 具有可配置时钟速率的 I2C 或硬件 SPI 通信; ● 非阻塞操作; ● 在正常模式下,气压计按指定的待机时间间隔返回结果; ● 高度可配置,允许更改压力和温度过采样、IIR滤波器和待机时间; ● 轮询或中断驱动的测量(使用 BMP388 的外部INT引脚); ● 使用BMP388的内部512字节FIFO存储器存储和突发读取多达72个温度和压力测量值;
库文件安装 可以通过Arduino IDE中的库管理器安装BMP388_DEV。在菜单中点击“工具”->"管理库...",打开库管理器,在搜索栏输入BMP388,在查询结果中选择BMP388_DEV,然后点击旁边的安装按钮。
也可以直接在Github存储库下载BMP388_DEV,然后将文件解压,将文件夹放置到.../Arduino/libraries/...文件夹中。
示例代码 以下是Arduino示例项目列表: ● BMP388_I2C_Normal.ino:I2C接口,正常模式(NORMAL),标准I2C地址(0x77) ● BMP388_I2C_Alt_Normal.ino:I2C接口,正常模式(NORMAL),备用I2C地址(0x76) ● BMP388_I2C_Forced.ino:I2C接口,强制模式(FORCED) ● BMP388_I2C_Normal_Interrupt.ino:I2C接口,正常模式,中断 ● BMP388_I2C_Forced_Interrupt.ino:I2C接口,强制模式(FORCED),中断 ● BMP388_I2C_Normal_FIFO.ino:I2C接口,正常模式,FIFO操作 ● BMP388_I2C_Normal_Interrupt_FIFO.ino:I2C 接口、正常模式、中断、FIFO 操作 ● BMP388_SPI_Normal.ino:SPI接口,正常模式 ● BMP388_SPI_Forced.ino:SPI接口,强制模式 ● BMP388_SPI_Normal_Interrupt.ino:SPI接口,正常模式,中断 ● BMP388_SPI_Forced_Interrupt.ino:SPI接口,强制模式,中断 ● BMP388_SPI_Normal_FIFO.ino:SPI接口,正常模式,FIFO 操作 ● BMP388_SPI_Normal_Interrupt_FIFO.ino:SPI接口、正常模式、中断、FIFO 操作 ● BMP388_SPI_Normal_Multiple.ino:SPI 接口,正常模式,多个设备 ● BMP388_ESP32_HSPI_Normal.ino :ESP32 HSPI接口,正常模式 ● BMP388_ESP8266_I2C_Normal_DefinedPins.ino : ESP8266 I2C 接口,正常模式,用户定义引脚 ● BMP388_ESP32_I2C_Normal_DefinedPins.ino :ESP32 I2C 接口,正常模式,用户定义引脚
代码简介 首先在项目代码的开头包含BMP388_DEV.h文: 对于I2C通信,创建BMP388_DEV 象: - BMP388_DEV bmp388; // Set up I2C communications
复制代码默认情况下,该库使用BMP388的I2C地址0x77。 (要使用备用I2C地址:0x76,请参阅下面的begin() 函数。
对于SPI通信,将片选 (CS) Arduino 数字输出引脚指定为参数,例如数字引脚10:
- BMP388_dev bmp388(10); // Set up SPI communications on digital pin D10
复制代码默认情况下,I2C以400kHz的速度运行在快速模式下,SPI 以1MHz的速度运行。 但是,可以使用setClock函数更改I2C或SPI时钟速度:
- bmp388.setClock(4000000); // Set the SPI clock to 4MHz
复制代码
设备初始化 要初始化BMP388,需要调用带或不带参数的 begin() 函数。 这些参数分别指定启动模式、压力/温度过采样、IIR 滤波器和待机时间选项: - bmp388.begin(SLEEP_MODE, OVERSAMPLING_X16, OVERSAMPLING_X2, IIR_FILTER_4, TIME_STANDBY_5MS);
复制代码或者简单地调用不带任何参数的 begin 函数,这将设置默认配置:SLEEP_MODE、压力过采样 X16、温度过采样 X2、IIR 滤波器关闭和 5ms 的待机时间:
- bmp388.begin(); // Initialise the BMP388 with default configuration
复制代码另一种选择是将BMP388的模式作为参数传递:
- bmp388.begin(NORMAL_MODE); // Initialise the BMP388 in NORMAL_MODE with default configuration
复制代码或者,指定模式和备用I2C地址:
- bmp388.begin(FORCED_MODE, BMP388_I2C_ALT_ADDR); // Initialise the BMP388 in FORCED_MODE with the alternate I2C address (0x76)
复制代码
设备配置 初始化后,可以使用以下函数更改BMP388配置: - bmp388.setPresOversampling(OVERSAMPLING_X4); // Options are OVERSAMPLING_SKIP, _X1, _X2, _X4, _X8, _X16, _32
- bmp388.setTempOversampling(OVERSAMPLING_X4); // Options are OVERSAMPLING_SKIP, _X1, _X2, _X4, _X8, _X16, _X32
- bmp388.setIIRFilter(IIR_FILTER_16); // Options are IIR_FILTER_OFF, _2, _4, _8, _16, _32
- bmp388.setTimeStandby(TIME_STANDBY_2000MS); // Options are TIME_STANDBY_5MS, _10MS, _20MS, _250MS, _40MS, _80MS, 160MS, 320MS, 640MS, 1280MS, 2560MS, 5120MS, 10240MS, 20480MS, 40960MS, 81920MS, 163840MS, 327680MS, 655360MS
复制代码
工作模式 BMP388有3种工作模式:SLEEP_MODE、NORMAL_MODE和FORCED_MODE: ● SLEEP_MODE:将设备置于非活动待机状态 ● NORMAL_MODE:执行连续转换,以待机时间间隔 ● FORCED_MODE:执行单次转换,完成后返回SLEEP_MODE
结果获取 BMP388库获取以摄氏度 (°C) 为单位的温度、以百帕/毫巴 (hPa) 为单位的压力以及以米 (m) 为单位的海拔高度。 采集函数扫描BMP388的状态寄存器,如果气压计结果已准备好并已成功读取,则返回1,否则返回 0; 这允许非阻塞代码实现。 温度、压力和高度结果本身是通过函数引用传递的浮点变量,并在成功读取后更新。
以下是结果获取的函数: - bmp388.getMeasurements(temperature, pressure, altitude); // Acquire temperature, pressue and altitude measurements
- bmp388.getTemperature(temperature); // Acquire the temperature only
- bmp388.getPressure(pressure); // Acquire the pressure only, (also calculates temperature, but doesn't return it)
- bmp388.getAltitude(altitude); // Acquire the altitude only
复制代码
代码实现 以下是如何使用BMP388库进行非阻塞I2C操作的示例项目,默认配置为NORMAL_MODE中的连续转换,但待机采样时间为1秒:
- #include <BMP388_DEV.h> // Include the BMP388_DEV.h library
- float temperature, pressure, altitude; // Create the temperature, pressure and altitude variables
- BMP388_DEV bmp388; // Instantiate (create) a BMP388_DEV object and set-up for I2C operation (address 0x77)
- void setup()
- {
- Serial.begin(115200); // Initialise the serial port
- bmp388.begin(); // Default initialisation, place the BMP388 into SLEEP_MODE
- bmp388.setTimeStandby(TIME_STANDBY_1280MS); // Set the standby time to 1280ms
- bmp388.startNormalConversion(); // Start NORMAL conversion mode
- }
- void loop()
- {
- if (bmp388.getMeasurements(temperature, pressure, altitude)) // Check if the measurement is complete
- {
- Serial.print(temperature); // Display the results
- Serial.print(F("*C "));
- Serial.print(pressure);
- Serial.print(F("hPa "));
- Serial.print(altitude);
- Serial.println(F("m"));
- }
- }
复制代码
|