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

Тема в разделе "ESP8266, ESP32", создана пользователем Dany11, 27 мар 2021.

  1. Dany11

    Dany11 Нерд

    Помогите оптимизировать библиотеку для работы с датчиками серии 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
    Я так понимаю это как раз для управления ШИМ...но все равно не работает.
    Помогите допилить.
    /****************************************************************************/
    // 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


    /****************************************************************************/
    // 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.h
      Размер файла:
      2,1 КБ
      Просмотров:
      158
    • BaseMQ.cpp
      Размер файла:
      3,1 КБ
      Просмотров:
      147
  2. Dany11

    Dany11 Нерд

    Сделал вот так,теперь в ESP32 работает,а в НАНО не грузит..
    Код (C++):
    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){
     
    Последнее редактирование: 28 мар 2021
  3. Dany11

    Dany11 Нерд

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

    #else
    analogWrite(_pinHeater, 75);
    _heater = true;
    _cooler = true;
    _prMillis = millis();
    #endif
    }
     
    Последнее редактирование: 28 мар 2021
  4. NikitOS

    NikitOS Король шутов Администратор

    Это, конечно, хорошо, но код по правилам все же вставьте.