In this article we connect the ever popular BMP384 Sensor to a raspberry Pi Pico and we will then display readings via the serial monitor window. We are using t he Arduino IDE.
Lets look at the sensor first
Features
The BMP384 provides excellent accuracy across a wide measurement range (300hPa to 1250hPa and -40 to +85°C).
The sensor also features a configurable oversampling setting, a FIFO buffer for storing up to 73 measurements, as well as a low pass filter so users can customize the performance based on the application’s requirements.
The sensor communicates over I2C by default.
The BMP384 has three operating modes: Sleep Mode, Normal Mode and Forced Mode. While in Sleep Mode the sensor is idle and consumes ~2µA. While in Normal Mode, the sensor automatically cycles between measurement and standby periods and consumes ~700µA at peak current draw during measurements.
Forced Mode allows direct control of measurements to wake the sensor from Sleep Mode, take a single-shot measurement, and return the device to Sleep Mode.
| Parameter | Technical data |
|---|---|
|
Operation range
|
Pressure: 300… 1250 hPa
|
|
Supply voltage VDDIO
Supply voltage VDD |
1.2 V … 3.6 V
1.65 V … 3.6 V |
|
Interface
|
I²C (up to 3.4 MHz) and SPI (3 and 4 wire, up to 10 MHz)
|
|
Average typical current consumption (1 Hz data rate)
|
3.4 µA @ 1 Hzpressure and temperature,
2.0 µA in sleep mode |
|
Absolute accuracy
P=300 …1100 hPa (T=0 … 65 °C) |
± 50 Pa
|
|
Relative accuracy pressure (typ.)
P=900…1100 hPa (T=25 … 40°C) |
± 9 Pa, equiv. to ± 0.75 m
|
|
Noise in pressure (lowest bandwidth, highest resolution)
|
0.03 Pa
|
|
Temperature coefficient offset (25°…40°C @ 900 hPa)
|
±1 Pa/K
|
|
Long-term stability (12 months)
|
±0.70 hPa
|
|
Maximum sampling rate
|
200 Hz
|
Parts Required
| Name | Link | |
| Raspberry Pi Pico | ||
| BMP384 | ||
| Connecting cables |
Schematic/Connection
Here is a layout in fritzing to show this
Code Example
I used the sparkfun BMP384 library and this is the default example which worked
#include <Wire.h>
#include "SparkFunBMP384.h"
// Create a new sensor object
BMP384 pressureSensor;
// I2C address selection
uint8_t i2cAddress = BMP384_I2C_ADDRESS_DEFAULT; // 0x77
//uint8_t i2cAddress = BMP384_I2C_ADDRESS_SECONDARY; // 0x76
void setup()
{
// Start serial
Serial.begin(115200);
Serial.println("BMP384 Example1 begin!");
// Initialize the I2C library
Wire.begin();
// Check if sensor is connected and initialize
// Address is optional (defaults to 0x77)
while(pressureSensor.beginI2C(i2cAddress) != BMP3_OK)
{
// Not connected, inform user
Serial.println("Error: BMP384 not connected, check wiring and I2C address!");
// Wait a bit to see if connection is established
delay(1000);
}
Serial.println("BMP384 connected!");
}
void loop()
{
// Get measurements from the sensor
bmp3_data data;
int8_t err = pressureSensor.getSensorData(&data);
// Check whether data was acquired successfully
if(err == BMP3_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);
}
Output
Temperature (C): 18.95 Pressure (Pa): 98937.87
Temperature (C): 18.96 Pressure (Pa): 98915.58
Temperature (C): 18.95 Pressure (Pa): 98953.07
Temperature (C): 18.95 Pressure (Pa): 98913.54
Temperature (C): 18.95 Pressure (Pa): 98929.76
Links
https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmp384-ds003.pdf