MQSensorsLib/src/MQUnifiedsensor.cpp

633 lines
16 KiB
C++
Raw Normal View History

2019-04-30 08:52:47 -05:00
#include "MQUnifiedsensor.h"
2019-05-24 16:15:02 -05:00
MQUnifiedsensor::MQUnifiedsensor(int pin, int type) {
2019-05-23 15:17:39 -05:00
2019-04-30 08:52:47 -05:00
this->_pin = pin;
2019-05-19 13:27:00 -05:00
this->_type = type; //2,3,4,5,6,7,8,9,131,135,303,309
2019-05-23 15:17:39 -05:00
//Set _MQ variable with MQ sensor selected
if(_type == 2)
{
2019-05-30 12:25:15 -05:00
//memcpy(_MQ, _MQ2, sizeof(_MQ2));
2019-05-29 21:03:46 -05:00
_ratioInCleanAir = RatioMQ2CleanAir;
2019-05-29 21:30:08 -05:00
_R0 = R0_MQ2;
2019-05-24 17:02:46 -05:00
//_MQ = MQ2;
2019-05-23 15:17:39 -05:00
}
else if(_type == 3)
{
2019-05-30 12:25:15 -05:00
//memcpy(_MQ, _MQ3, sizeof(_MQ3));
2019-05-29 21:03:46 -05:00
_ratioInCleanAir = RatioMQ3CleanAir;
2019-05-29 21:30:08 -05:00
_R0 = R0_MQ3;
2019-05-24 17:02:46 -05:00
//_MQ = MQ3;
2019-05-23 15:17:39 -05:00
}
else if(_type == 4)
{
2019-05-30 12:25:15 -05:00
//memcpy(_MQ, _MQ4, sizeof(_MQ4));
2019-05-29 21:03:46 -05:00
_ratioInCleanAir = RatioMQ4CleanAir;
2019-05-29 21:30:08 -05:00
_R0 = R0_MQ4;
2019-05-24 17:02:46 -05:00
//_MQ = MQ4;
2019-05-23 15:17:39 -05:00
}
else if(_type == 5)
{
2019-05-30 12:25:15 -05:00
//memcpy(_MQ, _MQ5, sizeof(_MQ5));
2019-05-29 21:03:46 -05:00
_ratioInCleanAir = RatioMQ5CleanAir;
2019-05-29 21:30:08 -05:00
_R0 = R0_MQ5;
2019-05-24 17:02:46 -05:00
//_MQ = MQ5;
2019-05-23 15:17:39 -05:00
}
else if(_type == 6)
{
2019-05-30 12:25:15 -05:00
//memcpy(_MQ, _MQ6, sizeof(_MQ6));
2019-05-29 21:03:46 -05:00
_ratioInCleanAir = RatioMQ6CleanAir;
2019-05-29 21:30:08 -05:00
_R0 = R0_MQ6;
2019-05-24 17:02:46 -05:00
//_MQ = MQ6;
2019-05-23 15:17:39 -05:00
}
else if(_type == 7)
{
2019-05-30 12:25:15 -05:00
//memcpy(_MQ, _MQ7, sizeof(_MQ7));
2019-05-29 21:03:46 -05:00
_ratioInCleanAir = RatioMQ7CleanAir;
2019-05-29 21:30:08 -05:00
_R0 = R0_MQ7;
2019-05-24 17:02:46 -05:00
//_MQ = MQ7;
2019-05-23 15:17:39 -05:00
}
else if(_type == 8)
{
2019-05-30 12:25:15 -05:00
//memcpy(_MQ, _MQ8, sizeof(_MQ8));
2019-05-29 21:03:46 -05:00
_ratioInCleanAir = RatioMQ8CleanAir;
2019-05-29 21:30:08 -05:00
_R0 = R0_MQ8;
2019-05-24 17:02:46 -05:00
//_MQ = MQ8;
2019-05-23 15:17:39 -05:00
}
else if(_type == 9)
{
2019-05-30 12:25:15 -05:00
//memcpy(_MQ, _MQ9, sizeof(_MQ9));
2019-05-29 21:03:46 -05:00
_ratioInCleanAir = RatioMQ9CleanAir;
2019-05-29 21:30:08 -05:00
_R0 = R0_MQ9;
2019-05-24 17:02:46 -05:00
//_MQ = MQ9;
2019-05-23 15:17:39 -05:00
}
else if(_type == 131)
{
2019-05-30 12:25:15 -05:00
//memcpy(_MQ, _MQ131, sizeof(_MQ131));
2019-05-29 21:03:46 -05:00
_ratioInCleanAir = RatioMQ131CleanAir;
2019-05-29 21:30:08 -05:00
_R0 = R0_MQ131;
2019-05-24 17:02:46 -05:00
//_MQ = MQ131;
2019-05-23 15:17:39 -05:00
}
else if(_type == 135)
{
2019-05-30 12:25:15 -05:00
//memcpy(_MQ, _MQ135, sizeof(_MQ135));
2019-05-29 21:03:46 -05:00
_ratioInCleanAir = RatioMQ135CleanAir;
2019-05-29 21:30:08 -05:00
_R0 = R0_MQ135;
2019-05-24 17:02:46 -05:00
//_MQ = MQ135;
2019-05-23 15:17:39 -05:00
}
else if(_type == 303)
{
2019-05-30 12:25:15 -05:00
//memcpy(_MQ, _MQ303A, sizeof(_MQ303A));
2019-05-29 21:03:46 -05:00
_ratioInCleanAir = RatioMQ303CleanAir;
2019-05-29 21:30:08 -05:00
_R0 = R0_MQ303;
2019-05-24 17:02:46 -05:00
//_MQ = MQ303A;
2019-05-23 15:17:39 -05:00
}
else if(_type == 309)
{
2019-05-30 12:25:15 -05:00
//memcpy(_MQ, _MQ309A, sizeof(_MQ309A));
2019-05-29 21:03:46 -05:00
_ratioInCleanAir = RatioMQ309CleanAir;
2019-05-29 21:30:08 -05:00
_R0 = R0_MQ309;
2019-05-24 17:02:46 -05:00
//_MQ = MQ309;
2019-05-23 15:17:39 -05:00
}
2019-04-30 08:52:47 -05:00
}
2019-08-14 20:47:24 -05:00
void MQUnifiedsensor::update()
{
_sensor_volt = this->getVoltage();
}
2019-05-25 10:46:44 -05:00
void MQUnifiedsensor::setVoltResolution(float voltaje)
{
2019-05-29 22:13:13 -05:00
_VOLT_RESOLUTION = voltaje;
2019-05-25 10:46:44 -05:00
}
2019-05-24 17:13:54 -05:00
void MQUnifiedsensor::inicializar()
{
pinMode(_pin, INPUT);
2019-04-30 08:52:47 -05:00
}
float MQUnifiedsensor::readSensor(String nameLectureRequeired, bool print)
2019-04-30 08:52:47 -05:00
{
2019-08-14 20:47:24 -05:00
setSensorCharacteristics(nameLectureRequeired, print); //In this function update _a and _b
2019-08-15 20:47:42 -05:00
//More explained in: https://jayconsystems.com/blog/understanding-a-gas-sensor
2019-08-14 20:47:24 -05:00
_RS_Calc = ((_VOLT_RESOLUTION*_RLValue)/_sensor_volt)-_RLValue; //Get value of RS in a gas
if(_RS_Calc < 0) _RS_Calc = 0; //No negative values accepted.
2019-08-14 20:47:24 -05:00
_ratio = _RS_Calc / this->_R0; // Get ratio RS_gas/RS_air
if(_ratio <= 0 || _ratio>100) _ratio = 0.01; //No negative values accepted or upper datasheet recomendation.
_PPM= _a*pow(_ratio, _b);
if(_PPM < 0) _PPM = 0; //No negative values accepted or upper datasheet recomendation.
if(_PPM > 10000) _PPM = 9999; //No negative values accepted or upper datasheet recomendation.
2019-08-14 20:47:24 -05:00
2019-05-24 17:02:46 -05:00
if(print)
{
2019-05-24 17:24:37 -05:00
String nameLecture = getnameLecture();
2019-05-26 15:18:16 -05:00
Serial.println("**********************");
Serial.println("* Sensor: MQ-" + String(_type));
2019-07-22 22:27:47 -05:00
Serial.println("* Vcc: " + String(_VOLT_RESOLUTION) + ", RS: " + String(_RS_Calc));
2019-05-29 21:31:45 -05:00
Serial.println("* RS/R0 = " + String(_ratio) + " ,Voltaje leido(ADC): " + String(_sensor_volt));
Serial.println("* PPM = " + String(_a) + "*pow(" + String(_ratio) + "," + String(_b) + ")");
Serial.println("* Lectura(" + nameLecture + ") = " + String(_PPM) + " PPM");
2019-05-26 15:18:16 -05:00
Serial.println("**********************");
2019-05-24 17:02:46 -05:00
}
return _PPM;
2019-04-30 08:52:47 -05:00
}
2019-05-24 17:13:54 -05:00
String MQUnifiedsensor::getnameLecture()
2019-05-23 16:51:24 -05:00
{
2019-05-24 22:15:53 -05:00
return _nameLectureRequeired;
2019-05-23 16:51:24 -05:00
}
2019-05-24 17:24:37 -05:00
void MQUnifiedsensor::setSensorCharacteristics(String nameLectureRequeired, bool print)
2019-04-30 08:52:47 -05:00
{
2019-05-24 17:24:37 -05:00
//Defaults index
2019-05-23 16:21:53 -05:00
if(nameLectureRequeired == "")
{
//Set default
setDefaultGas();
//Put the default into variable internally used
2019-05-24 22:16:37 -05:00
nameLectureRequeired = _nameLectureRequeired;
2019-05-23 16:21:53 -05:00
}
2019-05-24 22:09:11 -05:00
2019-05-30 12:25:15 -05:00
if(_type == 2)
{
if(nameLectureRequeired == "H2")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "H2";
_a = MQ2_H2_a;
2019-05-30 12:25:15 -05:00
_b = MQ2_H2_b;
}
else if(nameLectureRequeired == "LPG")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "LPG";
_a = MQ2_LPG_a;
2019-05-30 12:25:15 -05:00
_b = MQ2_LPG_b;
}
else if(nameLectureRequeired == "CO")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CO";
_a = MQ2_CO_a;
2019-05-30 12:25:15 -05:00
_b = MQ2_CO_b;
}
else if(nameLectureRequeired == "Alcohol")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "Alcohol";
_a = MQ2_Alcohol_a;
2019-05-30 12:25:15 -05:00
_b = MQ2_Alcohol_b;
}
else if(nameLectureRequeired == "Propane")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "Propane";
_a = MQ2_Propane_a;
2019-05-30 12:25:15 -05:00
_b = MQ2_Propane_b;
}
}
else if(_type == 3)
{
if(nameLectureRequeired == "LPG")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "LPG";
_a = MQ3_LPG_a;
2019-05-30 12:25:15 -05:00
_b = MQ3_LPG_b;
}
else if(nameLectureRequeired == "CH4")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CH4";
_a = MQ3_CH4_a;
2019-05-30 12:25:15 -05:00
_b = MQ3_CH4_b;
}
else if(nameLectureRequeired == "CO")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CO";
_a = MQ3_CO_a;
2019-05-30 12:25:15 -05:00
_b = MQ3_CO_b;
}
else if(nameLectureRequeired == "Alcohol")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "Alcohol";
_a = MQ3_Alcohol_a;
2019-05-30 12:25:15 -05:00
_b = MQ3_Alcohol_b;
}
else if(nameLectureRequeired == "Hexane")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "Hexane";
_a = MQ3_Hexane_a;
2019-05-30 12:25:15 -05:00
_b = MQ3_Hexane_b;
}
else if(nameLectureRequeired == "Benzene")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "Benzene";
_a = MQ3_Benzene_a;
2019-05-30 12:25:15 -05:00
_b = MQ3_Benzene_b;
}
}
else if(_type == 4)
{
if(nameLectureRequeired == "LPG")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "LPG";
_a = MQ4_LPG_a;
2019-05-30 12:25:15 -05:00
_b = MQ4_LPG_b;
}
else if(nameLectureRequeired == "CH4")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CH4";
_a = MQ4_CH4_a;
2019-05-30 12:25:15 -05:00
_b = MQ4_CH4_b;
}
else if(nameLectureRequeired == "CO")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CO";
_a = MQ4_CO_a;
2019-05-30 12:25:15 -05:00
_b = MQ4_CO_b;
}
else if(nameLectureRequeired == "Alcohol")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "Alcohol";
_a = MQ4_Alcohol_a;
2019-05-30 12:25:15 -05:00
_b = MQ4_Alcohol_b;
}
else if(nameLectureRequeired == "smoke")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "smoke";
_a = MQ4_smoke_a;
2019-05-30 12:25:15 -05:00
_b = MQ4_smoke_b;
}
}
else if(_type == 5)
{
if(nameLectureRequeired == "H2")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "H2";
_a = MQ5_H2_a;
2019-05-30 12:25:15 -05:00
_b = MQ5_H2_b;
}
else if(nameLectureRequeired == "LPG")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "LPG";
_a = MQ5_LPG_a;
2019-05-30 12:25:15 -05:00
_b = MQ5_LPG_b;
}
else if(nameLectureRequeired == "CH4")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CH4";
_a = MQ5_CH4_a;
2019-05-30 12:25:15 -05:00
_b = MQ5_CH4_b;
}
else if(nameLectureRequeired == "CO")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CO";
_a = MQ5_CO_a;
2019-05-30 12:25:15 -05:00
_b = MQ5_CO_b;
}
else if(nameLectureRequeired == "Alcohol")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "Alcohol";
_a = MQ5_Alcohol_a;
2019-05-30 12:25:15 -05:00
_b = MQ5_Alcohol_b;
}
}
else if(_type == 6)
{
if(nameLectureRequeired == "H2")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "H2";
_a = MQ6_H2_a;
2019-05-30 12:25:15 -05:00
_b = MQ6_H2_b;
}
else if(nameLectureRequeired == "LPG")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "LPG";
_a = MQ6_LPG_a;
2019-05-30 12:25:15 -05:00
_b = MQ6_LPG_b;
}
else if(nameLectureRequeired == "CH4")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CH4";
_a = MQ6_CH4_a;
2019-05-30 12:25:15 -05:00
_b = MQ6_CH4_b;
}
else if(nameLectureRequeired == "CO")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CO";
_a = MQ6_CO_a;
2019-05-30 12:25:15 -05:00
_b = MQ6_CO_b;
}
else if(nameLectureRequeired == "Alcohol")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "Alcohol";
_a = MQ6_Alcohol_a;
2019-05-30 12:25:15 -05:00
_b = MQ6_Alcohol_b;
}
}
else if(_type == 7)
{
if(nameLectureRequeired == "H2")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "H2";
_a = MQ7_H2_a;
2019-05-30 12:25:15 -05:00
_b = MQ7_H2_b;
}
else if(nameLectureRequeired == "LPG")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "LPG";
_a = MQ7_LPG_a;
2019-05-30 12:25:15 -05:00
_b = MQ7_LPG_b;
}
else if(nameLectureRequeired == "CH4")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CH4";
_a = MQ7_CH4_a;
2019-05-30 12:25:15 -05:00
_b = MQ7_CH4_b;
}
else if(nameLectureRequeired == "CO")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CO";
_a = MQ7_CO_a;
2019-05-30 12:25:15 -05:00
_b = MQ7_CO_b;
}
else if(nameLectureRequeired == "Alcohol")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "Alcohol";
_a = MQ7_Alcohol_a;
2019-05-30 12:25:15 -05:00
_b = MQ7_Alcohol_b;
}
}
else if(_type == 8)
{
if(nameLectureRequeired == "H2")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "H2";
_a = MQ8_H2_a;
2019-05-30 12:25:15 -05:00
_b = MQ8_H2_b;
}
else if(nameLectureRequeired == "LPG")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "LPG";
_a = MQ8_LPG_a;
2019-05-30 12:25:15 -05:00
_b = MQ8_LPG_b;
}
else if(nameLectureRequeired == "CH4")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CH4";
_a = MQ8_CH4_a;
2019-05-30 12:25:15 -05:00
_b = MQ8_CH4_b;
}
else if(nameLectureRequeired == "CO")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CO";
_a = MQ8_CO_a;
2019-05-30 12:25:15 -05:00
_b = MQ8_CO_b;
}
else if(nameLectureRequeired == "Alcohol")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "Alcohol";
_a = MQ8_Alcohol_a;
2019-05-30 12:25:15 -05:00
_b = MQ8_Alcohol_b;
}
}
else if(_type == 9)
{
if(nameLectureRequeired == "LPG")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "LPG";
_a = MQ9_LPG_a;
2019-05-30 12:25:15 -05:00
_b = MQ9_LPG_b;
}
else if(nameLectureRequeired == "CH4")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CH4";
_a = MQ9_CH4_a;
2019-05-30 12:25:15 -05:00
_b = MQ9_CH4_b;
}
else if(nameLectureRequeired == "CO")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CO";
_a = MQ9_CO_a;
2019-05-30 12:25:15 -05:00
_b = MQ9_CO_b;
}
}
else if(_type == 131)
{
if(nameLectureRequeired == "NOx")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "NOx";
_a = MQ131_NOx_a;
2019-05-30 12:25:15 -05:00
_b = MQ131_NOx_b;
}
else if(nameLectureRequeired == "CL2")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CL2";
_a = MQ131_CL2_a;
2019-05-30 12:25:15 -05:00
_b = MQ131_CL2_b;
}
else if(nameLectureRequeired == "O3")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "O3";
_a = MQ131_O3_a;
2019-05-30 12:25:15 -05:00
_b = MQ131_O3_b;
}
}
else if(_type == 135)
{
if(nameLectureRequeired == "CO")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CO";
_a = MQ135_CO_a;
2019-05-30 12:25:15 -05:00
_b = MQ135_CO_b;
}
else if(nameLectureRequeired == "Alcohol")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "Alcohol";
_a = MQ135_Alcohol_a;
2019-05-30 12:25:15 -05:00
_b = MQ135_Alcohol_b;
}
else if(nameLectureRequeired == "CO2")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CO2";
_a = MQ135_CO2_a;
2019-05-30 12:25:15 -05:00
_b = MQ135_CO2_b;
}
else if(nameLectureRequeired == "Tolueno")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "Tolueno";
_a = MQ135_Tolueno_a;
2019-05-30 12:25:15 -05:00
_b = MQ135_Tolueno_b;
}
else if(nameLectureRequeired == "NH4")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "NH4";
_a = MQ135_NH4_a;
2019-05-30 12:25:15 -05:00
_b = MQ135_NH4_b;
}
else if(nameLectureRequeired == "Acetona")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "Acetona";
_a = MQ135_Acetona_a;
2019-05-30 12:25:15 -05:00
_b = MQ135_Acetona_b;
}
}
else if(_type == 303)
{
if(nameLectureRequeired == "Iso_butano")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "Iso_butano";
_a = MQ303_Iso_butano_a;
2019-05-30 12:25:15 -05:00
_b = MQ303_Iso_butano_b;
}
else if(nameLectureRequeired == "Hydrogeno")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "Hydrogeno";
_a = MQ303_Hydrogeno_a;
2019-05-30 12:25:15 -05:00
_b = MQ303_Hydrogeno_b;
}
else if(nameLectureRequeired == "Ethanol")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "Ethanol";
_a = MQ303_Ethanol_a;
2019-05-30 12:25:15 -05:00
_b = MQ303_Ethanol_b;
}
}
else if(_type == 309)
{
if(nameLectureRequeired == "H2")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "H2";
_a = MQ309_H2_a;
2019-05-30 12:25:15 -05:00
_b = MQ309_H2_b;
}
else if(nameLectureRequeired == "CH4")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CH4";
_a = MQ309_CH4_a;
2019-05-30 12:25:15 -05:00
_b = MQ309_CH4_b;
}
else if(nameLectureRequeired == "CO")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "CO";
_a = MQ309_CO_a;
2019-05-30 12:25:15 -05:00
_b = MQ309_CO_b;
}
else if(nameLectureRequeired == "Alcohol")
2019-05-30 12:25:15 -05:00
{
_nameLectureRequeired = "Alcohol";
_a = MQ309_Alcohol_a;
2019-05-30 12:25:15 -05:00
_b = MQ309_Alcohol_b;
}
}
2019-05-24 17:24:37 -05:00
//Serial debugging
2019-04-30 08:52:47 -05:00
}
float MQUnifiedsensor::calibrate(boolean print) {
2019-05-29 20:58:22 -05:00
//More explained in: https://jayconsystems.com/blog/understanding-a-gas-sensor
/*
V = I x R
VRL = [VC / (RS + RL)] x RL
VRL = (VC x RL) / (RS + RL)
Así que ahora resolvemos para RS:
VRL x (RS + RL) = VC x RL
(VRL x RS) + (VRL x RL) = VC x RL
(VRL x RS) = (VC x RL) - (VRL x RL)
RS = [(VC x RL) - (VRL x RL)] / VRL
RS = [(VC x RL) / VRL] - RL
*/
2019-07-22 22:27:47 -05:00
float RS_air; //Define variable for sensor resistance
float R0; //Define variable for R0
RS_air = ((_VOLT_RESOLUTION*_RLValue)/_sensor_volt)-_RLValue; //Calculate RS in fresh air
if(RS_air < 0) RS_air = 0; //No negative values accepted.
2019-05-29 20:58:22 -05:00
R0 = RS_air/_ratioInCleanAir; //Calculate R0
if(R0 < 0) R0 = 0; //No negative values accepted.
2019-05-29 22:17:25 -05:00
if(print)
{
2019-05-29 22:19:43 -05:00
Serial.println("*******Calibrating*********");
2019-05-30 13:23:42 -05:00
Serial.println("* Sensor: MQ-" + String(_type) + "*");
2019-08-14 20:47:24 -05:00
Serial.println("* Vcc: " + String(_VOLT_RESOLUTION) + "*");
2019-05-30 13:23:42 -05:00
Serial.println("* _sensor_volt: " + String(_sensor_volt) + "*");
Serial.println("* _RLValue: " + String(_RLValue) + "*");
Serial.println("* _ratioInCleanAir: " + String(_ratioInCleanAir) + "*");
Serial.println("* R0: " + String(R0) + "*");
2019-05-29 22:19:43 -05:00
Serial.println("*******Calibrating*********");
2019-05-29 22:17:25 -05:00
}
2019-05-29 20:58:22 -05:00
return R0;
2019-04-30 08:52:47 -05:00
}
2019-06-01 18:00:10 -05:00
double MQUnifiedsensor::getVoltage(int read) {
double voltage;
2019-06-01 18:00:10 -05:00
if(read)
{
double avg = 0.0;
for (int i = 0; i < retries; i ++) {
2019-06-01 18:21:14 -05:00
avg += analogRead(this->_pin);
2019-06-01 18:00:10 -05:00
delay(retry_interval);
}
2019-06-01 18:21:14 -05:00
voltage = (avg/ retries) * _VOLT_RESOLUTION / (pow(2, ADC_RESOLUTION) - 1);
2019-04-30 08:52:47 -05:00
}
else
{
voltage = _sensor_volt;
}
2019-04-30 08:52:47 -05:00
return voltage;
}
2019-07-22 22:27:47 -05:00
2019-05-24 17:13:54 -05:00
void MQUnifiedsensor::setR0(double R0) {
this->_R0 = R0;
2019-05-24 22:09:11 -05:00
}
2019-07-22 22:27:47 -05:00
double MQUnifiedsensor::getR0() {
return _R0;
}
void MQUnifiedsensor::setRL(double RL) {
this->_RLValue = RL;
}
double MQUnifiedsensor::getRL() {
return _RLValue;
}
2019-05-24 22:09:11 -05:00
void MQUnifiedsensor::setDefaultGas()
{
if(_type == 2)
{
2019-05-24 22:14:34 -05:00
_nameLectureRequeired = defaultMQ2;
2019-05-24 22:09:11 -05:00
}
else if(_type == 3)
{
2019-05-24 22:14:34 -05:00
_nameLectureRequeired = defaultMQ3;
2019-05-24 22:09:11 -05:00
}
else if(_type == 4)
{
2019-05-24 22:14:34 -05:00
_nameLectureRequeired = defaultMQ4;
2019-05-24 22:09:11 -05:00
}
else if(_type == 5)
{
2019-05-24 22:14:34 -05:00
_nameLectureRequeired = defaultMQ5;
2019-05-24 22:09:11 -05:00
}
else if(_type == 6)
{
2019-05-24 22:14:34 -05:00
_nameLectureRequeired = defaultMQ6;
2019-05-24 22:09:11 -05:00
}
else if(_type == 7)
{
2019-05-24 22:14:34 -05:00
_nameLectureRequeired = defaultMQ7;
2019-05-24 22:09:11 -05:00
}
else if(_type == 8)
{
2019-05-24 22:14:34 -05:00
_nameLectureRequeired = defaultMQ8;
2019-05-24 22:09:11 -05:00
}
else if(_type == 9)
{
2019-05-24 22:14:34 -05:00
_nameLectureRequeired = defaultMQ9;
2019-05-24 22:09:11 -05:00
}
else if(_type == 131)
{
2019-05-24 22:14:34 -05:00
_nameLectureRequeired = defaultMQ131;
2019-05-24 22:09:11 -05:00
}
else if(_type == 135)
{
2019-05-24 22:14:34 -05:00
_nameLectureRequeired = defaultMQ135;
2019-05-24 22:09:11 -05:00
}
else if(_type == 303)
{
2019-05-24 22:14:34 -05:00
_nameLectureRequeired = defaultMQ303;
2019-05-24 22:09:11 -05:00
}
else if(_type == 309)
{
2019-05-24 22:14:34 -05:00
_nameLectureRequeired = defaultMQ309;
2019-05-24 22:09:11 -05:00
}
}
2019-05-24 22:14:34 -05:00
double MQUnifiedsensor::stringToDouble(String & str)
2019-05-24 22:09:11 -05:00
{
return atof( str.c_str() );
2019-05-24 17:13:54 -05:00
}