This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

BME680 Interfacing with nRF52840-DK

Dear All,

I am working on interfacing BME680 with nRF52840-DK board. I got the output for Temperature, Pressure and Humidity but not getting the output for Gas resistance value.

Help me in getting the gas resistance values.

Thank you all.

#include <stdio.h>
#include "boards.h"
#include "app_util_platform.h"
#include "app_error.h"
#include "nrf_drv_twi.h"
#include "nrf_delay.h"

#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"
#include "bme680.h"

struct bme680_dev gas_sensor;
int8_t rslt = BME680_OK;

/* TWI instance ID. */
#if TWI0_ENABLED
#define TWI_INSTANCE_ID 0
#elif TWI1_ENABLED
#define TWI_INSTANCE_ID 1
#endif
int compteur = 0;
/* TWI instance. */
static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID);
int8_t user_i2c_read (uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len)
{
ret_code_t err;
uint8_t tampon[30]={0};
//NRF_LOG_INFO("read : reg addr : %d",reg_addr);
//NRF_LOG_FLUSH();

int size=0, result = 0, j=0;
uint8_t reg[1]={reg_addr};
nrf_drv_twi_tx(&m_twi, dev_id, reg, 1,false);
err = nrf_drv_twi_rx(&m_twi, dev_id, tampon, len);
//NRF_LOG_INFO("read : len %d :",len);
//NRF_LOG_FLUSH();
if(err==0)
{size=1;
for(int i = 0 ;i<30;i++)
{
if(tampon[i]!=0) size=i+1;

}
}
else
size=0;

if(size ==15 ) size=len;
//NRF_LOG_INFO("read : wire.available %d :",size);
// NRF_LOG_FLUSH();
if(len<=size)
{ for (int i=0;i<len;i++)
{
data[i]=tampon[i];
//NRF_LOG_INFO("%d",data[i]);
//NRF_LOG_FLUSH();
}
}
else
{result=5;}

return result;

}

int8_t user_i2c_write (uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len)
{
int result=0;
//NRF_LOG_INFO("write reg : %d",reg_addr);
uint8_t reg[]={reg_addr,*data};
nrf_drv_twi_tx(&m_twi, dev_id, reg, len+1, false);
for(int i = 0;i<len;i++)
{
//NRF_LOG_INFO("%d",data[i]);
//NRF_LOG_FLUSH();
}
return result;
}
void user_delay_ms (uint32_t period)
{
nrf_delay_ms(period);
}

void twi_init (void)
{
ret_code_t err_code;
const nrf_drv_twi_config_t twi_config = {
.scl = 27,
.sda = 26,
.frequency = NRF_DRV_TWI_FREQ_100K,
.interrupt_priority = APP_IRQ_PRIORITY_HIGH,
.clear_bus_init = false
};
err_code = nrf_drv_twi_init(&m_twi, &twi_config, NULL, NULL);
APP_ERROR_CHECK(err_code);
nrf_drv_twi_enable(&m_twi);
}

void init_bme (void)
{
uint8_t set_required_settings;
/* Set the temperature, pressure and humidity settings */
gas_sensor.tph_sett.os_hum = BME680_OS_2X;
gas_sensor.tph_sett.os_pres = BME680_OS_4X;
gas_sensor.tph_sett.os_temp = BME680_OS_8X;
gas_sensor.tph_sett.filter = BME680_FILTER_SIZE_3;
/* Set the remaining gas sensor settings and link the heating profile */
gas_sensor.gas_sett.run_gas = BME680_ENABLE_GAS_MEAS;
/* Create a ramp heat waveform in 3 steps */
gas_sensor.gas_sett.heatr_temp = 320; /* degree Celsius */
gas_sensor.gas_sett.heatr_dur = 150; /* milliseconds */
/* Select the power mode */
/* Must be set before writing the sensor configuration */
gas_sensor.power_mode = BME680_FORCED_MODE;
/* Set the required sensor settings needed */
set_required_settings = BME680_OST_SEL | BME680_OSP_SEL | BME680_OSH_SEL | BME680_FILTER_SEL
| BME680_GAS_SENSOR_SEL;
/* Set the desired sensor configuration */
rslt = bme680_set_sensor_settings(set_required_settings,&gas_sensor);
/* Set the power mode */
rslt = bme680_set_sensor_mode(&gas_sensor);
}

int main(void)
{
ret_code_t err_code;

APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
NRF_LOG_DEFAULT_BACKENDS_INIT();
NRF_LOG_INFO("TWI scanner started.");
NRF_LOG_FLUSH();
twi_init();

gas_sensor.dev_id = BME680_I2C_ADDR_SECONDARY;
gas_sensor.intf = BME680_I2C_INTF;
gas_sensor.read = user_i2c_read;
gas_sensor.write = user_i2c_write;
gas_sensor.delay_ms = user_delay_ms;
gas_sensor.amb_temp = 25;
rslt = bme680_init(&gas_sensor);

init_bme();
NRF_LOG_INFO("chip_id : %x :",gas_sensor.chip_id);
NRF_LOG_FLUSH();

//NRF_LOG_INFO("Rslt : %d",rslt);
//NRF_LOG_FLUSH();
if(rslt!=0)
{
while(1);
}
uint8_t data[1]={140};
uint8_t reg[1]={0x74};
uint8_t rega[1]={0x72};
//uint8_t regs[1]={0x73};
bme680_set_regs(reg, data, 1, &gas_sensor);
bme680_set_regs(rega, data, 1, &gas_sensor);
bme680_set_regs(regs, data, 1, &gas_sensor);
nrf_delay_ms(500);
NRF_LOG_FLUSH();

while (1)
{
uint16_t meas_period;
bme680_get_profile_dur(&meas_period, &gas_sensor);

struct bme680_field_data data;

while(1)
{
nrf_delay_ms(meas_period);
rslt = bme680_get_sensor_data(&data, &gas_sensor);
//NRF_LOG_INFO("Read Result: %d",rslt);
NRF_LOG_FLUSH();
//NRF_LOG_INFO("%d",data.temperature);
nrf_delay_ms(500);
NRF_LOG_FLUSH();
NRF_LOG_ERROR( "TEMPERATURE : " NRF_LOG_FLOAT_MARKER "\r\n", NRF_LOG_FLOAT(data.temperature /100.0));
NRF_LOG_FLUSH();
nrf_delay_ms(500);
NRF_LOG_ERROR( "PRESSURE : " NRF_LOG_FLOAT_MARKER "\r\n", NRF_LOG_FLOAT(data.pressure/1000.0));
NRF_LOG_FLUSH();
nrf_delay_ms(500);
NRF_LOG_ERROR( "HUMIDITY: " NRF_LOG_FLOAT_MARKER "\r\n", NRF_LOG_FLOAT(data.humidity /1000.0));
NRF_LOG_FLUSH();
nrf_delay_ms(500);
NRF_LOG_ERROR( "GAS: " NRF_LOG_FLOAT_MARKER "\r\n", NRF_LOG_FLOAT(data.gas_resistance /1000.0));
NRF_LOG_FLUSH();
nrf_delay_ms(500);

if (data.status & BME680_GASM_VALID_MSK)
{
NRF_LOG_INFO("GAS: ");
NRF_LOG_INFO("%d",data.gas_resistance);
NRF_LOG_FLUSH();
}
if (gas_sensor.power_mode == BME680_FORCED_MODE)
{
rslt = bme680_set_sensor_mode(&gas_sensor);
}
}
}
}

Parents Reply Children
No Data
Related