Driver for Bosch Sensortec BME280 combined humidity and pressure sensor

Dependencies:   mbed

Committer:
Clemo
Date:
Tue Sep 06 15:17:20 2016 +0000
Revision:
0:b16a9b34fa4c
First version, works for me

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Clemo 0:b16a9b34fa4c 1
Clemo 0:b16a9b34fa4c 2 #include "mbed.h"
Clemo 0:b16a9b34fa4c 3
Clemo 0:b16a9b34fa4c 4 #include <stdint.h>
Clemo 0:b16a9b34fa4c 5 #include "bme280.h"
Clemo 0:b16a9b34fa4c 6
Clemo 0:b16a9b34fa4c 7 #if defined TARGET_LPC81X
Clemo 0:b16a9b34fa4c 8 // SDA, SCL for Elektor CoCo-ri-Co!
Clemo 0:b16a9b34fa4c 9 #define PIN_SDA (P0_10)
Clemo 0:b16a9b34fa4c 10 #define PIN_SCL (P0_11)
Clemo 0:b16a9b34fa4c 11 #elif defined TARGET_NRF51_MICROBIT
Clemo 0:b16a9b34fa4c 12 // SDA, SCL for BBC micro:bit
Clemo 0:b16a9b34fa4c 13 #define PIN_SDA I2C_SDA0 /* (P20) */
Clemo 0:b16a9b34fa4c 14 #define PIN_SCL I2C_SCL0 /* (P19) */
Clemo 0:b16a9b34fa4c 15 #endif
Clemo 0:b16a9b34fa4c 16
Clemo 0:b16a9b34fa4c 17 I2C i2c(PIN_SDA,PIN_SCL);
Clemo 0:b16a9b34fa4c 18 BME280 bme280;
Clemo 0:b16a9b34fa4c 19
Clemo 0:b16a9b34fa4c 20 DigitalOut led1(LED1); // Blue on LPC800-MAX, Pad0 on micro:bit
Clemo 0:b16a9b34fa4c 21 DigitalOut led2(LED2); // Green on LPC800-MAX, Pad1 on micro:bit
Clemo 0:b16a9b34fa4c 22 DigitalOut led3(LED3); // Red on LPC800-MAX, Pad2 on micro:bit
Clemo 0:b16a9b34fa4c 23
Clemo 0:b16a9b34fa4c 24 #if defined TARGET_LPC81X
Clemo 0:b16a9b34fa4c 25 #define LED_ON (0)
Clemo 0:b16a9b34fa4c 26 #define LED_OFF (1)
Clemo 0:b16a9b34fa4c 27 #elif defined TARGET_NRF51_MICROBIT
Clemo 0:b16a9b34fa4c 28 #define LED_ON (1)
Clemo 0:b16a9b34fa4c 29 #define LED_OFF (0)
Clemo 0:b16a9b34fa4c 30 #endif
Clemo 0:b16a9b34fa4c 31
Clemo 0:b16a9b34fa4c 32 // Note for LPC800-MAX users: check SJ1 and SJ4.
Clemo 0:b16a9b34fa4c 33 // For the USB serial port to work pins 1&2 must be shorted, not pins 2&3.
Clemo 0:b16a9b34fa4c 34
Clemo 0:b16a9b34fa4c 35
Clemo 0:b16a9b34fa4c 36 void i2cWrite(uint8_t i2c_address, uint8_t *p_data, uint8_t data_size, uint8_t repeated_start)
Clemo 0:b16a9b34fa4c 37 {
Clemo 0:b16a9b34fa4c 38 // mbed uses 8-bit addresses, always confusing.
Clemo 0:b16a9b34fa4c 39 i2c.write(i2c_address<<1,(const char *)p_data,data_size,repeated_start);
Clemo 0:b16a9b34fa4c 40 }
Clemo 0:b16a9b34fa4c 41
Clemo 0:b16a9b34fa4c 42
Clemo 0:b16a9b34fa4c 43 void i2cRead(uint8_t i2c_address, uint8_t *p_data, uint8_t data_size)
Clemo 0:b16a9b34fa4c 44 {
Clemo 0:b16a9b34fa4c 45 // mbed uses 8-bit addresses, always confusing.
Clemo 0:b16a9b34fa4c 46 i2c.read(i2c_address<<1,(char *)p_data,data_size);
Clemo 0:b16a9b34fa4c 47 }
Clemo 0:b16a9b34fa4c 48
Clemo 0:b16a9b34fa4c 49
Clemo 0:b16a9b34fa4c 50 // Not using BME280 SPI interface, provide stubs.
Clemo 0:b16a9b34fa4c 51 void spiWrite(uint8_t *p_data, uint8_t data_size) {}
Clemo 0:b16a9b34fa4c 52 void spiRead(uint8_t *p_data, uint8_t data_size) {}
Clemo 0:b16a9b34fa4c 53
Clemo 0:b16a9b34fa4c 54
Clemo 0:b16a9b34fa4c 55 int main(void)
Clemo 0:b16a9b34fa4c 56 {
Clemo 0:b16a9b34fa4c 57 led1 = LED_OFF;
Clemo 0:b16a9b34fa4c 58 led2 = LED_OFF;
Clemo 0:b16a9b34fa4c 59 led3 = LED_OFF;
Clemo 0:b16a9b34fa4c 60
Clemo 0:b16a9b34fa4c 61 printf("Elektor project 150652\n");
Clemo 0:b16a9b34fa4c 62 printf("BME280 weather sensor\n");
Clemo 0:b16a9b34fa4c 63 #if defined TARGET_LPC81X
Clemo 0:b16a9b34fa4c 64 printf("for LPC800-MAX\n");
Clemo 0:b16a9b34fa4c 65 #elif defined TARGET_NRF51_MICROBIT
Clemo 0:b16a9b34fa4c 66 printf("for BBC micro:bit\n");
Clemo 0:b16a9b34fa4c 67 #endif
Clemo 0:b16a9b34fa4c 68
Clemo 0:b16a9b34fa4c 69 #if BME280_ALLOW_FLOAT!=0
Clemo 0:b16a9b34fa4c 70 printf("Using floating point maths\n");
Clemo 0:b16a9b34fa4c 71 #else
Clemo 0:b16a9b34fa4c 72 printf("Using integer maths\n");
Clemo 0:b16a9b34fa4c 73 #endif
Clemo 0:b16a9b34fa4c 74
Clemo 0:b16a9b34fa4c 75 if (bme280.begin(BME280_I2C_ADDRESS2)!=0)
Clemo 0:b16a9b34fa4c 76 {
Clemo 0:b16a9b34fa4c 77 printf("\n*** BME280 not found.\n");
Clemo 0:b16a9b34fa4c 78 }
Clemo 0:b16a9b34fa4c 79 printf("\n");
Clemo 0:b16a9b34fa4c 80
Clemo 0:b16a9b34fa4c 81 // Configure for test purposes.
Clemo 0:b16a9b34fa4c 82 bme280.writeConfigRegister(BME280_STANDBY_500_US,BME280_FILTER_OFF,0);
Clemo 0:b16a9b34fa4c 83 bme280.writeControlRegisters(BME280_OVERSAMPLING_1X,BME280_OVERSAMPLING_1X,BME280_OVERSAMPLING_1X,BME280_MODE_NORMAL);
Clemo 0:b16a9b34fa4c 84
Clemo 0:b16a9b34fa4c 85 while (1)
Clemo 0:b16a9b34fa4c 86 {
Clemo 0:b16a9b34fa4c 87 led1 = LED_ON;
Clemo 0:b16a9b34fa4c 88
Clemo 0:b16a9b34fa4c 89 bme280.read();
Clemo 0:b16a9b34fa4c 90 #if BME280_ALLOW_FLOAT!=0
Clemo 0:b16a9b34fa4c 91 printf("T=%0.1f degrees C, P=%0.1f mbar, RH=%0.1f%%\n",bme280.temperature(),bme280.pressure()/100,bme280.humidity());
Clemo 0:b16a9b34fa4c 92 #else
Clemo 0:b16a9b34fa4c 93 printf("T=%d degrees C, P=%d mbar, RH=%d%%\n",bme280.temperature()/100,bme280.pressure()/100,bme280.humidity()>>10);
Clemo 0:b16a9b34fa4c 94 #endif
Clemo 0:b16a9b34fa4c 95
Clemo 0:b16a9b34fa4c 96 // Worst case speed is about 1 Hz.
Clemo 0:b16a9b34fa4c 97 // Keep flash short, it is terribly bright.
Clemo 0:b16a9b34fa4c 98 wait_ms(5);
Clemo 0:b16a9b34fa4c 99 led1 = LED_OFF;
Clemo 0:b16a9b34fa4c 100 wait_ms(995);
Clemo 0:b16a9b34fa4c 101 }
Clemo 0:b16a9b34fa4c 102 }