Fedor Chervyakov / Mbed OS bme280-ble-sensor
Revision:
0:22a4f6c99d74
Child:
1:667b9825e7ee
diff -r 000000000000 -r 22a4f6c99d74 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Aug 10 22:25:46 2019 +0000
@@ -0,0 +1,165 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2018 ARM Limited
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include "mbed.h"
+#include "bme280.h"
+
+
+
+I2C sensor(I2C_SDA, I2C_SCL);
+
+void user_delay_ms(uint32_t period)
+{
+    wait_ms(period);
+}
+
+
+int8_t user_i2c_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
+{
+    int8_t rslt = 0; /* Return 0 for Success, non-zero for failure */
+    int addr8bit = dev_id << 1;
+    
+    char cmd[2];
+    cmd[0] = (char) reg_addr;
+    
+    rslt = sensor.write(addr8bit, cmd, 1);
+    rslt = sensor.read( addr8bit, (char *) reg_data, (int) len);
+    
+    /*if (sizeof(reg_data)/8 < len)
+        return BME280_E_COMM_FAIL;
+    */
+    /*
+     * The parameter dev_id can be used as a variable to store the I2C address of the device
+     */
+
+    /*
+     * Data on the bus should be like
+     * |------------+---------------------|
+     * | I2C action | Data                |
+     * |------------+---------------------|
+     * | Start      | -                   |
+     * | Write      | (reg_addr)          |
+     * | Stop       | -                   |
+     * | Start      | -                   |
+     * | Read       | (reg_data[0])       |
+     * | Read       | (....)              |
+     * | Read       | (reg_data[len - 1]) |
+     * | Stop       | -                   |
+     * |------------+---------------------|
+     */
+    
+    return rslt;
+}
+
+int8_t user_i2c_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
+{
+    int8_t rslt = 0; /* Return 0 for Success, non-zero for failure */
+
+    /*
+     * The parameter dev_id can be used as a variable to store the I2C address of the device
+     */
+    
+    int addr8bit = dev_id << 1;
+    char cmd[2*len];
+    
+    int n;
+    for (int i=0; i<len; i++) {
+        n = 2*i;
+        cmd[n] = reg_addr+i;
+        cmd[n+1] = reg_data[i];
+    }
+    
+    rslt = sensor.write(addr8bit, cmd, len*2);
+    /*
+     * Data on the bus should be like
+     * |------------+----------------------|
+     * | I2C action | Data                 |
+     * |------------+----------------------|
+     * | Start      | -                    |
+     * | Write      | (reg_addr)           |
+     * | Write      | (reg_data[0])        |
+     * | Write      | (reg_addr + 1)       |
+     * | Write      | (reg_data[1])        |
+     * | Write      | (....)               |
+     * | Write      | (reg_addr + len - 1) |
+     * | Write      | (reg_data[len - 1])  |
+     * | Stop       | -                    |
+     * |------------+----------------------|
+     */
+
+    return rslt;
+}
+
+void print_sensor_data(struct bme280_data *comp_data)
+{
+    float temp, press, hum;
+#ifdef BME280_FLOAT_ENABLE
+    temp = comp_data->temperature;
+    press = 0.01 * comp_data->pressure;
+    hum = comp_data->humidity;
+#else
+#ifdef BME280_64BIT_ENABLE
+    temp = 0.01f * comp_data->temperature;
+    press = 0.0001f * comp_data->pressure;
+    hum = 1.0f / 1024.0f * comp_data->humidity;
+#else
+    temp = 0.01f * comp_data->temperature;
+    press = 0.01f * comp_data->pressure;
+    hum = 1.0f / 1024.0f * comp_data->humidity;
+#endif
+#endif
+    printf("%0.2lf deg C, %0.2lf hPa, %0.2lf%%\n", temp, press, hum);
+}
+
+// main() runs in its own thread in the OS
+int main()
+{
+
+    struct bme280_dev dev;
+    struct bme280_data comp_data;
+    uint8_t settings_sel;
+    int8_t rslt;
+       
+    dev.dev_id = BME280_I2C_ADDR_PRIM;
+    dev.intf = BME280_I2C_INTF;
+    dev.write = user_i2c_write;
+    dev.read = user_i2c_read;
+    dev.delay_ms = user_delay_ms;
+    
+    bme280_init(&dev);
+    
+    dev.settings.osr_h = BME280_OVERSAMPLING_1X;
+    dev.settings.osr_p = BME280_OVERSAMPLING_16X;
+    dev.settings.osr_t = BME280_OVERSAMPLING_2X;
+    dev.settings.filter = BME280_FILTER_COEFF_16;
+    
+    settings_sel = BME280_OSR_PRESS_SEL | BME280_OSR_TEMP_SEL | BME280_OSR_HUM_SEL | BME280_FILTER_SEL;
+    
+    rslt = bme280_set_sensor_settings(settings_sel, &dev);
+    if (rslt != BME280_OK)
+    {
+        fprintf(stderr, "Failed to set sensor settings (code %+d).", rslt);
+        return rslt;
+    }
+    
+    while (true) {
+        rslt = bme280_set_sensor_mode(BME280_FORCED_MODE, &dev);
+        if (rslt != BME280_OK)
+        {
+            printf("Failed to set sensor mode (code %+d).\n", rslt);
+            break;
+        }
+        dev.delay_ms(400);
+        rslt = bme280_get_sensor_data(BME280_ALL, &comp_data, &dev);
+        
+        if (rslt != BME280_OK)
+        {
+            printf("Failed to get sensor data (code %+d).\n", rslt);
+            break;
+        }
+        print_sensor_data(&comp_data);
+
+    }
+}