Библиотека тройка для датчиков mq

Ответить
DanilaWERT
Сержант
Сообщения: 147
Зарегистрирован: 01.12.2018{, 14:20}
Репутация: 1
Имя: danila

Библиотека тройка для датчиков mq

#1

Сообщение DanilaWERT » 27.03.2021{, 20:54}

Помогите оптимизировать библиотеку для работы с датчиками серии MQ.Я в нее добавил уже строку в BaseMQ.h
#if defined(ARDUINO_ARCH_ESP32)
#define ADC_BIT 12
До этого показания были не правильные.
Выяснилось,что ESP32 с циклом нагревателя для датчиков MQ-7 и MQ-9 не работает.Nano,NodeMCU работают,все норм.А в ESP32 нагрев идет на полную постоянно.По идее должен циклически.Нагрев-охлаждение-считывание данных-нагрев....
Там есть строка
#if defined(ARDUINO_ARCH_ESP32)
#define analogWrite ledcWrite
Я так понимаю это как раз для управления ШИМ...но все равно не работает.
Помогите допилить.
BaseMQ.hПоказать
/ 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
// разрядность АЦП
#if defined(ARDUINO_ARCH_ESP32)
#define ADC_BIT 12

#else
#define ADC_BIT 10
#endif
// масимальное значение АЦП
#define ADC_VALUE_MAX pow(2, ADC_BIT)

#if defined(ARDUINO_ARCH_ESP32)
#define analogWrite ledcWrite

#endif

#if defined(__AVR__)
#define OPERATING_VOLTAGE 5.0

#else
#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 float 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
BaseMQ.cppПоказать
/****************************************************************************/
// 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;
}
}
Вложения
BaseMQ.cpp
(3.08 КБ) 42 скачивания
BaseMQ.h
(2.09 КБ) 45 скачиваний

DanilaWERT
Сержант
Сообщения: 147
Зарегистрирован: 01.12.2018{, 14:20}
Репутация: 1
Имя: danila

Библиотека тройка для датчиков mq

#2

Сообщение DanilaWERT » 28.03.2021{, 00:31}

Сделал вот так,но не работает.
void BaseMQ::heaterPwrLow() {
if (ARDUINO_ARCH_ESP32){
ledcSetup(15, 1000, 8);
ledcAttachPin(_pinHeater, 75);
ledcWrite(15, 20);
_heater = true;
_cooler = true;
_prMillis = millis();
}else {
analogWrite(_pinHeater, 75);
_heater = true;
_cooler = true;
_prMillis = millis();
}
}
В ЕСП32 грузит,а в нано теперь не хочет.Что я не так сделал?
error: 'ARDUINO_ARCH_ESP32' was not declared in this scope
if (ARDUINO_ARCH_ESP32){

DanilaWERT
Сержант
Сообщения: 147
Зарегистрирован: 01.12.2018{, 14:20}
Репутация: 1
Имя: danila

Библиотека тройка для датчиков mq

#3

Сообщение DanilaWERT » 28.03.2021{, 01:10}

Сам справился :D Незнаю насколько правильно сделал,но работает..
void BaseMQ::heaterPwrLow() {
#if defined(ARDUINO_ARCH_ESP32)
ledcSetup(15, 1000, 8);
ledcAttachPin(_pinHeater, 15);
ledcWrite(15, 20);
_heater = true;
_cooler = true;
_prMillis = millis();

#else
analogWrite(_pinHeater, 20);
_heater = true;
_cooler = true;
_prMillis = millis();
#endif
}

Eugene01
Рядовой
Сообщения: 5
Зарегистрирован: 28.03.2021{, 16:24}
Репутация: 0
Имя: Евгений

Библиотека тройка для датчиков mq

#4

Сообщение Eugene01 » 05.01.2022{, 17:07}

Добрый день.
А есть блок для для нано на датчике MQ?

Ответить

Вернуться в «С++ в Ардуино»