691cf4ed62
* Driver for Bosch Sensortec BME680 added
125 lines
4.1 KiB
C
125 lines
4.1 KiB
C
/**
|
|
* Simple example with one sensor connected to I2C bus 0 and a sequence of
|
|
* heating profiles. The heating profile is changed with each cycle.
|
|
*
|
|
* Harware configuration:
|
|
*
|
|
* I2C +-------------------------+ +----------+
|
|
* | ESP8266 Bus 0 | | BME680 |
|
|
* | GPIO 5 (SCL) ------> SCL |
|
|
* | GPIO 4 (SDA) ------- SDA |
|
|
* +-------------------------+ +----------+
|
|
*/
|
|
|
|
#include "espressif/esp_common.h"
|
|
#include "esp/uart.h"
|
|
|
|
#include "FreeRTOS.h"
|
|
#include "task.h"
|
|
|
|
// include communication interface driver
|
|
#include "i2c/i2c.h"
|
|
|
|
// include BME680 driver
|
|
#include "bme680/bme680.h"
|
|
|
|
// define I2C interface for BME680 sensors
|
|
#define I2C_BUS 0
|
|
#define I2C_SCL_PIN 5
|
|
#define I2C_SDA_PIN 4
|
|
|
|
static bme680_sensor_t* sensor;
|
|
|
|
/*
|
|
* User task that triggers measurements of sensor every seconds. It uses
|
|
* function *vTaskDelay* to wait for measurement results and changes the
|
|
* heating profile in each cycle.
|
|
*/
|
|
void user_task(void *pvParameters)
|
|
{
|
|
bme680_values_float_t values;
|
|
|
|
TickType_t last_wakeup = xTaskGetTickCount();
|
|
|
|
uint32_t count = 0;
|
|
|
|
while (1)
|
|
{
|
|
if (count++ < 60)
|
|
// disable gas measurement for cycle counter < 60
|
|
bme680_use_heater_profile (sensor, BME680_HEATER_NOT_USED);
|
|
else
|
|
// change heating profile in each cycle
|
|
switch (count % 5)
|
|
{
|
|
case 0: bme680_use_heater_profile (sensor, 0); break;
|
|
case 1: bme680_use_heater_profile (sensor, 1); break;
|
|
case 2: bme680_use_heater_profile (sensor, 2); break;
|
|
case 3: bme680_use_heater_profile (sensor, 3); break;
|
|
case 4: bme680_use_heater_profile (sensor, 4); break;
|
|
}
|
|
|
|
// measurement duration changes in each cycle
|
|
uint32_t duration = bme680_get_measurement_duration(sensor);
|
|
|
|
// trigger the sensor to start one TPHG measurement cycle
|
|
if (bme680_force_measurement (sensor))
|
|
{
|
|
// passive waiting until measurement results are available
|
|
vTaskDelay (duration);
|
|
|
|
// get the results and do something with them
|
|
if (bme680_get_results_float (sensor, &values))
|
|
printf("%.3f BME680 Sensor: %.2f °C, %.2f %%, %.2f hPa, %.2f Ohm\n",
|
|
(double)sdk_system_get_time()*1e-3,
|
|
values.temperature, values.humidity,
|
|
values.pressure, values.gas_resistance);
|
|
}
|
|
// passive waiting until 1 second is over
|
|
vTaskDelayUntil(&last_wakeup, 1000 / portTICK_PERIOD_MS);
|
|
}
|
|
}
|
|
|
|
|
|
void user_init(void)
|
|
{
|
|
// Set UART Parameter
|
|
uart_set_baud(0, 115200);
|
|
// Give the UART some time to settle
|
|
sdk_os_delay_us(500);
|
|
|
|
/** -- MANDATORY PART -- */
|
|
|
|
#ifdef SPI_USED
|
|
// Init the sensor connected either to SPI.
|
|
sensor = bme680_init_sensor (SPI_BUS, 0, SPI_CS_GPIO);
|
|
#else
|
|
// Init all I2C bus interfaces at which BME680 sensors are connected
|
|
i2c_init(I2C_BUS, I2C_SCL_PIN, I2C_SDA_PIN, I2C_FREQ_100K);
|
|
|
|
// Init the sensor connected either to I2C.
|
|
sensor = bme680_init_sensor (I2C_BUS, BME680_I2C_ADDRESS_2, 0);
|
|
#endif
|
|
|
|
if (sensor)
|
|
{
|
|
// Create a task that uses the sensor
|
|
xTaskCreate(user_task, "user_task", 256, NULL, 2, NULL);
|
|
|
|
/** -- OPTIONAL PART -- */
|
|
|
|
// Changes the oversampling rates to 4x oversampling for temperature
|
|
// and 2x oversampling for humidity. Pressure measurement is skipped.
|
|
bme680_set_oversampling_rates(sensor, osr_4x, osr_none, osr_2x);
|
|
|
|
// Change the IIR filter size for temperature and pressure to 7.
|
|
bme680_set_filter_size(sensor, iir_size_7);
|
|
|
|
// Define a number of different heating profiles
|
|
bme680_set_heater_profile (sensor, 0, 200, 100);
|
|
bme680_set_heater_profile (sensor, 1, 250, 120);
|
|
bme680_set_heater_profile (sensor, 2, 300, 140);
|
|
bme680_set_heater_profile (sensor, 3, 350, 160);
|
|
bme680_set_heater_profile (sensor, 4, 400, 180);
|
|
}
|
|
}
|