TroykaMQ/BaseMQ.cpp

118 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);
_prMillis = 0;
}
// калибровка датчика
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();
_ro = ro;
_stateCalibrate = true;
}
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) {
float vrl = rawAdc*(5.0 / 1023);
float rsAir = (5.0 - vrl)/vrl*getRL();
return rsAir;
}
// считывание датчика
float BaseMQ::readRs() {
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;
}
float BaseMQ::getRo() {
return _ro;
}
bool BaseMQ::isCalibrated() {
return _stateCalibrate;
}
float BaseMQ::readRatio() {
return readRs()/_ro;
}
bool BaseMQ::heatingCompleted() {
if ((_heater) && (!_cooler) && (millis() - _prMillis > 60000))
return true;
else
return false;
}
bool BaseMQ::coolanceCompleted() {
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;
}
}