BME280 library

Dependents:   mbed_BME280

Files at this revision

API Documentation at this revision

Comitter:
yasuyuki
Date:
Mon Nov 23 07:50:28 2015 +0000
Child:
1:0054d4a28927
Commit message:
release

Changed in this revision

BME280.cpp Show annotated file Show diff for this revision Revisions of this file
BME280.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BME280.cpp	Mon Nov 23 07:50:28 2015 +0000
@@ -0,0 +1,213 @@
+//**********************
+// BME280.cpp for mbed
+//
+// BME280 bme280(P0_5,P0_4);
+// or
+// I2C i2c(P0_5,P0_4);
+// BME280 bme280(i2c);
+//
+// (C)Copyright 2015 All rights reserved by Y.Onodera
+// http://einstlab.web.fc2.com
+//**********************
+
+#include "mbed.h"
+#include "BME280.h"
+
+BME280::BME280 (PinName sda, PinName scl) : _i2c(sda, scl) {
+    init();
+}
+BME280::BME280 (I2C& p_i2c) : _i2c(p_i2c) {
+    init();
+}
+
+
+unsigned char BME280::get(unsigned char a)
+{
+    
+    buf[0] = a;  // register
+    _i2c.write(BME280_ADDR, buf, 1);   // with stop
+    // get data
+    _i2c.read( BME280_ADDR, buf, 1);
+    return buf[0];
+
+}
+
+void BME280::set(unsigned char a, unsigned char b)
+{
+    
+    buf[0] = a;  // register
+    buf[1] = b;
+    _i2c.write(BME280_ADDR, buf, 2);   // with stop
+
+}
+
+
+void BME280::getALL()
+{
+    // set ctrl_meas : forced mode
+    set(ctrl_meas, 0x25);
+
+    // wait status
+    if(get(status) != 0)wait_ms(1);
+
+    // get temp
+    temp.XLSB = get(temp_xlsb);
+    temp.LSB = get(temp_lsb);
+    temp.MSB = get(temp_msb);
+    temp.dummy = 0;
+
+    // get press
+    press.XLSB = get(press_xlsb);
+    press.LSB = get(press_lsb);
+    press.MSB = get(press_msb);
+    press.dummy = 0;
+
+    // get hum
+    hum.LSB = get(hum_lsb);
+    hum.MSB = get(hum_msb);
+
+
+    // compensation
+    t = BME280_compensate_T_int32(temp.s32>>12);
+    p = BME280_compensate_P_int64(press.s32>>12);
+    h = BME280_compensate_H_int32((signed int)hum.u16);
+}
+
+unsigned int BME280::humidity()
+{
+
+    // get hum
+    getALL();
+    return h;
+    
+}
+
+signed int BME280::temperature()
+{
+
+    // get temp
+    getALL();
+    return t;
+    
+}
+
+unsigned int BME280::pressure()
+{
+
+    // get hum
+    getALL();
+    return p;
+    
+}
+
+void BME280::init()
+{
+    
+    // get calibrations
+    calib.LSB = get(calib00);
+    calib.MSB = get(calib01);
+    dig_T1 = calib.u16;
+    calib.LSB = get(calib02);
+    calib.MSB = get(calib03);
+    dig_T2 = calib.s16;
+    calib.LSB = get(calib04);
+    calib.MSB = get(calib05);
+    dig_T3 = calib.s16;
+    calib.LSB = get(calib06);
+    calib.MSB = get(calib07);
+    dig_P1 = calib.u16;
+    calib.LSB = get(calib08);
+    calib.MSB = get(calib09);
+    dig_P2 = calib.s16;
+    calib.LSB = get(calib10);
+    calib.MSB = get(calib11);
+    dig_P3 = calib.s16;
+    calib.LSB = get(calib12);
+    calib.MSB = get(calib13);
+    dig_P4 = calib.s16;
+    calib.LSB = get(calib14);
+    calib.MSB = get(calib15);
+    dig_P5 = calib.s16;
+    calib.LSB = get(calib16);
+    calib.MSB = get(calib17);
+    dig_P6 = calib.s16;
+    calib.LSB = get(calib18);
+    calib.MSB = get(calib19);
+    dig_P7 = calib.s16;
+    calib.LSB = get(calib20);
+    calib.MSB = get(calib21);
+    dig_P8 = calib.s16;
+    calib.LSB = get(calib22);
+    calib.MSB = get(calib23);
+    dig_P9 = calib.s16;
+    dig_H1 = get(calib25);
+    calib.LSB = get(calib26);
+    calib.MSB = get(calib27);
+    dig_H2 = calib.s16;
+    dig_H3 = get(calib28);
+    calib.MSB = get(calib29);
+    calib.LSB = get(calib30) << 4;
+    dig_H4 = calib.s16>>4;
+    calib.LSB = get(calib30);
+    calib.MSB = get(calib31);
+    dig_H5 = calib.s16>>4;
+    dig_H6 = get(calib32);
+
+    // Set configuration
+    set(config, 0x00);
+    set(ctrl_hum, 0x01);
+
+}
+
+// Returns temperature in DegC, resolution is 0.01 DegC. Output value of "5123" equals 51.23 DegC.
+// t_fine carries fine temperature as global value
+BME280_S32_t BME280::BME280_compensate_T_int32(BME280_S32_t adc_T)
+{
+    BME280_S32_t var1, var2, T;
+    var1  = ((((adc_T>>3) - ((BME280_S32_t)dig_T1<<1))) * ((BME280_S32_t)dig_T2)) >> 11;
+    var2  = (((((adc_T>>4) - ((BME280_S32_t)dig_T1)) * ((adc_T>>4) - ((BME280_S32_t)dig_T1))) >> 12) *
+        ((BME280_S32_t)dig_T3)) >> 14;
+    t_fine = var1 + var2;
+    T  = (t_fine * 5 + 128) >> 8;
+    return T;
+}
+
+// Returns pressure in Pa as unsigned 32 bit integer in Q24.8 format (24 integer bits and 8 fractional bits).
+// Output value of "24674867" represents 24674867/256 = 96386.2 Pa = 963.862 hPa
+BME280_U32_t BME280::BME280_compensate_P_int64(BME280_S32_t adc_P)
+{
+    BME280_S64_t var1, var2, p;
+    var1 = ((BME280_S64_t)t_fine) - 128000;
+    var2 = var1 * var1 * (BME280_S64_t)dig_P6;
+    var2 = var2 + ((var1*(BME280_S64_t)dig_P5)<<17);
+    var2 = var2 + (((BME280_S64_t)dig_P4)<<35);
+    var1 = ((var1 * var1 * (BME280_S64_t)dig_P3)>>8) + ((var1 * (BME280_S64_t)dig_P2)<<12);
+    var1 = (((((BME280_S64_t)1)<<47)+var1))*((BME280_S64_t)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 = (((BME280_S64_t)dig_P9) * (p>>13) * (p>>13)) >> 25;
+    var2 = (((BME280_S64_t)dig_P8) * p) >> 19;
+    p = ((p + var1 + var2) >> 8) + (((BME280_S64_t)dig_P7)<<4);
+    return (BME280_U32_t)p;
+}
+
+// Returns humidity in %RH as unsigned 32 bit integer in Q22.10 format (22 integer and 10 fractional bits).
+// Output value of "47445" represents 47445/1024 = 46.333 %RH
+BME280_U32_t BME280::BME280_compensate_H_int32(BME280_S32_t adc_H)
+{
+    BME280_S32_t v_x1_u32r;
+    v_x1_u32r = (t_fine - ((BME280_S32_t)76800));
+    v_x1_u32r = (((((adc_H << 14) - (((BME280_S32_t)dig_H4) << 20) - (((BME280_S32_t)dig_H5) * v_x1_u32r)) +
+        ((BME280_S32_t)16384)) >> 15) * (((((((v_x1_u32r * ((BME280_S32_t)dig_H6)) >> 10) * (((v_x1_u32r *
+        ((BME280_S32_t)dig_H3)) >> 11) + ((BME280_S32_t)32768))) >> 10) + ((BME280_S32_t)2097152)) *
+        ((BME280_S32_t)dig_H2) + 8192) >> 14));
+    v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * ((BME280_S32_t)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);
+    return (BME280_U32_t)(v_x1_u32r>>12); 
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BME280.h	Mon Nov 23 07:50:28 2015 +0000
@@ -0,0 +1,150 @@
+//**********************
+// BME280.h for mbed
+//
+// (C)Copyright 2015 All rights reserved by Y.Onodera
+// http://einstlab.web.fc2.com
+//**********************
+#ifndef BME280_H_
+#define BME280_H_
+
+#define BME280_ADDR            0xEC
+#define hum_lsb     0xFE
+#define hum_msb     0xFD
+#define temp_xlsb   0xFC
+#define temp_lsb    0xFB
+#define temp_msb    0xFA
+#define press_xlsb  0xF9
+#define press_lsb   0xF8
+#define press_msb   0xF7
+#define config      0xF5
+#define ctrl_meas   0xF4
+#define status      0xF3
+#define ctrl_hum    0xF2
+#define calib41     0xF0
+#define calib40     0xEF
+#define calib39     0xEE
+#define calib38     0xED
+#define calib37     0xEC
+#define calib36     0xEB
+#define calib35     0xEA
+#define calib34     0xE9
+#define calib33     0xE8
+#define calib32     0xE7
+#define calib31     0xE6
+#define calib30     0xE5
+#define calib29     0xE4
+#define calib28     0xE3
+#define calib27     0xE2
+#define calib26     0xE1
+#define reset       0xE0
+#define id      0xD0
+#define calib25     0xA1
+#define calib24     0xA0
+#define calib23     0x9F
+#define calib22     0x9E
+#define calib21     0x9D
+#define calib20     0x9C
+#define calib19     0x9B
+#define calib18     0x9A
+#define calib17     0x99
+#define calib16     0x98
+#define calib15     0x97
+#define calib14     0x96
+#define calib13     0x95
+#define calib12     0x94
+#define calib11     0x93
+#define calib10     0x92
+#define calib09     0x91
+#define calib08     0x90
+#define calib07     0x8F
+#define calib06     0x8E
+#define calib05     0x8D
+#define calib04     0x8C
+#define calib03     0x8B
+#define calib02     0x8A
+#define calib01     0x89
+#define calib00     0x88
+
+#include "mbed.h"
+
+// see BST-BME280-DS001-10
+#define BME280_S32_t    signed int
+#define BME280_S64_t    signed long long
+#define BME280_U32_t    unsigned int
+
+
+union WORD32 {
+    signed int  s32;
+    unsigned int    u32;
+    struct {
+        unsigned char dummy;
+        unsigned char XLSB;
+        unsigned char LSB;
+        unsigned char MSB;
+    };
+};
+
+union WORD16 {
+    signed short    s16;
+    unsigned short  u16;
+    struct {
+        unsigned char   LSB;
+        unsigned char   MSB;
+    };
+};
+
+
+class BME280{
+public:
+    BME280 (PinName sda, PinName scl);
+    BME280 (I2C& p_i2c);
+
+    void set(unsigned char a,unsigned char b);
+    unsigned char get(unsigned char a);
+    void getALL();
+    unsigned int humidity();
+    signed int temperature();
+    unsigned int pressure();
+    void init();
+
+protected:
+    
+    I2C _i2c;
+
+    union WORD16 calib;
+    union WORD16 hum;
+    union WORD32 temp;
+    union WORD32 press;
+    char buf[8];
+
+    unsigned short dig_T1;
+    signed short dig_T2;
+    signed short dig_T3;
+    unsigned short dig_P1;
+    signed short dig_P2;
+    signed short dig_P3;
+    signed short dig_P4;
+    signed short dig_P5;
+    signed short dig_P6;
+    signed short dig_P7;
+    signed short dig_P8;
+    signed short dig_P9;
+    unsigned char dig_H1;
+    signed short dig_H2;
+    unsigned char dig_H3;
+    signed short dig_H4;
+    signed short dig_H5;
+    signed char dig_H6;
+
+    BME280_S32_t t_fine;
+    BME280_S32_t BME280_compensate_T_int32(BME280_S32_t adc_T);
+    BME280_U32_t BME280_compensate_P_int64(BME280_S32_t adc_P);
+    BME280_U32_t BME280_compensate_H_int32(BME280_S32_t adc_H);
+    unsigned int t;
+    signed int p;
+    signed int h;
+};
+
+#endif /* BME280_H_ */
+
+