diff --git a/MQ135.cpp b/MQ135.cpp new file mode 100755 index 0000000..676ed31 --- /dev/null +++ b/MQ135.cpp @@ -0,0 +1,123 @@ +/**************************************************************************/ +/*! +@file MQ135.cpp +@author G.Krocker (Mad Frog Labs) +@license GNU GPLv3 + +First version of an Arduino Library for the MQ135 gas sensor +TODO: Review the correction factor calculation. This currently relies on +the datasheet but the information there seems to be wrong. + +@section HISTORY + +v1.0 - First release +*/ +/**************************************************************************/ + +#include "MQ135.h" + +/**************************************************************************/ +/*! +@brief Default constructor + +@param[in] pin The analog input pin for the readout of the sensor +*/ +/**************************************************************************/ + +MQ135::MQ135(uint8_t pin) { + _pin = pin; +} + + +/**************************************************************************/ +/*! +@brief Get the correction factor to correct for temperature and humidity + +@param[in] t The ambient air temperature +@param[in] h The relative humidity + +@return The calculated correction factor +*/ +/**************************************************************************/ +float MQ135::getCorrectionFactor(float t, float h) { + return CORA * t * t - CORB * t + CORC - (h-33.)*CORD; +} + +/**************************************************************************/ +/*! +@brief Get the resistance of the sensor, ie. the measurement value + +@return The sensor resistance in kOhm +*/ +/**************************************************************************/ +float MQ135::getResistance() { + int val = analogRead(_pin); + return ((1023./(float)val) * 5. - 1.)*RLOAD; +} + +/**************************************************************************/ +/*! +@brief Get the resistance of the sensor, ie. the measurement value corrected + for temp/hum + +@param[in] t The ambient air temperature +@param[in] h The relative humidity + +@return The corrected sensor resistance kOhm +*/ +/**************************************************************************/ +float MQ135::getCorrectedResistance(float t, float h) { + return getResistance()/getCorrectionFactor(t, h); +} + +/**************************************************************************/ +/*! +@brief Get the ppm of CO2 sensed (assuming only CO2 in the air) + +@return The ppm of CO2 in the air +*/ +/**************************************************************************/ +float MQ135::getPPM() { + return PARA * pow((getResistance()/RZERO), -PARB); +} + +/**************************************************************************/ +/*! +@brief Get the ppm of CO2 sensed (assuming only CO2 in the air), corrected + for temp/hum + +@param[in] t The ambient air temperature +@param[in] h The relative humidity + +@return The ppm of CO2 in the air +*/ +/**************************************************************************/ +float MQ135::getCorrectedPPM(float t, float h) { + return PARA * pow((getCorrectedResistance(t, h)/RZERO), -PARB); +} + +/**************************************************************************/ +/*! +@brief Get the resistance RZero of the sensor for calibration purposes + +@return The sensor resistance RZero in kOhm +*/ +/**************************************************************************/ +float MQ135::getRZero() { + return getResistance() * pow((ATMOCO2/PARA), (1./PARB)); +} + +/**************************************************************************/ +/*! +@brief Get the corrected resistance RZero of the sensor for calibration + purposes + +@param[in] t The ambient air temperature +@param[in] h The relative humidity + +@return The corrected sensor resistance RZero in kOhm +*/ +/**************************************************************************/ +float MQ135::getCorrectedRZero(float t, float h) { + return getCorrectedResistance(t, h) * pow((ATMOCO2/PARA), (1./PARB)); +} diff --git a/MQ135.h b/MQ135.h new file mode 100755 index 0000000..22cefec --- /dev/null +++ b/MQ135.h @@ -0,0 +1,55 @@ +/**************************************************************************/ +/*! +@file MQ135.h +@author G.Krocker (Mad Frog Labs) +@license GNU GPLv3 + +First version of an Arduino Library for the MQ135 gas sensor +TODO: Review the correction factor calculation. This currently relies on +the datasheet but the information there seems to be wrong. + +@section HISTORY + +v1.0 - First release +*/ +/**************************************************************************/ +#ifndef MQ135_H +#define MQ135_H +#if ARDUINO >= 100 + #include "Arduino.h" +#else + #include "WProgram.h" +#endif + +/// The load resistance on the board +#define RLOAD 10.0 +/// Calibration resistance at atmospheric CO2 level +#define RZERO 76.63 +/// Parameters for calculating ppm of CO2 from sensor resistance +#define PARA 116.6020682 +#define PARB 2.769034857 + +/// Parameters to model temperature and humidity dependence +#define CORA 0.00035 +#define CORB 0.02718 +#define CORC 1.39538 +#define CORD 0.0018 + +/// Atmospheric CO2 level for calibration purposes +#define ATMOCO2 397.13 + +class MQ135 { + private: + uint8_t _pin; + + public: + MQ135(uint8_t pin); + float getCorrectionFactor(float t, float h); + float getResistance(); + float getCorrectedResistance(float t, float h); + float getPPM(); + float getCorrectedPPM(float t, float h); + float getRZero(); + float getCorrectedRZero(float t, float h); +}; +#endif