BME280 and BME680 easyC Library 1.0.0
This is a library for the BME 280 and BME680 easyC board.
Loading...
Searching...
No Matches
BME280.h
Go to the documentation of this file.
1// clang-format off
73// clang-format on
74#include "Arduino.h" // Arduino data type definitions
75#include <SPI.h> // Standard SPI library
76#include <Wire.h> // Standard I2C "Wire" library
77#ifndef BME280_h
79#define BME280_h
80/*************************************************************************************************
81** Declare constants used in the class **
82*************************************************************************************************/
83#ifndef I2C_MODES
85#define I2C_MODES
86const uint32_t I2C_STANDARD_MODE = 100000;
87const uint32_t I2C_FAST_MODE = 400000;
88const uint32_t I2C_FAST_MODE_PLUS_MODE = 1000000;
89const uint32_t I2C_HIGH_SPEED_MODE = 3400000;
90#endif
91const uint32_t SPI_HERTZ = 500000;
92const uint8_t BME280_CHIPID_REG = 0xD0;
93const uint8_t BME280_CHIPID = 0x60;
94const uint8_t BME280_SOFTRESET_REG = 0xE0;
95const uint8_t BME280_CONTROLHUMID_REG = 0xF2;
96const uint8_t BME280_STATUS_REG = 0xF3;
97const uint8_t BME280_CONTROL_REG = 0xF4;
98const uint8_t BME280_CONFIG_REG = 0xF5;
99const uint8_t BME280_PRESSUREDATA_REG = 0xF7;
100const uint8_t BME280_TEMPDATA_REG = 0xFA;
101const uint8_t BME280_HUMIDDATA_REG = 0xFD;
102const uint8_t BME280_SOFTWARE_CODE = 0xB6;
103const uint8_t BME280_T1_REG = 0x88;
104const uint8_t BME280_T2_REG = 0x8A;
105const uint8_t BME280_T3_REG = 0x8C;
106const uint8_t BME280_P1_REG = 0x8E;
107const uint8_t BME280_P2_REG = 0x90;
108const uint8_t BME280_P3_REG = 0x92;
109const uint8_t BME280_P4_REG = 0x94;
110const uint8_t BME280_P5_REG = 0x96;
111const uint8_t BME280_P6_REG = 0x98;
112const uint8_t BME280_P7_REG = 0x9A;
113const uint8_t BME280_P8_REG = 0x9C;
114const uint8_t BME280_P9_REG = 0x9E;
115const uint8_t BME280_H1_REG = 0xA1;
116const uint8_t BME280_H2_REG = 0xE1;
117const uint8_t BME280_H3_REG = 0xE3;
118const uint8_t BME280_H4_REG = 0xE4;
119const uint8_t BME280_H5_REG = 0xE5;
120const uint8_t BME280_H6_REG = 0xE7;
121
122/*************************************************************************************************
123** Declare enumerated types used in the class **
124*************************************************************************************************/
183
185{
192 public:
193 BME280_Class();
195 bool begin();
196 bool begin(const uint32_t i2cSpeed);
197 bool begin(const uint8_t chipSelect);
198 bool begin(const uint8_t chipSelect, const uint8_t mosi, const uint8_t miso, const uint8_t sck);
199 uint8_t mode(const uint8_t operatingMode = UINT8_MAX);
200 bool setOversampling(const uint8_t sensor, const uint8_t sampling);
201 uint8_t getOversampling(const uint8_t sensor, const bool actual = false);
202 uint8_t iirFilter(const uint8_t iirFilterSetting = UINT8_MAX);
203 uint8_t inactiveTime(const uint8_t inactiveTimeSetting = UINT8_MAX);
204 uint32_t measurementTime(const uint8_t measureTimeSetting = 1);
205 void getSensorData(int32_t &temp, int32_t &hum, int32_t &press);
206 void reset();
207
208 private:
209 uint8_t readByte(const uint8_t addr);
210 void readSensors();
211 void getCalibration();
212 bool _TransmissionStatus = false;
213 uint8_t _I2CAddress = 0;
214 uint8_t _cs, _sck, _mosi, _miso;
216 int8_t _cal_dig_H6 = 0;
221 uint8_t _mode = UINT8_MAX;
223 /*********************************************************************************************
224 ** Declare the getData and putData methods as template functions. All device I/O is done **
225 ** through these two functions regardless of whether I2C, hardware SPI or software SPI is **
226 ** being used. The two functions are designed so that only the address and a variable are **
227 ** passed in and the functions determine the size of the parameter variable and reads or **
228 ** writes that many bytes. So if a read is called using a character array[10] then 10 bytes **
229 ** are read, if called with a int8 then only one byte is read. The return value, if used, **
230 ** is the number of bytes read or written. This is done by using template function **
231 ** definitions which need to be defined in this header file rather than in the c++ program **
232 ** library file. **
233 *********************************************************************************************/
234 template <typename T> uint8_t &getData(const uint8_t addr, T &value)
235 {
244 uint8_t *bytePtr = (uint8_t *)&value; // Pointer to structure beginning
245 static uint8_t structSize = sizeof(T); // Number of bytes in structure
246 if (_I2CAddress) // If I2C address is non-zero then assume I2C bus
247 {
248 Wire.beginTransmission(_I2CAddress); // Address the I2C device
249 Wire.write(addr); // Send register address to read
250 _TransmissionStatus = Wire.endTransmission(); // Close transmission
251 Wire.requestFrom(_I2CAddress, sizeof(T)); // Request 1 byte of data
252 structSize = Wire.available(); // Use the actual number of bytes
253 for (uint8_t i = 0; i < structSize; i++)
254 *bytePtr++ = Wire.read(); // loop for each byte to be read
255 }
256 else // Otherwise use SPI bus
257 {
258 if (_sck == 0) // if sck is zero then hardware SPI
259 {
260 SPI.beginTransaction(SPISettings(SPI_HERTZ, MSBFIRST, SPI_MODE0)); // Start the SPI transaction
261 digitalWrite(_cs, LOW); // Tell BME280 to listen up
262 SPI.transfer(addr | 0x80); // bit 7 is high, so read a byte
263 for (uint8_t i = 0; i < structSize; i++)
264 *bytePtr++ = SPI.transfer(0); // loop for each byte to be read
265 digitalWrite(_cs, HIGH); // Tell BME280 to stop listening
266 SPI.endTransaction(); // End the transaction
267 }
268 else // otherwise we are using software SPI
269 {
270 int8_t i, j;
271 uint8_t reply;
272 digitalWrite(_cs, LOW); // Tell BME280 to listen up
273 for (j = 7; j >= 0; j--)
274 { // First send the address byte
275 digitalWrite(_sck, LOW); // set the clock signal
276 digitalWrite(_mosi, ((addr) | 0x80) & (1 << j)); // set the MOSI pin state
277 digitalWrite(_sck, HIGH); // reset the clock signal
278 } // of for-next each bit
279 for (i = 0; i < structSize; i++)
280 {
281 reply = 0; // reset our return byte
282 for (j = 7; j >= 0; j--) // Now read the data at that byte
283 {
284 reply <<= 1; // shift buffer one bit left
285 digitalWrite(_sck, LOW); // set and reset the clock signal
286 digitalWrite(_sck, HIGH); // pin to get the next MISO bit
287 if (digitalRead(_miso))
288 reply |= 1; // read the MISO bit, add to reply
289 } // of for-next each bit
290 *bytePtr++ = reply; // Add byte just read to return data
291 } // of for-next each byte to be read
292 digitalWrite(_cs, HIGH); // Tell BME280 to stop listening
293 } // of if-then-else we are using hardware SPI
294 } // of if-then-else we are using I2C
295 return (structSize); // return the number of bytes read
296 } // of method getData()
297
298 template <typename T> uint8_t &putData(const uint8_t addr, const T &value)
299 {
307 const uint8_t *bytePtr = (const uint8_t *)&value; // Pointer to structure beginning
308 static uint8_t structSize = sizeof(T); // Number of bytes in structure
309 if (_I2CAddress) // Use I2C protocol if address is non-zero
310 {
311 Wire.beginTransmission(_I2CAddress); // Address the I2C device
312 Wire.write(addr); // Send register address to write
313 for (uint8_t i = 0; i < sizeof(T); i++)
314 Wire.write(*bytePtr++); // loop for each byte to be written
315 _TransmissionStatus = Wire.endTransmission(); // Close transmission
316 }
317 else
318 {
319 if (_sck == 0) // if sck is zero then use hardware SPI
320 {
321 SPI.beginTransaction(SPISettings(SPI_HERTZ, MSBFIRST, SPI_MODE0)); // start the SPI transaction
322 digitalWrite(_cs, LOW); // Tell BME280 to listen up
323 SPI.transfer(addr & ~0x80); // bit 7 is low, so write a byte
324 for (uint8_t i = 0; i < structSize; i++)
325 SPI.transfer(*bytePtr++); // loop for each byte to be written
326 digitalWrite(_cs, HIGH); // Tell BME280 to stop listening
327 SPI.endTransaction(); // End the transaction
328 }
329 else // Otherwise use software SPI
330 {
331 int8_t i, j;
332 uint8_t reply;
333 for (i = 0; i < structSize; i++)
334 {
335 reply = 0; // reset our return byte
336 digitalWrite(_cs, LOW); // Tell BME280 to listen up
337 for (j = 7; j >= 0; j--)
338 { // First send the address byte
339 digitalWrite(_sck, LOW); // set the clock signal
340 digitalWrite(_mosi, (addr & ~0x80) & (1 << j)); // set the MOSI pin state
341 digitalWrite(_sck, HIGH); // reset the clock signal
342 } // of for-next each bit
343 for (j = 7; j >= 0; j--) // Now read the data at that byte
344 {
345 reply <<= 1; // shift buffer one bit left
346 digitalWrite(_sck, LOW); // set the clock signal
347 digitalWrite(_mosi, *bytePtr & (1 << j)); // set the MOSI pin state
348 digitalWrite(_sck, HIGH); // reset the clock signal
349 } // of for-next each bit
350#ifdef ESP32
351 static uint8_t dummyVar = *bytePtr++; // go to next byte to write (dummyVar only required for ESP32)
352#else
353 *bytePtr++; // go to next byte to write
354#endif
355 digitalWrite(_cs, HIGH); // Tell BME280 to stop listening
356 } // of for-next each byte to be read
357 } // of if-then-else we are using hardware SPI
358 } // of if-then-else we are using I2C
359 return (structSize); // return number of bytes written
360 } // of method putData()
361}; // of BME280 class definition
362#endif
const uint8_t BME280_SOFTWARE_CODE
Reset on this written to resetreg.
Definition BME280.h:102
const uint8_t BME280_H3_REG
calibration data register
Definition BME280.h:117
const uint8_t BME280_P9_REG
calibration data register
Definition BME280.h:114
const uint8_t BME280_CONTROL_REG
Device control register.
Definition BME280.h:97
const uint8_t BME280_P2_REG
calibration data register
Definition BME280.h:107
const uint8_t BME280_T3_REG
calibration data register
Definition BME280.h:105
const uint8_t BME280_H4_REG
calibration data register
Definition BME280.h:118
const uint32_t I2C_STANDARD_MODE
Default normal I2C 100KHz speed.
Definition BME280.h:86
const uint8_t BME280_STATUS_REG
Device status register.
Definition BME280.h:96
modeTypes
Definition BME280.h:127
@ UnknownMode
Definition BME280.h:132
@ ForcedMode
Definition BME280.h:129
@ NormalMode
Definition BME280.h:131
@ ForcedMode2
Definition BME280.h:130
@ SleepMode
Definition BME280.h:128
const uint32_t SPI_HERTZ
SPI speed in Hz.
Definition BME280.h:91
iirFilterTypes
Definition BME280.h:155
@ IIR4
Definition BME280.h:158
@ UnknownIIR
Definition BME280.h:161
@ IIROff
Definition BME280.h:156
@ IIR2
Definition BME280.h:157
@ IIR8
Definition BME280.h:159
@ IIR16
Definition BME280.h:160
const uint32_t I2C_HIGH_SPEED_MODE
Turbo mode.
Definition BME280.h:89
const uint32_t I2C_FAST_MODE
Fast mode.
Definition BME280.h:87
oversamplingTypes
Definition BME280.h:144
@ Oversample4
Definition BME280.h:148
@ Oversample8
Definition BME280.h:149
@ Oversample2
Definition BME280.h:147
@ UnknownOversample
Definition BME280.h:151
@ Oversample1
Definition BME280.h:146
@ SensorOff
Definition BME280.h:145
@ Oversample16
Definition BME280.h:150
const uint8_t BME280_CHIPID
Hard-coded value 0x60 for BME280.
Definition BME280.h:93
const uint8_t BME280_P6_REG
calibration data register
Definition BME280.h:111
const uint8_t BME280_CONFIG_REG
Device configuration register.
Definition BME280.h:98
const uint8_t BME280_HUMIDDATA_REG
Humidity readings register.
Definition BME280.h:101
inactiveTimeTypes
Definition BME280.h:165
@ inactive10ms
Definition BME280.h:172
@ inactive63ms
Definition BME280.h:167
@ inactive250ms
Definition BME280.h:169
@ inactive20ms
Definition BME280.h:173
@ inactive1000ms
Definition BME280.h:171
@ UnknownInactive
Definition BME280.h:174
@ inactive500ms
Definition BME280.h:170
@ inactiveHalf
Definition BME280.h:166
@ inactive125ms
Definition BME280.h:168
const uint8_t BME280_SOFTRESET_REG
Reset when 0xB6 is written here.
Definition BME280.h:94
const uint8_t BME280_H5_REG
calibration data register
Definition BME280.h:119
const uint8_t BME280_PRESSUREDATA_REG
Pressure readings register.
Definition BME280.h:99
const uint8_t BME280_CHIPID_REG
Chip-Id register.
Definition BME280.h:92
const uint8_t BME280_H2_REG
calibration data register
Definition BME280.h:116
const uint8_t BME280_P1_REG
calibration data register
Definition BME280.h:106
const uint8_t BME280_T1_REG
Declare BME280 registers for the.
Definition BME280.h:103
const uint8_t BME280_P4_REG
calibration data register
Definition BME280.h:109
const uint8_t BME280_P3_REG
calibration data register
Definition BME280.h:108
const uint8_t BME280_TEMPDATA_REG
Temperature readings register.
Definition BME280.h:100
sensorTypes
Definition BME280.h:136
@ UnknownSensor
Definition BME280.h:140
@ HumiditySensor
Definition BME280.h:138
@ TemperatureSensor
Definition BME280.h:137
@ PressureSensor
Definition BME280.h:139
const uint8_t BME280_H6_REG
calibration data register
Definition BME280.h:120
const uint8_t BME280_P5_REG
calibration data register
Definition BME280.h:110
measureTimeTypes
Definition BME280.h:178
@ TypicalMeasure
Definition BME280.h:179
@ UnknownMeasure
Definition BME280.h:181
@ MaximumMeasure
Definition BME280.h:180
const uint8_t BME280_H1_REG
calibration data register
Definition BME280.h:115
const uint32_t I2C_FAST_MODE_PLUS_MODE
Really fast mode.
Definition BME280.h:88
const uint8_t BME280_P8_REG
calibration data register
Definition BME280.h:113
const uint8_t BME280_CONTROLHUMID_REG
Humidity control register.
Definition BME280.h:95
const uint8_t BME280_P7_REG
calibration data register
Definition BME280.h:112
const uint8_t BME280_T2_REG
calibration data register
Definition BME280.h:104
BME280 Class definition.
Definition BME280.h:185
int32_t _tfine
Definition BME280.h:222
int8_t _cal_dig_H6
Calibration variables.
Definition BME280.h:216
uint8_t & putData(const uint8_t addr, const T &value)
Definition BME280.h:298
int16_t _cal_dig_H5
Calibration variables.
Definition BME280.h:220
int16_t _cal_dig_P3
Definition BME280.h:218
int32_t _Pressure
Definition BME280.h:222
int16_t _cal_dig_P9
Definition BME280.h:219
void reset()
Definition BME280.cpp:391
uint8_t getOversampling(const uint8_t sensor, const bool actual=false)
Definition BME280.cpp:188
uint8_t readByte(const uint8_t addr)
Definition BME280.cpp:134
uint8_t _miso
Hardware and software SPI pins for SPI.
Definition BME280.h:214
int16_t _cal_dig_P8
Definition BME280.h:219
int16_t _cal_dig_P7
Definition BME280.h:218
uint8_t iirFilter(const uint8_t iirFilterSetting=UINT8_MAX)
Definition BME280.cpp:287
void getSensorData(int32_t &temp, int32_t &hum, int32_t &press)
Definition BME280.cpp:378
int32_t _Temperature
Definition BME280.h:222
int16_t _cal_dig_H2
Definition BME280.h:219
int16_t _cal_dig_T2
Definition BME280.h:218
void getCalibration()
Definition BME280.cpp:101
uint8_t inactiveTime(const uint8_t inactiveTimeSetting=UINT8_MAX)
Definition BME280.cpp:305
uint8_t mode(const uint8_t operatingMode=UINT8_MAX)
Definition BME280.cpp:145
bool _TransmissionStatus
I2C communications status.
Definition BME280.h:212
uint8_t & getData(const uint8_t addr, T &value)
Definition BME280.h:234
~BME280_Class()
Empty & unused class destructor.
Definition BME280.cpp:10
uint8_t _cs
Definition BME280.h:214
int16_t _cal_dig_T3
Definition BME280.h:218
int16_t _cal_dig_P4
Definition BME280.h:218
int16_t _cal_dig_P6
Definition BME280.h:218
int16_t _cal_dig_P2
Definition BME280.h:218
int16_t _cal_dig_P5
Definition BME280.h:218
void readSensors()
Definition BME280.cpp:216
uint8_t _mode
Last mode set.
Definition BME280.h:221
uint8_t _I2CAddress
Default is no I2C address known.
Definition BME280.h:213
BME280_Class()
Empty & unused class constructor.
Definition BME280.cpp:9
uint32_t measurementTime(const uint8_t measureTimeSetting=1)
Definition BME280.cpp:323
uint8_t _cal_dig_H1
Definition BME280.h:215
uint16_t _cal_dig_P1
Calibration variables.
Definition BME280.h:217
uint8_t _cal_dig_H3
Calibration variables.
Definition BME280.h:215
int32_t _Humidity
Sensor global variables.
Definition BME280.h:222
uint16_t _cal_dig_T1
Definition BME280.h:217
uint8_t _sck
Definition BME280.h:214
int16_t _cal_dig_H4
Definition BME280.h:219
bool begin()
Definition BME280.cpp:11
uint8_t _mosi
Definition BME280.h:214
bool setOversampling(const uint8_t sensor, const uint8_t sampling)
Definition BME280.cpp:160