111 #define CONCAT_BYTES(msb, lsb) \ 112 (((uint16_t)msb << 8) | (uint16_t)lsb) 114 #define _BV(bit) (1 << (bit)) 119 #ifndef I2C_MODES // If the I2C_Modes haven't been declared yet 121 const uint32_t I2C_STANDARD_MODE{100000}; 122 const uint32_t I2C_FAST_MODE{400000}; 123 const uint32_t I2C_FAST_MODE_PLUS{1000000}; 124 const uint32_t I2C_HIGH_SPEED_MODE{3400000}; 132 enum sensorTypes { TemperatureSensor, HumiditySensor, PressureSensor, GasSensor, UnknownSensor };
144 enum iirFilterTypes { IIROff, IIR2, IIR4, IIR8, IIR16, IIR32, IIR64, IIR128, UnknownIIR };
155 bool begin(
const uint32_t i2cSpeed);
156 bool begin(
const uint8_t chipSelect);
157 bool begin(
const uint32_t i2cSpeed,
const uint8_t i2cAddress);
158 bool begin(
const uint8_t chipSelect,
const uint8_t mosi,
159 const uint8_t miso,
const uint8_t sck);
161 const uint8_t sampling = UINT8_MAX)
const;
162 bool setGas(uint16_t GasTemp, uint16_t GasMillis)
const;
163 uint8_t
setIIRFilter(
const uint8_t iirFilterSetting = UINT8_MAX)
const;
165 int32_t &press, int32_t &
gas,
166 const bool waitSwitch =
true);
172 bool commonInitialization();
173 uint8_t readByte(
const uint8_t addr)
const;
174 uint8_t readSensors(
const bool waitSwitch);
175 void waitForReadings()
const;
176 void getCalibration();
177 uint8_t _I2CAddress = 0;
178 uint16_t _I2CSpeed = 0;
179 uint8_t _cs, _sck, _mosi, _miso;
180 uint8_t _H6, _P10, _res_heat_range;
181 int8_t _H3, _H4, _H5, _H7, _G1, _G3, _T3, _P3, _P6, _P7, _res_heat,
183 uint16_t _H1, _H2, _T1, _P1;
184 int16_t _G2, _T2, _P2, _P4, _P5, _P8, _P9;
185 int32_t _tfine, _Temperature, _Pressure, _Humidity, _Gas;
200 template <
typename T>
201 uint8_t &getData(
const uint8_t addr, T &value)
const {
209 uint8_t * bytePtr = (uint8_t *)&value;
210 static uint8_t structSize =
sizeof(T);
213 Wire.beginTransmission(_I2CAddress);
215 Wire.endTransmission();
216 Wire.requestFrom(_I2CAddress,
sizeof(T));
217 structSize = Wire.available();
218 for (uint8_t i = 0; i < structSize; i++)
219 *bytePtr++ = Wire.read();
225 SPI.beginTransaction(
226 SPISettings(
SPI_HERZ, MSBFIRST, SPI_MODE0));
227 digitalWrite(_cs, LOW);
228 SPI.transfer(addr | 0x80);
229 for (uint8_t i = 0; i < structSize; i++)
230 *bytePtr++ = SPI.transfer(0);
231 digitalWrite(_cs, HIGH);
232 SPI.endTransaction();
236 digitalWrite(_cs, LOW);
237 for (j = 7; j >= 0; j--)
239 digitalWrite(_sck, LOW);
240 digitalWrite(_mosi, ((addr) | 0x80) & (1 << j));
241 digitalWrite(_sck, HIGH);
243 for (i = 0; i < structSize; i++)
246 for (j = 7; j >= 0; j--)
249 digitalWrite(_sck, LOW);
250 digitalWrite(_sck, HIGH);
251 if (digitalRead(_miso)) reply |= 1;
255 digitalWrite(_cs, HIGH);
260 template <
typename T>
261 uint8_t &putData(
const uint8_t addr,
const T &value)
const {
269 const uint8_t *bytePtr = (
const uint8_t *)&value;
270 static uint8_t structSize =
sizeof(T);
273 Wire.beginTransmission(_I2CAddress);
275 for (uint8_t i = 0; i <
sizeof(T); i++)
276 Wire.write(*bytePtr++);
277 Wire.endTransmission();
281 SPI.beginTransaction(
282 SPISettings(
SPI_HERZ, MSBFIRST, SPI_MODE0));
283 digitalWrite(_cs, LOW);
284 SPI.transfer(addr & ~0x80);
285 for (uint8_t i = 0; i < structSize; i++) {
286 SPI.transfer(*bytePtr++);
288 digitalWrite(_cs, HIGH);
289 SPI.endTransaction();
294 for (i = 0; i < structSize; i++)
297 digitalWrite(_cs, LOW);
298 for (j = 7; j >= 0; j--)
300 digitalWrite(_sck, LOW);
301 digitalWrite(_mosi, (addr & ~0x80) & (1 << j));
302 digitalWrite(_sck, HIGH);
304 for (j = 7; j >= 0; j--)
307 digitalWrite(_sck, LOW);
308 digitalWrite(_mosi, *bytePtr & (1 << j));
309 digitalWrite(_sck, HIGH);
311 digitalWrite(_cs, HIGH);
bool begin()
Definition: Zanshin_BME680.cpp:97
iirFilterTypes
Enumerate the iir filter types.
Definition: Zanshin_BME680.h:145
uint8_t setIIRFilter(const uint8_t iirFilterSetting=UINT8_MAX) const
Definition: Zanshin_BME680.cpp:360
bool measuring() const
true if currently measuring
Definition: Zanshin_BME680.cpp:560
sensorTypes
Enumerate the sensor type.
Definition: Zanshin_BME680.h:133
uint8_t setOversampling(const uint8_t sensor, const uint8_t sampling=UINT8_MAX) const
Definition: Zanshin_BME680.cpp:298
uint8_t getI2CAddress() const
Definition: Zanshin_BME680.cpp:396
~BME680_Class()
Definition: Zanshin_BME680.cpp:88
void reset()
Definition: Zanshin_BME680.cpp:221
oversamplingTypes
Enumerate the Oversampling types.
Definition: Zanshin_BME680.h:135
void triggerMeasurement() const
trigger a measurement
Definition: Zanshin_BME680.cpp:571
int32_t gas
BME680 gas resistance value.
Definition: ESP32FeatherWiFiDemo.ino:115
BME680_Class()
Definition: Zanshin_BME680.cpp:82
Main BME680 class for the temperature / humidity / pressure sensor.
Definition: Zanshin_BME680.h:147
uint8_t getSensorData(int32_t &temp, int32_t &hum, int32_t &press, int32_t &gas, const bool waitSwitch=true)
Definition: Zanshin_BME680.cpp:379
const uint32_t SPI_HERZ
SPI speed in Hz.
Definition: Zanshin_BME680.h:127
bool setGas(uint16_t GasTemp, uint16_t GasMillis) const
Definition: Zanshin_BME680.cpp:512