Помогите оптимизировать библиотеку для работы с датчиками серии 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; } }
Сделал вот так,теперь в 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){
Сам справился Незнаю насколько правильно сделал,но работает.. Код (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 }