You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
4.0 KiB
C++
143 lines
4.0 KiB
C++
/*
|
|
BME280I2CI2C.cpp
|
|
This code records data from the BME280I2C sensor and provides an API.
|
|
This file is part of the Arduino BME280I2C library.
|
|
Copyright (C) 2016 Tyler Glenn
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
Written: Dec 30 2015.
|
|
Last Updated: Jan 1 2016. - Happy New year!
|
|
|
|
This header must be included in any derived code or copies of the code.
|
|
|
|
Based on the data sheet provided by Bosch for the BME280I2C environmental sensor,
|
|
calibration code based on algorithms providedBosch, some unit conversations courtesy
|
|
of www.endmemo.com, altitude equation courtesy of NOAA, and dew point equation
|
|
courtesy of Brian McNoldy at http://andrew.rsmas.miami.edu.
|
|
*/
|
|
|
|
|
|
/* ==== Includes ==== */
|
|
#include <Wire.h>
|
|
#include "BME280I2C.h"
|
|
/* ==== END Includes ==== */
|
|
|
|
/* ==== Methods ==== */
|
|
|
|
bool BME280I2C::Initialize() {
|
|
WriteRegister(CTRL_HUM_ADDR, controlHumidity);
|
|
WriteRegister(CTRL_MEAS_ADDR, controlMeasure);
|
|
WriteRegister(CONFIG_ADDR, config);
|
|
return ReadTrim();
|
|
}
|
|
|
|
|
|
void BME280I2C::WriteRegister(uint8_t addr, uint8_t data)
|
|
{
|
|
Wire.beginTransmission(bme_280_addr);
|
|
Wire.write(addr);
|
|
Wire.write(data);
|
|
Wire.endTransmission();
|
|
}
|
|
|
|
bool BME280I2C::ReadTrim()
|
|
{
|
|
uint8_t ord(0);
|
|
|
|
// Temp. Dig
|
|
Wire.beginTransmission(bme_280_addr);
|
|
Wire.write(TEMP_DIG_ADDR);
|
|
Wire.endTransmission();
|
|
|
|
Wire.requestFrom(bme_280_addr, (uint8_t)6);
|
|
while(Wire.available()){
|
|
dig[ord++] = Wire.read();
|
|
}
|
|
|
|
// Pressure Dig
|
|
Wire.beginTransmission(bme_280_addr);
|
|
Wire.write(PRESS_DIG_ADDR);
|
|
Wire.endTransmission();
|
|
|
|
Wire.requestFrom(bme_280_addr, (uint8_t)18);
|
|
while(Wire.available()){
|
|
dig[ord++] = Wire.read();
|
|
}
|
|
|
|
// Humidity Dig 1
|
|
Wire.beginTransmission(bme_280_addr);
|
|
Wire.write(HUM_DIG_ADDR1);
|
|
Wire.endTransmission();
|
|
|
|
Wire.requestFrom(bme_280_addr, (uint8_t)1);
|
|
while(Wire.available()){
|
|
dig[ord++] = Wire.read();
|
|
}
|
|
|
|
// Humidity Dig 2
|
|
Wire.beginTransmission(bme_280_addr);
|
|
Wire.write(HUM_DIG_ADDR2);
|
|
Wire.endTransmission();
|
|
|
|
Wire.requestFrom(bme_280_addr, (uint8_t)7);
|
|
while(Wire.available()){
|
|
dig[ord++] = Wire.read();
|
|
}
|
|
return ord == 32;
|
|
}
|
|
|
|
bool BME280I2C::ReadData(int32_t data[8]){
|
|
uint8_t ord = 0;
|
|
|
|
// Registers are in order. So we can start at the pressure register and read 8 bytes.
|
|
Wire.beginTransmission(bme_280_addr);
|
|
Wire.write(PRESS_ADDR);
|
|
Wire.endTransmission();
|
|
|
|
Wire.requestFrom(bme_280_addr, (uint8_t)8);
|
|
while(Wire.available()){
|
|
data[ord++] = Wire.read();
|
|
}
|
|
return ord == 8;
|
|
}
|
|
|
|
|
|
BME280I2C::BME280I2C(uint8_t tosr, uint8_t hosr, uint8_t posr, uint8_t mode, uint8_t st, uint8_t filter,
|
|
bool spiEnable, uint8_t bme_280_addr):
|
|
BME280(tosr, hosr, posr, mode, st, filter, spiEnable), bme_280_addr(bme_280_addr)
|
|
{
|
|
// ctrl_hum register. (ctrl_hum[2:0] = Humidity oversampling rate.)
|
|
controlHumidity = humidityOversamplingRate;
|
|
// ctrl_meas register. (ctrl_meas[7:5] = temperature oversampling rate, ctrl_meas[4:2] = pressure oversampling rate, ctrl_meas[1:0] = mode.)
|
|
controlMeasure = (tempOversamplingRate << 5) | (pressureOversamplingRate << 2) | mode;
|
|
// config register. (config[7:5] = standby time, config[4:2] = filter, ctrl_meas[0] = spi enable.)
|
|
config = (standbyTime << 5) | (filter << 2) | spiEnable;
|
|
}
|
|
|
|
#if defined(ARDUINO_ARCH_ESP8266)
|
|
bool BME280I2C::begin(int SDA, int SCL) {
|
|
// allow config of pins
|
|
Wire.begin(SDA,SCL);
|
|
return Initialize();
|
|
}
|
|
#endif
|
|
|
|
bool BME280I2C::begin(){
|
|
Wire.begin();
|
|
return Initialize();
|
|
}
|
|
|
|
/* ==== END Methods ==== */
|