Digital Barometric Pressure Sensor
Diff: QMP6988.h
- Revision:
- 3:1217d0c3c926
- Parent:
- 1:9f46fae3aa6e
--- a/QMP6988.h Fri Feb 25 15:24:48 2022 +0000 +++ b/QMP6988.h Fri Feb 25 15:43:15 2022 +0000 @@ -22,7 +22,130 @@ /** Example: @code +#include "mbed.h" +#include "QMP6988.h" +QMP6988 myQMP6988 ( I2C_SDA, I2C_SCL, QMP6988::QMP6988_ADDRESS_SDO_LOW, 400000 ); // I2C_SDA | I2C_SCL +Serial pc ( USBTX, USBRX ); // tx, rx + +DigitalOut myled ( LED1 ); +Ticker newAction; + + +//@brief Constants. + + +//@brief Variables. +volatile uint32_t myState; // State that indicates when to perform a new sample + + +//@brief FUNCTION PROTOTYPES +void changeDATA ( void ); + + +//@brief FUNCTION FOR APPLICATION MAIN ENTRY. +int main() +{ + QMP6988::QMP6988_status_t aux; + QMP6988::QMP6988_user_data_t myQMP6988_Data; + + pc.baud ( 115200 ); + + myled = 1; + wait(3); + myled = 0; + + // Reset the device + aux = myQMP6988.QMP6988_SoftReset (); + wait_ms(200); + + // Get chip ID + aux = myQMP6988.QMP6988_GetChipID (&myQMP6988_Data.chip_id ); + pc.printf ( "Chip ID: %x\r\n", myQMP6988_Data.chip_id ); + + // Wait until the OTP values are available + do { + aux = myQMP6988.QMP6988_GetDeviceStat ( &myQMP6988_Data.device_stat ); + } while( ( myQMP6988_Data.device_stat & QMP6988::DEVICE_STAT_OTP_UPDATE_MASK ) == QMP6988::DEVICE_STAT_OTP_UPDATE_BUSY ); + + // Raw compensation coefficients + aux = myQMP6988.QMP6988_GetRawCompensationCoefficients ( &myQMP6988_Data.raw_k ); + + // Calculate compensation coefficients + myQMP6988_Data.k = myQMP6988.QMP6988_CalculateCompensationCoefficients ( myQMP6988_Data.raw_k ); + + // Temperature average: FILTER: N = 4 + myQMP6988_Data.filter = QMP6988::IIR_FILTER_N_4; + aux = myQMP6988.QMP6988_SetIIR_Filter ( myQMP6988_Data.filter ); + + // Temperature average: TEMP_AVERAGE: 8 + myQMP6988_Data.temp_average = QMP6988::CTRL_MEAS_TEMP_AVERAGE_8; + aux = myQMP6988.QMP6988_SetTemperatureAverage ( myQMP6988_Data.temp_average ); + + // Pressure average: PRESS_AVERAGE: 8 + myQMP6988_Data.press_average = QMP6988::CTRL_MEAS_PRESS_AVERAGE_8; + aux = myQMP6988.QMP6988_SetPressureAverage ( myQMP6988_Data.press_average ); + + // Power mode: Sleep mode + myQMP6988_Data.power_mode = QMP6988::CTRL_MEAS_POWER_MODE_SLEEP_MODE; + aux = myQMP6988.QMP6988_SetPowerMode ( myQMP6988_Data.power_mode ); + + myState = 0UL; // Reset the variable + newAction.attach( &changeDATA, 1U ); // the address of the function to be attached ( changeDATA ) and the interval ( 1s ) + + // Let the callbacks take care of everything + while(1) { + sleep(); + + if ( myState == 1UL ) { + myled = 1U; + + // Power mode: Forced mode + myQMP6988_Data.power_mode = QMP6988::CTRL_MEAS_POWER_MODE_FORCED_MODE; + aux = myQMP6988.QMP6988_SetPowerMode ( myQMP6988_Data.power_mode ); + + // Wait until a new set of data is available + do { + aux = myQMP6988.QMP6988_GetDeviceStat ( &myQMP6988_Data.device_stat ); + } while( ( myQMP6988_Data.device_stat & QMP6988::DEVICE_STAT_MEASURE_MASK ) == QMP6988::DEVICE_STAT_MEASURE_BUSY ); + + // Get the raw data + aux = myQMP6988.QMP6988_GetRawMeasurements ( &myQMP6988_Data.raw_txd ); + + // Process both temperature and pressure data + myQMP6988_Data.txd = myQMP6988.QMP6988_CalculateCompensatedMeasuredData( myQMP6988_Data.raw_txd, myQMP6988_Data.k ); + + // Send data through the UART + pc.printf ( "Temp: %0.2f C | Press: %0.3f Pa\r\n", myQMP6988_Data.txd.temperature, myQMP6988_Data.txd.pressure ); + + + // Reset the variables + myState = 0UL; + myled = 0U; + } + } +} + + +// @brief changeDATA ( void ) +// +// @details It changes myState variable +// +// @param[in] N/A +// +// @param[out] N/A. +// +// @return N/A. +// +// @author Manuel Caballero +// @date 25/March/2021 +// @version 25/March/2021 The ORIGIN +// @pre N/A +// @warning N/A. +void changeDATA ( void ) +{ + myState = 1UL; +} @endcode */