A component library for MiCS-6814 Multichannel Gas Sensor (seeed)

Dependents:   MiCS6814_GasSensor_Hello grove_multichannel_GasSensor

Committer:
edamame22
Date:
Wed May 24 13:17:32 2017 +0900
Revision:
1:5caeba593de4
Parent:
multigas_sensor.h@0:e0794665caf1
Child:
2:8d61377f2e2a
Modified Some functions, and updated Doxygen comment

Who changed what in which revision?

UserRevisionLine numberNew contents of line
edamame22 0:e0794665caf1 1 /**
edamame22 0:e0794665caf1 2 ******************************************************************************
edamame22 1:5caeba593de4 3 * @file MiCS6814_GasSensor.h
edamame22 0:e0794665caf1 4 * @author Boting Ren
edamame22 0:e0794665caf1 5 * @version V1.0.1
edamame22 0:e0794665caf1 6 * @date 22 May 2017
edamame22 0:e0794665caf1 7 * @brief This file contains the class of a Multichannel Gas Sensor library with I2C interface
edamame22 0:e0794665caf1 8 ******************************************************************************
edamame22 0:e0794665caf1 9 * @attention
edamame22 0:e0794665caf1 10 *
edamame22 0:e0794665caf1 11 * Permission is hereby granted, free of charge, to any person obtaining a copy
edamame22 0:e0794665caf1 12 * of this software and associated documentation files (the "Software"), to deal
edamame22 0:e0794665caf1 13 * in the Software without restriction, including without limitation the rights
edamame22 0:e0794665caf1 14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
edamame22 0:e0794665caf1 15 * copies of the Software, and to permit persons to whom the Software is
edamame22 0:e0794665caf1 16 * furnished to do so, subject to the following conditions:
edamame22 0:e0794665caf1 17 *
edamame22 0:e0794665caf1 18 * The above copyright notice and this permission notice shall be included in
edamame22 0:e0794665caf1 19 * all copies or substantial portions of the Software.
edamame22 0:e0794665caf1 20 *
edamame22 0:e0794665caf1 21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
edamame22 0:e0794665caf1 22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
edamame22 0:e0794665caf1 23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
edamame22 0:e0794665caf1 24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
edamame22 0:e0794665caf1 25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
edamame22 0:e0794665caf1 26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
edamame22 0:e0794665caf1 27 * THE SOFTWARE.
edamame22 1:5caeba593de4 28 */
edamame22 1:5caeba593de4 29
edamame22 1:5caeba593de4 30 /**
edamame22 1:5caeba593de4 31 * Library for "MiCS-6814 Multichannel Gas Sensor" from Switch Science
edamame22 1:5caeba593de4 32 * https://www.switch-science.com/catalog/2512/
edamame22 0:e0794665caf1 33 *
edamame22 1:5caeba593de4 34 * For more information about the Multichannel Gas Sensor:
edamame22 1:5caeba593de4 35 * http://wiki.seeed.cc/Grove-Multichannel_Gas_Sensor/
edamame22 0:e0794665caf1 36 */
edamame22 1:5caeba593de4 37
edamame22 1:5caeba593de4 38
edamame22 0:e0794665caf1 39 #ifndef MBED_MULTIGAS_SENSOR_H
edamame22 0:e0794665caf1 40 #define MBED_MULTIGAS_SENSOR_H
edamame22 0:e0794665caf1 41
edamame22 0:e0794665caf1 42 #include "mbed.h"
edamame22 0:e0794665caf1 43
edamame22 0:e0794665caf1 44 //#define _DEBUG
edamame22 0:e0794665caf1 45 #define SLAVE_ADDRESS_MiCS6814 (0x04<<1)
edamame22 0:e0794665caf1 46
edamame22 0:e0794665caf1 47 #define ADDR_IS_SET 0 // This is read at initialization time, if 1126, set
edamame22 0:e0794665caf1 48 #define ADDR_FACTORY_ADC_NH3 2
edamame22 0:e0794665caf1 49 #define ADDR_FACTORY_ADC_CO 4
edamame22 0:e0794665caf1 50 #define ADDR_FACTORY_ADC_NO2 6
edamame22 0:e0794665caf1 51
edamame22 0:e0794665caf1 52 #define ADDR_USER_ADC_HN3 8
edamame22 0:e0794665caf1 53 #define ADDR_USER_ADC_CO 10
edamame22 0:e0794665caf1 54 #define ADDR_USER_ADC_NO2 12
edamame22 0:e0794665caf1 55 #define ADDR_IF_CALI 14 // IF USER HAD CALI
edamame22 0:e0794665caf1 56
edamame22 0:e0794665caf1 57 #define ADDR_I2C_ADDRESS 20
edamame22 0:e0794665caf1 58
edamame22 0:e0794665caf1 59 #define CH_VALUE_NH3 1
edamame22 0:e0794665caf1 60 #define CH_VALUE_CO 2
edamame22 0:e0794665caf1 61 #define CH_VALUE_NO2 3
edamame22 0:e0794665caf1 62
edamame22 0:e0794665caf1 63 #define CMD_ADC_RES0 1 // NH3
edamame22 0:e0794665caf1 64 #define CMD_ADC_RES1 2 // CO
edamame22 0:e0794665caf1 65 #define CMD_ADC_RES2 3 // NO2
edamame22 0:e0794665caf1 66 #define CMD_ADC_RESALL 4 // ALL CHANNEL
edamame22 0:e0794665caf1 67 #define CMD_CHANGE_I2C 5 // CHANGE I2C
edamame22 0:e0794665caf1 68 #define CMD_READ_EEPROM 6 // READ EEPROM VALUE, RETURN UNSIGNED INT
edamame22 0:e0794665caf1 69 #define CMD_SET_R0_ADC 7 // SET R0 ADC VALUE
edamame22 0:e0794665caf1 70 #define CMD_GET_R0_ADC 8 // GET R0 ADC VALUE
edamame22 0:e0794665caf1 71 #define CMD_GET_R0_ADC_FACTORY 9 // GET FACTORY R0 ADC VALUE
edamame22 0:e0794665caf1 72 #define CMD_CONTROL_LED 10
edamame22 0:e0794665caf1 73 #define CMD_CONTROL_PWR 11
edamame22 0:e0794665caf1 74
edamame22 1:5caeba593de4 75 #define HEATER_ON 1
edamame22 1:5caeba593de4 76 #define HEATER_OFF 0
edamame22 1:5caeba593de4 77
edamame22 0:e0794665caf1 78
edamame22 0:e0794665caf1 79 #ifdef _DEBUG
edamame22 0:e0794665caf1 80 extern Serial pc;
edamame22 0:e0794665caf1 81 #define DEBUG_PRINT(...) pc.printf(__VA_ARGS__)
edamame22 0:e0794665caf1 82 #else
edamame22 0:e0794665caf1 83 #define DEBUG_PRINT(...)
edamame22 0:e0794665caf1 84 #endif
edamame22 0:e0794665caf1 85
edamame22 0:e0794665caf1 86 enum GAS_TYPE{NH3, CO, NO2, C3H8, C4H10, CH4, H2, C2H5OH};
edamame22 0:e0794665caf1 87 enum READ_ERROR_TYPE{READ_OK, NULL_RETURN_BUFFER_PTR, WRITE_LENGTH_ERROR, READ_LENGTH_ERROR, CHECKSUM_ERROR};
edamame22 0:e0794665caf1 88
edamame22 1:5caeba593de4 89 /** Interface for controlling MiCS-6814 Multichannel Gas Sensor
edamame22 1:5caeba593de4 90 *
edamame22 1:5caeba593de4 91 * @code
edamame22 1:5caeba593de4 92 * #include "mbed.h"
edamame22 1:5caeba593de4 93 * #include "MiCS6814_GasSensor.h"
edamame22 1:5caeba593de4 94 *
edamame22 1:5caeba593de4 95 * Serial pc(USBTX, USBRX);
edamame22 1:5caeba593de4 96 *
edamame22 1:5caeba593de4 97 * #if defined(TARGET_LPC1768)
edamame22 1:5caeba593de4 98 * MiCS6814_GasSensor sensor(p28, p27);
edamame22 1:5caeba593de4 99 * #else
edamame22 1:5caeba593de4 100 * MiCS6814_GasSensor sensor(I2C_SDA, I2C_SCL);
edamame22 1:5caeba593de4 101 * #endif
edamame22 1:5caeba593de4 102 *
edamame22 1:5caeba593de4 103 * int main() {
edamame22 1:5caeba593de4 104 *
edamame22 1:5caeba593de4 105 * while(1) {
edamame22 1:5caeba593de4 106 * pc.printf("NH3: %.2f ppm, CO: %.2f ppm, NO2: %.2f ppm, C3H8: %.2f ppm \r\n", gas.calcGas(NH3), gas.calcGas(CO), gas.calcGas(NO2), gas.calcGas(C3H8));
edamame22 1:5caeba593de4 107 * pc.printf("C4H10: %.2f ppm, CH4: %.2f ppm, H2: %.2f ppm, C2H5OH: %.2f ppm \r\n", gas.calcGas(C4H10), gas.calcGas(CH4), gas.calcGas(H2), gas.calcGas(C2H5OH));
edamame22 1:5caeba593de4 108 * wait(1);
edamame22 1:5caeba593de4 109 * }
edamame22 1:5caeba593de4 110 * }
edamame22 1:5caeba593de4 111 *
edamame22 1:5caeba593de4 112 * @endcode
edamame22 1:5caeba593de4 113 */
edamame22 1:5caeba593de4 114
edamame22 0:e0794665caf1 115 /**
edamame22 0:e0794665caf1 116 * @class MiCS6814_GasSensor
edamame22 1:5caeba593de4 117 * @brief A mbed component library to measure concentration value for 8 type of gases by using MiCS6814 - Multichannel Gas Sensor (seeed)
edamame22 0:e0794665caf1 118 *
edamame22 0:e0794665caf1 119 */
edamame22 0:e0794665caf1 120
edamame22 0:e0794665caf1 121 class MiCS6814_GasSensor{
edamame22 0:e0794665caf1 122
edamame22 0:e0794665caf1 123 public:
edamame22 0:e0794665caf1 124 /** Create a MiCS6814_GasSensor instance
edamame22 0:e0794665caf1 125 * the sensor is connected to specified I2C pins with specified address
edamame22 0:e0794665caf1 126 * 1. create an I2C instance
edamame22 0:e0794665caf1 127 * 2. initialize private variables.
edamame22 0:e0794665caf1 128 *
edamame22 0:e0794665caf1 129 * @param[in] sda I2C-bus SDA pin
edamame22 0:e0794665caf1 130 * @param[in] scl I2C-bus SCL pin
edamame22 0:e0794665caf1 131 * @param[in] slave_adr (option) I2C-bus address (default: 0x04<<1)
edamame22 0:e0794665caf1 132 */
edamame22 0:e0794665caf1 133 MiCS6814_GasSensor(PinName sda, PinName sck, char slave_adr = SLAVE_ADDRESS_MiCS6814);
edamame22 0:e0794665caf1 134
edamame22 0:e0794665caf1 135 /** Create a MiCS6814_GasSensor instance
edamame22 0:e0794665caf1 136 * the sensor is connected to specified I2C pins with specified address
edamame22 0:e0794665caf1 137 * 1. pass an I2C instance,
edamame22 0:e0794665caf1 138 * 2. then initialize private variables.
edamame22 0:e0794665caf1 139 *
edamame22 0:e0794665caf1 140 * @param[in] i2c_obj I2C object (instance)
edamame22 0:e0794665caf1 141 * @param[in] slave_adr (option) I2C-bus address (default: 0x04<<1)
edamame22 0:e0794665caf1 142 */
edamame22 0:e0794665caf1 143 MiCS6814_GasSensor(I2C &i2c_obj, char slave_adr = SLAVE_ADDRESS_MiCS6814);
edamame22 0:e0794665caf1 144
edamame22 0:e0794665caf1 145 /** Destructor of MiCS6814_GasSensor
edamame22 0:e0794665caf1 146 * 1. Power off heater
edamame22 0:e0794665caf1 147 * 2. Release allocated heap memory.
edamame22 0:e0794665caf1 148 */
edamame22 0:e0794665caf1 149 virtual ~MiCS6814_GasSensor();
edamame22 0:e0794665caf1 150
edamame22 0:e0794665caf1 151 /** Initialize MiCS6814_GasSensor
edamame22 0:e0794665caf1 152 * 1. Read firmware version from sensor
edamame22 0:e0794665caf1 153 * 2. Power on heater
edamame22 0:e0794665caf1 154 * 3. Clear private variables
edamame22 0:e0794665caf1 155 */
edamame22 0:e0794665caf1 156 void initialize(void);
edamame22 0:e0794665caf1 157
edamame22 0:e0794665caf1 158 /** Return a specific measured value, unit: ppm
edamame22 0:e0794665caf1 159 *
edamame22 0:e0794665caf1 160 * @param[in] gas_type one of gas type defined at enum GAS_TYPE
edamame22 0:e0794665caf1 161 * @return the measured concentration of specific gas type (ppm)
edamame22 0:e0794665caf1 162 */
edamame22 0:e0794665caf1 163 float calcGas(const enum GAS_TYPE gas_type);
edamame22 0:e0794665caf1 164
edamame22 0:e0794665caf1 165 private:
edamame22 0:e0794665caf1 166
edamame22 0:e0794665caf1 167 I2C *_i2c_p;
edamame22 0:e0794665caf1 168 I2C &_i2c;
edamame22 1:5caeba593de4 169 char _address; //I2C address of this MCU
edamame22 0:e0794665caf1 170 /** Check firmware version of sensor
edamame22 1:5caeba593de4 171 * only support version 2
edamame22 0:e0794665caf1 172 */
edamame22 0:e0794665caf1 173 void CheckFirmwareVersion(void);
edamame22 0:e0794665caf1 174
edamame22 0:e0794665caf1 175 /** Turn On/Off sensor heater
edamame22 0:e0794665caf1 176 *
edamame22 1:5caeba593de4 177 * @param[in] Switch_On 1: Turn on, 0: Turn off
edamame22 0:e0794665caf1 178 */
edamame22 1:5caeba593de4 179 void HeaterPower(const unsigned char Switch_On);
edamame22 1:5caeba593de4 180
edamame22 0:e0794665caf1 181 /** Read 16-bit data from sensor
edamame22 0:e0794665caf1 182 *
edamame22 0:e0794665caf1 183 * @param[in] reg_addr register adderss
edamame22 0:e0794665caf1 184 * @param[in] data_4reg data for the register, it will be Zero in case no input data for above register.
edamame22 0:e0794665caf1 185 * @param[in] write_length length for I2C writing, should be 1 or 2
edamame22 0:e0794665caf1 186 * @param[in] read_length length for I2C reading, should be 2 or 4
edamame22 0:e0794665caf1 187 * @param[out] pointer for read result buffer 16-bit
edamame22 0:e0794665caf1 188 * @return status
edamame22 0:e0794665caf1 189 */
edamame22 0:e0794665caf1 190 READ_ERROR_TYPE read_Multibytes(unsigned char reg_addr, unsigned char data_4reg ,unsigned char write_length, unsigned char read_length, uint16_t *readBuf);
edamame22 0:e0794665caf1 191
edamame22 0:e0794665caf1 192 /** Read A0_[x] of sensor
edamame22 0:e0794665caf1 193 *
edamame22 0:e0794665caf1 194 * @param[in] index {0,1,2}
edamame22 1:5caeba593de4 195 * @return return A0_[x]
edamame22 0:e0794665caf1 196 */
edamame22 0:e0794665caf1 197 uint16_t readR0_A0(unsigned char _indix);
edamame22 0:e0794665caf1 198
edamame22 0:e0794665caf1 199 /** Read An_[x] of sensor
edamame22 0:e0794665caf1 200 *
edamame22 0:e0794665caf1 201 * @param[in] index {0,1,2}
edamame22 1:5caeba593de4 202 * @return return An_[x]
edamame22 0:e0794665caf1 203 */
edamame22 0:e0794665caf1 204 uint16_t readRs_An(unsigned char _indix);
edamame22 0:e0794665caf1 205 };
edamame22 0:e0794665caf1 206
edamame22 0:e0794665caf1 207 #endif // MBED_MULTIGAS_SENSOR_H