save all
This commit is contained in:
646
libraries/Adafruit_BME280_Library/Adafruit_BME280.cpp
Normal file
646
libraries/Adafruit_BME280_Library/Adafruit_BME280.cpp
Normal file
@@ -0,0 +1,646 @@
|
||||
/*!
|
||||
* @file Adafruit_BME280.cpp
|
||||
*
|
||||
* @mainpage Adafruit BME280 humidity, temperature & pressure sensor
|
||||
*
|
||||
* @section intro_sec Introduction
|
||||
*
|
||||
* Driver for the BME280 humidity, temperature & pressure sensor
|
||||
*
|
||||
* These sensors use I2C or SPI to communicate, 2 or 4 pins are required
|
||||
* to interface.
|
||||
*
|
||||
* Designed specifically to work with the Adafruit BME280 Breakout
|
||||
* ----> http://www.adafruit.com/products/2652
|
||||
*
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* @section author Author
|
||||
*
|
||||
* Written by Kevin "KTOWN" Townsend for Adafruit Industries.
|
||||
*
|
||||
* @section license License
|
||||
*
|
||||
* BSD license, all text here must be included in any redistribution.
|
||||
* See the LICENSE file for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "Adafruit_BME280.h"
|
||||
#include "Arduino.h"
|
||||
|
||||
/*!
|
||||
* @brief class constructor
|
||||
*/
|
||||
Adafruit_BME280::Adafruit_BME280() {}
|
||||
|
||||
/*!
|
||||
* @brief class constructor if using hardware SPI
|
||||
* @param cspin the chip select pin to use
|
||||
* @param *theSPI
|
||||
* optional SPI object
|
||||
*/
|
||||
Adafruit_BME280::Adafruit_BME280(int8_t cspin, SPIClass *theSPI) {
|
||||
spi_dev = new Adafruit_SPIDevice(cspin, 1000000, SPI_BITORDER_MSBFIRST,
|
||||
SPI_MODE0, theSPI);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief class constructor if using software SPI
|
||||
* @param cspin the chip select pin to use
|
||||
* @param mosipin the MOSI pin to use
|
||||
* @param misopin the MISO pin to use
|
||||
* @param sckpin the SCK pin to use
|
||||
*/
|
||||
Adafruit_BME280::Adafruit_BME280(int8_t cspin, int8_t mosipin, int8_t misopin,
|
||||
int8_t sckpin) {
|
||||
spi_dev = new Adafruit_SPIDevice(cspin, sckpin, misopin, mosipin);
|
||||
}
|
||||
|
||||
Adafruit_BME280::~Adafruit_BME280(void) {
|
||||
if (spi_dev) {
|
||||
delete spi_dev;
|
||||
}
|
||||
if (i2c_dev) {
|
||||
delete i2c_dev;
|
||||
}
|
||||
if (temp_sensor) {
|
||||
delete temp_sensor;
|
||||
}
|
||||
if (pressure_sensor) {
|
||||
delete pressure_sensor;
|
||||
}
|
||||
if (humidity_sensor) {
|
||||
delete humidity_sensor;
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Initialise sensor with given parameters / settings
|
||||
* @param addr the I2C address the device can be found on
|
||||
* @param theWire the I2C object to use, defaults to &Wire
|
||||
* @returns true on success, false otherwise
|
||||
*/
|
||||
bool Adafruit_BME280::begin(uint8_t addr, TwoWire *theWire) {
|
||||
if (spi_dev == NULL) {
|
||||
// I2C mode
|
||||
if (i2c_dev)
|
||||
delete i2c_dev;
|
||||
i2c_dev = new Adafruit_I2CDevice(addr, theWire);
|
||||
if (!i2c_dev->begin())
|
||||
return false;
|
||||
} else {
|
||||
// SPI mode
|
||||
if (!spi_dev->begin())
|
||||
return false;
|
||||
}
|
||||
return init();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Initialise sensor with given parameters / settings
|
||||
* @returns true on success, false otherwise
|
||||
*/
|
||||
bool Adafruit_BME280::init() {
|
||||
// check if sensor, i.e. the chip ID is correct
|
||||
_sensorID = read8(BME280_REGISTER_CHIPID);
|
||||
if (_sensorID != 0x60)
|
||||
return false;
|
||||
|
||||
// reset the device using soft-reset
|
||||
// this makes sure the IIR is off, etc.
|
||||
write8(BME280_REGISTER_SOFTRESET, 0xB6);
|
||||
|
||||
// wait for chip to wake up.
|
||||
delay(10);
|
||||
|
||||
// if chip is still reading calibration, delay
|
||||
while (isReadingCalibration())
|
||||
delay(10);
|
||||
|
||||
readCoefficients(); // read trimming parameters, see DS 4.2.2
|
||||
|
||||
setSampling(); // use defaults
|
||||
|
||||
delay(100);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief setup sensor with given parameters / settings
|
||||
*
|
||||
* This is simply a overload to the normal begin()-function, so SPI users
|
||||
* don't get confused about the library requiring an address.
|
||||
* @param mode the power mode to use for the sensor
|
||||
* @param tempSampling the temp samping rate to use
|
||||
* @param pressSampling the pressure sampling rate to use
|
||||
* @param humSampling the humidity sampling rate to use
|
||||
* @param filter the filter mode to use
|
||||
* @param duration the standby duration to use
|
||||
*/
|
||||
void Adafruit_BME280::setSampling(sensor_mode mode,
|
||||
sensor_sampling tempSampling,
|
||||
sensor_sampling pressSampling,
|
||||
sensor_sampling humSampling,
|
||||
sensor_filter filter,
|
||||
standby_duration duration) {
|
||||
_measReg.mode = mode;
|
||||
_measReg.osrs_t = tempSampling;
|
||||
_measReg.osrs_p = pressSampling;
|
||||
|
||||
_humReg.osrs_h = humSampling;
|
||||
_configReg.filter = filter;
|
||||
_configReg.t_sb = duration;
|
||||
_configReg.spi3w_en = 0;
|
||||
|
||||
// making sure sensor is in sleep mode before setting configuration
|
||||
// as it otherwise may be ignored
|
||||
write8(BME280_REGISTER_CONTROL, MODE_SLEEP);
|
||||
|
||||
// you must make sure to also set REGISTER_CONTROL after setting the
|
||||
// CONTROLHUMID register, otherwise the values won't be applied (see
|
||||
// DS 5.4.3)
|
||||
write8(BME280_REGISTER_CONTROLHUMID, _humReg.get());
|
||||
write8(BME280_REGISTER_CONFIG, _configReg.get());
|
||||
write8(BME280_REGISTER_CONTROL, _measReg.get());
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Writes an 8 bit value over I2C or SPI
|
||||
* @param reg the register address to write to
|
||||
* @param value the value to write to the register
|
||||
*/
|
||||
void Adafruit_BME280::write8(byte reg, byte value) {
|
||||
byte buffer[2];
|
||||
buffer[1] = value;
|
||||
if (i2c_dev) {
|
||||
buffer[0] = reg;
|
||||
i2c_dev->write(buffer, 2);
|
||||
} else {
|
||||
buffer[0] = reg & ~0x80;
|
||||
spi_dev->write(buffer, 2);
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Reads an 8 bit value over I2C or SPI
|
||||
* @param reg the register address to read from
|
||||
* @returns the data byte read from the device
|
||||
*/
|
||||
uint8_t Adafruit_BME280::read8(byte reg) {
|
||||
uint8_t buffer[1];
|
||||
if (i2c_dev) {
|
||||
buffer[0] = uint8_t(reg);
|
||||
i2c_dev->write_then_read(buffer, 1, buffer, 1);
|
||||
} else {
|
||||
buffer[0] = uint8_t(reg | 0x80);
|
||||
spi_dev->write_then_read(buffer, 1, buffer, 1);
|
||||
}
|
||||
return buffer[0];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Reads a 16 bit value over I2C or SPI
|
||||
* @param reg the register address to read from
|
||||
* @returns the 16 bit data value read from the device
|
||||
*/
|
||||
uint16_t Adafruit_BME280::read16(byte reg) {
|
||||
uint8_t buffer[2];
|
||||
|
||||
if (i2c_dev) {
|
||||
buffer[0] = uint8_t(reg);
|
||||
i2c_dev->write_then_read(buffer, 1, buffer, 2);
|
||||
} else {
|
||||
buffer[0] = uint8_t(reg | 0x80);
|
||||
spi_dev->write_then_read(buffer, 1, buffer, 2);
|
||||
}
|
||||
return uint16_t(buffer[0]) << 8 | uint16_t(buffer[1]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Reads a signed 16 bit little endian value over I2C or SPI
|
||||
* @param reg the register address to read from
|
||||
* @returns the 16 bit data value read from the device
|
||||
*/
|
||||
uint16_t Adafruit_BME280::read16_LE(byte reg) {
|
||||
uint16_t temp = read16(reg);
|
||||
return (temp >> 8) | (temp << 8);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Reads a signed 16 bit value over I2C or SPI
|
||||
* @param reg the register address to read from
|
||||
* @returns the 16 bit data value read from the device
|
||||
*/
|
||||
int16_t Adafruit_BME280::readS16(byte reg) { return (int16_t)read16(reg); }
|
||||
|
||||
/*!
|
||||
* @brief Reads a signed little endian 16 bit value over I2C or SPI
|
||||
* @param reg the register address to read from
|
||||
* @returns the 16 bit data value read from the device
|
||||
*/
|
||||
int16_t Adafruit_BME280::readS16_LE(byte reg) {
|
||||
return (int16_t)read16_LE(reg);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Reads a 24 bit value over I2C
|
||||
* @param reg the register address to read from
|
||||
* @returns the 24 bit data value read from the device
|
||||
*/
|
||||
uint32_t Adafruit_BME280::read24(byte reg) {
|
||||
uint8_t buffer[3];
|
||||
|
||||
if (i2c_dev) {
|
||||
buffer[0] = uint8_t(reg);
|
||||
i2c_dev->write_then_read(buffer, 1, buffer, 3);
|
||||
} else {
|
||||
buffer[0] = uint8_t(reg | 0x80);
|
||||
spi_dev->write_then_read(buffer, 1, buffer, 3);
|
||||
}
|
||||
|
||||
return uint32_t(buffer[0]) << 16 | uint32_t(buffer[1]) << 8 |
|
||||
uint32_t(buffer[2]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Take a new measurement (only possible in forced mode)
|
||||
@returns true in case of success else false
|
||||
*/
|
||||
bool Adafruit_BME280::takeForcedMeasurement(void) {
|
||||
bool return_value = false;
|
||||
// If we are in forced mode, the BME sensor goes back to sleep after each
|
||||
// measurement and we need to set it to forced mode once at this point, so
|
||||
// it will take the next measurement and then return to sleep again.
|
||||
// In normal mode simply does new measurements periodically.
|
||||
if (_measReg.mode == MODE_FORCED) {
|
||||
return_value = true;
|
||||
// set to forced mode, i.e. "take next measurement"
|
||||
write8(BME280_REGISTER_CONTROL, _measReg.get());
|
||||
// Store current time to measure the timeout
|
||||
uint32_t timeout_start = millis();
|
||||
// wait until measurement has been completed, otherwise we would read the
|
||||
// the values from the last measurement or the timeout occurred after 2 sec.
|
||||
while (read8(BME280_REGISTER_STATUS) & 0x08) {
|
||||
// In case of a timeout, stop the while loop
|
||||
if ((millis() - timeout_start) > 2000) {
|
||||
return_value = false;
|
||||
break;
|
||||
}
|
||||
delay(1);
|
||||
}
|
||||
}
|
||||
return return_value;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Reads the factory-set coefficients
|
||||
*/
|
||||
void Adafruit_BME280::readCoefficients(void) {
|
||||
_bme280_calib.dig_T1 = read16_LE(BME280_REGISTER_DIG_T1);
|
||||
_bme280_calib.dig_T2 = readS16_LE(BME280_REGISTER_DIG_T2);
|
||||
_bme280_calib.dig_T3 = readS16_LE(BME280_REGISTER_DIG_T3);
|
||||
|
||||
_bme280_calib.dig_P1 = read16_LE(BME280_REGISTER_DIG_P1);
|
||||
_bme280_calib.dig_P2 = readS16_LE(BME280_REGISTER_DIG_P2);
|
||||
_bme280_calib.dig_P3 = readS16_LE(BME280_REGISTER_DIG_P3);
|
||||
_bme280_calib.dig_P4 = readS16_LE(BME280_REGISTER_DIG_P4);
|
||||
_bme280_calib.dig_P5 = readS16_LE(BME280_REGISTER_DIG_P5);
|
||||
_bme280_calib.dig_P6 = readS16_LE(BME280_REGISTER_DIG_P6);
|
||||
_bme280_calib.dig_P7 = readS16_LE(BME280_REGISTER_DIG_P7);
|
||||
_bme280_calib.dig_P8 = readS16_LE(BME280_REGISTER_DIG_P8);
|
||||
_bme280_calib.dig_P9 = readS16_LE(BME280_REGISTER_DIG_P9);
|
||||
|
||||
_bme280_calib.dig_H1 = read8(BME280_REGISTER_DIG_H1);
|
||||
_bme280_calib.dig_H2 = readS16_LE(BME280_REGISTER_DIG_H2);
|
||||
_bme280_calib.dig_H3 = read8(BME280_REGISTER_DIG_H3);
|
||||
_bme280_calib.dig_H4 = ((int8_t)read8(BME280_REGISTER_DIG_H4) << 4) |
|
||||
(read8(BME280_REGISTER_DIG_H4 + 1) & 0xF);
|
||||
_bme280_calib.dig_H5 = ((int8_t)read8(BME280_REGISTER_DIG_H5 + 1) << 4) |
|
||||
(read8(BME280_REGISTER_DIG_H5) >> 4);
|
||||
_bme280_calib.dig_H6 = (int8_t)read8(BME280_REGISTER_DIG_H6);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief return true if chip is busy reading cal data
|
||||
* @returns true if reading calibration, false otherwise
|
||||
*/
|
||||
bool Adafruit_BME280::isReadingCalibration(void) {
|
||||
uint8_t const rStatus = read8(BME280_REGISTER_STATUS);
|
||||
|
||||
return (rStatus & (1 << 0)) != 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Returns the temperature from the sensor
|
||||
* @returns the temperature read from the device
|
||||
*/
|
||||
float Adafruit_BME280::readTemperature(void) {
|
||||
int32_t var1, var2;
|
||||
|
||||
int32_t adc_T = read24(BME280_REGISTER_TEMPDATA);
|
||||
if (adc_T == 0x800000) // value in case temp measurement was disabled
|
||||
return NAN;
|
||||
adc_T >>= 4;
|
||||
|
||||
var1 = (int32_t)((adc_T / 8) - ((int32_t)_bme280_calib.dig_T1 * 2));
|
||||
var1 = (var1 * ((int32_t)_bme280_calib.dig_T2)) / 2048;
|
||||
var2 = (int32_t)((adc_T / 16) - ((int32_t)_bme280_calib.dig_T1));
|
||||
var2 = (((var2 * var2) / 4096) * ((int32_t)_bme280_calib.dig_T3)) / 16384;
|
||||
|
||||
t_fine = var1 + var2 + t_fine_adjust;
|
||||
|
||||
int32_t T = (t_fine * 5 + 128) / 256;
|
||||
|
||||
return (float)T / 100;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Returns the pressure from the sensor
|
||||
* @returns the pressure value (in Pascal) read from the device
|
||||
*/
|
||||
float Adafruit_BME280::readPressure(void) {
|
||||
int64_t var1, var2, var3, var4;
|
||||
|
||||
readTemperature(); // must be done first to get t_fine
|
||||
|
||||
int32_t adc_P = read24(BME280_REGISTER_PRESSUREDATA);
|
||||
if (adc_P == 0x800000) // value in case pressure measurement was disabled
|
||||
return NAN;
|
||||
adc_P >>= 4;
|
||||
|
||||
var1 = ((int64_t)t_fine) - 128000;
|
||||
var2 = var1 * var1 * (int64_t)_bme280_calib.dig_P6;
|
||||
var2 = var2 + ((var1 * (int64_t)_bme280_calib.dig_P5) * 131072);
|
||||
var2 = var2 + (((int64_t)_bme280_calib.dig_P4) * 34359738368);
|
||||
var1 = ((var1 * var1 * (int64_t)_bme280_calib.dig_P3) / 256) +
|
||||
((var1 * ((int64_t)_bme280_calib.dig_P2) * 4096));
|
||||
var3 = ((int64_t)1) * 140737488355328;
|
||||
var1 = (var3 + var1) * ((int64_t)_bme280_calib.dig_P1) / 8589934592;
|
||||
|
||||
if (var1 == 0) {
|
||||
return 0; // avoid exception caused by division by zero
|
||||
}
|
||||
|
||||
var4 = 1048576 - adc_P;
|
||||
var4 = (((var4 * 2147483648) - var2) * 3125) / var1;
|
||||
var1 = (((int64_t)_bme280_calib.dig_P9) * (var4 / 8192) * (var4 / 8192)) /
|
||||
33554432;
|
||||
var2 = (((int64_t)_bme280_calib.dig_P8) * var4) / 524288;
|
||||
var4 = ((var4 + var1 + var2) / 256) + (((int64_t)_bme280_calib.dig_P7) * 16);
|
||||
|
||||
float P = var4 / 256.0;
|
||||
|
||||
return P;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Returns the humidity from the sensor
|
||||
* @returns the humidity value read from the device
|
||||
*/
|
||||
float Adafruit_BME280::readHumidity(void) {
|
||||
int32_t var1, var2, var3, var4, var5;
|
||||
|
||||
readTemperature(); // must be done first to get t_fine
|
||||
|
||||
int32_t adc_H = read16(BME280_REGISTER_HUMIDDATA);
|
||||
if (adc_H == 0x8000) // value in case humidity measurement was disabled
|
||||
return NAN;
|
||||
|
||||
var1 = t_fine - ((int32_t)76800);
|
||||
var2 = (int32_t)(adc_H * 16384);
|
||||
var3 = (int32_t)(((int32_t)_bme280_calib.dig_H4) * 1048576);
|
||||
var4 = ((int32_t)_bme280_calib.dig_H5) * var1;
|
||||
var5 = (((var2 - var3) - var4) + (int32_t)16384) / 32768;
|
||||
var2 = (var1 * ((int32_t)_bme280_calib.dig_H6)) / 1024;
|
||||
var3 = (var1 * ((int32_t)_bme280_calib.dig_H3)) / 2048;
|
||||
var4 = ((var2 * (var3 + (int32_t)32768)) / 1024) + (int32_t)2097152;
|
||||
var2 = ((var4 * ((int32_t)_bme280_calib.dig_H2)) + 8192) / 16384;
|
||||
var3 = var5 * var2;
|
||||
var4 = ((var3 / 32768) * (var3 / 32768)) / 128;
|
||||
var5 = var3 - ((var4 * ((int32_t)_bme280_calib.dig_H1)) / 16);
|
||||
var5 = (var5 < 0 ? 0 : var5);
|
||||
var5 = (var5 > 419430400 ? 419430400 : var5);
|
||||
uint32_t H = (uint32_t)(var5 / 4096);
|
||||
|
||||
return (float)H / 1024.0;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Calculates the altitude (in meters) from the specified atmospheric
|
||||
* pressure (in hPa), and sea-level pressure (in hPa).
|
||||
* @param seaLevel Sea-level pressure in hPa
|
||||
* @returns the altitude value read from the device
|
||||
*/
|
||||
float Adafruit_BME280::readAltitude(float seaLevel) {
|
||||
// Equation taken from BMP180 datasheet (page 16):
|
||||
// http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf
|
||||
|
||||
// Note that using the equation from wikipedia can give bad results
|
||||
// at high altitude. See this thread for more information:
|
||||
// http://forums.adafruit.com/viewtopic.php?f=22&t=58064
|
||||
|
||||
float atmospheric = readPressure() / 100.0F;
|
||||
return 44330.0 * (1.0 - pow(atmospheric / seaLevel, 0.1903));
|
||||
}
|
||||
|
||||
/*!
|
||||
* Calculates the pressure at sea level (in hPa) from the specified
|
||||
* altitude (in meters), and atmospheric pressure (in hPa).
|
||||
* @param altitude Altitude in meters
|
||||
* @param atmospheric Atmospheric pressure in hPa
|
||||
* @returns the pressure at sea level (in hPa) from the specified altitude
|
||||
*/
|
||||
float Adafruit_BME280::seaLevelForAltitude(float altitude, float atmospheric) {
|
||||
// Equation taken from BMP180 datasheet (page 17):
|
||||
// http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf
|
||||
|
||||
// Note that using the equation from wikipedia can give bad results
|
||||
// at high altitude. See this thread for more information:
|
||||
// http://forums.adafruit.com/viewtopic.php?f=22&t=58064
|
||||
|
||||
return atmospheric / pow(1.0 - (altitude / 44330.0), 5.255);
|
||||
}
|
||||
|
||||
/*!
|
||||
* Returns Sensor ID found by init() for diagnostics
|
||||
* @returns Sensor ID 0x60 for BME280, 0x56, 0x57, 0x58 BMP280
|
||||
*/
|
||||
uint32_t Adafruit_BME280::sensorID(void) { return _sensorID; }
|
||||
|
||||
/*!
|
||||
* Returns the current temperature compensation value in degrees Celsius
|
||||
* @returns the current temperature compensation value in degrees Celsius
|
||||
*/
|
||||
float Adafruit_BME280::getTemperatureCompensation(void) {
|
||||
return float((t_fine_adjust * 5) >> 8) / 100.0;
|
||||
};
|
||||
|
||||
/*!
|
||||
* Sets a value to be added to each temperature reading. This adjusted
|
||||
* temperature is used in pressure and humidity readings.
|
||||
* @param adjustment Value to be added to each temperature reading in Celsius
|
||||
*/
|
||||
void Adafruit_BME280::setTemperatureCompensation(float adjustment) {
|
||||
// convert the value in C into and adjustment to t_fine
|
||||
t_fine_adjust = ((int32_t(adjustment * 100) << 8)) / 5;
|
||||
};
|
||||
|
||||
/*!
|
||||
@brief Gets an Adafruit Unified Sensor object for the temp sensor component
|
||||
@return Adafruit_Sensor pointer to temperature sensor
|
||||
*/
|
||||
Adafruit_Sensor *Adafruit_BME280::getTemperatureSensor(void) {
|
||||
if (!temp_sensor) {
|
||||
temp_sensor = new Adafruit_BME280_Temp(this);
|
||||
}
|
||||
|
||||
return temp_sensor;
|
||||
}
|
||||
|
||||
/*!
|
||||
@brief Gets an Adafruit Unified Sensor object for the pressure sensor
|
||||
component
|
||||
@return Adafruit_Sensor pointer to pressure sensor
|
||||
*/
|
||||
Adafruit_Sensor *Adafruit_BME280::getPressureSensor(void) {
|
||||
if (!pressure_sensor) {
|
||||
pressure_sensor = new Adafruit_BME280_Pressure(this);
|
||||
}
|
||||
return pressure_sensor;
|
||||
}
|
||||
|
||||
/*!
|
||||
@brief Gets an Adafruit Unified Sensor object for the humidity sensor
|
||||
component
|
||||
@return Adafruit_Sensor pointer to humidity sensor
|
||||
*/
|
||||
Adafruit_Sensor *Adafruit_BME280::getHumiditySensor(void) {
|
||||
if (!humidity_sensor) {
|
||||
humidity_sensor = new Adafruit_BME280_Humidity(this);
|
||||
}
|
||||
return humidity_sensor;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Gets the sensor_t data for the BME280's temperature sensor
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void Adafruit_BME280_Temp::getSensor(sensor_t *sensor) {
|
||||
/* Clear the sensor_t object */
|
||||
memset(sensor, 0, sizeof(sensor_t));
|
||||
|
||||
/* Insert the sensor name in the fixed length char array */
|
||||
strncpy(sensor->name, "BME280", sizeof(sensor->name) - 1);
|
||||
sensor->name[sizeof(sensor->name) - 1] = 0;
|
||||
sensor->version = 1;
|
||||
sensor->sensor_id = _sensorID;
|
||||
sensor->type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
|
||||
sensor->min_delay = 0;
|
||||
sensor->min_value = -40.0; /* Temperature range -40 ~ +85 C */
|
||||
sensor->max_value = +85.0;
|
||||
sensor->resolution = 0.01; /* 0.01 C */
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Gets the temperature as a standard sensor event
|
||||
@param event Sensor event object that will be populated
|
||||
@returns True
|
||||
*/
|
||||
/**************************************************************************/
|
||||
bool Adafruit_BME280_Temp::getEvent(sensors_event_t *event) {
|
||||
/* Clear the event */
|
||||
memset(event, 0, sizeof(sensors_event_t));
|
||||
|
||||
event->version = sizeof(sensors_event_t);
|
||||
event->sensor_id = _sensorID;
|
||||
event->type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
|
||||
event->timestamp = millis();
|
||||
event->temperature = _theBME280->readTemperature();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Gets the sensor_t data for the BME280's pressure sensor
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void Adafruit_BME280_Pressure::getSensor(sensor_t *sensor) {
|
||||
/* Clear the sensor_t object */
|
||||
memset(sensor, 0, sizeof(sensor_t));
|
||||
|
||||
/* Insert the sensor name in the fixed length char array */
|
||||
strncpy(sensor->name, "BME280", sizeof(sensor->name) - 1);
|
||||
sensor->name[sizeof(sensor->name) - 1] = 0;
|
||||
sensor->version = 1;
|
||||
sensor->sensor_id = _sensorID;
|
||||
sensor->type = SENSOR_TYPE_PRESSURE;
|
||||
sensor->min_delay = 0;
|
||||
sensor->min_value = 300.0; /* 300 ~ 1100 hPa */
|
||||
sensor->max_value = 1100.0;
|
||||
sensor->resolution = 0.012; /* 0.12 hPa relative */
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Gets the pressure as a standard sensor event
|
||||
@param event Sensor event object that will be populated
|
||||
@returns True
|
||||
*/
|
||||
/**************************************************************************/
|
||||
bool Adafruit_BME280_Pressure::getEvent(sensors_event_t *event) {
|
||||
/* Clear the event */
|
||||
memset(event, 0, sizeof(sensors_event_t));
|
||||
|
||||
event->version = sizeof(sensors_event_t);
|
||||
event->sensor_id = _sensorID;
|
||||
event->type = SENSOR_TYPE_PRESSURE;
|
||||
event->timestamp = millis();
|
||||
event->pressure = _theBME280->readPressure() / 100; // convert Pa to hPa
|
||||
return true;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Gets the sensor_t data for the BME280's humidity sensor
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void Adafruit_BME280_Humidity::getSensor(sensor_t *sensor) {
|
||||
/* Clear the sensor_t object */
|
||||
memset(sensor, 0, sizeof(sensor_t));
|
||||
|
||||
/* Insert the sensor name in the fixed length char array */
|
||||
strncpy(sensor->name, "BME280", sizeof(sensor->name) - 1);
|
||||
sensor->name[sizeof(sensor->name) - 1] = 0;
|
||||
sensor->version = 1;
|
||||
sensor->sensor_id = _sensorID;
|
||||
sensor->type = SENSOR_TYPE_RELATIVE_HUMIDITY;
|
||||
sensor->min_delay = 0;
|
||||
sensor->min_value = 0;
|
||||
sensor->max_value = 100; /* 0 - 100 % */
|
||||
sensor->resolution = 3; /* 3% accuracy */
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Gets the humidity as a standard sensor event
|
||||
@param event Sensor event object that will be populated
|
||||
@returns True
|
||||
*/
|
||||
/**************************************************************************/
|
||||
bool Adafruit_BME280_Humidity::getEvent(sensors_event_t *event) {
|
||||
/* Clear the event */
|
||||
memset(event, 0, sizeof(sensors_event_t));
|
||||
|
||||
event->version = sizeof(sensors_event_t);
|
||||
event->sensor_id = _sensorID;
|
||||
event->type = SENSOR_TYPE_RELATIVE_HUMIDITY;
|
||||
event->timestamp = millis();
|
||||
event->relative_humidity = _theBME280->readHumidity();
|
||||
return true;
|
||||
}
|
||||
372
libraries/Adafruit_BME280_Library/Adafruit_BME280.h
Normal file
372
libraries/Adafruit_BME280_Library/Adafruit_BME280.h
Normal file
@@ -0,0 +1,372 @@
|
||||
/*!
|
||||
* @file Adafruit_BME280.h
|
||||
*
|
||||
* Designed specifically to work with the Adafruit BME280 Breakout
|
||||
* ----> http://www.adafruit.com/products/2650
|
||||
*
|
||||
* These sensors use I2C or SPI to communicate, 2 or 4 pins are required
|
||||
* to interface.
|
||||
*
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Written by Kevin "KTOWN" Townsend for Adafruit Industries.
|
||||
*
|
||||
* BSD license, all text here must be included in any redistribution.
|
||||
* See the LICENSE file for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __BME280_H__
|
||||
#define __BME280_H__
|
||||
|
||||
#include "Arduino.h"
|
||||
|
||||
#include <Adafruit_I2CDevice.h>
|
||||
#include <Adafruit_SPIDevice.h>
|
||||
#include <Adafruit_Sensor.h>
|
||||
|
||||
/*!
|
||||
* @brief default I2C address
|
||||
*/
|
||||
#define BME280_ADDRESS (0x77) // Primary I2C Address
|
||||
/*!
|
||||
* @brief alternate I2C address
|
||||
*/
|
||||
#define BME280_ADDRESS_ALTERNATE (0x76) // Alternate Address
|
||||
|
||||
/*!
|
||||
* @brief Register addresses
|
||||
*/
|
||||
enum {
|
||||
BME280_REGISTER_DIG_T1 = 0x88,
|
||||
BME280_REGISTER_DIG_T2 = 0x8A,
|
||||
BME280_REGISTER_DIG_T3 = 0x8C,
|
||||
|
||||
BME280_REGISTER_DIG_P1 = 0x8E,
|
||||
BME280_REGISTER_DIG_P2 = 0x90,
|
||||
BME280_REGISTER_DIG_P3 = 0x92,
|
||||
BME280_REGISTER_DIG_P4 = 0x94,
|
||||
BME280_REGISTER_DIG_P5 = 0x96,
|
||||
BME280_REGISTER_DIG_P6 = 0x98,
|
||||
BME280_REGISTER_DIG_P7 = 0x9A,
|
||||
BME280_REGISTER_DIG_P8 = 0x9C,
|
||||
BME280_REGISTER_DIG_P9 = 0x9E,
|
||||
|
||||
BME280_REGISTER_DIG_H1 = 0xA1,
|
||||
BME280_REGISTER_DIG_H2 = 0xE1,
|
||||
BME280_REGISTER_DIG_H3 = 0xE3,
|
||||
BME280_REGISTER_DIG_H4 = 0xE4,
|
||||
BME280_REGISTER_DIG_H5 = 0xE5,
|
||||
BME280_REGISTER_DIG_H6 = 0xE7,
|
||||
|
||||
BME280_REGISTER_CHIPID = 0xD0,
|
||||
BME280_REGISTER_VERSION = 0xD1,
|
||||
BME280_REGISTER_SOFTRESET = 0xE0,
|
||||
|
||||
BME280_REGISTER_CAL26 = 0xE1, // R calibration stored in 0xE1-0xF0
|
||||
|
||||
BME280_REGISTER_CONTROLHUMID = 0xF2,
|
||||
BME280_REGISTER_STATUS = 0XF3,
|
||||
BME280_REGISTER_CONTROL = 0xF4,
|
||||
BME280_REGISTER_CONFIG = 0xF5,
|
||||
BME280_REGISTER_PRESSUREDATA = 0xF7,
|
||||
BME280_REGISTER_TEMPDATA = 0xFA,
|
||||
BME280_REGISTER_HUMIDDATA = 0xFD
|
||||
};
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief calibration data
|
||||
*/
|
||||
/**************************************************************************/
|
||||
typedef struct {
|
||||
uint16_t dig_T1; ///< temperature compensation value
|
||||
int16_t dig_T2; ///< temperature compensation value
|
||||
int16_t dig_T3; ///< temperature compensation value
|
||||
|
||||
uint16_t dig_P1; ///< pressure compensation value
|
||||
int16_t dig_P2; ///< pressure compensation value
|
||||
int16_t dig_P3; ///< pressure compensation value
|
||||
int16_t dig_P4; ///< pressure compensation value
|
||||
int16_t dig_P5; ///< pressure compensation value
|
||||
int16_t dig_P6; ///< pressure compensation value
|
||||
int16_t dig_P7; ///< pressure compensation value
|
||||
int16_t dig_P8; ///< pressure compensation value
|
||||
int16_t dig_P9; ///< pressure compensation value
|
||||
|
||||
uint8_t dig_H1; ///< humidity compensation value
|
||||
int16_t dig_H2; ///< humidity compensation value
|
||||
uint8_t dig_H3; ///< humidity compensation value
|
||||
int16_t dig_H4; ///< humidity compensation value
|
||||
int16_t dig_H5; ///< humidity compensation value
|
||||
int8_t dig_H6; ///< humidity compensation value
|
||||
} bme280_calib_data;
|
||||
/*=========================================================================*/
|
||||
|
||||
class Adafruit_BME280;
|
||||
|
||||
/** Adafruit Unified Sensor interface for temperature component of BME280 */
|
||||
class Adafruit_BME280_Temp : public Adafruit_Sensor {
|
||||
public:
|
||||
/** @brief Create an Adafruit_Sensor compatible object for the temp sensor
|
||||
@param parent A pointer to the BME280 class */
|
||||
Adafruit_BME280_Temp(Adafruit_BME280 *parent) { _theBME280 = parent; }
|
||||
bool getEvent(sensors_event_t *);
|
||||
void getSensor(sensor_t *);
|
||||
|
||||
private:
|
||||
int _sensorID = 280;
|
||||
Adafruit_BME280 *_theBME280 = NULL;
|
||||
};
|
||||
|
||||
/** Adafruit Unified Sensor interface for pressure component of BME280 */
|
||||
class Adafruit_BME280_Pressure : public Adafruit_Sensor {
|
||||
public:
|
||||
/** @brief Create an Adafruit_Sensor compatible object for the pressure sensor
|
||||
@param parent A pointer to the BME280 class */
|
||||
Adafruit_BME280_Pressure(Adafruit_BME280 *parent) { _theBME280 = parent; }
|
||||
bool getEvent(sensors_event_t *);
|
||||
void getSensor(sensor_t *);
|
||||
|
||||
private:
|
||||
int _sensorID = 280;
|
||||
Adafruit_BME280 *_theBME280 = NULL;
|
||||
};
|
||||
|
||||
/** Adafruit Unified Sensor interface for humidity component of BME280 */
|
||||
class Adafruit_BME280_Humidity : public Adafruit_Sensor {
|
||||
public:
|
||||
/** @brief Create an Adafruit_Sensor compatible object for the humidity sensor
|
||||
@param parent A pointer to the BME280 class */
|
||||
Adafruit_BME280_Humidity(Adafruit_BME280 *parent) { _theBME280 = parent; }
|
||||
bool getEvent(sensors_event_t *);
|
||||
void getSensor(sensor_t *);
|
||||
|
||||
private:
|
||||
int _sensorID = 280;
|
||||
Adafruit_BME280 *_theBME280 = NULL;
|
||||
};
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Class that stores state and functions for interacting with BME280 IC
|
||||
*/
|
||||
/**************************************************************************/
|
||||
class Adafruit_BME280 {
|
||||
public:
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief sampling rates
|
||||
*/
|
||||
/**************************************************************************/
|
||||
enum sensor_sampling {
|
||||
SAMPLING_NONE = 0b000,
|
||||
SAMPLING_X1 = 0b001,
|
||||
SAMPLING_X2 = 0b010,
|
||||
SAMPLING_X4 = 0b011,
|
||||
SAMPLING_X8 = 0b100,
|
||||
SAMPLING_X16 = 0b101
|
||||
};
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief power modes
|
||||
*/
|
||||
/**************************************************************************/
|
||||
enum sensor_mode {
|
||||
MODE_SLEEP = 0b00,
|
||||
MODE_FORCED = 0b01,
|
||||
MODE_NORMAL = 0b11
|
||||
};
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief filter values
|
||||
*/
|
||||
/**************************************************************************/
|
||||
enum sensor_filter {
|
||||
FILTER_OFF = 0b000,
|
||||
FILTER_X2 = 0b001,
|
||||
FILTER_X4 = 0b010,
|
||||
FILTER_X8 = 0b011,
|
||||
FILTER_X16 = 0b100
|
||||
};
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief standby duration in ms
|
||||
*/
|
||||
/**************************************************************************/
|
||||
enum standby_duration {
|
||||
STANDBY_MS_0_5 = 0b000,
|
||||
STANDBY_MS_10 = 0b110,
|
||||
STANDBY_MS_20 = 0b111,
|
||||
STANDBY_MS_62_5 = 0b001,
|
||||
STANDBY_MS_125 = 0b010,
|
||||
STANDBY_MS_250 = 0b011,
|
||||
STANDBY_MS_500 = 0b100,
|
||||
STANDBY_MS_1000 = 0b101
|
||||
};
|
||||
|
||||
// constructors
|
||||
Adafruit_BME280();
|
||||
Adafruit_BME280(int8_t cspin, SPIClass *theSPI = &SPI);
|
||||
Adafruit_BME280(int8_t cspin, int8_t mosipin, int8_t misopin, int8_t sckpin);
|
||||
~Adafruit_BME280(void);
|
||||
bool begin(uint8_t addr = BME280_ADDRESS, TwoWire *theWire = &Wire);
|
||||
bool init();
|
||||
|
||||
void setSampling(sensor_mode mode = MODE_NORMAL,
|
||||
sensor_sampling tempSampling = SAMPLING_X16,
|
||||
sensor_sampling pressSampling = SAMPLING_X16,
|
||||
sensor_sampling humSampling = SAMPLING_X16,
|
||||
sensor_filter filter = FILTER_OFF,
|
||||
standby_duration duration = STANDBY_MS_0_5);
|
||||
|
||||
bool takeForcedMeasurement(void);
|
||||
float readTemperature(void);
|
||||
float readPressure(void);
|
||||
float readHumidity(void);
|
||||
|
||||
float readAltitude(float seaLevel);
|
||||
float seaLevelForAltitude(float altitude, float pressure);
|
||||
uint32_t sensorID(void);
|
||||
|
||||
float getTemperatureCompensation(void);
|
||||
void setTemperatureCompensation(float);
|
||||
|
||||
Adafruit_Sensor *getTemperatureSensor(void);
|
||||
Adafruit_Sensor *getPressureSensor(void);
|
||||
Adafruit_Sensor *getHumiditySensor(void);
|
||||
|
||||
protected:
|
||||
Adafruit_I2CDevice *i2c_dev = NULL; ///< Pointer to I2C bus interface
|
||||
Adafruit_SPIDevice *spi_dev = NULL; ///< Pointer to SPI bus interface
|
||||
|
||||
Adafruit_BME280_Temp *temp_sensor = NULL;
|
||||
//!< Adafruit_Sensor compat temperature sensor component
|
||||
|
||||
Adafruit_BME280_Pressure *pressure_sensor = NULL;
|
||||
//!< Adafruit_Sensor compat pressure sensor component
|
||||
|
||||
Adafruit_BME280_Humidity *humidity_sensor = NULL;
|
||||
//!< Adafruit_Sensor compat humidity sensor component
|
||||
|
||||
void readCoefficients(void);
|
||||
bool isReadingCalibration(void);
|
||||
|
||||
void write8(byte reg, byte value);
|
||||
uint8_t read8(byte reg);
|
||||
uint16_t read16(byte reg);
|
||||
uint32_t read24(byte reg);
|
||||
int16_t readS16(byte reg);
|
||||
uint16_t read16_LE(byte reg); // little endian
|
||||
int16_t readS16_LE(byte reg); // little endian
|
||||
|
||||
uint8_t _i2caddr; //!< I2C addr for the TwoWire interface
|
||||
int32_t _sensorID; //!< ID of the BME Sensor
|
||||
int32_t t_fine; //!< temperature with high resolution, stored as an attribute
|
||||
//!< as this is used for temperature compensation reading
|
||||
//!< humidity and pressure
|
||||
|
||||
int32_t t_fine_adjust = 0; //!< add to compensate temp readings and in turn
|
||||
//!< to pressure and humidity readings
|
||||
|
||||
bme280_calib_data _bme280_calib; //!< here calibration data is stored
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief config register
|
||||
*/
|
||||
/**************************************************************************/
|
||||
struct config {
|
||||
// inactive duration (standby time) in normal mode
|
||||
// 000 = 0.5 ms
|
||||
// 001 = 62.5 ms
|
||||
// 010 = 125 ms
|
||||
// 011 = 250 ms
|
||||
// 100 = 500 ms
|
||||
// 101 = 1000 ms
|
||||
// 110 = 10 ms
|
||||
// 111 = 20 ms
|
||||
unsigned int t_sb : 3; ///< inactive duration (standby time) in normal mode
|
||||
|
||||
// filter settings
|
||||
// 000 = filter off
|
||||
// 001 = 2x filter
|
||||
// 010 = 4x filter
|
||||
// 011 = 8x filter
|
||||
// 100 and above = 16x filter
|
||||
unsigned int filter : 3; ///< filter settings
|
||||
|
||||
// unused - don't set
|
||||
unsigned int none : 1; ///< unused - don't set
|
||||
unsigned int spi3w_en : 1; ///< unused - don't set
|
||||
|
||||
/// @return combined config register
|
||||
unsigned int get() { return (t_sb << 5) | (filter << 2) | spi3w_en; }
|
||||
};
|
||||
config _configReg; //!< config register object
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief ctrl_meas register
|
||||
*/
|
||||
/**************************************************************************/
|
||||
struct ctrl_meas {
|
||||
// temperature oversampling
|
||||
// 000 = skipped
|
||||
// 001 = x1
|
||||
// 010 = x2
|
||||
// 011 = x4
|
||||
// 100 = x8
|
||||
// 101 and above = x16
|
||||
unsigned int osrs_t : 3; ///< temperature oversampling
|
||||
|
||||
// pressure oversampling
|
||||
// 000 = skipped
|
||||
// 001 = x1
|
||||
// 010 = x2
|
||||
// 011 = x4
|
||||
// 100 = x8
|
||||
// 101 and above = x16
|
||||
unsigned int osrs_p : 3; ///< pressure oversampling
|
||||
|
||||
// device mode
|
||||
// 00 = sleep
|
||||
// 01 or 10 = forced
|
||||
// 11 = normal
|
||||
unsigned int mode : 2; ///< device mode
|
||||
|
||||
/// @return combined ctrl register
|
||||
unsigned int get() { return (osrs_t << 5) | (osrs_p << 2) | mode; }
|
||||
};
|
||||
ctrl_meas _measReg; //!< measurement register object
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief ctrl_hum register
|
||||
*/
|
||||
/**************************************************************************/
|
||||
struct ctrl_hum {
|
||||
/// unused - don't set
|
||||
unsigned int none : 5;
|
||||
|
||||
// pressure oversampling
|
||||
// 000 = skipped
|
||||
// 001 = x1
|
||||
// 010 = x2
|
||||
// 011 = x4
|
||||
// 100 = x8
|
||||
// 101 and above = x16
|
||||
unsigned int osrs_h : 3; ///< pressure oversampling
|
||||
|
||||
/// @return combined ctrl hum register
|
||||
unsigned int get() { return (osrs_h); }
|
||||
};
|
||||
ctrl_hum _humReg; //!< hum register object
|
||||
};
|
||||
|
||||
#endif
|
||||
27
libraries/Adafruit_BME280_Library/LICENSE
Normal file
27
libraries/Adafruit_BME280_Library/LICENSE
Normal file
@@ -0,0 +1,27 @@
|
||||
Copyright (c) 2015, Limor Fried & Kevin Townsend for Adafruit Industries
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of Adafruit Industries nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
54
libraries/Adafruit_BME280_Library/README.md
Normal file
54
libraries/Adafruit_BME280_Library/README.md
Normal file
@@ -0,0 +1,54 @@
|
||||
# Adafruit BME280 Library [](https://github.com/adafruit/Adafruit_BME280_Library/actions)[](http://adafruit.github.io/Adafruit_BME280_Library/html/index.html)
|
||||
|
||||
|
||||
<a href="http://www.adafruit.com/products/2652"><img src="./assets/board.jpg" width="500"/></a>
|
||||
|
||||
This is a library for the Adafruit BME280 Humidity, Barometric Pressure + Temp sensor
|
||||
|
||||
Designed specifically to work with the Adafruit BME280 Breakout
|
||||
* http://www.adafruit.com/products/2652
|
||||
|
||||
Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit!
|
||||
|
||||
# Installation
|
||||
To install, use the Arduino Library Manager and search for "Adafruit BME280" and install the library.
|
||||
|
||||
## Dependencies
|
||||
* [Adafruit Unified Sensor Driver](https://github.com/adafruit/Adafruit_Sensor)
|
||||
|
||||
# Contributing
|
||||
|
||||
Contributions are welcome! Please read our [Code of Conduct](https://github.com/adafruit/Adafruit_PM25AQI/blob/master/CODE_OF_CONDUCT.md>)
|
||||
before contributing to help this project stay welcoming.
|
||||
|
||||
## Documentation and doxygen
|
||||
Documentation is produced by doxygen. Contributions should include documentation for any new code added.
|
||||
|
||||
Some examples of how to use doxygen can be found in these guide pages:
|
||||
|
||||
https://learn.adafruit.com/the-well-automated-arduino-library/doxygen
|
||||
|
||||
https://learn.adafruit.com/the-well-automated-arduino-library/doxygen-tips
|
||||
|
||||
## Formatting and clang-format
|
||||
This library uses [`clang-format`](https://releases.llvm.org/download.html) to standardize the formatting of `.cpp` and `.h` files.
|
||||
Contributions should be formatted using `clang-format`:
|
||||
|
||||
The `-i` flag will make the changes to the file.
|
||||
```bash
|
||||
clang-format -i *.cpp *.h
|
||||
```
|
||||
If you prefer to make the changes yourself, running `clang-format` without the `-i` flag will print out a formatted version of the file. You can save this to a file and diff it against the original to see the changes.
|
||||
|
||||
Note that the formatting output by `clang-format` is what the automated formatting checker will expect. Any diffs from this formatting will result in a failed build until they are addressed. Using the `-i` flag is highly recommended.
|
||||
|
||||
### clang-format resources
|
||||
* [Binary builds and source available on the LLVM downloads page](https://releases.llvm.org/download.html)
|
||||
* [Documentation and IDE integration](https://clang.llvm.org/docs/ClangFormat.html)
|
||||
|
||||
## About this Driver
|
||||
Written by Ladyada for Adafruit Industries.
|
||||
|
||||
BSD license, check license.txt for more information
|
||||
|
||||
All text above must be included in any redistribution
|
||||
BIN
libraries/Adafruit_BME280_Library/assets/board.jpg
Normal file
BIN
libraries/Adafruit_BME280_Library/assets/board.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 431 KiB |
@@ -0,0 +1,159 @@
|
||||
/***************************************************************************
|
||||
This is a library for the BME280 humidity, temperature & pressure sensor
|
||||
|
||||
Designed specifically to work with the Adafruit BME280 Breakout
|
||||
----> http://www.adafruit.com/products/2650
|
||||
|
||||
These sensors use I2C or SPI to communicate, 2 or 4 pins are required
|
||||
to interface. The device's I2C address is either 0x76 or 0x77.
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit andopen-source hardware by purchasing products
|
||||
from Adafruit!
|
||||
|
||||
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
See the LICENSE file for details.
|
||||
***************************************************************************/
|
||||
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
#include <Adafruit_Sensor.h>
|
||||
#include <Adafruit_BME280.h>
|
||||
|
||||
#define BME_SCK 13
|
||||
#define BME_MISO 12
|
||||
#define BME_MOSI 11
|
||||
#define BME_CS 10
|
||||
|
||||
#define SEALEVELPRESSURE_HPA (1013.25)
|
||||
|
||||
Adafruit_BME280 bme; // I2C
|
||||
//Adafruit_BME280 bme(BME_CS); // hardware SPI
|
||||
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
|
||||
|
||||
unsigned long delayTime;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
Serial.println(F("BME280 test"));
|
||||
|
||||
if (! bme.begin(0x77, &Wire)) {
|
||||
Serial.println("Could not find a valid BME280 sensor, check wiring!");
|
||||
while (1);
|
||||
}
|
||||
|
||||
Serial.println("-- Default Test --");
|
||||
Serial.println("normal mode, 16x oversampling for all, filter off,");
|
||||
Serial.println("0.5ms standby period");
|
||||
delayTime = 5000;
|
||||
|
||||
|
||||
// For more details on the following scenarious, see chapter
|
||||
// 3.5 "Recommended modes of operation" in the datasheet
|
||||
|
||||
/*
|
||||
// weather monitoring
|
||||
Serial.println("-- Weather Station Scenario --");
|
||||
Serial.println("forced mode, 1x temperature / 1x humidity / 1x pressure oversampling,");
|
||||
Serial.println("filter off");
|
||||
bme.setSampling(Adafruit_BME280::MODE_FORCED,
|
||||
Adafruit_BME280::SAMPLING_X1, // temperature
|
||||
Adafruit_BME280::SAMPLING_X1, // pressure
|
||||
Adafruit_BME280::SAMPLING_X1, // humidity
|
||||
Adafruit_BME280::FILTER_OFF );
|
||||
|
||||
// suggested rate is 1/60Hz (1m)
|
||||
delayTime = 60000; // in milliseconds
|
||||
*/
|
||||
|
||||
/*
|
||||
// humidity sensing
|
||||
Serial.println("-- Humidity Sensing Scenario --");
|
||||
Serial.println("forced mode, 1x temperature / 1x humidity / 0x pressure oversampling");
|
||||
Serial.println("= pressure off, filter off");
|
||||
bme.setSampling(Adafruit_BME280::MODE_FORCED,
|
||||
Adafruit_BME280::SAMPLING_X1, // temperature
|
||||
Adafruit_BME280::SAMPLING_NONE, // pressure
|
||||
Adafruit_BME280::SAMPLING_X1, // humidity
|
||||
Adafruit_BME280::FILTER_OFF );
|
||||
|
||||
// suggested rate is 1Hz (1s)
|
||||
delayTime = 1000; // in milliseconds
|
||||
*/
|
||||
|
||||
/*
|
||||
// indoor navigation
|
||||
Serial.println("-- Indoor Navigation Scenario --");
|
||||
Serial.println("normal mode, 16x pressure / 2x temperature / 1x humidity oversampling,");
|
||||
Serial.println("0.5ms standby period, filter 16x");
|
||||
bme.setSampling(Adafruit_BME280::MODE_NORMAL,
|
||||
Adafruit_BME280::SAMPLING_X2, // temperature
|
||||
Adafruit_BME280::SAMPLING_X16, // pressure
|
||||
Adafruit_BME280::SAMPLING_X1, // humidity
|
||||
Adafruit_BME280::FILTER_X16,
|
||||
Adafruit_BME280::STANDBY_MS_0_5 );
|
||||
|
||||
// suggested rate is 25Hz
|
||||
// 1 + (2 * T_ovs) + (2 * P_ovs + 0.5) + (2 * H_ovs + 0.5)
|
||||
// T_ovs = 2
|
||||
// P_ovs = 16
|
||||
// H_ovs = 1
|
||||
// = 40ms (25Hz)
|
||||
// with standby time that should really be 24.16913... Hz
|
||||
delayTime = 41;
|
||||
*/
|
||||
|
||||
/*
|
||||
// gaming
|
||||
Serial.println("-- Gaming Scenario --");
|
||||
Serial.println("normal mode, 4x pressure / 1x temperature / 0x humidity oversampling,");
|
||||
Serial.println("= humidity off, 0.5ms standby period, filter 16x");
|
||||
bme.setSampling(Adafruit_BME280::MODE_NORMAL,
|
||||
Adafruit_BME280::SAMPLING_X1, // temperature
|
||||
Adafruit_BME280::SAMPLING_X4, // pressure
|
||||
Adafruit_BME280::SAMPLING_NONE, // humidity
|
||||
Adafruit_BME280::FILTER_X16,
|
||||
Adafruit_BME280::STANDBY_MS_0_5 );
|
||||
|
||||
// Suggested rate is 83Hz
|
||||
// 1 + (2 * T_ovs) + (2 * P_ovs + 0.5)
|
||||
// T_ovs = 1
|
||||
// P_ovs = 4
|
||||
// = 11.5ms + 0.5ms standby
|
||||
delayTime = 12;
|
||||
*/
|
||||
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
|
||||
void loop() {
|
||||
// Only needed in forced mode! In normal mode, you can remove the next line.
|
||||
bme.takeForcedMeasurement(); // has no effect in normal mode
|
||||
|
||||
printValues();
|
||||
delay(delayTime);
|
||||
}
|
||||
|
||||
|
||||
void printValues() {
|
||||
Serial.print("Temperature = ");
|
||||
Serial.print(bme.readTemperature());
|
||||
Serial.println(" *C");
|
||||
|
||||
Serial.print("Pressure = ");
|
||||
|
||||
Serial.print(bme.readPressure() / 100.0F);
|
||||
Serial.println(" hPa");
|
||||
|
||||
Serial.print("Approx. Altitude = ");
|
||||
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
|
||||
Serial.println(" m");
|
||||
|
||||
Serial.print("Humidity = ");
|
||||
Serial.print(bme.readHumidity());
|
||||
Serial.println(" %");
|
||||
|
||||
Serial.println();
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
/***************************************************************************
|
||||
This is a library for the BME280 humidity, temperature & pressure sensor
|
||||
This example shows how to take Sensor Events instead of direct readings
|
||||
|
||||
Designed specifically to work with the Adafruit BME280 Breakout
|
||||
----> http://www.adafruit.com/products/2652
|
||||
|
||||
These sensors use I2C or SPI to communicate, 2 or 4 pins are required
|
||||
to interface.
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing products
|
||||
from Adafruit!
|
||||
|
||||
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
***************************************************************************/
|
||||
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
#include <Adafruit_BME280.h>
|
||||
|
||||
Adafruit_BME280 bme; // use I2C interface
|
||||
Adafruit_Sensor *bme_temp = bme.getTemperatureSensor();
|
||||
Adafruit_Sensor *bme_pressure = bme.getPressureSensor();
|
||||
Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
Serial.println(F("BME280 Sensor event test"));
|
||||
|
||||
if (!bme.begin()) {
|
||||
Serial.println(F("Could not find a valid BME280 sensor, check wiring!"));
|
||||
while (1) delay(10);
|
||||
}
|
||||
|
||||
bme_temp->printSensorDetails();
|
||||
bme_pressure->printSensorDetails();
|
||||
bme_humidity->printSensorDetails();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
sensors_event_t temp_event, pressure_event, humidity_event;
|
||||
bme_temp->getEvent(&temp_event);
|
||||
bme_pressure->getEvent(&pressure_event);
|
||||
bme_humidity->getEvent(&humidity_event);
|
||||
|
||||
Serial.print(F("Temperature = "));
|
||||
Serial.print(temp_event.temperature);
|
||||
Serial.println(" *C");
|
||||
|
||||
Serial.print(F("Humidity = "));
|
||||
Serial.print(humidity_event.relative_humidity);
|
||||
Serial.println(" %");
|
||||
|
||||
Serial.print(F("Pressure = "));
|
||||
Serial.print(pressure_event.pressure);
|
||||
Serial.println(" hPa");
|
||||
|
||||
Serial.println();
|
||||
delay(1000);
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
/***************************************************************************
|
||||
This is a library for the BME280 humidity, temperature & pressure sensor
|
||||
|
||||
Designed specifically to work with the Adafruit BME280 Breakout
|
||||
----> http://www.adafruit.com/products/2650
|
||||
|
||||
These sensors use I2C or SPI to communicate, 2 or 4 pins are required
|
||||
to interface. The device's I2C address is either 0x76 or 0x77.
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit andopen-source hardware by purchasing products
|
||||
from Adafruit!
|
||||
|
||||
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
See the LICENSE file for details.
|
||||
***************************************************************************/
|
||||
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
#include <Adafruit_Sensor.h>
|
||||
#include <Adafruit_BME280.h>
|
||||
|
||||
#define BME_SCK 13
|
||||
#define BME_MISO 12
|
||||
#define BME_MOSI 11
|
||||
#define BME_CS 10
|
||||
|
||||
#define SEALEVELPRESSURE_HPA (1013.25)
|
||||
|
||||
Adafruit_BME280 bme; // I2C
|
||||
//Adafruit_BME280 bme(BME_CS); // hardware SPI
|
||||
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
|
||||
|
||||
unsigned long delayTime;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
while(!Serial); // time to get serial running
|
||||
Serial.println(F("BME280 test"));
|
||||
|
||||
unsigned status;
|
||||
|
||||
// default settings
|
||||
status = bme.begin();
|
||||
// You can also pass in a Wire library object like &Wire2
|
||||
// status = bme.begin(0x76, &Wire2)
|
||||
if (!status) {
|
||||
Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
|
||||
Serial.print("SensorID was: 0x"); Serial.println(bme.sensorID(),16);
|
||||
Serial.print(" ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
|
||||
Serial.print(" ID of 0x56-0x58 represents a BMP 280,\n");
|
||||
Serial.print(" ID of 0x60 represents a BME 280.\n");
|
||||
Serial.print(" ID of 0x61 represents a BME 680.\n");
|
||||
while (1) delay(10);
|
||||
}
|
||||
|
||||
Serial.println("-- Default Test --");
|
||||
delayTime = 1000;
|
||||
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
|
||||
void loop() {
|
||||
printValues();
|
||||
delay(delayTime);
|
||||
}
|
||||
|
||||
|
||||
void printValues() {
|
||||
Serial.print("Temperature = ");
|
||||
Serial.print(bme.readTemperature());
|
||||
Serial.println(" °C");
|
||||
|
||||
Serial.print("Pressure = ");
|
||||
|
||||
Serial.print(bme.readPressure() / 100.0F);
|
||||
Serial.println(" hPa");
|
||||
|
||||
Serial.print("Approx. Altitude = ");
|
||||
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
|
||||
Serial.println(" m");
|
||||
|
||||
Serial.print("Humidity = ");
|
||||
Serial.print(bme.readHumidity());
|
||||
Serial.println(" %");
|
||||
|
||||
Serial.println();
|
||||
}
|
||||
10
libraries/Adafruit_BME280_Library/library.properties
Normal file
10
libraries/Adafruit_BME280_Library/library.properties
Normal file
@@ -0,0 +1,10 @@
|
||||
name=Adafruit BME280 Library
|
||||
version=2.2.4
|
||||
author=Adafruit
|
||||
maintainer=Adafruit <info@adafruit.com>
|
||||
sentence=Arduino library for BME280 sensors.
|
||||
paragraph=Arduino library for BME280 humidity and pressure sensors.
|
||||
category=Sensors
|
||||
url=https://github.com/adafruit/Adafruit_BME280_Library
|
||||
architectures=*
|
||||
depends=Adafruit Unified Sensor, Adafruit BusIO
|
||||
Reference in New Issue
Block a user