OS6. i2s BME280 library, also works with BMP280 without Humidity. See BME280.h for example code.

BME280.h

Committer:
star297
Date:
2021-01-02
Revision:
0:19fab6c64964

File content as of revision 0:19fab6c64964:

#ifndef BME_H
#define BME_H

#include "mbed.h"

#define _debug   1      // '1' to enable prinf BME's registers

/*
Bosch Sensortec BMP280 BME280 i2c example code
using 64bit numeric calculations as recomended by Bosch.
Some sensors supplied from Chinese suppliers may have 'suspect'
quality sensor with different i2c address.
My sensors were address 0xEC and all the ones I have
differ quite a bit in tolerance :( so be aware if accuracy is paramount.
*/

/*
#include "mbed.h"
#include "BME280.h"

BME sensor(D0,D1, 0xEC); // sda, clk, 8bit address (NUCLEO-L432)
DigitalOut led(LED1);

float temp, humidity, pressure, altitude;

int main()
{

    int BMPE_id = sensor.init();    // initialise and get sensor id

    if(!BMPE_id) {
        printf("No sensor detected!!\n");
        while(1){
            led=!led;
            ThisThread::sleep_for(200ms);
        }
    }
     
    if(_debug){ // set _debug to '1' to see BME's registers
        ThisThread::sleep_for(2s);
        }
    
    while(1) {
        led=1;
        printf("\033[0m\033[2J\033[H------- BME280-BMP280 Sensor example -------\r\n\n");
        if(BMPE_id==0x60) {
            printf("BME280 detected id: 0x%x\n\n",BMPE_id);
        } else if(BMPE_id==0x58) {
            printf("BMP280 detected id: 0x%x\n\n",BMPE_id);
        }

        temp = sensor.getTemperature();
            
        printf("Temperature: %3.2f %cc \n",temp,0xb0);

        if(sensor.chip_id==0x60) {        // only BME has Humidity
            humidity    = sensor.getHumidity();
            printf("Humidity:    %2.2f %cRh \n", humidity,0x25);
        }
        pressure    = sensor.getPressure();
        printf("Pressure:    %4.2f mbar's \n\n",pressure);

        altitude = 44330.0f*( 1.0f - pow((pressure/1013.25f), (1.0f/5.255f)))+18;     // Calculate altitude in meters
        printf("Altitude: %3.1f meters   %4.1f feet \r\n(Referenced to 1,013.25 millibars @ sea level) \r\n\n", altitude,altitude*3.2810f);
        led=0;
        ThisThread::sleep_for(1s);
    }
}
*/

class BME
{
public:

    BME(PinName sda, PinName scl, char slave_adr);

    int         init(void);
    int         chipID(void);
    float       getTemperature(void);
    float       getPressure(void);
    float       getHumidity(void);
  
    uint16_t    chip_id;

private:

    I2C         bme;
    void        initialize(void);
    char        address;
    uint16_t    dig_T1;
    int16_t     dig_T2, dig_T3;
    uint16_t    dig_P1;
    int16_t     dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7, dig_P8, dig_P9;
    uint16_t    dig_H1, dig_H3;
    int16_t     dig_H2, dig_H4, dig_H5, dig_H6;
    int32_t     t_fine;
    bool        dbg_on;
};
#endif // BME_H