BME680 gas sensor series design guide

Product Overview

The main characteristics of the BME680 are described below:

Key features

  • 3.0 mm x 3.0 mm x 0.93 mm, metal lid LGA package
  • Digital interface I²C (up to 3.4 MHz) and SPI (3 and 4-wire, up to 10 MHz)
  • Supply voltage
    • VDD main supply voltage range: 1.71 V - 3.6 V
    • VDDIO interface voltage range: 1.2 V - 3.6 V
  • Current consumption
    • 2.1 μA at 1 Hz humidity and temperature
    • 3.1 μA at 1 Hz pressure and temperature
    • 3.7 μA at 1 Hz humidity, pressure and temperature
    • 0.09‒12 mA for p/h/T/gas depending on operation mode
    • 0,15 μA in sleep mode
  • Operating range: -40 to +85 °C, 0 - 100% r.H., 300 - 1100 hPa
  • Individual humidity, pressure and gas sensors can be operated independently
  • RoHS compliant, halogen-free, MSL1

Furthermore here some performance parameters:

Key parameters for gas sensor

 

Response time (𝜏33−63%)

< 1 s (for new sensors)

Power consumption

< 0.1 mA in ultra-low power mode

Output data processing

direct indoor air quality (IAQ) index output

 

Key parameters for humidity sensor

 

Response time (𝜏0−63%)

~8 s

Accuracy tolerance

±3% r.H.

Hysteresis

±1.5% r.H.

 

Key parameters for temperature sensor

 

RMS Noise

0.12 Pa, equiv. to 1.7 cm

Offset temperature coefficient

±1.3 Pa/K, equiv. to ±10.9 cm at 1 °C temperature change

 

Available evaluation tools and software

To best evaluate the product from the BME68x faminly

Reference design

Figure 1 shows the complete schematic for a typical use case.

Figure 1: Mockup reference design

Bill of materials

Table 2 lists the bill of necessary materials.

Value

Part number

Qty

RefDes

Name

0.1uF

C0402

2

C1, C2

Capacitor

4.7 kΩ

R0402

2

R1, R2

Resistor

Table 2: Bill of materials

Layout recommendations

Landing Pattern

For the design of the landing pattern, the dimensions shown in Figure 2 are recommended. It is important to note that areas marked in red are exposed PCB metal pads.

 In case of a solder mask defined (SMD) PCB process, the land dimensions should be defined by solder mask openings. The underlying metal pads are larger than these openings.

 In case of a non-solder mask defined (NSMD) PCB process, the land dimensions should be defined in the metal layer. The mask openings are larger than these metal pads.

Figure 2: Recommended landing pattern (top view, in mm)

Typical Layout

Figure 3 shows the typical layout.

 

 Figure 3: Typical layout

Manufacturing notes

Table 3 lists some recommendations for the manufacture.

Parameter

Value

PCB thickness

1.6mm

Solder paste type

3.0Ag/0.5Cu/Remain Sn

Paste mask stencil thickness

100um

Peak reflow temperature

260°C

Table 3: Manufacture recommendation

First power-on

After powering the sensor for the first time, the initial specs would be to test for communication with the device. This can be done simply by reading the chip identification code in the register 0xD0. See below for the expected values:

Device

Chip ID

BME680

0x61

Table 5: Chip ID of the BME68x product family.


Here is some sample code on how to perform this test, based on BME680, using the COINES software as the host.

 

 

/*!
 * @brief This internal API is used to initializes the bme680 sensor with default
 * settings like power mode and OSRS settings
 *
 * @param[in] void
 *
 * @return void
 *
 */
static void init_bme680(void)
{
    int8_t rslt;
    rslt = bme680_init(&bme680Dev);
    if (rslt == BME680_OK)
    {
        printf("BME680 Initialization Success!\n");
        printf("Chip ID 0x%x\n", bme680Dev.chip_id);  
        fflush(stdout);
    }
    else
    {
        printf("Chip Initialization failure !\n");    
        fflush(stdout);
        exit(COINES_E_FAILURE);
    }

 

 

 

How to test the sensor’s functionality

The BME680 is a digital 4-in-1 sensor with gas, humidity, pressure and temperature measurement based on proven sensing principles. In order to verify the functionality of new sensors after soldering, an example self test code is available based on BME680 API.

The self-test starts by performing a soft reset of the device. After this, Chip-ID and trimming data are read and verified. Then temperature, pressure and humidity sensor signals are measured and compared against customisable plausibility limits. For Gas sensor the heater and gas sensor resistance are checked. For more information on self test please refer to the BME680 self test application note.

A sample code on how to perform this self-test for BME680 is available on Github.

https://github.com/BoschSensortec/BME680_driver/tree/master/Self test

Usage

The COINES installation provides sample code on how to turn on the sensor, configure it and read out the sensor data.  it can be found under the installation directory on examples\c\bme680

 Sample code

 The COINES installation includes an example code for using BSEC library with BME680.

 

 

/*!
 *  @brief Main Function where the execution getting started to test the code.
 *
 *  @param[in] argc
 *  @param[in] argv
 *
 *  @return status
 *
 */
int main(int argc, char *argv[])
{
    return_values_init ret_bsec;
    int16_t rslt;
    struct coines_board_info board_info;

    signal(SIGINT, ctrl_c_sig_handler);

    init_bme680_sensor_driver_interface();

    rslt = coines_open_comm_intf(COINES_COMM_INTF_USB);

    if (rslt < 0)
    {
        printf("\n Unable to connect with Application Board ! \n"
               " 1. Check if the board is connected and powered on. \n"
               " 2. Check if Application Board USB driver is installed. \n"
               " 3. Check if Board is in use by another application. (Insufficient permissions to access USB) \n");
        exit(rslt);
    }

    rslt = coines_get_board_info(&board_info);

    if (rslt == COINES_SUCCESS)
    {
        if (board_info.shuttle_id != BME680_SHUTTLE_ID)
        {
            printf("! Warning invalid sensor shuttle. This application will not support this sensor \r\n"
                    "1.Check the sensor shuttle \r\n"
                    "2.Reset the board  \r\n");
            exit(COINES_E_FAILURE);
        }
    }

    init_sensor_interface();

    /* after sensor init introduce 200 msec sleep */
    coines_delay_msec(200);

    init_bme680();

    /* Call to the function which initializes the BSEC library 
     * Switch on low-power mode and provide no temperature offset */
    ret_bsec = bsec_iot_init(BSEC_SAMPLE_RATE_LP, 0.0f, bus_write, bus_read, sleep, state_load, config_load);
    if (ret_bsec.bme680_status)
    {
        /* Could not intialize BME680 */
        return (int)ret_bsec.bme680_status;
    }
    else if (ret_bsec.bsec_status)
    {
        /* Could not intialize BSEC library */
        return (int)ret_bsec.bsec_status;
    }  

    /* Call to endless loop function which reads and processes data based on sensor settings */
    /* State is saved every 10.000 samples, which means every 10.000 * 3 secs = 500 minutes  */
    bsec_iot_loop(sleep, get_timestamp_us, output_ready, state_save, 10000);

    return 0;
}

 

 

Further reads

15 replies