Adafruit BME280 Library
Adafruit_BME280.h
Go to the documentation of this file.
1 
21 #ifndef __BME280_H__
22 #define __BME280_H__
23 
24 #include "Arduino.h"
25 
26 #include <Adafruit_I2CDevice.h>
27 #include <Adafruit_SPIDevice.h>
28 #include <Adafruit_Sensor.h>
29 
33 #define BME280_ADDRESS (0x77) // Primary I2C Address
34 
37 #define BME280_ADDRESS_ALTERNATE (0x76) // Alternate Address
38 
42 enum {
43  BME280_REGISTER_DIG_T1 = 0x88,
44  BME280_REGISTER_DIG_T2 = 0x8A,
45  BME280_REGISTER_DIG_T3 = 0x8C,
46 
47  BME280_REGISTER_DIG_P1 = 0x8E,
48  BME280_REGISTER_DIG_P2 = 0x90,
49  BME280_REGISTER_DIG_P3 = 0x92,
50  BME280_REGISTER_DIG_P4 = 0x94,
51  BME280_REGISTER_DIG_P5 = 0x96,
52  BME280_REGISTER_DIG_P6 = 0x98,
53  BME280_REGISTER_DIG_P7 = 0x9A,
54  BME280_REGISTER_DIG_P8 = 0x9C,
55  BME280_REGISTER_DIG_P9 = 0x9E,
56 
57  BME280_REGISTER_DIG_H1 = 0xA1,
58  BME280_REGISTER_DIG_H2 = 0xE1,
59  BME280_REGISTER_DIG_H3 = 0xE3,
60  BME280_REGISTER_DIG_H4 = 0xE4,
61  BME280_REGISTER_DIG_H5 = 0xE5,
62  BME280_REGISTER_DIG_H6 = 0xE7,
63 
64  BME280_REGISTER_CHIPID = 0xD0,
65  BME280_REGISTER_VERSION = 0xD1,
66  BME280_REGISTER_SOFTRESET = 0xE0,
67 
68  BME280_REGISTER_CAL26 = 0xE1, // R calibration stored in 0xE1-0xF0
69 
70  BME280_REGISTER_CONTROLHUMID = 0xF2,
71  BME280_REGISTER_STATUS = 0XF3,
72  BME280_REGISTER_CONTROL = 0xF4,
73  BME280_REGISTER_CONFIG = 0xF5,
74  BME280_REGISTER_PRESSUREDATA = 0xF7,
75  BME280_REGISTER_TEMPDATA = 0xFA,
76  BME280_REGISTER_HUMIDDATA = 0xFD
77 };
78 
79 /**************************************************************************/
83 /**************************************************************************/
84 typedef struct {
85  uint16_t dig_T1;
86  int16_t dig_T2;
87  int16_t dig_T3;
88 
89  uint16_t dig_P1;
90  int16_t dig_P2;
91  int16_t dig_P3;
92  int16_t dig_P4;
93  int16_t dig_P5;
94  int16_t dig_P6;
95  int16_t dig_P7;
96  int16_t dig_P8;
97  int16_t dig_P9;
98 
99  uint8_t dig_H1;
100  int16_t dig_H2;
101  uint8_t dig_H3;
102  int16_t dig_H4;
103  int16_t dig_H5;
104  int8_t dig_H6;
106 /*=========================================================================*/
107 
108 class Adafruit_BME280;
109 
111 class Adafruit_BME280_Temp : public Adafruit_Sensor {
112 public:
115  Adafruit_BME280_Temp(Adafruit_BME280 *parent) { _theBME280 = parent; }
116  bool getEvent(sensors_event_t *);
117  void getSensor(sensor_t *);
118 
119 private:
120  int _sensorID = 280;
121  Adafruit_BME280 *_theBME280 = NULL;
122 };
123 
125 class Adafruit_BME280_Pressure : public Adafruit_Sensor {
126 public:
129  Adafruit_BME280_Pressure(Adafruit_BME280 *parent) { _theBME280 = parent; }
130  bool getEvent(sensors_event_t *);
131  void getSensor(sensor_t *);
132 
133 private:
134  int _sensorID = 280;
135  Adafruit_BME280 *_theBME280 = NULL;
136 };
137 
139 class Adafruit_BME280_Humidity : public Adafruit_Sensor {
140 public:
143  Adafruit_BME280_Humidity(Adafruit_BME280 *parent) { _theBME280 = parent; }
144  bool getEvent(sensors_event_t *);
145  void getSensor(sensor_t *);
146 
147 private:
148  int _sensorID = 280;
149  Adafruit_BME280 *_theBME280 = NULL;
150 };
151 
152 /**************************************************************************/
156 /**************************************************************************/
158 public:
159  /**************************************************************************/
163  /**************************************************************************/
165  SAMPLING_NONE = 0b000,
166  SAMPLING_X1 = 0b001,
167  SAMPLING_X2 = 0b010,
168  SAMPLING_X4 = 0b011,
169  SAMPLING_X8 = 0b100,
170  SAMPLING_X16 = 0b101
171  };
172 
173  /**************************************************************************/
177  /**************************************************************************/
178  enum sensor_mode {
179  MODE_SLEEP = 0b00,
180  MODE_FORCED = 0b01,
181  MODE_NORMAL = 0b11
182  };
183 
184  /**************************************************************************/
188  /**************************************************************************/
190  FILTER_OFF = 0b000,
191  FILTER_X2 = 0b001,
192  FILTER_X4 = 0b010,
193  FILTER_X8 = 0b011,
194  FILTER_X16 = 0b100
195  };
196 
197  /**************************************************************************/
201  /**************************************************************************/
203  STANDBY_MS_0_5 = 0b000,
204  STANDBY_MS_10 = 0b110,
205  STANDBY_MS_20 = 0b111,
206  STANDBY_MS_62_5 = 0b001,
207  STANDBY_MS_125 = 0b010,
208  STANDBY_MS_250 = 0b011,
209  STANDBY_MS_500 = 0b100,
210  STANDBY_MS_1000 = 0b101
211  };
212 
213  // constructors
214  Adafruit_BME280();
215  Adafruit_BME280(int8_t cspin, SPIClass *theSPI = &SPI);
216  Adafruit_BME280(int8_t cspin, int8_t mosipin, int8_t misopin, int8_t sckpin);
217  ~Adafruit_BME280(void);
218  bool begin(uint8_t addr = BME280_ADDRESS, TwoWire *theWire = &Wire);
219  bool init();
220 
221  void setSampling(sensor_mode mode = MODE_NORMAL,
222  sensor_sampling tempSampling = SAMPLING_X16,
223  sensor_sampling pressSampling = SAMPLING_X16,
224  sensor_sampling humSampling = SAMPLING_X16,
225  sensor_filter filter = FILTER_OFF,
226  standby_duration duration = STANDBY_MS_0_5);
227 
228  bool takeForcedMeasurement(void);
229  float readTemperature(void);
230  float readPressure(void);
231  float readHumidity(void);
232 
233  float readAltitude(float seaLevel);
234  float seaLevelForAltitude(float altitude, float pressure);
235  uint32_t sensorID(void);
236 
237  float getTemperatureCompensation(void);
238  void setTemperatureCompensation(float);
239 
240  Adafruit_Sensor *getTemperatureSensor(void);
241  Adafruit_Sensor *getPressureSensor(void);
242  Adafruit_Sensor *getHumiditySensor(void);
243 
244 protected:
245  Adafruit_I2CDevice *i2c_dev = NULL;
246  Adafruit_SPIDevice *spi_dev = NULL;
247 
248  Adafruit_BME280_Temp *temp_sensor = NULL;
250 
251  Adafruit_BME280_Pressure *pressure_sensor = NULL;
253 
254  Adafruit_BME280_Humidity *humidity_sensor = NULL;
256 
257  void readCoefficients(void);
258  bool isReadingCalibration(void);
259 
260  void write8(byte reg, byte value);
261  uint8_t read8(byte reg);
262  uint16_t read16(byte reg);
263  uint32_t read24(byte reg);
264  int16_t readS16(byte reg);
265  uint16_t read16_LE(byte reg); // little endian
266  int16_t readS16_LE(byte reg); // little endian
267 
268  uint8_t _i2caddr;
269  int32_t _sensorID;
270  int32_t t_fine;
271 
274  int32_t t_fine_adjust = 0;
275 
278 
279  /**************************************************************************/
283  /**************************************************************************/
284  struct config {
285  // inactive duration (standby time) in normal mode
286  // 000 = 0.5 ms
287  // 001 = 62.5 ms
288  // 010 = 125 ms
289  // 011 = 250 ms
290  // 100 = 500 ms
291  // 101 = 1000 ms
292  // 110 = 10 ms
293  // 111 = 20 ms
294  unsigned int t_sb : 3;
295 
296  // filter settings
297  // 000 = filter off
298  // 001 = 2x filter
299  // 010 = 4x filter
300  // 011 = 8x filter
301  // 100 and above = 16x filter
302  unsigned int filter : 3;
303 
304  // unused - don't set
305  unsigned int none : 1;
306  unsigned int spi3w_en : 1;
307 
309  unsigned int get() { return (t_sb << 5) | (filter << 2) | spi3w_en; }
310  };
312 
313  /**************************************************************************/
317  /**************************************************************************/
318  struct ctrl_meas {
319  // temperature oversampling
320  // 000 = skipped
321  // 001 = x1
322  // 010 = x2
323  // 011 = x4
324  // 100 = x8
325  // 101 and above = x16
326  unsigned int osrs_t : 3;
327 
328  // pressure oversampling
329  // 000 = skipped
330  // 001 = x1
331  // 010 = x2
332  // 011 = x4
333  // 100 = x8
334  // 101 and above = x16
335  unsigned int osrs_p : 3;
336 
337  // device mode
338  // 00 = sleep
339  // 01 or 10 = forced
340  // 11 = normal
341  unsigned int mode : 2;
342 
344  unsigned int get() { return (osrs_t << 5) | (osrs_p << 2) | mode; }
345  };
347 
348  /**************************************************************************/
352  /**************************************************************************/
353  struct ctrl_hum {
355  unsigned int none : 5;
356 
357  // pressure oversampling
358  // 000 = skipped
359  // 001 = x1
360  // 010 = x2
361  // 011 = x4
362  // 100 = x8
363  // 101 and above = x16
364  unsigned int osrs_h : 3;
365 
367  unsigned int get() { return (osrs_h); }
368  };
370 };
371 
372 #endif
int16_t dig_H4
humidity compensation value
Definition: Adafruit_BME280.h:102
unsigned int none
unused - don&#39;t set
Definition: Adafruit_BME280.h:355
unsigned int filter
filter settings
Definition: Adafruit_BME280.h:302
int16_t dig_P6
pressure compensation value
Definition: Adafruit_BME280.h:94
unsigned int none
unused - don&#39;t set
Definition: Adafruit_BME280.h:305
Adafruit_BME280_Pressure(Adafruit_BME280 *parent)
Create an Adafruit_Sensor compatible object for the pressure sensor.
Definition: Adafruit_BME280.h:129
ctrl_meas register
Definition: Adafruit_BME280.h:318
int16_t dig_H2
humidity compensation value
Definition: Adafruit_BME280.h:100
Definition: Adafruit_BME280.h:111
Class that stores state and functions for interacting with BME280 IC.
Definition: Adafruit_BME280.h:157
Adafruit_BME280_Temp(Adafruit_BME280 *parent)
Create an Adafruit_Sensor compatible object for the temp sensor.
Definition: Adafruit_BME280.h:115
int16_t dig_P2
pressure compensation value
Definition: Adafruit_BME280.h:90
int16_t dig_P8
pressure compensation value
Definition: Adafruit_BME280.h:96
int32_t _sensorID
ID of the BME Sensor.
Definition: Adafruit_BME280.h:269
Adafruit_BME280_Humidity(Adafruit_BME280 *parent)
Create an Adafruit_Sensor compatible object for the humidity sensor.
Definition: Adafruit_BME280.h:143
bme280_calib_data _bme280_calib
here calibration data is stored
Definition: Adafruit_BME280.h:277
bool getEvent(sensors_event_t *)
Gets the temperature as a standard sensor event.
Definition: Adafruit_BME280.cpp:556
int16_t dig_T3
temperature compensation value
Definition: Adafruit_BME280.h:87
unsigned int osrs_p
pressure oversampling
Definition: Adafruit_BME280.h:335
int16_t dig_T2
temperature compensation value
Definition: Adafruit_BME280.h:86
int16_t dig_P3
pressure compensation value
Definition: Adafruit_BME280.h:91
config _configReg
config register object
Definition: Adafruit_BME280.h:311
sensor_filter
filter values
Definition: Adafruit_BME280.h:189
ctrl_hum register
Definition: Adafruit_BME280.h:353
int8_t dig_H6
humidity compensation value
Definition: Adafruit_BME280.h:104
Definition: Adafruit_BME280.h:125
int16_t dig_H5
humidity compensation value
Definition: Adafruit_BME280.h:103
uint8_t dig_H1
humidity compensation value
Definition: Adafruit_BME280.h:99
int16_t dig_P4
pressure compensation value
Definition: Adafruit_BME280.h:92
config register
Definition: Adafruit_BME280.h:284
unsigned int osrs_h
pressure oversampling
Definition: Adafruit_BME280.h:364
int16_t dig_P5
pressure compensation value
Definition: Adafruit_BME280.h:93
uint16_t dig_P1
pressure compensation value
Definition: Adafruit_BME280.h:89
ctrl_hum _humReg
hum register object
Definition: Adafruit_BME280.h:369
unsigned int spi3w_en
unused - don&#39;t set
Definition: Adafruit_BME280.h:306
unsigned int t_sb
inactive duration (standby time) in normal mode
Definition: Adafruit_BME280.h:294
uint8_t dig_H3
humidity compensation value
Definition: Adafruit_BME280.h:101
unsigned int osrs_t
temperature oversampling
Definition: Adafruit_BME280.h:326
Definition: Adafruit_BME280.h:139
sensor_sampling
sampling rates
Definition: Adafruit_BME280.h:164
unsigned int mode
device mode
Definition: Adafruit_BME280.h:341
uint16_t dig_T1
temperature compensation value
Definition: Adafruit_BME280.h:85
int16_t dig_P7
pressure compensation value
Definition: Adafruit_BME280.h:95
int16_t dig_P9
pressure compensation value
Definition: Adafruit_BME280.h:97
#define BME280_ADDRESS
default I2C address
Definition: Adafruit_BME280.h:33
int32_t t_fine
Definition: Adafruit_BME280.h:270
uint8_t _i2caddr
I2C addr for the TwoWire interface.
Definition: Adafruit_BME280.h:268
void getSensor(sensor_t *)
Gets the sensor_t data for the BME280&#39;s temperature sensor.
Definition: Adafruit_BME280.cpp:533
standby_duration
standby duration in ms
Definition: Adafruit_BME280.h:202
ctrl_meas _measReg
measurement register object
Definition: Adafruit_BME280.h:346
sensor_mode
power modes
Definition: Adafruit_BME280.h:178
calibration data
Definition: Adafruit_BME280.h:84