update library

This commit is contained in:
Igor
2018-01-19 21:37:03 +03:00
parent 61dc0f9349
commit 4c7567255b
51 changed files with 690 additions and 392 deletions

122
src/BaseMQ.cpp Normal file
View File

@@ -0,0 +1,122 @@
/****************************************************************************/
// Function: cpp file for BaseMQ
// Hardware: MQ2, MQ3, MQ4, MQ5, MQ6, MQ7, MQ8, MQ9, MQ135
// Arduino IDE: Arduino 1.8.3
// Author: Igor Dementiev
// Date: Jan 19, 2018
// Version: v1.1
// by www.amperka.ru
/****************************************************************************/
#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 rs = readRs();
float ro = rs / getRoInCleanAir();
calibrate(ro);
}
// включение нагревателя на 100%
void BaseMQ::heaterPwrHigh() {
digitalWrite(_pinHeater, HIGH);
_heater = true;
_prMillis = millis();
}
// включение нагревателья на 20%
void BaseMQ::heaterPwrLow() {
analogWrite(_pinHeater, 75);
_heater = true;
_cooler = true;
_prMillis = millis();
}
// выключение нагревателя
void BaseMQ::heaterPwrOff() {
digitalWrite(_pinHeater, LOW);
_heater = false;
}
// циклическое считывание сопративления датчика
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;
}
// сопротивление датчика
float BaseMQ::calculateResistance(int sensorADC) const {
float sensorVoltage = sensorADC * (OPERATING_VOLTAGE / ADC_VALUE_MAX);
float sensorResistance = (OPERATING_VOLTAGE - sensorVoltage) / sensorVoltage * getRL();
return sensorResistance;
}
float 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 > MQ_HEATING_TIME)) {
return true;
} else {
return false;
}
}
bool BaseMQ::coolanceCompleted() const {
if ((_heater) && (_cooler) && (millis() - _prMillis > MQ_COOLANCE_TIME)) {
return true;
} else {
return false;
}
}
void BaseMQ::cycleHeat() {
_heater = false;
_cooler = false;
heaterPwrHigh();
// Serial.println("Heated sensor");
}
bool BaseMQ::atHeatCycleEnd() {
if (heatingCompleted()) {
heaterPwrLow();
// Serial.println("Cool sensor");
return false;
} else if (coolanceCompleted()) {
heaterPwrOff();
return true;
} else {
return false;
}
}

72
src/BaseMQ.h Normal file
View File

@@ -0,0 +1,72 @@
/****************************************************************************/
// Function: Header file for BaseMQ
// Hardware: MQ2, MQ3, MQ4, MQ5, MQ6, MQ7, MQ8, MQ9, MQ135
// Arduino IDE: Arduino 1.8.3
// Author: Igor Dementiev
// Date: Jan 19, 2018
// Version: v1.1
// by www.amperka.ru
/****************************************************************************/
#ifndef BaseMQ_H
#define BaseMQ_H
#include <Arduino.h>
// кол-во считываний значений в цикле
#define MQ_SAMPLE_TIMES 5
// задержка после каждого считывания датчика
#define MQ_SAMPLE_INTERVAL 20
// время нагрева датчика
#define MQ_HEATING_TIME 6000
// время охлаждение датчика
#define MQ_COOLANCE_TIME 9000
// разрядность АЦП
#define ADC_BIT 10
// масимальное значение АЦП
#define ADC_VALUE_MAX pow(2, ADC_BIT)
#if defined(__AVR__)
#define OPERATING_VOLTAGE 5.0
#elif defined(__SAM3X8E__) || defined(__SAM3A8C__) || defined(__SAM3A4C__) || defined(__SAMD21G18A__)
#define OPERATING_VOLTAGE 3.3
#endif
class BaseMQ {
public:
BaseMQ(uint8_t pin);
BaseMQ(uint8_t pin, uint8_t pinHeater);
void calibrate();
void calibrate(float ro);
void heaterPwrHigh();
void heaterPwrLow();
void heaterPwrOff();
void cycleHeat();
bool atHeatCycleEnd();
bool heatingCompleted() const;
bool coolanceCompleted() const;
float readRatio() const;
inline bool isCalibrated() const {
return _stateCalibrate;
};
inline float getRo() const {
return _ro;
};
protected:
float readScaled(float a, float b) const;
virtual float getRoInCleanAir() const = 0;
virtual int getRL() const = 0;
private:
bool _heater = false;
bool _cooler = false;
bool _stateCalibrate = false;
unsigned long _prMillis = 0;
float _ro = 1.0f;
uint8_t _pin;
uint8_t _pinHeater;
float readRs() const;
float calculateResistance(int sensorADC) const;
};
#endif

