The MiCS-VZ-89TE is an integrated sensor board for Indoor Air Quality monitoring

Committer:
mcm
Date:
Wed Jun 09 17:42:19 2021 +0000
Revision:
4:b00d73e7a096
Parent:
2:df66ad9420a1
The driver was completed and tested (NUCLEO-L152RE), it works as expected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 1:59ae0741684a 1 /**
mcm 1:59ae0741684a 2 * @brief MICS_VZ_89TE.h
mcm 1:59ae0741684a 3 * @details Integrated VOC Sensor Module with CO2 equivalent.
mcm 1:59ae0741684a 4 * Header file.
mcm 1:59ae0741684a 5 *
mcm 1:59ae0741684a 6 *
mcm 1:59ae0741684a 7 * @return N/A
mcm 1:59ae0741684a 8 *
mcm 1:59ae0741684a 9 * @author Manuel Caballero
mcm 1:59ae0741684a 10 * @date 27/May/2021
mcm 1:59ae0741684a 11 * @version 27/May/2021 The ORIGIN
mcm 1:59ae0741684a 12 * @pre N/A
mcm 1:59ae0741684a 13 * @warning N/A
mcm 1:59ae0741684a 14 * @pre This code belongs to Nimbus Centre ( http://www.nimbus.cit.ie ).
mcm 1:59ae0741684a 15 */
mcm 1:59ae0741684a 16 #ifndef MICS_VZ_89TE_H_
mcm 1:59ae0741684a 17 #define MICS_VZ_89TE_H_
mcm 1:59ae0741684a 18
mcm 1:59ae0741684a 19 #include "mbed.h"
mcm 1:59ae0741684a 20
mcm 1:59ae0741684a 21
mcm 1:59ae0741684a 22 /**
mcm 1:59ae0741684a 23 Example:
mcm 1:59ae0741684a 24
mcm 1:59ae0741684a 25 @code
mcm 4:b00d73e7a096 26 #include "mbed.h"
mcm 4:b00d73e7a096 27 #include "MICS_VZ_89TE.h"
mcm 1:59ae0741684a 28
mcm 4:b00d73e7a096 29 MICS_VZ_89TE myMICS_VZ_89TE ( I2C_SDA, I2C_SCL, MICS_VZ_89TE::MICS_VZ_89TE_ADDRESS, 100000 ); // I2C_SDA | I2C_SCL
mcm 4:b00d73e7a096 30 Serial pc ( USBTX, USBRX ); // tx, rx
mcm 4:b00d73e7a096 31
mcm 4:b00d73e7a096 32 DigitalOut myled ( LED1 );
mcm 4:b00d73e7a096 33 Ticker newAction;
mcm 4:b00d73e7a096 34
mcm 4:b00d73e7a096 35
mcm 4:b00d73e7a096 36 //@brief Constants.
mcm 4:b00d73e7a096 37
mcm 4:b00d73e7a096 38
mcm 4:b00d73e7a096 39 //@brief Variables.
mcm 4:b00d73e7a096 40 volatile uint32_t myState; // State that indicates when to perform a new sample
mcm 4:b00d73e7a096 41
mcm 4:b00d73e7a096 42
mcm 4:b00d73e7a096 43 //@brief FUNCTION PROTOTYPES
mcm 4:b00d73e7a096 44 void changeDATA ( void );
mcm 4:b00d73e7a096 45
mcm 4:b00d73e7a096 46
mcm 4:b00d73e7a096 47 //@brief FUNCTION FOR APPLICATION MAIN ENTRY.
mcm 4:b00d73e7a096 48 int main()
mcm 4:b00d73e7a096 49 {
mcm 4:b00d73e7a096 50 MICS_VZ_89TE::MICS_VZ_89TE_status_t aux;
mcm 4:b00d73e7a096 51 MICS_VZ_89TE::MICS_VZ_89TE_data_t myMICS_VZ_89TE_Data;
mcm 4:b00d73e7a096 52
mcm 4:b00d73e7a096 53 pc.baud ( 115200 );
mcm 4:b00d73e7a096 54
mcm 4:b00d73e7a096 55 myled = 1;
mcm 4:b00d73e7a096 56 wait(3);
mcm 4:b00d73e7a096 57 myled = 0;
mcm 4:b00d73e7a096 58
mcm 4:b00d73e7a096 59 // It triggers the Revision command and gets the result
mcm 4:b00d73e7a096 60 aux = myMICS_VZ_89TE.MICS_VZ_89TE_TriggersRevision ();
mcm 4:b00d73e7a096 61 wait_ms (100);
mcm 4:b00d73e7a096 62 aux = myMICS_VZ_89TE.MICS_VZ_89TE_GetRevision ( &myMICS_VZ_89TE_Data.device );
mcm 4:b00d73e7a096 63
mcm 4:b00d73e7a096 64 // It triggers the R0 ( calibration ) command and gets the result
mcm 4:b00d73e7a096 65 aux = myMICS_VZ_89TE.MICS_VZ_89TE_TriggersR0 ();
mcm 4:b00d73e7a096 66 wait_ms (100);
mcm 4:b00d73e7a096 67 aux = myMICS_VZ_89TE.MICS_VZ_89TE_GetR0 ( &myMICS_VZ_89TE_Data.r0_raw, &myMICS_VZ_89TE_Data.r0 );
mcm 4:b00d73e7a096 68
mcm 4:b00d73e7a096 69 pc.printf ( "Revision: %d | R0: %d\r\n", myMICS_VZ_89TE_Data.device, myMICS_VZ_89TE_Data.r0 );
mcm 4:b00d73e7a096 70
mcm 4:b00d73e7a096 71
mcm 4:b00d73e7a096 72 myState = 0UL; // Reset the variable
mcm 4:b00d73e7a096 73 newAction.attach( &changeDATA, 5U ); // the address of the function to be attached ( changeDATA ) and the interval ( 5s )
mcm 4:b00d73e7a096 74
mcm 4:b00d73e7a096 75 // Let the callbacks take care of everything
mcm 4:b00d73e7a096 76 while(1) {
mcm 4:b00d73e7a096 77 sleep();
mcm 4:b00d73e7a096 78
mcm 4:b00d73e7a096 79 if ( myState == 1UL ) {
mcm 4:b00d73e7a096 80 myled = 1U;
mcm 4:b00d73e7a096 81
mcm 4:b00d73e7a096 82 // Trigger to get a new data value
mcm 4:b00d73e7a096 83 aux = myMICS_VZ_89TE.MICS_VZ_89TE_TriggersStatus ();
mcm 4:b00d73e7a096 84 wait_ms (100);
mcm 4:b00d73e7a096 85
mcm 4:b00d73e7a096 86 // Get the values: tVOC, CO2_equ and Resistor
mcm 4:b00d73e7a096 87 aux = myMICS_VZ_89TE.MICS_VZ_89TE_GetUpdateValues ( &myMICS_VZ_89TE_Data.status, &myMICS_VZ_89TE_Data.values );
mcm 4:b00d73e7a096 88
mcm 4:b00d73e7a096 89 // Send data through the UART
mcm 4:b00d73e7a096 90 pc.printf ( "tVOC: %d [ppb], CO2_equ: %d [ppm], R: %d [kOhms]\r\n", (uint32_t)myMICS_VZ_89TE_Data.values.tvoc, (uint32_t)myMICS_VZ_89TE_Data.values.co2_equ, (uint32_t)myMICS_VZ_89TE_Data.values.resistor );
mcm 4:b00d73e7a096 91
mcm 4:b00d73e7a096 92 // Reset the variables
mcm 4:b00d73e7a096 93 myState = 0UL;
mcm 4:b00d73e7a096 94 myled = 0U;
mcm 4:b00d73e7a096 95 }
mcm 4:b00d73e7a096 96 }
mcm 4:b00d73e7a096 97 }
mcm 4:b00d73e7a096 98
mcm 4:b00d73e7a096 99
mcm 4:b00d73e7a096 100 // @brief changeDATA ( void )
mcm 4:b00d73e7a096 101 //
mcm 4:b00d73e7a096 102 // @details It changes myState variable
mcm 4:b00d73e7a096 103 //
mcm 4:b00d73e7a096 104 // @param[in] N/A
mcm 4:b00d73e7a096 105 //
mcm 4:b00d73e7a096 106 // @param[out] N/A.
mcm 4:b00d73e7a096 107 //
mcm 4:b00d73e7a096 108 // @return N/A.
mcm 4:b00d73e7a096 109 //
mcm 4:b00d73e7a096 110 // @author Manuel Caballero
mcm 4:b00d73e7a096 111 // @date 09/June/2021
mcm 4:b00d73e7a096 112 // @version 09/June/2021 The ORIGIN
mcm 4:b00d73e7a096 113 // @pre N/A
mcm 4:b00d73e7a096 114 // @warning N/A.
mcm 4:b00d73e7a096 115 void changeDATA ( void )
mcm 4:b00d73e7a096 116 {
mcm 4:b00d73e7a096 117 myState = 1UL;
mcm 4:b00d73e7a096 118 }
mcm 1:59ae0741684a 119 @endcode
mcm 1:59ae0741684a 120 */
mcm 1:59ae0741684a 121
mcm 1:59ae0741684a 122
mcm 1:59ae0741684a 123 /*!
mcm 1:59ae0741684a 124 Library for the MICS_VZ_89TE Integrated VOC Sensor Module with CO2 equivalent.
mcm 1:59ae0741684a 125 */
mcm 1:59ae0741684a 126 class MICS_VZ_89TE
mcm 1:59ae0741684a 127 {
mcm 1:59ae0741684a 128 public:
mcm 1:59ae0741684a 129 /**
mcm 1:59ae0741684a 130 * @brief DEFAULT ADDRESS
mcm 1:59ae0741684a 131 */
mcm 1:59ae0741684a 132 typedef enum {
mcm 1:59ae0741684a 133 MICS_VZ_89TE_ADDRESS = ( 0x70 << 1U ) /*!< I2C slave address byte, Default */
mcm 1:59ae0741684a 134 } MICS_VZ_89TE_address_t;
mcm 1:59ae0741684a 135
mcm 1:59ae0741684a 136
mcm 1:59ae0741684a 137
mcm 1:59ae0741684a 138 /**
mcm 1:59ae0741684a 139 * @brief COMMAND LIST
mcm 1:59ae0741684a 140 */
mcm 1:59ae0741684a 141 typedef enum {
mcm 1:59ae0741684a 142 MICS_VZ_89TE_SET_PPM_CO2 = 0b00001000, /*!< To send the ppmCO2 value given by an external analyser to the VZ89TE in order to recalibrate its outputs */
mcm 1:59ae0741684a 143 MICS_VZ_89TE_GET_STATUS = 0b00001100, /*!< This command is used to read the VZ89TE status coded on 6x bytes + 1 CRC byte */
mcm 1:59ae0741684a 144 MICS_VZ_89TE_GET_REVISION = 0b00001101, /*!< This command will return the revision code of the module */
mcm 1:59ae0741684a 145 MICS_VZ_89TE_GET_R0 = 0b00010000 /*!< This command is used to read the R0 (calibration) value in [kOhms] */
mcm 1:59ae0741684a 146 } MICS_VZ_89TE_command_list_t;
mcm 1:59ae0741684a 147
mcm 1:59ae0741684a 148
mcm 1:59ae0741684a 149
mcm 1:59ae0741684a 150
mcm 1:59ae0741684a 151
mcm 1:59ae0741684a 152 #ifndef MICS_VZ_89TE_VECTOR_STRUCT_H
mcm 1:59ae0741684a 153 #define MICS_VZ_89TE_VECTOR_STRUCT_H
mcm 1:59ae0741684a 154 /* Status command */
mcm 1:59ae0741684a 155 typedef struct {
mcm 1:59ae0741684a 156 uint8_t d1; /*!< Raw tVOC */
mcm 1:59ae0741684a 157 uint8_t d2; /*!< Raw CO2_equ */
mcm 1:59ae0741684a 158 uint8_t d3; /*!< RS first byte(MSB) */
mcm 1:59ae0741684a 159 uint8_t d4; /*!< RS second byte */
mcm 1:59ae0741684a 160 uint8_t d5; /*!< RS third byte(LSB) */
mcm 1:59ae0741684a 161 uint8_t d6; /*!< Status */
mcm 1:59ae0741684a 162 uint8_t d7; /*!< CRC */
mcm 1:59ae0741684a 163 } MICS_VZ_89TE_get_status_t;
mcm 1:59ae0741684a 164
mcm 1:59ae0741684a 165
mcm 1:59ae0741684a 166 /* Output values */
mcm 1:59ae0741684a 167 typedef struct {
mcm 1:59ae0741684a 168 float tvoc; /*!< tVOC [13...242] in ppb */
mcm 1:59ae0741684a 169 float co2_equ; /*!< CO2 equivalent [13...242] in ppm */
mcm 1:59ae0741684a 170 uint32_t resistor; /*!< Resistor value in Ohms */
mcm 1:59ae0741684a 171 } MICS_VZ_89TE_output_values_t;
mcm 1:59ae0741684a 172
mcm 1:59ae0741684a 173
mcm 1:59ae0741684a 174 /* Revision */
mcm 1:59ae0741684a 175 typedef struct {
mcm 1:59ae0741684a 176 uint8_t year; /*!< Year */
mcm 1:59ae0741684a 177 uint8_t month; /*!< Month */
mcm 1:59ae0741684a 178 uint8_t day; /*!< Day */
mcm 1:59ae0741684a 179 uint8_t ascii_code; /*!< ASCII code for a charter */
mcm 1:59ae0741684a 180 uint8_t crc; /*!< CRC */
mcm 1:59ae0741684a 181 } MICS_VZ_89TE_revision_t;
mcm 1:59ae0741684a 182
mcm 1:59ae0741684a 183
mcm 1:59ae0741684a 184 /* R0: Raw data */
mcm 1:59ae0741684a 185 typedef struct {
mcm 1:59ae0741684a 186 uint8_t r0_lsb; /*!< R0 LSB */
mcm 1:59ae0741684a 187 uint8_t r0_msb; /*!< R0 MSB */
mcm 1:59ae0741684a 188 uint8_t crc; /*!< CRC */
mcm 1:59ae0741684a 189 } MICS_VZ_89TE_r0_t;
mcm 1:59ae0741684a 190
mcm 1:59ae0741684a 191
mcm 1:59ae0741684a 192
mcm 1:59ae0741684a 193 /* USER: User's global variables */
mcm 1:59ae0741684a 194 typedef struct {
mcm 1:59ae0741684a 195 /* Output */
mcm 1:59ae0741684a 196 MICS_VZ_89TE_get_status_t status; /*!< Raw values: tVOC, CO2_equ and Resistor */
mcm 1:59ae0741684a 197 MICS_VZ_89TE_output_values_t values; /*!< Output values: tVOC, CO2_equ and Resistor */
mcm 1:59ae0741684a 198
mcm 1:59ae0741684a 199
mcm 1:59ae0741684a 200 /* Calibration */
mcm 1:59ae0741684a 201 MICS_VZ_89TE_r0_t r0_raw; /*!< R0 calibration raw value */
mcm 1:59ae0741684a 202 uint16_t r0; /*!< R0 calibration value in kOhms */
mcm 1:59ae0741684a 203
mcm 1:59ae0741684a 204
mcm 1:59ae0741684a 205 /* Device identification */
mcm 1:59ae0741684a 206 MICS_VZ_89TE_revision_t device; /*!< Device. The revision code of the module */
mcm 1:59ae0741684a 207 } MICS_VZ_89TE_data_t;
mcm 1:59ae0741684a 208 #endif
mcm 1:59ae0741684a 209
mcm 1:59ae0741684a 210
mcm 1:59ae0741684a 211
mcm 1:59ae0741684a 212
mcm 1:59ae0741684a 213 /**
mcm 1:59ae0741684a 214 * @brief INTERNAL CONSTANTS
mcm 1:59ae0741684a 215 */
mcm 1:59ae0741684a 216 typedef enum {
mcm 1:59ae0741684a 217 MICS_VZ_89TE_SUCCESS = 0,
mcm 1:59ae0741684a 218 MICS_VZ_89TE_FAILURE = 1,
mcm 1:59ae0741684a 219 MICS_VZ_89TE_DATA_CORRUPTED = 2,
mcm 1:59ae0741684a 220 I2C_SUCCESS = 0
mcm 1:59ae0741684a 221 } MICS_VZ_89TE_status_t;
mcm 1:59ae0741684a 222
mcm 1:59ae0741684a 223
mcm 1:59ae0741684a 224
mcm 1:59ae0741684a 225 /**
mcm 1:59ae0741684a 226 * @brief FUNCTION PROTOTYPES
mcm 1:59ae0741684a 227 */
mcm 1:59ae0741684a 228 /** Create an MICS_VZ_89TE object connected to the specified I2C pins.
mcm 1:59ae0741684a 229 *
mcm 1:59ae0741684a 230 * @param sda I2C data pin
mcm 1:59ae0741684a 231 * @param scl I2C clock pin
mcm 1:59ae0741684a 232 * @param addr I2C slave address
mcm 1:59ae0741684a 233 * @param freq I2C frequency in Hz.
mcm 1:59ae0741684a 234 */
mcm 1:59ae0741684a 235 MICS_VZ_89TE ( PinName sda, PinName scl, uint32_t addr, uint32_t freq );
mcm 1:59ae0741684a 236
mcm 1:59ae0741684a 237 /** Delete MICS_VZ_89TE object.
mcm 1:59ae0741684a 238 */
mcm 1:59ae0741684a 239 ~MICS_VZ_89TE();
mcm 1:59ae0741684a 240
mcm 1:59ae0741684a 241 /** It triggers the STATUS command.
mcm 1:59ae0741684a 242 */
mcm 1:59ae0741684a 243 MICS_VZ_89TE_status_t MICS_VZ_89TE_TriggersStatus ( void );
mcm 1:59ae0741684a 244
mcm 1:59ae0741684a 245 /** It gets all the raw values.
mcm 1:59ae0741684a 246 */
mcm 1:59ae0741684a 247 MICS_VZ_89TE_status_t MICS_VZ_89TE_GetStatus ( MICS_VZ_89TE_get_status_t* status );
mcm 1:59ae0741684a 248
mcm 1:59ae0741684a 249 /** It gets all the values: tVOC, CO2_equ and Resistor.
mcm 1:59ae0741684a 250 */
mcm 1:59ae0741684a 251 MICS_VZ_89TE_status_t MICS_VZ_89TE_GetUpdateValues ( MICS_VZ_89TE_get_status_t* status, MICS_VZ_89TE_output_values_t* values );
mcm 1:59ae0741684a 252
mcm 1:59ae0741684a 253 /** It triggers the Revsion command.
mcm 1:59ae0741684a 254 */
mcm 1:59ae0741684a 255 MICS_VZ_89TE_status_t MICS_VZ_89TE_TriggersRevision ( void );
mcm 1:59ae0741684a 256
mcm 1:59ae0741684a 257 /** It gets Revision values.
mcm 1:59ae0741684a 258 */
mcm 1:59ae0741684a 259 MICS_VZ_89TE_status_t MICS_VZ_89TE_GetRevision ( MICS_VZ_89TE_revision_t* revision );
mcm 1:59ae0741684a 260
mcm 1:59ae0741684a 261 /** It triggers the R0 command.
mcm 1:59ae0741684a 262 */
mcm 1:59ae0741684a 263 MICS_VZ_89TE_status_t MICS_VZ_89TE_TriggersR0 ( void );
mcm 1:59ae0741684a 264
mcm 1:59ae0741684a 265 /** It gets R0 value.
mcm 1:59ae0741684a 266 */
mcm 1:59ae0741684a 267 MICS_VZ_89TE_status_t MICS_VZ_89TE_GetRawR0 ( MICS_VZ_89TE_r0_t* rawR0 );
mcm 1:59ae0741684a 268
mcm 1:59ae0741684a 269 /** It gets R0 value (in kOhms).
mcm 1:59ae0741684a 270 */
mcm 1:59ae0741684a 271 MICS_VZ_89TE_status_t MICS_VZ_89TE_GetR0 ( MICS_VZ_89TE_r0_t* rawR0, uint16_t* r0 );
mcm 1:59ae0741684a 272
mcm 1:59ae0741684a 273
mcm 1:59ae0741684a 274
mcm 1:59ae0741684a 275 private:
mcm 1:59ae0741684a 276 /** It gets the CRC byte.
mcm 1:59ae0741684a 277 */
mcm 2:df66ad9420a1 278 uint8_t MICS_VZ_89TE_GetCRC ( char* buffer, uint8_t size );
mcm 1:59ae0741684a 279
mcm 1:59ae0741684a 280 I2C _i2c;
mcm 1:59ae0741684a 281 uint32_t _MICS_VZ_89TE_Addr;
mcm 1:59ae0741684a 282 };
mcm 1:59ae0741684a 283
mcm 1:59ae0741684a 284 #endif /* MICS_VZ_89TE_H */