83 lines
1.5 KiB
C++
83 lines
1.5 KiB
C++
#include "MQ135.h"
|
|
|
|
MQ135::MQ135(uint8_t pin) {
|
|
this->pin = pin;
|
|
pinMode(pin, INPUT);
|
|
}
|
|
|
|
double MQ135::getVoltage() {
|
|
return (double)analogRead(pin) * VStep;
|
|
}
|
|
|
|
double MQ135::getResistance() {
|
|
double voltage = getVoltage();
|
|
double rs = ((VIn * RL) / voltage) - RL;
|
|
if (rs < 0) {
|
|
rs = 0;
|
|
}
|
|
return rs;
|
|
}
|
|
|
|
double MQ135::getPPM(float a, float b) {
|
|
double ratio = getResistance() / R0;
|
|
double ppm = a * pow(ratio, b);
|
|
if (ppm < 0) {
|
|
ppm = 0;
|
|
}
|
|
return ppm;
|
|
}
|
|
|
|
double MQ135::getPPMLinear(float a, float b) {
|
|
double ratio = getResistance() / R0;
|
|
double ppm_log = (log10(ratio) - b) / a;
|
|
double ppm = pow(10, ppm_log);
|
|
if (ppm < 0) {
|
|
ppm = 0;
|
|
}
|
|
return ppm;
|
|
}
|
|
|
|
double MQ135::getAcetona() {
|
|
return getPPM(34.668, -3.369);
|
|
}
|
|
|
|
double MQ135::getAlcohol() {
|
|
return getPPM(77.255, -3.18);
|
|
}
|
|
|
|
double MQ135::getCO2() {
|
|
// return getPPMLinear(-0.3525, 0.7142) + ATMOCO2;
|
|
return getPPM(110.47, -2.862) + ATMOCO2;
|
|
}
|
|
|
|
double MQ135::getCO() {
|
|
return getPPM(605.18, -3.937);
|
|
}
|
|
|
|
double MQ135::getNH4() {
|
|
return getPPM(102.2, -2.473);
|
|
}
|
|
|
|
double MQ135::getTolueno() {
|
|
return getPPM(44.947, -3.445);
|
|
}
|
|
|
|
float MQ135::getR0() {
|
|
double r0 = getResistance() / 3.6;
|
|
return r0;
|
|
}
|
|
|
|
double MQ135::getR0ByCO2Level(float ppm) {
|
|
if (ppm > ATMOCO2) {
|
|
ppm -= ATMOCO2;
|
|
}
|
|
else {
|
|
return NAN;
|
|
}
|
|
double tmp = -(log10(ppm / 110.47) / -2.862) + log10(getResistance());
|
|
return pow(10, tmp);
|
|
}
|
|
|
|
void MQ135::setR0(float r0) {
|
|
R0 = r0;
|
|
}
|