13
src/MQ135.cpp Normal file
View File

@@ -0,0 +1,13 @@
#include "MQ135.h"
MQ135::MQ135(uint8_t pin)
: BaseMQ(pin) {
}
MQ135::MQ135(uint8_t pin, uint8_t pinHeater)
: BaseMQ(pin, pinHeater) {
}
unsigned long MQ135::readCO2() {
return readScaled(-0.42 , 1.92);
}

26
src/MQ135.h Normal file
View File

@@ -0,0 +1,26 @@
#ifndef MQ135_H_
#define MQ135_H_
#include "BaseMQ.h"
// резистор установленный на плату (кОм)
#define MQ135_RL_BOARD 10
// концентрация углекислого газа в сухом воздухе
#define PPM_CO2_IN_CLEAR_AIR 397.13
class MQ135 : public BaseMQ {
public:
MQ135(uint8_t pin);
MQ135(uint8_t pin, uint8_t pinHeater);
unsigned long readCO2();
private:
virtual int getRL() const {
return MQ135_RL_BOARD;
}
virtual float getRoInCleanAir() const {
return exp((log(PPM_CO2_IN_CLEAR_AIR) * -0.42) + 1.92);
}
};
#endif // MQ135_H_

25
src/MQ2.cpp Normal file
View File

@@ -0,0 +1,25 @@
#include "MQ2.h"
MQ2::MQ2(uint8_t pin)
: BaseMQ(pin) {
}
MQ2::MQ2(uint8_t pin, uint8_t pinHeater)
: BaseMQ(pin, pinHeater) {
}
unsigned long MQ2::readLPG() {
return readScaled(-0.45, 2.95);
}
unsigned long MQ2::readMethane() {
return readScaled(-0.38, 3.21);
}
unsigned long MQ2::readSmoke() {
return readScaled(-0.42, 3.54);
}
unsigned long MQ2::readHydrogen() {
return readScaled(-0.48, 3.32);
}

24
src/MQ2.h Normal file
View File

@@ -0,0 +1,24 @@
#ifndef MQ2_H_
#define MQ2_H_
#include "BaseMQ.h"
// резистор установленный на плату (кОм)
#define MQ2_RL_BOARD 5
// коефициент чистого воздуха из графика
#define MQ2_RO_IN_CLEAR_AIR 9.83
class MQ2 : public BaseMQ {
public:
MQ2(uint8_t pin);
MQ2(uint8_t pin, uint8_t pinHeater);
unsigned long readLPG();
unsigned long readMethane();
unsigned long readSmoke();
unsigned long readHydrogen();
private:
virtual int getRL() const { return MQ2_RL_BOARD; }
virtual float getRoInCleanAir() const { return MQ2_RO_IN_CLEAR_AIR; }
};
#endif // MQ2_H_

17
src/MQ3.cpp Normal file
View File

@@ -0,0 +1,17 @@
#include "MQ3.h"
MQ3::MQ3(uint8_t pin)
: BaseMQ(pin) {
}
MQ3::MQ3(uint8_t pin, uint8_t pinHeater)
: BaseMQ(pin, pinHeater) {
}
float MQ3::readAlcoholMgL() {
return readScaled(-0.66, -0.62);
}
float MQ3::readAlcoholPpm() {
return readScaled(-0.66, -0.62) * 2.2;
}

22
src/MQ3.h Normal file
View File

@@ -0,0 +1,22 @@
#ifndef MQ3_H_
#define MQ3_H_
#include "BaseMQ.h"
// резистор установленный на плату (кОм)
#define MQ3_RL_BOARD 200
// коефициент чистого воздуха из графика
#define MQ3_RO_IN_CLEAR_AIR 60
class MQ3 : public BaseMQ {
public:
MQ3(uint8_t pin);
MQ3(uint8_t pin, uint8_t pinHeater);
float readAlcoholMgL();
float readAlcoholPpm();
private:
virtual int getRL() const { return MQ3_RL_BOARD; }
virtual float getRoInCleanAir() const { return MQ3_RO_IN_CLEAR_AIR; }
};
#endif // MQ3_H_

