huehuehue
Dependencies: IESE5_merge mbed CCS811 BME680
main.cpp
- Committer:
- etiene32
- Date:
- 2019-02-19
- Revision:
- 0:5daf3ccf0e38
File content as of revision 0:5daf3ccf0e38:
#include "mbed.h"
#include "BME680.h"
#include "CCS811.h"
#include "Adafruit_SGP30.h"
BME680 myBME680 (A4, A5, 400000 );
Adafruit_SGP30 SGP30(D14, D15);
CCS811 ccs811(D14, D15);
uint16_t eco2, tvoc;
Serial pc ( USBTX, USBRX );
DigitalOut myled ( LED1 );
Ticker newReading;
uint32_t myState = 0;
//@brief FUNCTION PROTOTYPES
void changeDATA ( void );
void user_delay_ms ( uint32_t period );
int8_t user_i2c_read ( uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len );
int8_t user_i2c_write ( uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len );
//@brief FUNCTION FOR APPLICATION MAIN ENTRY.
int main()
{
pc.baud ( 9600 );
myled = 1;
wait(3);
myled = 0;
ccs811.init();
SGP30.begin();
SGP30.IAQinit();
struct bme680_dev gas_sensor;
gas_sensor.dev_id = BME680_I2C_ADDR_PRIMARY;
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;
// amb_temp can be set to 25 prior to configuring the gas sensor
// or by performing a few temperature readings without operating the gas sensor.
gas_sensor.amb_temp = 25;
int8_t rslt = BME680_OK;
rslt = myBME680.bme680_init ( &gas_sensor );
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 = myBME680.bme680_set_sensor_settings ( set_required_settings, &gas_sensor );
// Set the power mode
rslt = myBME680.bme680_set_sensor_mode ( &gas_sensor );
// Get the total measurement duration so as to sleep or wait till the measurement is complete
uint16_t meas_period;
myBME680.bme680_get_profile_dur ( &meas_period, &gas_sensor );
struct bme680_field_data data;
newReading.attach( &changeDATA, 1 ); // the address of the function to be attached ( changeDATA ) and the interval ( 1s )
// Let the callbacks take care of everything
while(1) {
sleep();
myled = 1;
if ( myState == 1 ) {
// Delay till the measurement is ready
user_delay_ms ( meas_period );
SGP30.IAQmeasure();
//printf("SGP30 %d,%d\r\n",SGP30.eCO2,SGP30.TVOC);
ccs811.readData(&eco2, &tvoc);
//printf("eCO2 reading :%dppm, TVOC reading :%dppb\r\n", eco2, tvoc);
rslt = myBME680.bme680_get_sensor_data ( &data, &gas_sensor );
// Prepare the data to be sent through the UART. NOTE: sprintf does NOT allow float numbers, that is why we round the number and plot them as integer
// Avoid using measurements from an unstable heating setup
if ( data.status & BME680_GASM_VALID_MSK ) {
//pc.printf( "T: %.2f degC, P: %.2f hPa, H %.2f %%rH, G: %d ohms\r\n", ( data.temperature/100.0f ), ( data.pressure / 100.0f ), ( data.humidity / 1000.0f ), data.gas_resistance );
//BME680 : Degres, Pression, Humidité, Voc ; SGO30 : eCO2, TVOC ; CCS811 : eco2, tvoc
pc.printf( "%.2f;%.2f;%.2f;%d;%d;%d;%d;%d\r\n", ( data.temperature/100.0f ), ( data.pressure / 100.0f ), ( data.humidity / 1000.0f ), data.gas_resistance,SGP30.eCO2,SGP30.TVOC, eco2, tvoc);
} else {
pc.printf( "T: %.2f degC, P: %.2f hPa, H %.2f %%rH\r\n", ( data.temperature/100.0f ), ( data.pressure / 100.0f ), ( data.humidity / 1000.0f ) );
}
// Trigger the next measurement if you would like to read data out continuously
if ( gas_sensor.power_mode == BME680_FORCED_MODE ) {
rslt = myBME680.bme680_set_sensor_mode ( &gas_sensor );
}
myState = 0; // Reset the variable
}
myled = 0;
}
}
// @brief changeDATA ( void )
//
// @details It changes myState variable
//
// @param[in] N/A
//
// @param[out] N/A.
//
//
// @return N/A..
//
//
// @author Manuel Caballero
// @date 21/July/2018
// @version 21/July/2018 The ORIGIN
// @pre N/A
// @warning N/A.
void changeDATA ( void )
{
myState = 1;
}
// @brief user_delay_ms ( uint32_t )
//
// @details Return control or wait, for a period amount of milliseconds
//
// @param[in] period: Delay in milliseconds.
//
// @param[out] N/A.
//
//
// @return N/A..
//
//
// @author Manuel Caballero
// @date 21/July/2018
// @version 21/July/2018 The ORIGIN
// @pre This is a Bosh pointer function adapted to our system.
// @warning N/A.
void user_delay_ms ( uint32_t period )
{
// Return control or wait,
// for a period amount of milliseconds
wait_ms ( period );
}
// @brief user_i2c_read ( uint8_t , uint8_t reg_addr, uint8_t *reg_data, uint16_t len )
//
// @details It adapts I2C reading functionality.
//
// @param[in] dev_id: I2C address.
// @param[in] reg_addr: Register to be read.
// @param[in] len: How many bytes to read.
//
// @param[out] reg_data: Result.
//
//
// @return Status of user_i2c_read.
//
//
// @author Manuel Caballero
// @date 21/July/2018
// @version 21/July/2018 The ORIGIN
// @pre This is a Bosh pointer function adapted to our system.
// @warning N/A.
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
// 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 | - |
// |------------+---------------------|
// Read data
uint32_t aux = 0;
aux = myBME680._i2c.write ( dev_id, (char*)®_addr, 1, true );
aux = myBME680._i2c.read ( dev_id, (char*)®_data[0], len );
if ( aux == 0 ) {
rslt = 0;
} else {
rslt = 0xFF;
}
return rslt;
}
// @brief user_i2c_write ( uint8_t , uint8_t reg_addr, uint8_t *reg_data, uint16_t len )
//
// @details It adapts I2C writing functionality.
//
// @param[in] dev_id: I2C address.
// @param[in] reg_addr: Register to be read.
// @param[out] reg_data: Data to be written.
// @param[in] len: How many bytes to read.
//
// @param[out] N/A.
//
//
// @return Status of user_i2c_write.
//
//
// @author Manuel Caballero
// @date 21/July/2018
// @version 21/July/2018 The ORIGIN
// @pre This is a Bosh pointer function adapted to our system.
// @warning N/A.
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
// Data on the bus should be like
// |------------+---------------------|
// | I2C action | Data |
// |------------+---------------------|
// | Start | - |
// | Write | (reg_addr) |
// | Write | (reg_data[0]) |
// | Write | (....) |
// | Write | (reg_data[len - 1]) |
// | Stop | - |
// |------------+---------------------|
uint32_t aux = 0;
char cmd[16] = { 0 };
uint32_t i = 0;
// Prepare the data to be sent
cmd[0] = reg_addr;
for ( i = 1; i <= len; i++ ) {
cmd[i] = reg_data[i - 1];
}
// Write data
aux = myBME680._i2c.write ( dev_id, &cmd[0], len + 1, false );
if ( aux == 0 ) {
rslt = 0;
} else {
rslt = 0xFF;
}
return rslt;
}