bmp280/bme280: C port, C++ wraps C

Some private methods (relating to calibration/compensation) are no
longer exposed.  In addition, the driver auto-detects the chip (BMP280
or BME280) and acts accordingly, rather than requiring the
specification of a chip id in the ctor.

The getHumidity() method no longer accepts an arguement representing
pressure at sea level.  A new method is provided to specify this.

Signed-off-by: Jon Trulson <jtrulson@ics.com>
This commit is contained in:
Jon Trulson
2017-03-10 09:57:09 -07:00
parent 58cdfadf4e
commit c4a506f5a3
17 changed files with 1977 additions and 1215 deletions

View File

@ -1,6 +1,8 @@
/*
* Author: Jon Trulson <jtrulson@ics.com>
* Copyright (c) 2016 Intel Corporation.
* Copyright (c) 2016-2017 Intel Corporation.
*
* The MIT License
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
@ -24,192 +26,101 @@
#pragma once
#include <string>
#include <mraa/i2c.hpp>
#include <mraa/spi.hpp>
#include <mraa/gpio.hpp>
#include "interfaces/iHumiditySensor.hpp"
#include "bmp280.hpp"
#define BME280_DEFAULT_I2C_BUS 0
#define BME280_DEFAULT_SPI_BUS 0
#define BME280_DEFAULT_ADDR 0x77
#define BME280_DEFAULT_CHIPID 0x60
namespace upm {
/**
* @library bmp280
* @sensor bme280
* @comname Digital Humidity, Pressure, and Temperature Sensor
* @type pressure humidity
* @man adafruit
* @con i2c spi gpio
* @web https://www.adafruit.com/products/2652
*
* @brief API for the BME280 Digital Humidity, Pressure, and
* Temperature Sensor
*
* The BME280 is as combined digital humidity, pressure and
* temperature sensor based on proven sensing principles. The sensor
* module is housed in an extremely compact metal-lid LGA package
* with a footprint of only 2.5 * 2.5 mm2 with a height of 0.93
* mm. Its small dimensions and its low power consumption allow the
* implementation in battery driven devices such as handsets, GPS
* modules or watches. The BME280 is register and performance
* compatible to the Bosch Sensortec BMP280 digital pressure sensor
*
* @snippet bme280.cxx Interesting
*/
class BME280 : public BMP280, public IHumiditySensor {
public:
/**
* BMP280 registers
*/
typedef enum : uint8_t {
// Do not write into reserved bits.
// We only specify those registers specific to the BME280. The
// rest of them can be found in the BMP280 header file.
// read-only factory calibration data for humidity
REG_CALIB_DIG_H1 = 0xa1,
REG_CALIB_DIG_H2_LSB = 0xe1,
REG_CALIB_DIG_H2_MSB = 0xe2,
REG_CALIB_DIG_H3 = 0xe3,
REG_CALIB_DIG_H4_0 = 0xe4, // bits 8 -> 11:4
REG_CALIB_DIG_H4_1 = 0xe5, // bits 3:0 -> 3:0
REG_CALIB_DIG_H5_0 = 0xe5, // bits 7:4 -> 3:0
REG_CALIB_DIG_H5_1 = 0xe6, // bits 8 -> 11:4
REG_CALIB_DIG_H6 = 0xe7,
REG_CTRL_HUM = 0xf2,
REG_HUMIDITY_MSB = 0xfd,
REG_HUMIDITY_LSB = 0xfe
} BME280_REGS_T;
/**
* REG_CTRL_HUM bits
*/
typedef enum {
CTRL_HUM_OSRS_H0 = 0x01,
CTRL_HUM_OSRS_H1 = 0x02,
CTRL_HUM_OSRS_H2 = 0x04,
_CTRL_HUM_OSRS_H_MASK = 3,
_CTRL_HUM_OSRS_H_SHIFT = 0
// 0x08-0x80 reserved
} CTRL_HUM_T;
/**
* CTRL_HUM_OSRS_H values
*/
typedef enum {
OSRS_H_SKIPPED = 0,
OSRS_H_OVERSAMPLING_1 = 1, // x1
OSRS_H_OVERSAMPLING_2 = 2, // x2
OSRS_H_OVERSAMPLING_4 = 3,
OSRS_H_OVERSAMPLING_8 = 4,
OSRS_H_OVERSAMPLING_16 = 5
} OSRS_H_T;
/**
* BME280 constructor.
* @library bmp280
* @sensor bme280
* @comname Digital Humidity, Pressure, and Temperature Sensor
* @type pressure humidity
* @man adafruit
* @con i2c spi gpio
* @web https://www.adafruit.com/products/2652
*
* This device can support both I2C and SPI. For SPI, set the addr
* to -1, and specify a positive integer representing the Chip
* Select (CS) pin for the cs argument. If you are using a
* hardware CS pin, then you can connect the proper pin to the
* hardware CS pin on your MCU and supply -1 for cs. The default
* operating mode is I2C.
* @brief API for the BME280 Digital Humidity, Pressure, and
* Temperature Sensor
*
* @param bus I2C or SPI bus to use.
* @param address The address for this device. -1 for SPI.
* @param cs The gpio pin to use for the SPI Chip Select. -1 for
* I2C or for SPI with a hardware controlled pin.
* @param theChipID The chip ID used for validation
*/
BME280(int bus=BME280_DEFAULT_I2C_BUS, int addr=BME280_DEFAULT_ADDR,
int cs=-1, uint8_t theChipID=BME280_DEFAULT_CHIPID);
/**
* BME280 Destructor.
*/
virtual ~BME280();
/**
* Update the internal stored values from sensor data.
*/
virtual void update();
/**
* Return the current measured relative humidity. update() must
* have been called prior to calling this method.
* The BME280 is as combined digital humidity, pressure and
* temperature sensor based on proven sensing principles. The
* sensor module is housed in an extremely compact metal-lid LGA
* package with a footprint of only 2.5 * 2.5 mm2 with a height of
* 0.93 mm. Its small dimensions and its low power consumption
* allow the implementation in battery driven devices such as
* handsets, GPS modules or watches. The BME280 is register and
* performance compatible to the Bosch Sensortec BMP280 digital
* pressure sensor.
*
* @return The relative humidity in percent..
* @snippet bme280.cxx Interesting
*/
float getHumidity();
/**
* Set a general usage mode. This function can be used to
* configure the filters and oversampling for a particular use
* case. These settings are documented in the BMP280 and BME280
* datasheets.
*
* @param mode One of the USAGE_MODE_T values.
*/
virtual void setUsageMode(USAGE_MODE_T mode);
class BME280 : public BMP280, public IHumiditySensor {
public:
/**
* Set the humidity sensor oversampling parameter. See the data
* sheet for details. This value can be automatically set to a
* suitable value by using one of the predefined modes for
* setUsageMode().
*
* @param mode One of the OSRS_H_T values.
*/
void setOversampleRateHumidity(OSRS_H_T rate);
/**
* BME280 constructor.
*
* This driver supports both the BMP280 and the BME280. The
* BME280 adds a humidity sensor. The device type is detected
* automatically by querying the chip id register.
*
* This device can support both I2C and SPI. For SPI, set the addr
* to -1, and specify a positive integer representing the Chip
* Select (CS) pin for the cs argument. If you are using a
* hardware CS pin, then you can connect the proper pin to the
* hardware CS pin on your MCU and supply -1 for cs. The default
* operating mode is I2C.
*
* @param bus I2C or SPI bus to use.
* @param address The I2C address for this device. Use -1 for SPI.
* @param cs The gpio pin to use for the SPI Chip Select. Use -1
* for I2C, or for SPI with a hardware controlled pin.
* @throws std::runtime_error on failure.
*/
BME280(int bus=BME280_DEFAULT_I2C_BUS, int addr=BME280_DEFAULT_ADDR,
int cs=-1);
// Interface support
const char *getModuleName()
{
return "BME280";
/**
* BME280 Destructor.
*/
virtual ~BME280();
/**
* Return the current measured relative humidity. update()
* must have been called prior to calling this method. If the
* device is a bmp280 rather than a bme280, this method will
* always return 0.
*
* @return The relative humidity in percent.
*/
float getHumidity();
/**
* Set the humidity sensor oversampling parameter. See the data
* sheet for details. This value can be automatically set to a
* suitable value by using one of the predefined modes for
* setUsageMode().
*
* @param mode One of the OSRS_H_T values.
*/
void setOversampleRateHumidity(BME280_OSRS_H_T rate);
// Interface support
const char *getModuleName()
{
return "BME280";
};
int getHumidityRelative()
{
return int(getHumidity());
};
protected:
private:
};
int getHumidityRelative()
{
return int(getHumidity());
};
protected:
// relative humidity
float m_humidity;
// read the calibration data
virtual void readCalibrationData();
private:
// calibration data humidity
uint8_t m_dig_H1;
int16_t m_dig_H2;
uint8_t m_dig_H3;
int16_t m_dig_H4;
int16_t m_dig_H5;
int8_t m_dig_H6;
// Bosch supplied conversion/compensation functions from the
// datasheet.
uint32_t bme280_compensate_H_int32(int32_t adc_H);
};
}