13
src/MQ4.cpp Normal file
View File

@@ -0,0 +1,13 @@
#include "MQ4.h"
MQ4::MQ4(uint8_t pin)
: BaseMQ(pin) {
}
MQ4::MQ4(uint8_t pin, uint8_t pinHeater)
: BaseMQ(pin, pinHeater) {
}
unsigned long MQ4::readMethane() {
return readScaled(-0.36, 2.54);
}

21
src/MQ4.h Normal file
View File

@@ -0,0 +1,21 @@
#ifndef MQ4_H_
#define MQ4_H_
#include "BaseMQ.h"
// резистор установленный на плату (кОм)
#define MQ4_RL_BOARD 20
// коефициент чистого воздуха из графика
#define MQ4_RO_IN_CLEAR_AIR 4.4
class MQ4 : public BaseMQ {
public:
MQ4(uint8_t pin);
MQ4(uint8_t pin, uint8_t pinHeater);
unsigned long readMethane();
private:
virtual int getRL() const { return MQ4_RL_BOARD ; }
virtual float getRoInCleanAir() const { return MQ4_RO_IN_CLEAR_AIR; }
};
#endif // MQ4_H_

17
src/MQ5.cpp Normal file
View File

@@ -0,0 +1,17 @@
#include "MQ5.h"
MQ5::MQ5(uint8_t pin)
: BaseMQ(pin) {
}
MQ5::MQ5(uint8_t pin, uint8_t pinHeater)
: BaseMQ(pin, pinHeater) {
}
unsigned long MQ5::readLPG() {
return readScaled(-0.39, 1.73);
}
unsigned long MQ5::readMethane() {
return readScaled(-0.38, 1.97);
}

22
src/MQ5.h Normal file
View File

@@ -0,0 +1,22 @@
#ifndef MQ5_H_
#define MQ5_H_
#include "BaseMQ.h"
// резистор установленный на плату (кОм)
#define MQ5_RL_BOARD 20
// коефициент чистого воздуха из графика
#define MQ5_RO_IN_CLEAR_AIR 6.5
class MQ5 : public BaseMQ {
public:
MQ5(uint8_t pin);
MQ5(uint8_t pin, uint8_t pinHeater);
unsigned long readLPG();
unsigned long readMethane();
private:
virtual int getRL() const { return MQ5_RL_BOARD; }
virtual float getRoInCleanAir() const { return MQ5_RO_IN_CLEAR_AIR; }
};
#endif // MQ5_H_

13
src/MQ6.cpp Normal file
View File

@@ -0,0 +1,13 @@
#include "MQ6.h"
MQ6::MQ6(uint8_t pin)
: BaseMQ(pin) {
}
MQ6::MQ6(uint8_t pin, uint8_t pinHeater)
: BaseMQ(pin, pinHeater) {
}
unsigned long MQ6::readLPG() {
return readScaled(-0.42, 2.91);
}

21
src/MQ6.h Normal file
View File

@@ -0,0 +1,21 @@
#ifndef MQ6_H_
#define MQ6_H_
#include "BaseMQ.h"
// резистор установленный на плату (кОм)
#define MQ6_RL_BOARD 20
// коефициент чистого воздуха из графика
#define MQ6_RO_IN_CLEAR_AIR 10
class MQ6 : public BaseMQ {
public:
MQ6(uint8_t pin);
MQ6(uint8_t pin, uint8_t pinHeater);
unsigned long readLPG();
private:
virtual int getRL() const { return MQ6_RL_BOARD ; }
virtual float getRoInCleanAir() const { return MQ6_RO_IN_CLEAR_AIR; }
};
#endif // MQ6_H_

13
src/MQ7.cpp Normal file
View File

@@ -0,0 +1,13 @@
#include "MQ7.h"
MQ7::MQ7(uint8_t pin)
: BaseMQ(pin) {
}
MQ7::MQ7(uint8_t pin, uint8_t pinHeater)
: BaseMQ(pin, pinHeater) {
}
unsigned long MQ7::readCarbonMonoxide() {
return readScaled(-0.77, 3.38);
}

