02-08-2023 11:18 PM
Hello,
I am an undergraduate university student developing my thesis project with PIC32. I would like to use BME 680 sensor with it. I hooked everything on a breadboard, wrote a working I2C driver for the PIC32, I also incorporated 3.3 <-> 1.8 V logic translator between the PIC32 and BME 680. But I got stuck with the configuration of the sensor... I was following these instructions: https://github.com/boschsensortec/BME680_driver
I have added both of the header files and the source file to my project, but still, I can not understand, how do I configure the sensor in the main program? The last section of the link that I provided gives a ,,Templates for function pointers" but I have already written the universal read and write functions for the I2C, so do I still have to write those again? (I though that the point of having a driver written for you is to avoid all those separate register reads and writes...) I may sound confusing, but I would really appreciate any help, explanations or observations. Could you give me an exact template for the main function, highlighting the variables or other parameters I have to change or write for myself? You could possibly save my project 🙂
For now, I came up with the example code, but I am not sure, if I have to write any more functions, or change the parameters...
#include <xc.h>
#include "configurations_bits.h" //Including microcontroller`s configuration settings
#include <stddef.h> //Including all the standard C libraries
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#include "stdio.h"
#include <sys/attribs.h>
#include "delay.h" //Including all the separate module header files
#include "inter_integrated_circuit_protocol.h"
#include "bme680.h"
//---EXAMPLE PART ONE-------------------------------------------------------------
struct bme680_dev gas_sensor {
gas_sensor.dev_id = BME680_I2C_ADDR_PRIMARY; //SDO pin is grounded, so this address is correct in my case
gas_sensor.intf = BME680_I2C_INTF;
gas_sensor.read = Inter_Integrated_Circuit_Read(); //I2C read function is defined in the I2C header and source files
gas_sensor.write = Inter_Integrated_Circuit_Write(); //I2C write function is defined in the I2C header and source files
gas_sensor.delay_ms = delay_ms(); //delay function is defined in the separate header and source files
//SHOULD I ASSIGN THESE FUNCTIONS HERE?
gas_sensor.amb_temp = 25;
}
int8_t rslt = BME680_OK;
rslt = bme680_init(&gas_sensor);
//---EXAMPLE PART ONE-------------------------------------------------------------
int main(void) { //Main program`s start
Inter_Integrated_Circuit_Setup (); //Calling I2C configuration function
Inter_Integrated_Circuit_Enable (); //Starting I2C module
//---EXAMPLE PART TWO-------------------------------------------------------------
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);
//---EXAMPLE PART TWO-------------------------------------------------------------
//---EXAMPLE PART THREE-------------------------------------------------------------
uint16_t meas_period = 1000; //Lets say 1000 millisecond? Is that the right value?
bme680_get_profile_dur(&meas_period, &gas_sensor);
struct bme680_field_data data;
while (true){ //Main program loop
delay_ms(meas_period); /* Delay till the measurement is ready */
rslt = bme680_get_sensor_data(&data, &gas_sensor);
printf("T: %.2f degC, P: %.2f hPa, H %.2f %%rH ", data.temperature / 100.0f,
data.pressure / 100.0f, data.humidity / 1000.0f );
/* Avoid using measurements from an unstable heating setup */
if(data.status & BME680_GASM_VALID_MSK)
printf(", G: %d ohms", data.gas_resistance);
printf("\r\n");
/* Trigger the next measurement if you would like to read data out continuously */
if (gas_sensor.power_mode == BME680_FORCED_MODE) {
rslt = bme680_set_sensor_mode(&gas_sensor);
}
//---EXAMPLE PART THREE-------------------------------------------------------------
}
return (EXIT_FAILURE);
}
02-09-2023 02:57 AM
Hi Vilius,
You could refer BME68x driver code and example code from https://github.com/boschsensortec/BME68x-Sensor-API
You don't need to rewrite driver code as it has been provided in the form of API, you only need to modify common.c according your host platform.