Clemens Valens
/
bme280
Driver for Bosch Sensortec BME280 combined humidity and pressure sensor
main.cpp@0:b16a9b34fa4c, 2016-09-06 (annotated)
- 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?
User | Revision | Line number | New 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 | } |