21
src/MQ7.h Normal file
View File

@@ -0,0 +1,21 @@
#ifndef MQ7_H_
#define MQ7_H_
#include "BaseMQ.h"
// резистор установленный на плату (кОм)
#define MQ7_RL_BOARD 10
// коефициент чистого воздуха из графика
#define MQ7_RO_IN_CLEAR_AIR 27
class MQ7 : public BaseMQ {
public:
MQ7(uint8_t pin);
MQ7(uint8_t pin, uint8_t pinHeater);
unsigned long readCarbonMonoxide();
private:
virtual int getRL() const { return MQ7_RL_BOARD; }
virtual float getRoInCleanAir() const { return MQ7_RO_IN_CLEAR_AIR; }
};
#endif // MQ7_H_

13
src/MQ8.cpp Normal file
View File

@@ -0,0 +1,13 @@
#include "MQ8.h"
MQ8::MQ8(uint8_t pin)
: BaseMQ(pin) {
}
MQ8::MQ8(uint8_t pin, uint8_t pinHeater)
: BaseMQ(pin, pinHeater) {
}
unsigned long MQ8::readHydrogen() {
return readScaled(-1.52, 10.49);
}

21
src/MQ8.h Normal file
View File

@@ -0,0 +1,21 @@
#ifndef MQ8_H_
#define MQ8_H_
#include "BaseMQ.h"
// резистор установленный на плату (кОм)
#define MQ8_RL_BOARD 10
// коефициент чистого воздуха из графика
#define MQ8_RO_IN_CLEAR_AIR 27
class MQ8 : public BaseMQ {
public:
MQ8(uint8_t pin);
MQ8(uint8_t pin, uint8_t pinHeater);
unsigned long readHydrogen();
private:
virtual int getRL() const { return MQ8_RL_BOARD; }
virtual float getRoInCleanAir() const { return MQ8_RO_IN_CLEAR_AIR ; }
};
#endif // MQ8_H_

21
src/MQ9.cpp Normal file
View File

@@ -0,0 +1,21 @@
#include "MQ9.h"
MQ9::MQ9(uint8_t pin)
: BaseMQ(pin) {
}
MQ9::MQ9(uint8_t pin, uint8_t pinHeater)
: BaseMQ(pin, pinHeater) {
}
unsigned long MQ9::readLPG() {
return readScaled(-0.48, 3.33);
}
unsigned long MQ9::readMethane() {
return readScaled(-0.38, 3.21);
}
unsigned long MQ9::readCarbonMonoxide() {
return readScaled(-0.48, 3.10);
}

25
src/MQ9.h Normal file
View File

@@ -0,0 +1,25 @@
#ifndef MQ9_H_
#define MQ9_H_
#include "BaseMQ.h"
// резистор установленный на плату (кОм)
#define MQ9_RL_BOARD 10
// коефициент чистого воздуха из графика
#define MQ9_RO_IN_CLEAR_AIR 9.8
class MQ9 : public BaseMQ {
public:
MQ9(uint8_t pin);
MQ9(uint8_t pin, uint8_t pinHeater);
unsigned long readLPG();
unsigned long readMethane();
unsigned long readCarbonMonoxide();
private:
// Резистор установленный на плату (кОм)
virtual int getRL() const { return MQ9_RL_BOARD; }
// коефициент чистого воздуха
virtual float getRoInCleanAir() const { return MQ9_RO_IN_CLEAR_AIR; }
};
#endif // MQ9_H_

23
src/TroykaMQ.h Normal file
View File

@@ -0,0 +1,23 @@
/****************************************************************************/
// Function: Header file for TroykaMQ
// Hardware: MQ2, MQ3, MQ4, MQ5, MQ6, MQ7, MQ8, MQ9, MQ135
// Arduino IDE: Arduino 1.8.3
// Author: Igor Dementiev
// Date: Jan 19, 2018
// Version: v1.1
// by www.amperka.ru
/****************************************************************************/
#ifndef TROYKAMQ_H_
#define TROYKAMQ_H_
#include "MQ2.h"
#include "MQ3.h"
#include "MQ4.h"
#include "MQ5.h"
#include "MQ6.h"
#include "MQ7.h"
#include "MQ8.h"
#include "MQ9.h"
#include "MQ135.h"
#endif // TROYKAMQ_H_