mirror of
https://github.com/amperka/TroykaMQ.git
synced 2025-03-15 04:27:34 +03:00
commit
61dc0f9349
36
BaseMQ.cpp
36
BaseMQ.cpp
@ -1,14 +1,14 @@
|
|||||||
#include "BaseMQ.h"
|
#include "BaseMQ.h"
|
||||||
|
|
||||||
BaseMQ::BaseMQ(uint8_t pin) {
|
BaseMQ::BaseMQ(uint8_t pin) :
|
||||||
_pin = pin;
|
_pin (pin) {
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseMQ::BaseMQ(uint8_t pin, uint8_t pinHeater) {
|
BaseMQ::BaseMQ(uint8_t pin, uint8_t pinHeater) :
|
||||||
_pin = pin;
|
_pin (pin),
|
||||||
_pinHeater = pinHeater;
|
_pinHeater (pinHeater)
|
||||||
|
{
|
||||||
pinMode(_pinHeater, OUTPUT);
|
pinMode(_pinHeater, OUTPUT);
|
||||||
_prMillis = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// калибровка датчика
|
// калибровка датчика
|
||||||
@ -26,8 +26,7 @@ void BaseMQ::calibrate() {
|
|||||||
}
|
}
|
||||||
ro = ro/MQ_SAMPLE_TIMES;
|
ro = ro/MQ_SAMPLE_TIMES;
|
||||||
ro = ro/getRoInCleanAir();
|
ro = ro/getRoInCleanAir();
|
||||||
_ro = ro;
|
calibrate (ro);
|
||||||
_stateCalibrate = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaseMQ::heaterPwrHigh() {
|
void BaseMQ::heaterPwrHigh() {
|
||||||
@ -49,14 +48,14 @@ void BaseMQ::heaterPwrOff() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// сопротивление датчика
|
// сопротивление датчика
|
||||||
float BaseMQ::calculateResistance(int rawAdc) {
|
float BaseMQ::calculateResistance(int rawAdc) const {
|
||||||
float vrl = rawAdc*(5.0 / 1023);
|
float vrl = rawAdc*(5.0 / 1023);
|
||||||
float rsAir = (5.0 - vrl)/vrl*getRL();
|
float rsAir = (5.0 - vrl)/vrl*getRL();
|
||||||
return rsAir;
|
return rsAir;
|
||||||
}
|
}
|
||||||
|
|
||||||
// считывание датчика
|
// считывание датчика
|
||||||
float BaseMQ::readRs() {
|
float BaseMQ::readRs() const {
|
||||||
float rs = 0;
|
float rs = 0;
|
||||||
for (int i = 0; i < MQ_SAMPLE_TIMES; i++) {
|
for (int i = 0; i < MQ_SAMPLE_TIMES; i++) {
|
||||||
rs += calculateResistance(analogRead(_pin));
|
rs += calculateResistance(analogRead(_pin));
|
||||||
@ -66,26 +65,23 @@ float BaseMQ::readRs() {
|
|||||||
return rs;
|
return rs;
|
||||||
}
|
}
|
||||||
|
|
||||||
float BaseMQ::getRo() {
|
unsigned long BaseMQ::readScaled(float a, float b) const {
|
||||||
return _ro;
|
float ratio = readRatio();
|
||||||
|
return exp((log(ratio)-b)/a);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BaseMQ::isCalibrated() {
|
float BaseMQ::readRatio() const {
|
||||||
return _stateCalibrate;
|
return readRs()/getRo();
|
||||||
}
|
}
|
||||||
|
|
||||||
float BaseMQ::readRatio() {
|
bool BaseMQ::heatingCompleted() const {
|
||||||
return readRs()/_ro;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool BaseMQ::heatingCompleted() {
|
|
||||||
if ((_heater) && (!_cooler) && (millis() - _prMillis > 60000))
|
if ((_heater) && (!_cooler) && (millis() - _prMillis > 60000))
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BaseMQ::coolanceCompleted() {
|
bool BaseMQ::coolanceCompleted() const {
|
||||||
if ((_heater) && (_cooler) && (millis() - _prMillis > 90000))
|
if ((_heater) && (_cooler) && (millis() - _prMillis > 90000))
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
|
32
BaseMQ.h
32
BaseMQ.h
@ -16,24 +16,32 @@ public:
|
|||||||
void heaterPwrLow();
|
void heaterPwrLow();
|
||||||
void heaterPwrOff();
|
void heaterPwrOff();
|
||||||
void cycleHeat();
|
void cycleHeat();
|
||||||
bool heatingCompleted();
|
|
||||||
bool coolanceCompleted();
|
|
||||||
bool isCalibrated();
|
|
||||||
bool atHeatCycleEnd();
|
bool atHeatCycleEnd();
|
||||||
float getRo();
|
bool heatingCompleted() const;
|
||||||
float readRatio();
|
bool coolanceCompleted() const;
|
||||||
|
float readRatio() const;
|
||||||
|
inline bool isCalibrated() const {
|
||||||
|
return _stateCalibrate;
|
||||||
|
};
|
||||||
|
inline float getRo() const {
|
||||||
|
return _ro;
|
||||||
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
unsigned long readScaled(float a, float b) const;
|
||||||
|
virtual float getRoInCleanAir() const = 0;
|
||||||
|
virtual int getRL() const = 0;
|
||||||
|
|
||||||
|
private:
|
||||||
bool _heater = false;
|
bool _heater = false;
|
||||||
bool _cooler = false;
|
bool _cooler = false;
|
||||||
bool _stateCalibrate = false;
|
bool _stateCalibrate = false;
|
||||||
unsigned long _prMillis;
|
unsigned long _prMillis = 0;
|
||||||
float _ro;
|
float _ro = 1.0f;
|
||||||
uint8_t _pin;
|
uint8_t _pin;
|
||||||
uint8_t _pinHeater;
|
uint8_t _pinHeater;
|
||||||
float readRs();
|
float readRs() const;
|
||||||
float calculateResistance(int rawAdc);
|
float calculateResistance(int rawAdc) const;
|
||||||
virtual float getRoInCleanAir() const = 0;
|
|
||||||
virtual int getRL() const = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
13
MQ2.cpp
13
MQ2.cpp
@ -9,22 +9,17 @@ MQ2::MQ2(uint8_t pin, uint8_t pinHeater)
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned long MQ2::readLPG() {
|
unsigned long MQ2::readLPG() {
|
||||||
return readPpm(-0.45, 2.95);
|
return readScaled(-0.45, 2.95);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long MQ2::readMethane() {
|
unsigned long MQ2::readMethane() {
|
||||||
return readPpm(-0.38, 3.21);
|
return readScaled(-0.38, 3.21);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long MQ2::readSmoke() {
|
unsigned long MQ2::readSmoke() {
|
||||||
return readPpm(-0.42, 3.54);
|
return readScaled(-0.42, 3.54);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long MQ2::readHydrogen() {
|
unsigned long MQ2::readHydrogen() {
|
||||||
return readPpm(-0.48, 3.32);
|
return readScaled(-0.48, 3.32);
|
||||||
}
|
|
||||||
|
|
||||||
int MQ2::readPpm(float a, float b) {
|
|
||||||
float ratio = readRs()/_ro;
|
|
||||||
return pow(M_E, (log(ratio)-b)/a);
|
|
||||||
}
|
}
|
||||||
|
3
MQ2.h
3
MQ2.h
@ -12,11 +12,10 @@ public:
|
|||||||
unsigned long readSmoke();
|
unsigned long readSmoke();
|
||||||
unsigned long readHydrogen();
|
unsigned long readHydrogen();
|
||||||
private:
|
private:
|
||||||
int readPpm(float a, float b);
|
|
||||||
// Резистор установленный на плату (кОм)
|
// Резистор установленный на плату (кОм)
|
||||||
virtual int getRL() const { return 5; }
|
virtual int getRL() const { return 5; }
|
||||||
// коефициент чистого воздуха
|
// коефициент чистого воздуха
|
||||||
virtual float getRoInCleanAir() const { return 9.83; }
|
virtual float getRoInCleanAir() const { return 9.83; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MQ2_H_
|
#endif // MQ2_H_
|
||||||
|
9
MQ3.cpp
9
MQ3.cpp
@ -9,14 +9,9 @@ MQ3::MQ3(uint8_t pin, uint8_t pinHeater)
|
|||||||
}
|
}
|
||||||
|
|
||||||
float MQ3::readAlcoholMgL() {
|
float MQ3::readAlcoholMgL() {
|
||||||
return readMgL(-0.66, -0.62);
|
return readScaled(-0.66, -0.62);
|
||||||
}
|
}
|
||||||
|
|
||||||
float MQ3::readAlcoholPpm() {
|
float MQ3::readAlcoholPpm() {
|
||||||
return readMgL(-0.66, -0.62)*2.2;
|
return readScaled(-0.66, -0.62)*2.2;
|
||||||
}
|
|
||||||
|
|
||||||
float MQ3::readMgL(float a, float b) {
|
|
||||||
float ratio = readRs()/_ro;
|
|
||||||
return pow(M_E, (log(ratio)-b)/a);
|
|
||||||
}
|
}
|
||||||
|
3
MQ3.h
3
MQ3.h
@ -10,11 +10,10 @@ public:
|
|||||||
float readAlcoholMgL();
|
float readAlcoholMgL();
|
||||||
float readAlcoholPpm();
|
float readAlcoholPpm();
|
||||||
private:
|
private:
|
||||||
float readMgL(float a, float b);
|
|
||||||
// Резистор установленный на плату (кОм)
|
// Резистор установленный на плату (кОм)
|
||||||
virtual int getRL() const { return 200; }
|
virtual int getRL() const { return 200; }
|
||||||
// коефициент чистого воздуха
|
// коефициент чистого воздуха
|
||||||
virtual float getRoInCleanAir() const { return 60; }
|
virtual float getRoInCleanAir() const { return 60; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MQ3_H_
|
#endif // MQ3_H_
|
||||||
|
7
MQ4.cpp
7
MQ4.cpp
@ -9,10 +9,5 @@ MQ4::MQ4(uint8_t pin, uint8_t pinHeater)
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned long MQ4::readMethane() {
|
unsigned long MQ4::readMethane() {
|
||||||
return readPpm(-0.36, 2.54);
|
return readScaled(-0.36, 2.54);
|
||||||
}
|
|
||||||
|
|
||||||
int MQ4::readPpm(float a, float b) {
|
|
||||||
float ratio = readRs()/_ro;
|
|
||||||
return pow(M_E, (log(ratio)-b)/a);
|
|
||||||
}
|
}
|
||||||
|
3
MQ4.h
3
MQ4.h
@ -9,11 +9,10 @@ public:
|
|||||||
MQ4(uint8_t pin, uint8_t pinHeater);
|
MQ4(uint8_t pin, uint8_t pinHeater);
|
||||||
unsigned long readMethane();
|
unsigned long readMethane();
|
||||||
private:
|
private:
|
||||||
int readPpm(float a, float b);
|
|
||||||
// Резистор установленный на плату (кОм)
|
// Резистор установленный на плату (кОм)
|
||||||
virtual int getRL() const { return 20; }
|
virtual int getRL() const { return 20; }
|
||||||
// коефициент чистого воздуха
|
// коефициент чистого воздуха
|
||||||
virtual float getRoInCleanAir() const { return 4.4; }
|
virtual float getRoInCleanAir() const { return 4.4; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MQ4_H_
|
#endif // MQ4_H_
|
||||||
|
9
MQ5.cpp
9
MQ5.cpp
@ -9,14 +9,9 @@ MQ5::MQ5(uint8_t pin, uint8_t pinHeater)
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned long MQ5::readLPG() {
|
unsigned long MQ5::readLPG() {
|
||||||
return readPpm(-0.39, 1.73);
|
return readScaled(-0.39, 1.73);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long MQ5::readMethane() {
|
unsigned long MQ5::readMethane() {
|
||||||
return readPpm(-0.38, 1.97);
|
return readScaled(-0.38, 1.97);
|
||||||
}
|
|
||||||
|
|
||||||
int MQ5::readPpm(float a, float b) {
|
|
||||||
float ratio = readRs()/_ro;
|
|
||||||
return pow(M_E, (log(ratio)-b)/a);
|
|
||||||
}
|
}
|
||||||
|
3
MQ5.h
3
MQ5.h
@ -10,11 +10,10 @@ public:
|
|||||||
unsigned long readLPG();
|
unsigned long readLPG();
|
||||||
unsigned long readMethane();
|
unsigned long readMethane();
|
||||||
private:
|
private:
|
||||||
int readPpm(float a, float b);
|
|
||||||
// Резистор установленный на плату (кОм)
|
// Резистор установленный на плату (кОм)
|
||||||
virtual int getRL() const { return 20; }
|
virtual int getRL() const { return 20; }
|
||||||
// коефициент чистого воздуха
|
// коефициент чистого воздуха
|
||||||
virtual float getRoInCleanAir() const { return 6.5; }
|
virtual float getRoInCleanAir() const { return 6.5; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MQ5_H_
|
#endif // MQ5_H_
|
||||||
|
7
MQ6.cpp
7
MQ6.cpp
@ -9,10 +9,5 @@ MQ6::MQ6(uint8_t pin, uint8_t pinHeater)
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned long MQ6::readLPG() {
|
unsigned long MQ6::readLPG() {
|
||||||
return readPpm(-0.42, 2.91);
|
return readScaled(-0.42, 2.91);
|
||||||
}
|
|
||||||
|
|
||||||
int MQ6::readPpm(float a, float b) {
|
|
||||||
float ratio = readRs()/_ro;
|
|
||||||
return pow(M_E, (log(ratio)-b)/a);
|
|
||||||
}
|
}
|
||||||
|
3
MQ6.h
3
MQ6.h
@ -9,11 +9,10 @@ public:
|
|||||||
MQ6(uint8_t pin, uint8_t pinHeater);
|
MQ6(uint8_t pin, uint8_t pinHeater);
|
||||||
unsigned long readLPG();
|
unsigned long readLPG();
|
||||||
private:
|
private:
|
||||||
int readPpm(float a, float b);
|
|
||||||
// Резистор установленный на плату (кОм)
|
// Резистор установленный на плату (кОм)
|
||||||
virtual int getRL() const { return 20; }
|
virtual int getRL() const { return 20; }
|
||||||
// коефициент чистого воздуха
|
// коефициент чистого воздуха
|
||||||
virtual float getRoInCleanAir() const { return 10; }
|
virtual float getRoInCleanAir() const { return 10; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MQ6_H_
|
#endif // MQ6_H_
|
||||||
|
7
MQ7.cpp
7
MQ7.cpp
@ -9,10 +9,5 @@ MQ7::MQ7(uint8_t pin, uint8_t pinHeater)
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned long MQ7::readCarbonMonoxide() {
|
unsigned long MQ7::readCarbonMonoxide() {
|
||||||
return readPpm(-0.77, 3.38);
|
return readScaled(-0.77, 3.38);
|
||||||
}
|
|
||||||
|
|
||||||
int MQ7::readPpm(float a, float b) {
|
|
||||||
float ratio = readRs()/_ro;
|
|
||||||
return pow(M_E, (log(ratio)-b)/a);
|
|
||||||
}
|
}
|
||||||
|
3
MQ7.h
3
MQ7.h
@ -9,11 +9,10 @@ public:
|
|||||||
MQ7(uint8_t pin, uint8_t pinHeater);
|
MQ7(uint8_t pin, uint8_t pinHeater);
|
||||||
unsigned long readCarbonMonoxide();
|
unsigned long readCarbonMonoxide();
|
||||||
private:
|
private:
|
||||||
int readPpm(float a, float b);
|
|
||||||
// Резистор установленный на плату (кОм)
|
// Резистор установленный на плату (кОм)
|
||||||
virtual int getRL() const { return 10; }
|
virtual int getRL() const { return 10; }
|
||||||
// коефициент чистого воздуха
|
// коефициент чистого воздуха
|
||||||
virtual float getRoInCleanAir() const { return 27; }
|
virtual float getRoInCleanAir() const { return 27; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MQ7_H_
|
#endif // MQ7_H_
|
||||||
|
7
MQ8.cpp
7
MQ8.cpp
@ -9,10 +9,5 @@ MQ8::MQ8(uint8_t pin, uint8_t pinHeater)
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned long MQ8::readHydrogen() {
|
unsigned long MQ8::readHydrogen() {
|
||||||
return readPpm(-1.52, 10.49);
|
return readScaled(-1.52, 10.49);
|
||||||
}
|
|
||||||
|
|
||||||
int MQ8::readPpm(float a, float b) {
|
|
||||||
float ratio = readRs()/_ro;
|
|
||||||
return pow(M_E, (log(ratio)-b)/a);
|
|
||||||
}
|
}
|
||||||
|
3
MQ8.h
3
MQ8.h
@ -9,11 +9,10 @@ public:
|
|||||||
MQ8(uint8_t pin, uint8_t pinHeater);
|
MQ8(uint8_t pin, uint8_t pinHeater);
|
||||||
unsigned long readHydrogen();
|
unsigned long readHydrogen();
|
||||||
private:
|
private:
|
||||||
int readPpm(float a, float b);
|
|
||||||
// Резистор установленный на плату (кОм)
|
// Резистор установленный на плату (кОм)
|
||||||
virtual int getRL() const { return 10; }
|
virtual int getRL() const { return 10; }
|
||||||
// коефициент чистого воздуха
|
// коефициент чистого воздуха
|
||||||
virtual float getRoInCleanAir() const { return 70; }
|
virtual float getRoInCleanAir() const { return 70; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MQ8_H_
|
#endif // MQ8_H_
|
||||||
|
11
MQ9.cpp
11
MQ9.cpp
@ -9,18 +9,13 @@ MQ9::MQ9(uint8_t pin, uint8_t pinHeater)
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned long MQ9::readLPG() {
|
unsigned long MQ9::readLPG() {
|
||||||
return readPpm(-0.48, 3.33);
|
return readScaled(-0.48, 3.33);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long MQ9::readMethane() {
|
unsigned long MQ9::readMethane() {
|
||||||
return readPpm(-0.38, 3.21);
|
return readScaled(-0.38, 3.21);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long MQ9::readCarbonMonoxide() {
|
unsigned long MQ9::readCarbonMonoxide() {
|
||||||
return readPpm(-0.48, 3.10);
|
return readScaled(-0.48, 3.10);
|
||||||
}
|
|
||||||
|
|
||||||
int MQ9::readPpm(float a, float b) {
|
|
||||||
float ratio = readRs()/_ro;
|
|
||||||
return pow(M_E, (log(ratio)-b)/a);
|
|
||||||
}
|
}
|
||||||
|
3
MQ9.h
3
MQ9.h
@ -11,11 +11,10 @@ public:
|
|||||||
unsigned long readMethane();
|
unsigned long readMethane();
|
||||||
unsigned long readCarbonMonoxide();
|
unsigned long readCarbonMonoxide();
|
||||||
private:
|
private:
|
||||||
int readPpm(float a, float b);
|
|
||||||
// Резистор установленный на плату (кОм)
|
// Резистор установленный на плату (кОм)
|
||||||
virtual int getRL() const { return 10; }
|
virtual int getRL() const { return 10; }
|
||||||
// коефициент чистого воздуха
|
// коефициент чистого воздуха
|
||||||
virtual float getRoInCleanAir() const { return 9.8; }
|
virtual float getRoInCleanAir() const { return 9.8; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MQ9_H_
|
#endif // MQ9_H_
|
||||||
|
Loading…
x
Reference in New Issue
Block a user