From 6677fac2ab09e4cc885e35832f3d923487546d8e Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Thu, 23 Feb 2017 22:22:40 +0100 Subject: [PATCH 1/2] bugfix use bmp280 and not bme280 --- .../osd/arduino-bmp280/Adafruit_BME280.cpp | 502 ------------------ examples/osd/arduino-bmp280/Adafruit_BME280.h | 290 ---------- .../osd/arduino-bmp280/Adafruit_BMP280.cpp | 325 ++++++++++++ examples/osd/arduino-bmp280/Adafruit_BMP280.h | 153 ++++++ .../.github/ISSUE_TEMPLATE.md | 46 ++ .../.github/PULL_REQUEST_TEMPLATE.md | 26 + .../Adafruit_BMP280.cpp | 325 ++++++++++++ .../Adafruit_BMP280.h | 158 ++++++ .../README.md | 27 +- .../examples/bmp280test/bmp280test.ino | 57 ++ .../library.properties | 9 + .../Barometer_Sensor/Adafruit_BME280.cpp | 502 ------------------ .../Barometer_Sensor/Adafruit_BME280.h | 295 ---------- .../advancedsettings/advancedsettings.ino | 157 ------ .../examples/bme280test/bme280test.ino | 81 --- examples/osd/arduino-bmp280/Makefile | 2 +- examples/osd/arduino-bmp280/sketch.pde | 21 +- 17 files changed, 1115 insertions(+), 1861 deletions(-) delete mode 100644 examples/osd/arduino-bmp280/Adafruit_BME280.cpp delete mode 100644 examples/osd/arduino-bmp280/Adafruit_BME280.h create mode 100644 examples/osd/arduino-bmp280/Adafruit_BMP280.cpp create mode 100644 examples/osd/arduino-bmp280/Adafruit_BMP280.h create mode 100644 examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/.github/ISSUE_TEMPLATE.md create mode 100644 examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/Adafruit_BMP280.cpp create mode 100644 examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/Adafruit_BMP280.h rename examples/osd/arduino-bmp280/{Barometer_Sensor => Adafruit_BMP280_Library-master}/README.md (60%) create mode 100644 examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/examples/bmp280test/bmp280test.ino create mode 100644 examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/library.properties delete mode 100644 examples/osd/arduino-bmp280/Barometer_Sensor/Adafruit_BME280.cpp delete mode 100644 examples/osd/arduino-bmp280/Barometer_Sensor/Adafruit_BME280.h delete mode 100644 examples/osd/arduino-bmp280/Barometer_Sensor/examples/advancedsettings/advancedsettings.ino delete mode 100644 examples/osd/arduino-bmp280/Barometer_Sensor/examples/bme280test/bme280test.ino diff --git a/examples/osd/arduino-bmp280/Adafruit_BME280.cpp b/examples/osd/arduino-bmp280/Adafruit_BME280.cpp deleted file mode 100644 index ce21cf2a6..000000000 --- a/examples/osd/arduino-bmp280/Adafruit_BME280.cpp +++ /dev/null @@ -1,502 +0,0 @@ -/*************************************************************************** - 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. - - 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 - ***************************************************************************/ -#include "Arduino.h" -#include -#include -#include "Adafruit_BME280.h" - -/*************************************************************************** - PRIVATE FUNCTIONS - ***************************************************************************/ -Adafruit_BME280::Adafruit_BME280() - : _cs(-1), _mosi(-1), _miso(-1), _sck(-1) -{ } - -Adafruit_BME280::Adafruit_BME280(int8_t cspin) - : _cs(cspin), _mosi(-1), _miso(-1), _sck(-1) -{ } - -Adafruit_BME280::Adafruit_BME280(int8_t cspin, int8_t mosipin, int8_t misopin, int8_t sckpin) - : _cs(cspin), _mosi(mosipin), _miso(misopin), _sck(sckpin) -{ } - - -/**************************************************************************/ -/*! - @brief Initialise sensor with given parameters / settings -*/ -/**************************************************************************/ -bool Adafruit_BME280::begin(uint8_t addr) -{ - _i2caddr = addr; - - // init I2C or SPI sensor interface - if (_cs == -1) { - // I2C - Wire.begin(); - } else { - digitalWrite(_cs, HIGH); - pinMode(_cs, OUTPUT); - if (_sck == -1) { - // hardware SPI - SPI.begin(); - } else { - // software SPI - pinMode(_sck, OUTPUT); - pinMode(_mosi, OUTPUT); - pinMode(_miso, INPUT); - } - } - - // check if sensor, i.e. the chip ID is correct - if (read8(BME280_REGISTER_CHIPID) != 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(300); - - // if chip is still reading calibration, delay - while (isReadingCalibration()) - delay(100); - - readCoefficients(); // read trimming parameters, see DS 4.2.2 - - setSampling(); // use defaults - - 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. -*/ -/**************************************************************************/ - - -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; - - - // 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 Encapsulate hardware and software SPI transfer into one function -*/ -/**************************************************************************/ -uint8_t Adafruit_BME280::spixfer(uint8_t x) { - // hardware SPI - if (_sck == -1) - return SPI.transfer(x); - - // software SPI - uint8_t reply = 0; - for (int i=7; i>=0; i--) { - reply <<= 1; - digitalWrite(_sck, LOW); - digitalWrite(_mosi, x & (1<> 8) | (temp << 8); -} - - -/**************************************************************************/ -/*! - @brief Reads a signed 16 bit value over I2C or SPI -*/ -/**************************************************************************/ -int16_t Adafruit_BME280::readS16(byte reg) -{ - return (int16_t)read16(reg); -} - - -/**************************************************************************/ -/*! - -*/ -/**************************************************************************/ -int16_t Adafruit_BME280::readS16_LE(byte reg) -{ - return (int16_t)read16_LE(reg); -} - - -/**************************************************************************/ -/*! - @brief Reads a 24 bit value over I2C -*/ -/**************************************************************************/ -uint32_t Adafruit_BME280::read24(byte reg) -{ - uint32_t value; - - if (_cs == -1) { - Wire.beginTransmission((uint8_t)_i2caddr); - Wire.write((uint8_t)reg); - Wire.endTransmission(); - Wire.requestFrom((uint8_t)_i2caddr, (byte)3); - - value = Wire.read(); - value <<= 8; - value |= Wire.read(); - value <<= 8; - value |= Wire.read(); - } else { - if (_sck == -1) - SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0)); - digitalWrite(_cs, LOW); - spixfer(reg | 0x80); // read, bit 7 high - - value = spixfer(0); - value <<= 8; - value |= spixfer(0); - value <<= 8; - value |= spixfer(0); - - digitalWrite(_cs, HIGH); - if (_sck == -1) - SPI.endTransaction(); // release the SPI bus - } - - return value; -} - - -/**************************************************************************/ -/*! - @brief Take a new measurement (only possible in forced mode) -*/ -/**************************************************************************/ -void Adafruit_BME280::takeForcedMeasurement() -{ - // 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) { - // set to forced mode, i.e. "take next measurement" - write8(BME280_REGISTER_CONTROL, _measReg.get()); - // wait until measurement has been completed, otherwise we would read - // the values from the last measurement - while (read8(BME280_REGISTER_STATUS) & 0x08) - delay(1); - } -} - - -/**************************************************************************/ -/*! - @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 = (read8(BME280_REGISTER_DIG_H4) << 4) | (read8(BME280_REGISTER_DIG_H4+1) & 0xF); - _bme280_calib.dig_H5 = (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 -*/ -/**************************************************************************/ -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 -*/ -/**************************************************************************/ -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 = ((((adc_T>>3) - ((int32_t)_bme280_calib.dig_T1 <<1))) * - ((int32_t)_bme280_calib.dig_T2)) >> 11; - - var2 = (((((adc_T>>4) - ((int32_t)_bme280_calib.dig_T1)) * - ((adc_T>>4) - ((int32_t)_bme280_calib.dig_T1))) >> 12) * - ((int32_t)_bme280_calib.dig_T3)) >> 14; - - t_fine = var1 + var2; - - float T = (t_fine * 5 + 128) >> 8; - return T/100; -} - - -/**************************************************************************/ -/*! - @brief Returns the temperature from the sensor -*/ -/**************************************************************************/ -float Adafruit_BME280::readPressure(void) { - int64_t var1, var2, p; - - 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)<<17); - var2 = var2 + (((int64_t)_bme280_calib.dig_P4)<<35); - var1 = ((var1 * var1 * (int64_t)_bme280_calib.dig_P3)>>8) + - ((var1 * (int64_t)_bme280_calib.dig_P2)<<12); - var1 = (((((int64_t)1)<<47)+var1))*((int64_t)_bme280_calib.dig_P1)>>33; - - if (var1 == 0) { - return 0; // avoid exception caused by division by zero - } - p = 1048576 - adc_P; - p = (((p<<31) - var2)*3125) / var1; - var1 = (((int64_t)_bme280_calib.dig_P9) * (p>>13) * (p>>13)) >> 25; - var2 = (((int64_t)_bme280_calib.dig_P8) * p) >> 19; - - p = ((p + var1 + var2) >> 8) + (((int64_t)_bme280_calib.dig_P7)<<4); - return (float)p/256; -} - - -/**************************************************************************/ -/*! - @brief Returns the humidity from the sensor -*/ -/**************************************************************************/ -float Adafruit_BME280::readHumidity(void) { - 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; - - int32_t v_x1_u32r; - - v_x1_u32r = (t_fine - ((int32_t)76800)); - - v_x1_u32r = (((((adc_H << 14) - (((int32_t)_bme280_calib.dig_H4) << 20) - - (((int32_t)_bme280_calib.dig_H5) * v_x1_u32r)) + ((int32_t)16384)) >> 15) * - (((((((v_x1_u32r * ((int32_t)_bme280_calib.dig_H6)) >> 10) * - (((v_x1_u32r * ((int32_t)_bme280_calib.dig_H3)) >> 11) + ((int32_t)32768))) >> 10) + - ((int32_t)2097152)) * ((int32_t)_bme280_calib.dig_H2) + 8192) >> 14)); - - v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * - ((int32_t)_bme280_calib.dig_H1)) >> 4)); - - v_x1_u32r = (v_x1_u32r < 0) ? 0 : v_x1_u32r; - v_x1_u32r = (v_x1_u32r > 419430400) ? 419430400 : v_x1_u32r; - float h = (v_x1_u32r>>12); - return 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 - @param atmospheric Atmospheric pressure in hPa -*/ -/**************************************************************************/ -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 -*/ -/**************************************************************************/ -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); -} diff --git a/examples/osd/arduino-bmp280/Adafruit_BME280.h b/examples/osd/arduino-bmp280/Adafruit_BME280.h deleted file mode 100644 index 0b8b67af1..000000000 --- a/examples/osd/arduino-bmp280/Adafruit_BME280.h +++ /dev/null @@ -1,290 +0,0 @@ -/*************************************************************************** - 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. - - 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 - ***************************************************************************/ -#ifndef __BME280_H__ -#define __BME280_H__ - -#include "Arduino.h" -#include -#include - -/*========================================================================= - I2C ADDRESS/BITS - -----------------------------------------------------------------------*/ - #define BME280_ADDRESS (0x77) -/*=========================================================================*/ - -/*========================================================================= - REGISTERS - -----------------------------------------------------------------------*/ - 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 - }; - -/*=========================================================================*/ - -/*========================================================================= - CALIBRATION DATA - -----------------------------------------------------------------------*/ - typedef struct - { - uint16_t dig_T1; - int16_t dig_T2; - int16_t dig_T3; - - uint16_t dig_P1; - int16_t dig_P2; - int16_t dig_P3; - int16_t dig_P4; - int16_t dig_P5; - int16_t dig_P6; - int16_t dig_P7; - int16_t dig_P8; - int16_t dig_P9; - - uint8_t dig_H1; - int16_t dig_H2; - uint8_t dig_H3; - int16_t dig_H4; - int16_t dig_H5; - int8_t dig_H6; - } bme280_calib_data; -/*=========================================================================*/ - -/* -class Adafruit_BME280_Unified : public Adafruit_Sensor -{ - public: - Adafruit_BME280_Unified(int32_t sensorID = -1); - - bool begin(uint8_t addr = BME280_ADDRESS); - void getTemperature(float *temp); - void getPressure(float *pressure); - float pressureToAltitude(float seaLevel, float atmospheric, float temp); - float seaLevelForAltitude(float altitude, float atmospheric, float temp); - void getEvent(sensors_event_t*); - void getSensor(sensor_t*); - - private: - uint8_t _i2c_addr; - int32_t _sensorID; -}; - -*/ - -class Adafruit_BME280 { - public: - enum sensor_sampling { - SAMPLING_NONE = 0b000, - SAMPLING_X1 = 0b001, - SAMPLING_X2 = 0b010, - SAMPLING_X4 = 0b011, - SAMPLING_X8 = 0b100, - SAMPLING_X16 = 0b101 - }; - - enum sensor_mode { - MODE_SLEEP = 0b00, - MODE_FORCED = 0b01, - MODE_NORMAL = 0b11 - }; - - enum sensor_filter { - FILTER_OFF = 0b000, - FILTER_X2 = 0b001, - FILTER_X4 = 0b010, - FILTER_X8 = 0b011, - FILTER_X16 = 0b100 - }; - - // standby durations 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(void); - Adafruit_BME280(int8_t cspin); - Adafruit_BME280(int8_t cspin, int8_t mosipin, int8_t misopin, int8_t sckpin); - - bool begin(uint8_t addr = BME280_ADDRESS); - - 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 - ); - - void takeForcedMeasurement(); - float readTemperature(void); - float readPressure(void); - float readHumidity(void); - - float readAltitude(float seaLevel); - float seaLevelForAltitude(float altitude, float pressure); - - - private: - void readCoefficients(void); - bool isReadingCalibration(void); - uint8_t spixfer(uint8_t x); - - 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; - int32_t _sensorID; - int32_t t_fine; - - int8_t _cs, _mosi, _miso, _sck; - - bme280_calib_data _bme280_calib; - - // The 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; - - // filter settings - // 000 = filter off - // 001 = 2x filter - // 010 = 4x filter - // 011 = 8x filter - // 100 and above = 16x filter - unsigned int filter : 3; - - // unused - don't set - unsigned int none : 1; - unsigned int spi3w_en : 1; - - unsigned int get() { - return (t_sb << 5) | (filter << 3) | spi3w_en; - } - }; - config _configReg; - - - // The 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; - - // pressure oversampling - // 000 = skipped - // 001 = x1 - // 010 = x2 - // 011 = x4 - // 100 = x8 - // 101 and above = x16 - unsigned int osrs_p : 3; - - // device mode - // 00 = sleep - // 01 or 10 = forced - // 11 = normal - unsigned int mode : 2; - - unsigned int get() { - return (osrs_t << 5) | (osrs_p << 3) | mode; - } - }; - ctrl_meas _measReg; - - - // The 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; - - unsigned int get() { - return (osrs_h); - } - }; - ctrl_hum _humReg; -}; - -#endif diff --git a/examples/osd/arduino-bmp280/Adafruit_BMP280.cpp b/examples/osd/arduino-bmp280/Adafruit_BMP280.cpp new file mode 100644 index 000000000..59bc4e2bd --- /dev/null +++ b/examples/osd/arduino-bmp280/Adafruit_BMP280.cpp @@ -0,0 +1,325 @@ +/*************************************************************************** + This is a library for the BMP280 pressure sensor + + Designed specifically to work with the Adafruit BMP280 Breakout + ----> http://www.adafruit.com/products/2651 + + These sensors use I2C to communicate, 2 pins are required to interface. + + Adafruit invests time and resources providing this open source code, + please support Adafruit andopen-source hardware by purchasing products + from Adafruit! + + Written by Kevin Townsend for Adafruit Industries. + BSD license, all text above must be included in any redistribution + ***************************************************************************/ +#include "Arduino.h" +#include +#include +#include "Adafruit_BMP280.h" + + +/*************************************************************************** + PRIVATE FUNCTIONS + ***************************************************************************/ + + +Adafruit_BMP280::Adafruit_BMP280() + : _cs(-1), _mosi(-1), _miso(-1), _sck(-1) +{ } + +Adafruit_BMP280::Adafruit_BMP280(int8_t cspin) + : _cs(cspin), _mosi(-1), _miso(-1), _sck(-1) +{ } + +Adafruit_BMP280::Adafruit_BMP280(int8_t cspin, int8_t mosipin, int8_t misopin, int8_t sckpin) + : _cs(cspin), _mosi(mosipin), _miso(misopin), _sck(sckpin) +{ } + + +bool Adafruit_BMP280::begin(uint8_t a, uint8_t chipid) { + _i2caddr = a; + + if (_cs == -1) { + // i2c + Wire.begin(); + } else { + digitalWrite(_cs, HIGH); + pinMode(_cs, OUTPUT); + + if (_sck == -1) { + // hardware SPI + SPI.begin(); + } else { + // software SPI + pinMode(_sck, OUTPUT); + pinMode(_mosi, OUTPUT); + pinMode(_miso, INPUT); + } + } + + if (read8(BMP280_REGISTER_CHIPID) != chipid) + return false; + + readCoefficients(); + write8(BMP280_REGISTER_CONTROL, 0x3F); + return true; +} + +uint8_t Adafruit_BMP280::spixfer(uint8_t x) { + if (_sck == -1) + return SPI.transfer(x); + + // software spi + //Serial.println("Software SPI"); + uint8_t reply = 0; + for (int i=7; i>=0; i--) { + reply <<= 1; + digitalWrite(_sck, LOW); + digitalWrite(_mosi, x & (1<> 8) | (temp << 8); + +} + +/**************************************************************************/ +/*! + @brief Reads a signed 16 bit value over I2C/SPI +*/ +/**************************************************************************/ +int16_t Adafruit_BMP280::readS16(byte reg) +{ + return (int16_t)read16(reg); + +} + +int16_t Adafruit_BMP280::readS16_LE(byte reg) +{ + return (int16_t)read16_LE(reg); + +} + + +/**************************************************************************/ +/*! + @brief Reads a 24 bit value over I2C/SPI +*/ +/**************************************************************************/ +uint32_t Adafruit_BMP280::read24(byte reg) +{ + uint32_t value; + + if (_cs == -1) { + Wire.beginTransmission((uint8_t)_i2caddr); + Wire.write((uint8_t)reg); + Wire.endTransmission(); + Wire.requestFrom((uint8_t)_i2caddr, (byte)3); + + value = Wire.read(); + value <<= 8; + value |= Wire.read(); + value <<= 8; + value |= Wire.read(); + + } else { + if (_sck == -1) + SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0)); + digitalWrite(_cs, LOW); + spixfer(reg | 0x80); // read, bit 7 high + + value = spixfer(0); + value <<= 8; + value |= spixfer(0); + value <<= 8; + value |= spixfer(0); + + digitalWrite(_cs, HIGH); + if (_sck == -1) + SPI.endTransaction(); // release the SPI bus + } + + return value; +} + +/**************************************************************************/ +/*! + @brief Reads the factory-set coefficients +*/ +/**************************************************************************/ +void Adafruit_BMP280::readCoefficients(void) +{ + _bmp280_calib.dig_T1 = read16_LE(BMP280_REGISTER_DIG_T1); + _bmp280_calib.dig_T2 = readS16_LE(BMP280_REGISTER_DIG_T2); + _bmp280_calib.dig_T3 = readS16_LE(BMP280_REGISTER_DIG_T3); + + _bmp280_calib.dig_P1 = read16_LE(BMP280_REGISTER_DIG_P1); + _bmp280_calib.dig_P2 = readS16_LE(BMP280_REGISTER_DIG_P2); + _bmp280_calib.dig_P3 = readS16_LE(BMP280_REGISTER_DIG_P3); + _bmp280_calib.dig_P4 = readS16_LE(BMP280_REGISTER_DIG_P4); + _bmp280_calib.dig_P5 = readS16_LE(BMP280_REGISTER_DIG_P5); + _bmp280_calib.dig_P6 = readS16_LE(BMP280_REGISTER_DIG_P6); + _bmp280_calib.dig_P7 = readS16_LE(BMP280_REGISTER_DIG_P7); + _bmp280_calib.dig_P8 = readS16_LE(BMP280_REGISTER_DIG_P8); + _bmp280_calib.dig_P9 = readS16_LE(BMP280_REGISTER_DIG_P9); +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +float Adafruit_BMP280::readTemperature(void) +{ + int32_t var1, var2; + + int32_t adc_T = read24(BMP280_REGISTER_TEMPDATA); + adc_T >>= 4; + + var1 = ((((adc_T>>3) - ((int32_t)_bmp280_calib.dig_T1 <<1))) * + ((int32_t)_bmp280_calib.dig_T2)) >> 11; + + var2 = (((((adc_T>>4) - ((int32_t)_bmp280_calib.dig_T1)) * + ((adc_T>>4) - ((int32_t)_bmp280_calib.dig_T1))) >> 12) * + ((int32_t)_bmp280_calib.dig_T3)) >> 14; + + t_fine = var1 + var2; + + float T = (t_fine * 5 + 128) >> 8; + return T/100; +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +float Adafruit_BMP280::readPressure(void) { + int64_t var1, var2, p; + + // Must be done first to get the t_fine variable set up + readTemperature(); + + int32_t adc_P = read24(BMP280_REGISTER_PRESSUREDATA); + adc_P >>= 4; + + var1 = ((int64_t)t_fine) - 128000; + var2 = var1 * var1 * (int64_t)_bmp280_calib.dig_P6; + var2 = var2 + ((var1*(int64_t)_bmp280_calib.dig_P5)<<17); + var2 = var2 + (((int64_t)_bmp280_calib.dig_P4)<<35); + var1 = ((var1 * var1 * (int64_t)_bmp280_calib.dig_P3)>>8) + + ((var1 * (int64_t)_bmp280_calib.dig_P2)<<12); + var1 = (((((int64_t)1)<<47)+var1))*((int64_t)_bmp280_calib.dig_P1)>>33; + + if (var1 == 0) { + return 0; // avoid exception caused by division by zero + } + p = 1048576 - adc_P; + p = (((p<<31) - var2)*3125) / var1; + var1 = (((int64_t)_bmp280_calib.dig_P9) * (p>>13) * (p>>13)) >> 25; + var2 = (((int64_t)_bmp280_calib.dig_P8) * p) >> 19; + + p = ((p + var1 + var2) >> 8) + (((int64_t)_bmp280_calib.dig_P7)<<4); + return (float)p/256; +} + +float Adafruit_BMP280::readAltitude(float seaLevelhPa) { + float altitude; + + float pressure = readPressure(); // in Si units for Pascal + pressure /= 100; + + altitude = 44330 * (1.0 - pow(pressure / seaLevelhPa, 0.1903)); + + return altitude; +} diff --git a/examples/osd/arduino-bmp280/Adafruit_BMP280.h b/examples/osd/arduino-bmp280/Adafruit_BMP280.h new file mode 100644 index 000000000..1636af161 --- /dev/null +++ b/examples/osd/arduino-bmp280/Adafruit_BMP280.h @@ -0,0 +1,153 @@ +/*************************************************************************** + This is a library for the BMP280 pressure sensor + + Designed specifically to work with the Adafruit BMP280 Breakout + ----> http://www.adafruit.com/products/2651 + + These sensors use I2C to communicate, 2 pins are required to interface. + + Adafruit invests time and resources providing this open source code, + please support Adafruit andopen-source hardware by purchasing products + from Adafruit! + + Written by Kevin Townsend for Adafruit Industries. + BSD license, all text above must be included in any redistribution + ***************************************************************************/ +#ifndef __BMP280_H__ +#define __BMP280_H__ + +#include "Arduino.h" +#include + +#ifdef __AVR_ATtiny85__ + #include "TinyWireM.h" + #define Wire TinyWireM +#else + #include +#endif + +/*========================================================================= + I2C ADDRESS/BITS/SETTINGS + -----------------------------------------------------------------------*/ + #define BMP280_ADDRESS (0x77) + #define BMP280_CHIPID (0x58) +/*=========================================================================*/ + +/*========================================================================= + REGISTERS + -----------------------------------------------------------------------*/ + enum + { + BMP280_REGISTER_DIG_T1 = 0x88, + BMP280_REGISTER_DIG_T2 = 0x8A, + BMP280_REGISTER_DIG_T3 = 0x8C, + + BMP280_REGISTER_DIG_P1 = 0x8E, + BMP280_REGISTER_DIG_P2 = 0x90, + BMP280_REGISTER_DIG_P3 = 0x92, + BMP280_REGISTER_DIG_P4 = 0x94, + BMP280_REGISTER_DIG_P5 = 0x96, + BMP280_REGISTER_DIG_P6 = 0x98, + BMP280_REGISTER_DIG_P7 = 0x9A, + BMP280_REGISTER_DIG_P8 = 0x9C, + BMP280_REGISTER_DIG_P9 = 0x9E, + + BMP280_REGISTER_CHIPID = 0xD0, + BMP280_REGISTER_VERSION = 0xD1, + BMP280_REGISTER_SOFTRESET = 0xE0, + + BMP280_REGISTER_CAL26 = 0xE1, // R calibration stored in 0xE1-0xF0 + + BMP280_REGISTER_CONTROL = 0xF4, + BMP280_REGISTER_CONFIG = 0xF5, + BMP280_REGISTER_PRESSUREDATA = 0xF7, + BMP280_REGISTER_TEMPDATA = 0xFA, + }; + +/*=========================================================================*/ + +/*========================================================================= + CALIBRATION DATA + -----------------------------------------------------------------------*/ + typedef struct + { + uint16_t dig_T1; + int16_t dig_T2; + int16_t dig_T3; + + uint16_t dig_P1; + int16_t dig_P2; + int16_t dig_P3; + int16_t dig_P4; + int16_t dig_P5; + int16_t dig_P6; + int16_t dig_P7; + int16_t dig_P8; + int16_t dig_P9; + + uint8_t dig_H1; + int16_t dig_H2; + uint8_t dig_H3; + int16_t dig_H4; + int16_t dig_H5; + int8_t dig_H6; + } bmp280_calib_data; +/*=========================================================================*/ + +/* +class Adafruit_BMP280_Unified : public Adafruit_Sensor +{ + public: + Adafruit_BMP280_Unified(int32_t sensorID = -1); + + bool begin(uint8_t addr = BMP280_ADDRESS, uint8_t chipid = BMP280_CHIPID); + void getTemperature(float *temp); + void getPressure(float *pressure); + float pressureToAltitude(float seaLevel, float atmospheric, float temp); + float seaLevelForAltitude(float altitude, float atmospheric, float temp); + void getEvent(sensors_event_t*); + void getSensor(sensor_t*); + + private: + uint8_t _i2c_addr; + int32_t _sensorID; +}; + +*/ + +class Adafruit_BMP280 +{ + public: + Adafruit_BMP280(); + Adafruit_BMP280(int8_t cspin); + Adafruit_BMP280(int8_t cspin, int8_t mosipin, int8_t misopin, int8_t sckpin); + + bool begin(uint8_t addr = BMP280_ADDRESS, uint8_t chipid = BMP280_CHIPID); + float readTemperature(void); + float readPressure(void); + float readAltitude(float seaLevelhPa = 1013.25); + + private: + + void readCoefficients(void); + uint8_t spixfer(uint8_t x); + + 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; + int32_t _sensorID; + int32_t t_fine; + + int8_t _cs, _mosi, _miso, _sck; + + bmp280_calib_data _bmp280_calib; + +}; + +#endif diff --git a/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/.github/ISSUE_TEMPLATE.md b/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/.github/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..f0e26146f --- /dev/null +++ b/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,46 @@ +Thank you for opening an issue on an Adafruit Arduino library repository. To +improve the speed of resolution please review the following guidelines and +common troubleshooting steps below before creating the issue: + +- **Do not use GitHub issues for troubleshooting projects and issues.** Instead use + the forums at http://forums.adafruit.com to ask questions and troubleshoot why + something isn't working as expected. In many cases the problem is a common issue + that you will more quickly receive help from the forum community. GitHub issues + are meant for known defects in the code. If you don't know if there is a defect + in the code then start with troubleshooting on the forum first. + +- **If following a tutorial or guide be sure you didn't miss a step.** Carefully + check all of the steps and commands to run have been followed. Consult the + forum if you're unsure or have questions about steps in a guide/tutorial. + +- **For Arduino projects check these very common issues to ensure they don't apply**: + + - For uploading sketches or communicating with the board make sure you're using + a **USB data cable** and **not** a **USB charge-only cable**. It is sometimes + very hard to tell the difference between a data and charge cable! Try using the + cable with other devices or swapping to another cable to confirm it is not + the problem. + + - **Be sure you are supplying adequate power to the board.** Check the specs of + your board and plug in an external power supply. In many cases just + plugging a board into your computer is not enough to power it and other + peripherals. + + - **Double check all soldering joints and connections.** Flakey connections + cause many mysterious problems. See the [guide to excellent soldering](https://learn.adafruit.com/adafruit-guide-excellent-soldering/tools) for examples of good solder joints. + + - **Ensure you are using an official Arduino or Adafruit board.** We can't + guarantee a clone board will have the same functionality and work as expected + with this code and don't support them. + +If you're sure this issue is a defect in the code and checked the steps above +please fill in the following fields to provide enough troubleshooting information. +You may delete the guideline and text above to just leave the following details: + +- Arduino board: **INSERT ARDUINO BOARD NAME/TYPE HERE** + +- Arduino IDE version (found in Arduino -> About Arduino menu): **INSERT ARDUINO + VERSION HERE** + +- List the steps to reproduce the problem below (if possible attach a sketch or + copy the sketch code in too): **LIST REPRO STEPS BELOW** diff --git a/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/.github/PULL_REQUEST_TEMPLATE.md b/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..7b641eb86 --- /dev/null +++ b/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,26 @@ +Thank you for creating a pull request to contribute to Adafruit's GitHub code! +Before you open the request please review the following guidelines and tips to +help it be more easily integrated: + +- **Describe the scope of your change--i.e. what the change does and what parts + of the code were modified.** This will help us understand any risks of integrating + the code. + +- **Describe any known limitations with your change.** For example if the change + doesn't apply to a supported platform of the library please mention it. + +- **Please run any tests or examples that can exercise your modified code.** We + strive to not break users of the code and running tests/examples helps with this + process. + +Thank you again for contributing! We will try to test and integrate the change +as soon as we can, but be aware we have many GitHub repositories to manage and +can't immediately respond to every request. There is no need to bump or check in +on a pull request (it will clutter the discussion of the request). + +Also don't be worried if the request is closed or not integrated--sometimes the +priorities of Adafruit's GitHub code (education, ease of use) might not match the +priorities of the pull request. Don't fret, the open source community thrives on +forks and GitHub makes it easy to keep your changes in a forked repo. + +After reviewing the guidelines above you can delete this text from the pull request. diff --git a/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/Adafruit_BMP280.cpp b/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/Adafruit_BMP280.cpp new file mode 100644 index 000000000..59bc4e2bd --- /dev/null +++ b/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/Adafruit_BMP280.cpp @@ -0,0 +1,325 @@ +/*************************************************************************** + This is a library for the BMP280 pressure sensor + + Designed specifically to work with the Adafruit BMP280 Breakout + ----> http://www.adafruit.com/products/2651 + + These sensors use I2C to communicate, 2 pins are required to interface. + + Adafruit invests time and resources providing this open source code, + please support Adafruit andopen-source hardware by purchasing products + from Adafruit! + + Written by Kevin Townsend for Adafruit Industries. + BSD license, all text above must be included in any redistribution + ***************************************************************************/ +#include "Arduino.h" +#include +#include +#include "Adafruit_BMP280.h" + + +/*************************************************************************** + PRIVATE FUNCTIONS + ***************************************************************************/ + + +Adafruit_BMP280::Adafruit_BMP280() + : _cs(-1), _mosi(-1), _miso(-1), _sck(-1) +{ } + +Adafruit_BMP280::Adafruit_BMP280(int8_t cspin) + : _cs(cspin), _mosi(-1), _miso(-1), _sck(-1) +{ } + +Adafruit_BMP280::Adafruit_BMP280(int8_t cspin, int8_t mosipin, int8_t misopin, int8_t sckpin) + : _cs(cspin), _mosi(mosipin), _miso(misopin), _sck(sckpin) +{ } + + +bool Adafruit_BMP280::begin(uint8_t a, uint8_t chipid) { + _i2caddr = a; + + if (_cs == -1) { + // i2c + Wire.begin(); + } else { + digitalWrite(_cs, HIGH); + pinMode(_cs, OUTPUT); + + if (_sck == -1) { + // hardware SPI + SPI.begin(); + } else { + // software SPI + pinMode(_sck, OUTPUT); + pinMode(_mosi, OUTPUT); + pinMode(_miso, INPUT); + } + } + + if (read8(BMP280_REGISTER_CHIPID) != chipid) + return false; + + readCoefficients(); + write8(BMP280_REGISTER_CONTROL, 0x3F); + return true; +} + +uint8_t Adafruit_BMP280::spixfer(uint8_t x) { + if (_sck == -1) + return SPI.transfer(x); + + // software spi + //Serial.println("Software SPI"); + uint8_t reply = 0; + for (int i=7; i>=0; i--) { + reply <<= 1; + digitalWrite(_sck, LOW); + digitalWrite(_mosi, x & (1<> 8) | (temp << 8); + +} + +/**************************************************************************/ +/*! + @brief Reads a signed 16 bit value over I2C/SPI +*/ +/**************************************************************************/ +int16_t Adafruit_BMP280::readS16(byte reg) +{ + return (int16_t)read16(reg); + +} + +int16_t Adafruit_BMP280::readS16_LE(byte reg) +{ + return (int16_t)read16_LE(reg); + +} + + +/**************************************************************************/ +/*! + @brief Reads a 24 bit value over I2C/SPI +*/ +/**************************************************************************/ +uint32_t Adafruit_BMP280::read24(byte reg) +{ + uint32_t value; + + if (_cs == -1) { + Wire.beginTransmission((uint8_t)_i2caddr); + Wire.write((uint8_t)reg); + Wire.endTransmission(); + Wire.requestFrom((uint8_t)_i2caddr, (byte)3); + + value = Wire.read(); + value <<= 8; + value |= Wire.read(); + value <<= 8; + value |= Wire.read(); + + } else { + if (_sck == -1) + SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0)); + digitalWrite(_cs, LOW); + spixfer(reg | 0x80); // read, bit 7 high + + value = spixfer(0); + value <<= 8; + value |= spixfer(0); + value <<= 8; + value |= spixfer(0); + + digitalWrite(_cs, HIGH); + if (_sck == -1) + SPI.endTransaction(); // release the SPI bus + } + + return value; +} + +/**************************************************************************/ +/*! + @brief Reads the factory-set coefficients +*/ +/**************************************************************************/ +void Adafruit_BMP280::readCoefficients(void) +{ + _bmp280_calib.dig_T1 = read16_LE(BMP280_REGISTER_DIG_T1); + _bmp280_calib.dig_T2 = readS16_LE(BMP280_REGISTER_DIG_T2); + _bmp280_calib.dig_T3 = readS16_LE(BMP280_REGISTER_DIG_T3); + + _bmp280_calib.dig_P1 = read16_LE(BMP280_REGISTER_DIG_P1); + _bmp280_calib.dig_P2 = readS16_LE(BMP280_REGISTER_DIG_P2); + _bmp280_calib.dig_P3 = readS16_LE(BMP280_REGISTER_DIG_P3); + _bmp280_calib.dig_P4 = readS16_LE(BMP280_REGISTER_DIG_P4); + _bmp280_calib.dig_P5 = readS16_LE(BMP280_REGISTER_DIG_P5); + _bmp280_calib.dig_P6 = readS16_LE(BMP280_REGISTER_DIG_P6); + _bmp280_calib.dig_P7 = readS16_LE(BMP280_REGISTER_DIG_P7); + _bmp280_calib.dig_P8 = readS16_LE(BMP280_REGISTER_DIG_P8); + _bmp280_calib.dig_P9 = readS16_LE(BMP280_REGISTER_DIG_P9); +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +float Adafruit_BMP280::readTemperature(void) +{ + int32_t var1, var2; + + int32_t adc_T = read24(BMP280_REGISTER_TEMPDATA); + adc_T >>= 4; + + var1 = ((((adc_T>>3) - ((int32_t)_bmp280_calib.dig_T1 <<1))) * + ((int32_t)_bmp280_calib.dig_T2)) >> 11; + + var2 = (((((adc_T>>4) - ((int32_t)_bmp280_calib.dig_T1)) * + ((adc_T>>4) - ((int32_t)_bmp280_calib.dig_T1))) >> 12) * + ((int32_t)_bmp280_calib.dig_T3)) >> 14; + + t_fine = var1 + var2; + + float T = (t_fine * 5 + 128) >> 8; + return T/100; +} + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +float Adafruit_BMP280::readPressure(void) { + int64_t var1, var2, p; + + // Must be done first to get the t_fine variable set up + readTemperature(); + + int32_t adc_P = read24(BMP280_REGISTER_PRESSUREDATA); + adc_P >>= 4; + + var1 = ((int64_t)t_fine) - 128000; + var2 = var1 * var1 * (int64_t)_bmp280_calib.dig_P6; + var2 = var2 + ((var1*(int64_t)_bmp280_calib.dig_P5)<<17); + var2 = var2 + (((int64_t)_bmp280_calib.dig_P4)<<35); + var1 = ((var1 * var1 * (int64_t)_bmp280_calib.dig_P3)>>8) + + ((var1 * (int64_t)_bmp280_calib.dig_P2)<<12); + var1 = (((((int64_t)1)<<47)+var1))*((int64_t)_bmp280_calib.dig_P1)>>33; + + if (var1 == 0) { + return 0; // avoid exception caused by division by zero + } + p = 1048576 - adc_P; + p = (((p<<31) - var2)*3125) / var1; + var1 = (((int64_t)_bmp280_calib.dig_P9) * (p>>13) * (p>>13)) >> 25; + var2 = (((int64_t)_bmp280_calib.dig_P8) * p) >> 19; + + p = ((p + var1 + var2) >> 8) + (((int64_t)_bmp280_calib.dig_P7)<<4); + return (float)p/256; +} + +float Adafruit_BMP280::readAltitude(float seaLevelhPa) { + float altitude; + + float pressure = readPressure(); // in Si units for Pascal + pressure /= 100; + + altitude = 44330 * (1.0 - pow(pressure / seaLevelhPa, 0.1903)); + + return altitude; +} diff --git a/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/Adafruit_BMP280.h b/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/Adafruit_BMP280.h new file mode 100644 index 000000000..cab68953e --- /dev/null +++ b/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/Adafruit_BMP280.h @@ -0,0 +1,158 @@ +/*************************************************************************** + This is a library for the BMP280 pressure sensor + + Designed specifically to work with the Adafruit BMP280 Breakout + ----> http://www.adafruit.com/products/2651 + + These sensors use I2C to communicate, 2 pins are required to interface. + + Adafruit invests time and resources providing this open source code, + please support Adafruit andopen-source hardware by purchasing products + from Adafruit! + + Written by Kevin Townsend for Adafruit Industries. + BSD license, all text above must be included in any redistribution + ***************************************************************************/ +#ifndef __BMP280_H__ +#define __BMP280_H__ + +#if (ARDUINO >= 100) + #include "Arduino.h" +#else + #include "WProgram.h" +#endif + +#include + +#ifdef __AVR_ATtiny85__ + #include "TinyWireM.h" + #define Wire TinyWireM +#else + #include +#endif + +/*========================================================================= + I2C ADDRESS/BITS/SETTINGS + -----------------------------------------------------------------------*/ + #define BMP280_ADDRESS (0x77) + #define BMP280_CHIPID (0x58) +/*=========================================================================*/ + +/*========================================================================= + REGISTERS + -----------------------------------------------------------------------*/ + enum + { + BMP280_REGISTER_DIG_T1 = 0x88, + BMP280_REGISTER_DIG_T2 = 0x8A, + BMP280_REGISTER_DIG_T3 = 0x8C, + + BMP280_REGISTER_DIG_P1 = 0x8E, + BMP280_REGISTER_DIG_P2 = 0x90, + BMP280_REGISTER_DIG_P3 = 0x92, + BMP280_REGISTER_DIG_P4 = 0x94, + BMP280_REGISTER_DIG_P5 = 0x96, + BMP280_REGISTER_DIG_P6 = 0x98, + BMP280_REGISTER_DIG_P7 = 0x9A, + BMP280_REGISTER_DIG_P8 = 0x9C, + BMP280_REGISTER_DIG_P9 = 0x9E, + + BMP280_REGISTER_CHIPID = 0xD0, + BMP280_REGISTER_VERSION = 0xD1, + BMP280_REGISTER_SOFTRESET = 0xE0, + + BMP280_REGISTER_CAL26 = 0xE1, // R calibration stored in 0xE1-0xF0 + + BMP280_REGISTER_CONTROL = 0xF4, + BMP280_REGISTER_CONFIG = 0xF5, + BMP280_REGISTER_PRESSUREDATA = 0xF7, + BMP280_REGISTER_TEMPDATA = 0xFA, + }; + +/*=========================================================================*/ + +/*========================================================================= + CALIBRATION DATA + -----------------------------------------------------------------------*/ + typedef struct + { + uint16_t dig_T1; + int16_t dig_T2; + int16_t dig_T3; + + uint16_t dig_P1; + int16_t dig_P2; + int16_t dig_P3; + int16_t dig_P4; + int16_t dig_P5; + int16_t dig_P6; + int16_t dig_P7; + int16_t dig_P8; + int16_t dig_P9; + + uint8_t dig_H1; + int16_t dig_H2; + uint8_t dig_H3; + int16_t dig_H4; + int16_t dig_H5; + int8_t dig_H6; + } bmp280_calib_data; +/*=========================================================================*/ + +/* +class Adafruit_BMP280_Unified : public Adafruit_Sensor +{ + public: + Adafruit_BMP280_Unified(int32_t sensorID = -1); + + bool begin(uint8_t addr = BMP280_ADDRESS, uint8_t chipid = BMP280_CHIPID); + void getTemperature(float *temp); + void getPressure(float *pressure); + float pressureToAltitude(float seaLevel, float atmospheric, float temp); + float seaLevelForAltitude(float altitude, float atmospheric, float temp); + void getEvent(sensors_event_t*); + void getSensor(sensor_t*); + + private: + uint8_t _i2c_addr; + int32_t _sensorID; +}; + +*/ + +class Adafruit_BMP280 +{ + public: + Adafruit_BMP280(); + Adafruit_BMP280(int8_t cspin); + Adafruit_BMP280(int8_t cspin, int8_t mosipin, int8_t misopin, int8_t sckpin); + + bool begin(uint8_t addr = BMP280_ADDRESS, uint8_t chipid = BMP280_CHIPID); + float readTemperature(void); + float readPressure(void); + float readAltitude(float seaLevelhPa = 1013.25); + + private: + + void readCoefficients(void); + uint8_t spixfer(uint8_t x); + + 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; + int32_t _sensorID; + int32_t t_fine; + + int8_t _cs, _mosi, _miso, _sck; + + bmp280_calib_data _bmp280_calib; + +}; + +#endif diff --git a/examples/osd/arduino-bmp280/Barometer_Sensor/README.md b/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/README.md similarity index 60% rename from examples/osd/arduino-bmp280/Barometer_Sensor/README.md rename to examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/README.md index b015367df..49a9725c6 100644 --- a/examples/osd/arduino-bmp280/Barometer_Sensor/README.md +++ b/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/README.md @@ -1,30 +1,17 @@ -This is a library for the Adafruit BME280 Humidity, Barometric Pressure + Temp sensor +#Adafruit BMP280 Driver (Barometric Pressure Sensor) # -Designed specifically to work with the Adafruit BME280 Breakout - * http://www.adafruit.com/products/2652 +This driver is for the Adafruit BMP280 Breakout (http://www.adafruit.com/products/2651) -These sensors use I2C or SPI to communicate, up to 4 pins are required to interface +## About the BMP280 ## -Use of this library also requires [Adafruit_Sensor](https://github.com/adafruit/Adafruit_Sensor) -to be installed on your local system. +This precision sensor from Bosch is the best low-cost sensing solution for measuring barometric pressure and temperature. Because pressure changes with altitude you can also use it as an altimeter! -Adafruit invests time and resources providing this open source code, -please support Adafruit and open-source hardware by purchasing -products from Adafruit! +## About this Driver ## -Check out the links above for our tutorials and wiring diagrams +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/Ladyada for Adafruit Industries. -BSD license, all text above must be included in any redistribution +Written by Kevin (KTOWN) Townsend for Adafruit Industries. -To download. click the DOWNLOAD ZIP button, rename the uncompressed folder Adafruit_BME280. -Check that the Adafruit_BME280 folder contains Adafruit_BME280.cpp and Adafruit_BME280.h - -Place the Adafruit_BME280 library folder your arduinosketchfolder/libraries/ folder. -You may need to create the libraries subfolder if its your first library. Restart the IDE. - -We also have a great tutorial on Arduino library installation at: -http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use ## Compatibility diff --git a/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/examples/bmp280test/bmp280test.ino b/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/examples/bmp280test/bmp280test.ino new file mode 100644 index 000000000..3c5eff0f4 --- /dev/null +++ b/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/examples/bmp280test/bmp280test.ino @@ -0,0 +1,57 @@ +/*************************************************************************** + This is a library for the BMP280 humidity, temperature & pressure sensor + + Designed specifically to work with the Adafruit BMEP280 Breakout + ----> http://www.adafruit.com/products/2651 + + 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 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 + ***************************************************************************/ + +#include +#include +#include +#include + +#define BMP_SCK 13 +#define BMP_MISO 12 +#define BMP_MOSI 11 +#define BMP_CS 10 + +Adafruit_BMP280 bme; // I2C +//Adafruit_BMP280 bme(BMP_CS); // hardware SPI +//Adafruit_BMP280 bme(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK); + +void setup() { + Serial.begin(9600); + Serial.println(F("BMP280 test")); + + if (!bme.begin()) { + Serial.println(F("Could not find a valid BMP280 sensor, check wiring!")); + while (1); + } +} + +void loop() { + Serial.print(F("Temperature = ")); + Serial.print(bme.readTemperature()); + Serial.println(" *C"); + + Serial.print(F("Pressure = ")); + Serial.print(bme.readPressure()); + Serial.println(" Pa"); + + Serial.print(F("Approx altitude = ")); + Serial.print(bme.readAltitude(1013.25)); // this should be adjusted to your local forcase + Serial.println(" m"); + + Serial.println(); + delay(2000); +} diff --git a/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/library.properties b/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/library.properties new file mode 100644 index 000000000..337758d12 --- /dev/null +++ b/examples/osd/arduino-bmp280/Adafruit_BMP280_Library-master/library.properties @@ -0,0 +1,9 @@ +name=Adafruit BMP280 Library +version=1.0.2 +author=Adafruit +maintainer=Adafruit +sentence=Arduino library for BMP280 sensors. +paragraph=Arduino library for BMP280 pressure and altitude sensors. +category=Sensors +url=https://github.com/adafruit/Adafruit_BMP280_Library +architectures=* diff --git a/examples/osd/arduino-bmp280/Barometer_Sensor/Adafruit_BME280.cpp b/examples/osd/arduino-bmp280/Barometer_Sensor/Adafruit_BME280.cpp deleted file mode 100644 index ce21cf2a6..000000000 --- a/examples/osd/arduino-bmp280/Barometer_Sensor/Adafruit_BME280.cpp +++ /dev/null @@ -1,502 +0,0 @@ -/*************************************************************************** - 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. - - 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 - ***************************************************************************/ -#include "Arduino.h" -#include -#include -#include "Adafruit_BME280.h" - -/*************************************************************************** - PRIVATE FUNCTIONS - ***************************************************************************/ -Adafruit_BME280::Adafruit_BME280() - : _cs(-1), _mosi(-1), _miso(-1), _sck(-1) -{ } - -Adafruit_BME280::Adafruit_BME280(int8_t cspin) - : _cs(cspin), _mosi(-1), _miso(-1), _sck(-1) -{ } - -Adafruit_BME280::Adafruit_BME280(int8_t cspin, int8_t mosipin, int8_t misopin, int8_t sckpin) - : _cs(cspin), _mosi(mosipin), _miso(misopin), _sck(sckpin) -{ } - - -/**************************************************************************/ -/*! - @brief Initialise sensor with given parameters / settings -*/ -/**************************************************************************/ -bool Adafruit_BME280::begin(uint8_t addr) -{ - _i2caddr = addr; - - // init I2C or SPI sensor interface - if (_cs == -1) { - // I2C - Wire.begin(); - } else { - digitalWrite(_cs, HIGH); - pinMode(_cs, OUTPUT); - if (_sck == -1) { - // hardware SPI - SPI.begin(); - } else { - // software SPI - pinMode(_sck, OUTPUT); - pinMode(_mosi, OUTPUT); - pinMode(_miso, INPUT); - } - } - - // check if sensor, i.e. the chip ID is correct - if (read8(BME280_REGISTER_CHIPID) != 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(300); - - // if chip is still reading calibration, delay - while (isReadingCalibration()) - delay(100); - - readCoefficients(); // read trimming parameters, see DS 4.2.2 - - setSampling(); // use defaults - - 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. -*/ -/**************************************************************************/ - - -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; - - - // 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 Encapsulate hardware and software SPI transfer into one function -*/ -/**************************************************************************/ -uint8_t Adafruit_BME280::spixfer(uint8_t x) { - // hardware SPI - if (_sck == -1) - return SPI.transfer(x); - - // software SPI - uint8_t reply = 0; - for (int i=7; i>=0; i--) { - reply <<= 1; - digitalWrite(_sck, LOW); - digitalWrite(_mosi, x & (1<> 8) | (temp << 8); -} - - -/**************************************************************************/ -/*! - @brief Reads a signed 16 bit value over I2C or SPI -*/ -/**************************************************************************/ -int16_t Adafruit_BME280::readS16(byte reg) -{ - return (int16_t)read16(reg); -} - - -/**************************************************************************/ -/*! - -*/ -/**************************************************************************/ -int16_t Adafruit_BME280::readS16_LE(byte reg) -{ - return (int16_t)read16_LE(reg); -} - - -/**************************************************************************/ -/*! - @brief Reads a 24 bit value over I2C -*/ -/**************************************************************************/ -uint32_t Adafruit_BME280::read24(byte reg) -{ - uint32_t value; - - if (_cs == -1) { - Wire.beginTransmission((uint8_t)_i2caddr); - Wire.write((uint8_t)reg); - Wire.endTransmission(); - Wire.requestFrom((uint8_t)_i2caddr, (byte)3); - - value = Wire.read(); - value <<= 8; - value |= Wire.read(); - value <<= 8; - value |= Wire.read(); - } else { - if (_sck == -1) - SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0)); - digitalWrite(_cs, LOW); - spixfer(reg | 0x80); // read, bit 7 high - - value = spixfer(0); - value <<= 8; - value |= spixfer(0); - value <<= 8; - value |= spixfer(0); - - digitalWrite(_cs, HIGH); - if (_sck == -1) - SPI.endTransaction(); // release the SPI bus - } - - return value; -} - - -/**************************************************************************/ -/*! - @brief Take a new measurement (only possible in forced mode) -*/ -/**************************************************************************/ -void Adafruit_BME280::takeForcedMeasurement() -{ - // 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) { - // set to forced mode, i.e. "take next measurement" - write8(BME280_REGISTER_CONTROL, _measReg.get()); - // wait until measurement has been completed, otherwise we would read - // the values from the last measurement - while (read8(BME280_REGISTER_STATUS) & 0x08) - delay(1); - } -} - - -/**************************************************************************/ -/*! - @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 = (read8(BME280_REGISTER_DIG_H4) << 4) | (read8(BME280_REGISTER_DIG_H4+1) & 0xF); - _bme280_calib.dig_H5 = (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 -*/ -/**************************************************************************/ -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 -*/ -/**************************************************************************/ -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 = ((((adc_T>>3) - ((int32_t)_bme280_calib.dig_T1 <<1))) * - ((int32_t)_bme280_calib.dig_T2)) >> 11; - - var2 = (((((adc_T>>4) - ((int32_t)_bme280_calib.dig_T1)) * - ((adc_T>>4) - ((int32_t)_bme280_calib.dig_T1))) >> 12) * - ((int32_t)_bme280_calib.dig_T3)) >> 14; - - t_fine = var1 + var2; - - float T = (t_fine * 5 + 128) >> 8; - return T/100; -} - - -/**************************************************************************/ -/*! - @brief Returns the temperature from the sensor -*/ -/**************************************************************************/ -float Adafruit_BME280::readPressure(void) { - int64_t var1, var2, p; - - 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)<<17); - var2 = var2 + (((int64_t)_bme280_calib.dig_P4)<<35); - var1 = ((var1 * var1 * (int64_t)_bme280_calib.dig_P3)>>8) + - ((var1 * (int64_t)_bme280_calib.dig_P2)<<12); - var1 = (((((int64_t)1)<<47)+var1))*((int64_t)_bme280_calib.dig_P1)>>33; - - if (var1 == 0) { - return 0; // avoid exception caused by division by zero - } - p = 1048576 - adc_P; - p = (((p<<31) - var2)*3125) / var1; - var1 = (((int64_t)_bme280_calib.dig_P9) * (p>>13) * (p>>13)) >> 25; - var2 = (((int64_t)_bme280_calib.dig_P8) * p) >> 19; - - p = ((p + var1 + var2) >> 8) + (((int64_t)_bme280_calib.dig_P7)<<4); - return (float)p/256; -} - - -/**************************************************************************/ -/*! - @brief Returns the humidity from the sensor -*/ -/**************************************************************************/ -float Adafruit_BME280::readHumidity(void) { - 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; - - int32_t v_x1_u32r; - - v_x1_u32r = (t_fine - ((int32_t)76800)); - - v_x1_u32r = (((((adc_H << 14) - (((int32_t)_bme280_calib.dig_H4) << 20) - - (((int32_t)_bme280_calib.dig_H5) * v_x1_u32r)) + ((int32_t)16384)) >> 15) * - (((((((v_x1_u32r * ((int32_t)_bme280_calib.dig_H6)) >> 10) * - (((v_x1_u32r * ((int32_t)_bme280_calib.dig_H3)) >> 11) + ((int32_t)32768))) >> 10) + - ((int32_t)2097152)) * ((int32_t)_bme280_calib.dig_H2) + 8192) >> 14)); - - v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * - ((int32_t)_bme280_calib.dig_H1)) >> 4)); - - v_x1_u32r = (v_x1_u32r < 0) ? 0 : v_x1_u32r; - v_x1_u32r = (v_x1_u32r > 419430400) ? 419430400 : v_x1_u32r; - float h = (v_x1_u32r>>12); - return 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 - @param atmospheric Atmospheric pressure in hPa -*/ -/**************************************************************************/ -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 -*/ -/**************************************************************************/ -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); -} diff --git a/examples/osd/arduino-bmp280/Barometer_Sensor/Adafruit_BME280.h b/examples/osd/arduino-bmp280/Barometer_Sensor/Adafruit_BME280.h deleted file mode 100644 index a0de5f782..000000000 --- a/examples/osd/arduino-bmp280/Barometer_Sensor/Adafruit_BME280.h +++ /dev/null @@ -1,295 +0,0 @@ -/*************************************************************************** - 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. - - 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 - ***************************************************************************/ -#ifndef __BME280_H__ -#define __BME280_H__ - -#if (ARDUINO >= 100) - #include "Arduino.h" -#else - #include "WProgram.h" -#endif - -#include -#include - -/*========================================================================= - I2C ADDRESS/BITS - -----------------------------------------------------------------------*/ - #define BME280_ADDRESS (0x77) -/*=========================================================================*/ - -/*========================================================================= - REGISTERS - -----------------------------------------------------------------------*/ - 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 - }; - -/*=========================================================================*/ - -/*========================================================================= - CALIBRATION DATA - -----------------------------------------------------------------------*/ - typedef struct - { - uint16_t dig_T1; - int16_t dig_T2; - int16_t dig_T3; - - uint16_t dig_P1; - int16_t dig_P2; - int16_t dig_P3; - int16_t dig_P4; - int16_t dig_P5; - int16_t dig_P6; - int16_t dig_P7; - int16_t dig_P8; - int16_t dig_P9; - - uint8_t dig_H1; - int16_t dig_H2; - uint8_t dig_H3; - int16_t dig_H4; - int16_t dig_H5; - int8_t dig_H6; - } bme280_calib_data; -/*=========================================================================*/ - -/* -class Adafruit_BME280_Unified : public Adafruit_Sensor -{ - public: - Adafruit_BME280_Unified(int32_t sensorID = -1); - - bool begin(uint8_t addr = BME280_ADDRESS); - void getTemperature(float *temp); - void getPressure(float *pressure); - float pressureToAltitude(float seaLevel, float atmospheric, float temp); - float seaLevelForAltitude(float altitude, float atmospheric, float temp); - void getEvent(sensors_event_t*); - void getSensor(sensor_t*); - - private: - uint8_t _i2c_addr; - int32_t _sensorID; -}; - -*/ - -class Adafruit_BME280 { - public: - enum sensor_sampling { - SAMPLING_NONE = 0b000, - SAMPLING_X1 = 0b001, - SAMPLING_X2 = 0b010, - SAMPLING_X4 = 0b011, - SAMPLING_X8 = 0b100, - SAMPLING_X16 = 0b101 - }; - - enum sensor_mode { - MODE_SLEEP = 0b00, - MODE_FORCED = 0b01, - MODE_NORMAL = 0b11 - }; - - enum sensor_filter { - FILTER_OFF = 0b000, - FILTER_X2 = 0b001, - FILTER_X4 = 0b010, - FILTER_X8 = 0b011, - FILTER_X16 = 0b100 - }; - - // standby durations 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(void); - Adafruit_BME280(int8_t cspin); - Adafruit_BME280(int8_t cspin, int8_t mosipin, int8_t misopin, int8_t sckpin); - - bool begin(uint8_t addr = BME280_ADDRESS); - - 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 - ); - - void takeForcedMeasurement(); - float readTemperature(void); - float readPressure(void); - float readHumidity(void); - - float readAltitude(float seaLevel); - float seaLevelForAltitude(float altitude, float pressure); - - - private: - void readCoefficients(void); - bool isReadingCalibration(void); - uint8_t spixfer(uint8_t x); - - 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; - int32_t _sensorID; - int32_t t_fine; - - int8_t _cs, _mosi, _miso, _sck; - - bme280_calib_data _bme280_calib; - - // The 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; - - // filter settings - // 000 = filter off - // 001 = 2x filter - // 010 = 4x filter - // 011 = 8x filter - // 100 and above = 16x filter - unsigned int filter : 3; - - // unused - don't set - unsigned int none : 1; - unsigned int spi3w_en : 1; - - unsigned int get() { - return (t_sb << 5) | (filter << 3) | spi3w_en; - } - }; - config _configReg; - - - // The 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; - - // pressure oversampling - // 000 = skipped - // 001 = x1 - // 010 = x2 - // 011 = x4 - // 100 = x8 - // 101 and above = x16 - unsigned int osrs_p : 3; - - // device mode - // 00 = sleep - // 01 or 10 = forced - // 11 = normal - unsigned int mode : 2; - - unsigned int get() { - return (osrs_t << 5) | (osrs_p << 3) | mode; - } - }; - ctrl_meas _measReg; - - - // The 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; - - unsigned int get() { - return (osrs_h); - } - }; - ctrl_hum _humReg; -}; - -#endif diff --git a/examples/osd/arduino-bmp280/Barometer_Sensor/examples/advancedsettings/advancedsettings.ino b/examples/osd/arduino-bmp280/Barometer_Sensor/examples/advancedsettings/advancedsettings.ino deleted file mode 100644 index 08fb0c026..000000000 --- a/examples/osd/arduino-bmp280/Barometer_Sensor/examples/advancedsettings/advancedsettings.ino +++ /dev/null @@ -1,157 +0,0 @@ -/*************************************************************************** - 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 - ***************************************************************************/ - -#include -#include -#include -#include - -#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()) { - 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(); -} \ No newline at end of file diff --git a/examples/osd/arduino-bmp280/Barometer_Sensor/examples/bme280test/bme280test.ino b/examples/osd/arduino-bmp280/Barometer_Sensor/examples/bme280test/bme280test.ino deleted file mode 100644 index ca84c39b6..000000000 --- a/examples/osd/arduino-bmp280/Barometer_Sensor/examples/bme280test/bme280test.ino +++ /dev/null @@ -1,81 +0,0 @@ -/*************************************************************************** - 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 - ***************************************************************************/ - -#include -#include -#include -#include - -#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")); - - bool status; - - // default settings - status = bme.begin(); - if (!status) { - Serial.println("Could not find a valid BME280 sensor, check wiring!"); - while (1); - } - - 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(); -} \ No newline at end of file diff --git a/examples/osd/arduino-bmp280/Makefile b/examples/osd/arduino-bmp280/Makefile index f2566e617..f69d0c202 100644 --- a/examples/osd/arduino-bmp280/Makefile +++ b/examples/osd/arduino-bmp280/Makefile @@ -12,7 +12,7 @@ CONTIKI_WITH_IPV6 = 1 CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" LFLAGS += -lm -PROJECT_SOURCEFILES += ${SKETCH}.cpp Adafruit_BME280.cpp +PROJECT_SOURCEFILES += ${SKETCH}.cpp Adafruit_BMP280.cpp # automatically build RESTful resources REST_RESOURCES_DIR = ./resources diff --git a/examples/osd/arduino-bmp280/sketch.pde b/examples/osd/arduino-bmp280/sketch.pde index 259a8d2d9..39a139f1a 100644 --- a/examples/osd/arduino-bmp280/sketch.pde +++ b/examples/osd/arduino-bmp280/sketch.pde @@ -12,7 +12,7 @@ #include #include -#include +#include extern "C" { #include "arduino-process.h" @@ -26,13 +26,13 @@ float bmpatm; float bmpalt; float bmphum; char bmptemp_s[8]; -char bmppress_s[8]; +char bmppress_s[10]; char bmpatm_s[8]; char bmpalt_s[8]; char bmphum_s[8]; #define SEALEVELPRESSURE_HPA (1013.25) -Adafruit_BME280 bme; // I2C +Adafruit_BMP280 bme; // I2C #define LED_PIN 4 } @@ -46,9 +46,9 @@ void setup (void) bool status; // default settings - status = bme.begin(0x77); + status = bme.begin(0x76); if (!status) { - printf("Could not find a valid BME280 sensor, check wiring!"); + printf("Could not find a valid BMP280 sensor, check wiring!"); } // init coap resourcen rest_init_engine (); @@ -69,13 +69,12 @@ void loop (void) bmppress = bme.readPressure(); bmpalt = bme.readAltitude(SEALEVELPRESSURE_HPA); bmpatm = bme.readPressure() / 100.0F; - bmphum = bme.readHumidity(); dtostrf(bmptemp , 6, 2, bmptemp_s ); dtostrf(bmppress , 6, 2, bmppress_s ); dtostrf(bmpalt , 6, 2, bmpalt_s ); dtostrf(bmpatm , 6, 2, bmpatm_s ); - dtostrf(bmphum , 6, 2, bmphum_s ); + // remove space if(bmptemp_s[0]==' '){ @@ -90,14 +89,10 @@ void loop (void) if(bmpatm_s[0]==' '){ memcpy (bmpatm_s,bmpatm_s+1,strlen(bmpatm_s)+1); } - if(bmphum_s[0]==' '){ - memcpy (bmphum_s,bmphum_s+1,strlen(bmphum_s)+1); - } - + // Debug Print printf("Temp: %s\n",bmptemp_s); printf("Press: %s\n",bmppress_s); printf("Altitude: %s\n",bmpalt_s); - printf("atm: %s\n",bmpatm_s); - printf("hum: %s\n",bmphum_s); + printf("atm: %s\n",bmpatm_s); } From 4151c09e2cbb503c78321186d0a92872cf8bce00 Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Thu, 23 Feb 2017 22:36:32 +0100 Subject: [PATCH 2/2] cleanup code --- examples/osd/arduino-bmp280/sketch.pde | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/examples/osd/arduino-bmp280/sketch.pde b/examples/osd/arduino-bmp280/sketch.pde index 39a139f1a..64ebf144d 100644 --- a/examples/osd/arduino-bmp280/sketch.pde +++ b/examples/osd/arduino-bmp280/sketch.pde @@ -24,12 +24,10 @@ float bmptemp; float bmppress; float bmpatm; float bmpalt; -float bmphum; char bmptemp_s[8]; char bmppress_s[10]; char bmpatm_s[8]; -char bmpalt_s[8]; -char bmphum_s[8]; +char bmpalt_s[8];; #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BMP280 bme; // I2C @@ -39,12 +37,11 @@ Adafruit_BMP280 bme; // I2C void setup (void) { + bool status; + // switch off the led pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, HIGH); - - bool status; - // default settings status = bme.begin(0x76); if (!status) {