Fedor Chervyakov / Mbed OS bme280-ble-sensor

main.cpp

Committer:
fedorc
Date:
2019-08-10
Revision:
0:22a4f6c99d74
Child:
1:667b9825e7ee

File content as of revision 0:22a4f6c99d74:

/* 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);

    }
}