风筝
发表于: 2023-8-24 21:52:20 | 显示全部楼层

上一篇帖子中,我们介绍了如何使用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,然后点击旁边的安装按钮。

安装BMP388_DEV库.jpg


也可以直接在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文:

  1. #include <BMP388_DEV.h>
复制代码

对于I2C通信,创建BMP388_DEV 象:

  1. BMP388_DEV bmp388;        // Set up I2C communications
复制代码

默认情况下,该库使用BMP388的I2C地址0x77。 (要使用备用I2C地址:0x76,请参阅下面的begin() 函数。


对于SPI通信,将片选 (CS) Arduino 数字输出引脚指定为参数,例如数字引脚10:

  1. BMP388_dev bmp388(10);        // Set up SPI communications on digital pin D10
复制代码

默认情况下,I2C以400kHz的速度运行在快速模式下,SPI 以1MHz的速度运行。 但是,可以使用setClock函数更改I2C或SPI时钟速度:

  1. bmp388.setClock(4000000);                        // Set the SPI clock to 4MHz
复制代码

设备初始化

要初始化BMP388,需要调用带或不带参数的 begin() 函数。 这些参数分别指定启动模式、压力/温度过采样、IIR 滤波器和待机时间选项:

  1. bmp388.begin(SLEEP_MODE, OVERSAMPLING_X16, OVERSAMPLING_X2, IIR_FILTER_4, TIME_STANDBY_5MS);
复制代码

或者简单地调用不带任何参数的 begin 函数,这将设置默认配置:SLEEP_MODE、压力过采样 X16、温度过采样 X2、IIR 滤波器关闭和 5ms 的待机时间:

  1. bmp388.begin();        // Initialise the BMP388 with default configuration
复制代码

另一种选择是将BMP388的模式作为参数传递:

  1. bmp388.begin(NORMAL_MODE);        // Initialise the BMP388 in NORMAL_MODE with default configuration
复制代码

或者,指定模式和备用I2C地址:

  1. bmp388.begin(FORCED_MODE, BMP388_I2C_ALT_ADDR);        // Initialise the BMP388 in FORCED_MODE with the alternate I2C address (0x76)
复制代码

设备配置

初始化后,可以使用以下函数更改BMP388配置:

  1. bmp388.setPresOversampling(OVERSAMPLING_X4);        // Options are OVERSAMPLING_SKIP, _X1, _X2, _X4, _X8, _X16, _32
  2. bmp388.setTempOversampling(OVERSAMPLING_X4);        // Options are OVERSAMPLING_SKIP, _X1, _X2, _X4, _X8, _X16, _X32
  3. bmp388.setIIRFilter(IIR_FILTER_16);        // Options are IIR_FILTER_OFF, _2, _4, _8, _16, _32
  4. 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; 这允许非阻塞代码实现。 温度、压力和高度结果本身是通过函数引用传递的浮点变量,并在成功读取后更新。


以下是结果获取的函数:

  1. bmp388.getMeasurements(temperature, pressure, altitude);        // Acquire temperature, pressue and altitude measurements
  2. bmp388.getTemperature(temperature);        // Acquire the temperature only
  3. bmp388.getPressure(pressure);        // Acquire the pressure only, (also calculates temperature, but doesn't return it)
  4. bmp388.getAltitude(altitude);        // Acquire the altitude only
复制代码

代码实现

以下是如何使用BMP388库进行非阻塞I2C操作的示例项目,默认配置为NORMAL_MODE中的连续转换,但待机采样时间为1秒:

  1. #include <BMP388_DEV.h>                           // Include the BMP388_DEV.h library

  2. float temperature, pressure, altitude;            // Create the temperature, pressure and altitude variables
  3. BMP388_DEV bmp388;                                // Instantiate (create) a BMP388_DEV object and set-up for I2C operation (address 0x77)

  4. void setup()
  5. {
  6.   Serial.begin(115200);                           // Initialise the serial port
  7.   bmp388.begin();                                 // Default initialisation, place the BMP388 into SLEEP_MODE
  8.   bmp388.setTimeStandby(TIME_STANDBY_1280MS);     // Set the standby time to 1280ms
  9.   bmp388.startNormalConversion();                 // Start NORMAL conversion mode
  10. }

  11. void loop()
  12. {
  13.   if (bmp388.getMeasurements(temperature, pressure, altitude))    // Check if the measurement is complete
  14.   {
  15.     Serial.print(temperature);                    // Display the results   
  16.     Serial.print(F("*C   "));
  17.     Serial.print(pressure);   
  18.     Serial.print(F("hPa   "));
  19.     Serial.print(altitude);
  20.     Serial.println(F("m"));
  21.   }
  22. }
复制代码



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

本版积分规则

主题 700 | 回复: 1483



手机版|

GMT+8, 2024-5-21 22:02 , Processed in 0.039499 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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