Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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);
}
}