Soldered BMP280 Arduino Library 1.0.0
Soldered Arduino library for BMP280 sensor breakout.
Loading...
Searching...
No Matches
BMP280_DEV.h
Go to the documentation of this file.
1/*
2 BMP280_DEV is an I2C/SPI compatible library for the Bosch BMP280 barometer.
3
4 Copyright (C) Martin Lindupp 2019
5
6 V1.0.0 -- Initial release
7 V1.0.1 -- Added ESP32 HSPI support and change library to unique name
8 V1.0.2 -- Modification to allow external creation of HSPI object on ESP32
9 V1.0.3 -- Changed library name in the library.properties file
10 V1.0.5 -- Fixed bug in BMP280_DEV::getTemperature() function, thanks to Jon M.
11 V1.0.6 -- Merged multiple instances and initialisation pull requests by sensslen
12 V1.0.8 -- Used default arguments for begin() member function and
13 added example using multiple BMP280 devices with SPI comms in NORMAL mode
14 V1.0.9 -- Moved writeMask to Device class and improved measurement detection code
15 V1.0.10 -- Modification to allow user-defined pins for I2C operation on the ESP8266
16 V1.0.12 -- Allow sea level pressure calibration using setSeaLevelPressure() function
17 V1.0.14 -- Fix uninitialised structures, thanks to David Jade investigating and
18 flagging up this issue
19 V1.0.16 -- Modification to allow user-defined pins for I2C operation on the ESP32
20 V1.0.17 -- Added getCurrentTemperature(), getCurrentPressure(), getCurrentTempPres()
21 getCurrentAltitude() and getCurrentMeasurements() functions,
22 to allow the BMP280 to be read directly without checking the measuring bit
23 V1.0.18 -- Initialise "device" constructor member variables in the same order they are declared
24 V1.0.19 -- Allow for additional TwoWire instances
25 V1.0.20 -- Removed default parameter causing ESP32 compilation error with user defined I2C pins
26 V1.0.21 -- Fixed uninitialised "Wire" pointer for ESP8266/ESP32 with user defined I2C pins
27
28 The MIT License (MIT)
29 Permission is hereby granted, free of charge, to any person obtaining a copy
30 of this software and associated documentation files (the "Software"), to deal
31 in the Software without restriction, including without limitation the rights
32 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
33 copies of the Software, and to permit persons to whom the Software is
34 furnished to do so, subject to the following conditions:
35 The above copyright notice and this permission notice shall be included in all
36 copies or substantial portions of the Software.
37 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
38 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
39 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
40 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
41 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
42 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
43 SOFTWARE.
44*/
45
46#ifndef BMP280_DEV_h
47#define BMP280_DEV_h
48
49#include "libs/Device.h"
50
52// BMP280_DEV Definitions
54
55#define BMP280_I2C_ADDR 0x77 // The BMP280 I2C address
56#define BMP280_I2C_ALT_ADDR 0x76 // The BMP280 I2C alternate address
57#define DEVICE_ID 0x58 // The BMP280 device ID
58#define RESET_CODE 0xB6 // The BMP280 reset code
59
65
67// BMP280_DEV Registers
69
70enum
71{
72 BMP280_TRIM_PARAMS = 0x88, // Trim parameter registers' base sub-address
73 BMP280_DEVICE_ID = 0xD0, // Device ID register sub-address
74 BMP280_RESET = 0xE0, // Reset register sub-address
75 BMP280_STATUS = 0xF3, // Status register sub-address
76 BMP280_CTRL_MEAS = 0xF4, // Control and measurement register sub-address
77 BMP280_CONFIG = 0xF5, // Configuration register sub-address
78 BMP280_PRES_MSB = 0xF7, // Pressure Most Significant Byte (MSB) register sub-address
79 BMP280_PRES_LSB = 0xF8, // Pressure Least Significant Byte (LSB) register sub-address
80 BMP280_PRES_XLSB = 0xF9, // Pressure eXtended Least Significant Byte (XLSB) register sub-address
81 BMP280_TEMP_MSB = 0xFA, // Pressure Most Significant Byte (MSB) register sub-address
82 BMP280_TEMP_LSB = 0xFB, // Pressure Least Significant Byte (LSB) register sub-address
83 BMP280_TEMP_XLSB = 0xFC // Pressure eXtended Least Significant Byte (XLSB) register sub-address
84};
85
87// BMP280_DEV Modes
89
90enum Mode
91{
92 SLEEP_MODE = 0x00, // Device mode bitfield in the control and measurement register
94 NORMAL_MODE = 0x03
95};
96
98// BMP280_DEV Register bit field Definitions
100
102{
103 OVERSAMPLING_SKIP = 0x00, // Oversampling bit fields in the control and measurement register
108 OVERSAMPLING_X16 = 0x05
110
112{
113 IIR_FILTER_OFF = 0x00, // Infinite Impulse Response (IIR) filter bit field in the configuration register
117 IIR_FILTER_16 = 0x04
119
121{
122 TIME_STANDBY_05MS = 0x00, // Time standby bit field in the configuration register
131
133// BMP280_DEV Class definition
135
136class BMP280_DEV : public Device
137{ // Derive the BMP280_DEV class from the Device class
138 public:
139 BMP280_DEV(TwoWire &twoWire = Wire); // BMP280_DEV object for I2C operation
140#ifdef ARDUINO_ESP8266_GENERIC
141 BMP280_DEV(uint8_t sda, uint8_t scl,
142 TwoWire &twoWire = Wire); // BMP280_DEV object for ESP8266 I2C operation with user-defined pins
143#endif
144 BMP280_DEV(uint8_t cs); // BMP280_DEV object for SPI operation
145#ifdef ARDUINO_ESP32_DEV
146 BMP280_DEV(uint8_t sda, uint8_t scl,
147 TwoWire &twoWire = Wire); // BMP280_DEV object for ESP32 I2C operation with user-defined pins
148 BMP280_DEV(uint8_t cs, uint8_t spiPort,
149 SPIClass &spiClass); // BMP280_DEV object for SPI1 with supplied SPIClass object
150#endif
151 uint8_t begin(Mode mode = SLEEP_MODE, // Initialise the barometer with arguments
152 Oversampling presOversampling = OVERSAMPLING_X16, Oversampling tempOversampling = OVERSAMPLING_X2,
153 IIRFilter iirFilter = IIR_FILTER_OFF, TimeStandby timeStandby = TIME_STANDBY_05MS);
154 uint8_t begin(Mode mode, uint8_t addr); // Initialise the barometer specifying start mode and I2C addrss
155 uint8_t begin(uint8_t addr); // Initialise the barometer specifying I2C address with default initialisation
156 void reset(); // Soft reset the barometer
157 void startNormalConversion(); // Start continuous measurement in NORMAL_MODE
158 void startForcedConversion(); // Start a one shot measurement in FORCED_MODE
159 void stopConversion(); // Stop the conversion and return to SLEEP_MODE
160 void setPresOversampling(Oversampling presOversampling); // Set the pressure oversampling: OFF, X1, X2, X4, X8, X16
162 Oversampling tempOversampling); // Set the temperature oversampling: OFF, X1, X2, X4, X8, X16
163 void setIIRFilter(IIRFilter iirFilter); // Set the IIR filter setting: OFF, 2, 4, 8, 16
164 void setTimeStandby(
165 TimeStandby timeStandby); // Set the time standby measurement interval: 0.5, 62, 125, 250, 500ms, 1s, 2s, 4s
166 void setSeaLevelPressure(float pressure = 1013.23f); // Set the sea level pressure value
168 float &temperature); // Get the current temperature measurement without checking the measuring bit
169 uint8_t getTemperature(float &temperature); // Get a temperature measurement
170 void getCurrentPressure(float &pressure); // Get the current pressure without checking the measuring bit
171 uint8_t getPressure(float &pressure); // Get a pressure measurement
173 float &temperature,
174 float &pressure); // Get the current temperature and pressure without checking the measuring bit
175 uint8_t getTempPres(float &temperature, float &pressure); // Get a temperature and pressure measurement
176 void getCurrentAltitude(float &altitude); // Get the current altitude without checking the measuring bit
177 uint8_t getAltitude(float &altitude); // Get an altitude measurement
178 void getCurrentMeasurements(float &temperature, float &pressure,
179 float &altitude); // Get all measurements without checking the measuring bit
180 uint8_t getMeasurements(float &temperature, float &pressure,
181 float &altitude); // Get temperature, pressure and altitude measurements
182 protected:
183 private:
184 void setMode(Mode mode); // Set the barometer mode
185 void setCtrlMeasRegister(Mode mode, Oversampling presOversampling,
186 Oversampling tempOversamping); // Set the BMP280 control and measurement register
187 void setConfigRegister(IIRFilter iirFilter, TimeStandby timeStandby); // Set the BMP280 configuration register
188 uint8_t dataReady(); // Checks if a measurement is ready
189
190 struct
191 { // The BMP280 compensation trim parameters (coefficients)
192 uint16_t dig_T1;
193 int16_t dig_T2;
194 int16_t dig_T3;
195 uint16_t dig_P1;
196 int16_t dig_P2;
197 int16_t dig_P3;
198 int16_t dig_P4;
199 int16_t dig_P5;
200 int16_t dig_P6;
201 int16_t dig_P7;
202 int16_t dig_P8;
203 int16_t dig_P9;
205
206 union { // Copy of the BMP280's configuration register
207 struct
208 {
209 uint8_t spi3w_en : 1;
210 uint8_t : 1;
211 uint8_t filter : 3;
212 uint8_t t_sb : 3;
214 uint8_t reg;
215 } config = {.reg = 0};
216
217 union { // Copy of the BMP280's control and measurement register
218 struct
219 {
220 uint8_t mode : 2;
221 uint8_t osrs_p : 3;
222 uint8_t osrs_t : 3;
224 uint8_t reg;
225 } ctrl_meas = {.reg = 0};
226
227 union { // Copy of the BMP280's status register
228 struct
229 {
230 uint8_t im_update : 1;
231 uint8_t : 2;
232 uint8_t measuring : 1;
234 uint8_t reg;
235 } status = {.reg = 0};
236
237 int32_t t_fine; // Bosch t_fine variable
238 int32_t bmp280_compensate_T_int32(int32_t adc_T); // Bosch temperature compensation function
239 uint32_t bmp280_compensate_P_int64(int32_t adc_P); // Bosch pressure compensation function
240 bool previous_measuring; // Previous measuring state
241 float sea_level_pressure = 1013.23f; // Sea level pressure
242};
243
244#endif
@ BMP280_TEMP_XLSB
Definition BMP280_DEV.h:83
@ BMP280_PRES_MSB
Definition BMP280_DEV.h:78
@ BMP280_TEMP_MSB
Definition BMP280_DEV.h:81
@ BMP280_TEMP_LSB
Definition BMP280_DEV.h:82
@ BMP280_DEVICE_ID
Definition BMP280_DEV.h:73
@ BMP280_CTRL_MEAS
Definition BMP280_DEV.h:76
@ BMP280_RESET
Definition BMP280_DEV.h:74
@ BMP280_PRES_LSB
Definition BMP280_DEV.h:79
@ BMP280_STATUS
Definition BMP280_DEV.h:75
@ BMP280_TRIM_PARAMS
Definition BMP280_DEV.h:72
@ BMP280_PRES_XLSB
Definition BMP280_DEV.h:80
@ BMP280_CONFIG
Definition BMP280_DEV.h:77
TimeStandby
Definition BMP280_DEV.h:121
@ TIME_STANDBY_05MS
Definition BMP280_DEV.h:122
@ TIME_STANDBY_500MS
Definition BMP280_DEV.h:126
@ TIME_STANDBY_125MS
Definition BMP280_DEV.h:124
@ TIME_STANDBY_62MS
Definition BMP280_DEV.h:123
@ TIME_STANDBY_2000MS
Definition BMP280_DEV.h:128
@ TIME_STANDBY_250MS
Definition BMP280_DEV.h:125
@ TIME_STANDBY_1000MS
Definition BMP280_DEV.h:127
@ TIME_STANDBY_4000MS
Definition BMP280_DEV.h:129
Mode
Definition BMP280_DEV.h:91
@ NORMAL_MODE
Definition BMP280_DEV.h:94
@ SLEEP_MODE
Definition BMP280_DEV.h:92
@ FORCED_MODE
Definition BMP280_DEV.h:93
SPIPort
Definition BMP280_DEV.h:61
@ BMP280_SPI1
Definition BMP280_DEV.h:63
@ BMP280_SPI0
Definition BMP280_DEV.h:62
IIRFilter
Definition BMP280_DEV.h:112
@ IIR_FILTER_4
Definition BMP280_DEV.h:115
@ IIR_FILTER_8
Definition BMP280_DEV.h:116
@ IIR_FILTER_OFF
Definition BMP280_DEV.h:113
@ IIR_FILTER_2
Definition BMP280_DEV.h:114
@ IIR_FILTER_16
Definition BMP280_DEV.h:117
Oversampling
Definition BMP280_DEV.h:102
@ OVERSAMPLING_X8
Definition BMP280_DEV.h:107
@ OVERSAMPLING_X4
Definition BMP280_DEV.h:106
@ OVERSAMPLING_X2
Definition BMP280_DEV.h:105
@ OVERSAMPLING_SKIP
Definition BMP280_DEV.h:103
@ OVERSAMPLING_X16
Definition BMP280_DEV.h:108
@ OVERSAMPLING_X1
Definition BMP280_DEV.h:104
Definition BMP280_DEV.h:137
uint8_t getTemperature(float &temperature)
Definition BMP280_DEV.cpp:178
int16_t dig_P3
Definition BMP280_DEV.h:197
void getCurrentAltitude(float &altitude)
Definition BMP280_DEV.cpp:224
uint8_t spi3w_en
Definition BMP280_DEV.h:209
uint8_t im_update
Definition BMP280_DEV.h:230
void setSeaLevelPressure(float pressure=1013.23f)
Definition BMP280_DEV.cpp:162
void setPresOversampling(Oversampling presOversampling)
Definition BMP280_DEV.cpp:138
void getCurrentTemperature(float &temperature)
Definition BMP280_DEV.cpp:167
uint8_t dataReady()
Definition BMP280_DEV.cpp:280
uint8_t getTempPres(float &temperature, float &pressure)
Definition BMP280_DEV.cpp:214
int16_t dig_P2
Definition BMP280_DEV.h:196
uint8_t reg
Definition BMP280_DEV.h:214
int16_t dig_P8
Definition BMP280_DEV.h:202
BMP280_DEV(TwoWire &twoWire=Wire)
Definition BMP280_DEV.cpp:52
union BMP280_DEV::@4 status
void setConfigRegister(IIRFilter iirFilter, TimeStandby timeStandby)
Definition BMP280_DEV.cpp:274
int16_t dig_T2
Definition BMP280_DEV.h:193
void setMode(Mode mode)
Definition BMP280_DEV.cpp:260
void getCurrentPressure(float &pressure)
Definition BMP280_DEV.cpp:188
uint8_t osrs_p
Definition BMP280_DEV.h:221
int16_t dig_P7
Definition BMP280_DEV.h:201
bool previous_measuring
Definition BMP280_DEV.h:240
uint8_t getPressure(float &pressure)
Definition BMP280_DEV.cpp:194
float sea_level_pressure
Definition BMP280_DEV.h:241
void setCtrlMeasRegister(Mode mode, Oversampling presOversampling, Oversampling tempOversamping)
Definition BMP280_DEV.cpp:267
void setTimeStandby(TimeStandby timeStandby)
Definition BMP280_DEV.cpp:156
uint8_t filter
Definition BMP280_DEV.h:211
uint8_t getMeasurements(float &temperature, float &pressure, float &altitude)
Definition BMP280_DEV.cpp:244
BMP280_DEV(uint8_t sda, uint8_t scl, TwoWire &twoWire=Wire)
int16_t dig_P5
Definition BMP280_DEV.h:199
void getCurrentTempPres(float &temperature, float &pressure)
Definition BMP280_DEV.cpp:200
uint8_t begin(Mode mode=SLEEP_MODE, Oversampling presOversampling=OVERSAMPLING_X16, Oversampling tempOversampling=OVERSAMPLING_X2, IIRFilter iirFilter=IIR_FILTER_OFF, TimeStandby timeStandby=TIME_STANDBY_05MS)
Definition BMP280_DEV.cpp:83
void startNormalConversion()
Definition BMP280_DEV.cpp:119
struct BMP280_DEV::@1 params
union BMP280_DEV::@3 ctrl_meas
void reset()
Definition BMP280_DEV.cpp:113
int32_t bmp280_compensate_T_int32(int32_t adc_T)
Definition BMP280_DEV.cpp:308
uint8_t mode
Definition BMP280_DEV.h:220
uint16_t dig_T1
Definition BMP280_DEV.h:192
void stopConversion()
Definition BMP280_DEV.cpp:133
void startForcedConversion()
Definition BMP280_DEV.cpp:124
uint16_t dig_P1
Definition BMP280_DEV.h:195
int16_t dig_P9
Definition BMP280_DEV.h:203
uint8_t t_sb
Definition BMP280_DEV.h:212
int32_t t_fine
Definition BMP280_DEV.h:237
union BMP280_DEV::@2 config
void setIIRFilter(IIRFilter iirFilter)
Definition BMP280_DEV.cpp:150
int16_t dig_T3
Definition BMP280_DEV.h:194
uint32_t bmp280_compensate_P_int64(int32_t adc_P)
Definition BMP280_DEV.cpp:322
int16_t dig_P4
Definition BMP280_DEV.h:198
void getCurrentMeasurements(float &temperature, float &pressure, float &altitude)
Definition BMP280_DEV.cpp:236
uint8_t measuring
Definition BMP280_DEV.h:232
struct BMP280_DEV::@2::@5 bit
uint8_t getAltitude(float &altitude)
Definition BMP280_DEV.cpp:230
void setTempOversampling(Oversampling tempOversampling)
Definition BMP280_DEV.cpp:144
uint8_t osrs_t
Definition BMP280_DEV.h:222
int16_t dig_P6
Definition BMP280_DEV.h:200
Definition Device.h:65
uint8_t sda
Definition Device.h:98
uint8_t scl
Definition Device.h:98
uint8_t spiPort
Definition Device.h:90
uint8_t cs
Definition Device.h:88