mirror of
https://github.com/amperka/TroykaMQ.git
synced 2025-03-14 20:17:35 +03:00
114 lines
2.3 KiB
C++
114 lines
2.3 KiB
C++
#include "BaseMQ.h"
|
|
|
|
BaseMQ::BaseMQ(uint8_t pin) :
|
|
_pin (pin) {
|
|
}
|
|
|
|
BaseMQ::BaseMQ(uint8_t pin, uint8_t pinHeater) :
|
|
_pin (pin),
|
|
_pinHeater (pinHeater)
|
|
{
|
|
pinMode(_pinHeater, OUTPUT);
|
|
}
|
|
|
|
// калибровка датчика
|
|
void BaseMQ::calibrate(float ro) {
|
|
_ro = ro;
|
|
_stateCalibrate = true;
|
|
}
|
|
|
|
// калибровка датчика
|
|
void BaseMQ::calibrate() {
|
|
float ro = 0;
|
|
for (int i = 0; i < MQ_SAMPLE_TIMES; i++) {
|
|
ro += calculateResistance(analogRead(_pin));
|
|
delay(MQ_SAMPLE_INTERVAL);
|
|
}
|
|
ro = ro/MQ_SAMPLE_TIMES;
|
|
ro = ro/getRoInCleanAir();
|
|
calibrate (ro);
|
|
}
|
|
|
|
void BaseMQ::heaterPwrHigh() {
|
|
digitalWrite(_pinHeater, HIGH);
|
|
_heater = true;
|
|
_prMillis = millis();
|
|
}
|
|
|
|
void BaseMQ::heaterPwrLow() {
|
|
analogWrite(_pinHeater, 75);
|
|
_heater = true;
|
|
_cooler = true;
|
|
_prMillis = millis();
|
|
}
|
|
|
|
void BaseMQ::heaterPwrOff() {
|
|
digitalWrite(_pinHeater, LOW);
|
|
_heater = false;
|
|
}
|
|
|
|
// сопротивление датчика
|
|
float BaseMQ::calculateResistance(int rawAdc) const {
|
|
float vrl = rawAdc*(5.0 / 1023);
|
|
float rsAir = (5.0 - vrl)/vrl*getRL();
|
|
return rsAir;
|
|
}
|
|
|
|
// считывание датчика
|
|
float BaseMQ::readRs() const {
|
|
float rs = 0;
|
|
for (int i = 0; i < MQ_SAMPLE_TIMES; i++) {
|
|
rs += calculateResistance(analogRead(_pin));
|
|
delay(MQ_SAMPLE_INTERVAL);
|
|
}
|
|
rs = rs/MQ_SAMPLE_TIMES;
|
|
return rs;
|
|
}
|
|
|
|
unsigned long BaseMQ::readScaled(float a, float b) const {
|
|
float ratio = readRatio();
|
|
return exp((log(ratio)-b)/a);
|
|
}
|
|
|
|
float BaseMQ::readRatio() const {
|
|
return readRs()/getRo();
|
|
}
|
|
|
|
bool BaseMQ::heatingCompleted() const {
|
|
if ((_heater) && (!_cooler) && (millis() - _prMillis > 60000))
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
bool BaseMQ::coolanceCompleted() const {
|
|
if ((_heater) && (_cooler) && (millis() - _prMillis > 90000))
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
void BaseMQ::cycleHeat() {
|
|
_heater = false;
|
|
_cooler = false;
|
|
heaterPwrHigh();
|
|
#ifdef MQDEBUG
|
|
Serial.println("Heated sensor");
|
|
#endif //MQDEBUG
|
|
}
|
|
|
|
bool BaseMQ::atHeatCycleEnd() {
|
|
if (heatingCompleted()) {
|
|
heaterPwrLow();
|
|
#ifdef MQDEBUG
|
|
Serial.println("Cool sensor");
|
|
#endif //MQDEBUG
|
|
return false;
|
|
} else if (coolanceCompleted()) {
|
|
heaterPwrOff();
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|