Kalibrace senzoru MQ135

Bojkas
Příspěvky: 15
Registrován: 12 črc 2018, 12:41
Reputation: 0

Kalibrace senzoru MQ135

Příspěvek od Bojkas » 11 bře 2019, 13:30

Ahoj,

už několik dní se pokouším zkalibrovat senzor MQ-135, ale pořád to propisuje nesmyslné hodnoty. Dle doporučení jsem nechal senzor na 24h "zahořet", dal jej ven a po hodině jsem vyčetl hodnotu RZERO, kterou jsem vepsal do souboru mq135.h a nahrál do arduina. Teď mi zobrazuje správnou hodnotu (cca 400ppm) venku, ale když jej nechám měřit doma, tak to propisuje hodnoty až 50000ppm, tedy smrtelné prostředí. :D

Posílám to přes po WIFI přes MQTT do Home Assistant. Teplotu a vlhkost to propisuje správně, ale nemůžu prostě docílit toho vzduchu. Potřebuji to funkční, abych mohl spouštět rekuperaci na základě kvality vzduchu.

Poradíte laikovi?

Děkuji

Arduino

Kód: Vybrat vše

//WiFi
#include <ESP8266WiFi.h>
const char* ssid = "xxxxx";
const char* password = "xxxxx";
WiFiClient espClient;

//MQTT
#include <PubSubClient.h>
#define mqtt_server "xxxxx"
#define mqtt_clientId "xxxxx"
#define mqtt_user "xx"
#define mqtt_password "xx"

PubSubClient client(espClient);

// MQTT Topics
#define humidity_topic "sensor/humidity_loz"
#define temperature_topic "sensor/temperature_loz"
#define co2_topic "sensor/co2_loz"


//DHT
#include <DHT.h>
#include <DHT_U.h>
#define DHTTYPE DHT22 // Тип датчика
#define DHTPIN 4 //К какому пину подключен датчик DHT
DHT dht (DHTPIN, DHTTYPE);

//MQ135
#include <MQ135.h>
MQ135 gasSensor = MQ135 (A0); //Датчик газа подключен к аналоговому пину

//BH1750
#include <Wire.h>

#define I2C_SDA_PIN   (4)      // D2  pin (SDA / GPIO-4)
#define I2C_SCL_PIN   (5)      // D1  pin (SCL / GPIO-5)


//Timer
#include <TimeLib.h>
#include <SimpleTimer.h>
SimpleTimer timer;

unsigned long lastSampleTime = 0;
const long sampleDelay = 30000;

void setup() {
  Serial.begin(115200);
  dht.begin();
  Wire.begin( I2C_SDA_PIN, I2C_SCL_PIN );
  setupWifi();
  client.setServer(mqtt_server, 14331);
  timer.setInterval(5000L,sendTemps);

}

void sendTemps (){

float h = dht.readHumidity(); 
float t = dht.readTemperature(); 

 if (isnan(h) || isnan(t)){
     return;
     }

float rzero = gasSensor.getRZero();
float ppm = gasSensor.getPPM();
float rzeroc = gasSensor.getCorrectedRZero(t, h);
float ppmc = gasSensor.getCorrectedPPM(t, h);


Serial.print("Humidity: ");
  Serial.println(h);
  Serial.print("Temperature: ");
  Serial.println(t);
  Serial.print("A0: ");
  Serial.println(analogRead (A0));
  Serial.print("Rzero: ");
  Serial.println(rzero);
  Serial.print("Rzeroc: ");
  Serial.println(rzeroc);
  Serial.print("PPM: ");
  Serial.println(ppm);
  Serial.print("PPMC: ");
  Serial.println(ppmc);

}
void setupWifi() {
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(mqtt_clientId, mqtt_user, mqtt_password)) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  unsigned long currentMillis = millis();
  float h = dht.readHumidity(); 
  float t = dht.readTemperature(); 

 if (isnan(h) || isnan(t)){
     return;
     }

  float rzero = gasSensor.getRZero();
  float ppm = gasSensor.getPPM();
  float rzeroc = gasSensor.getCorrectedRZero(t, h);
  float ppmc = gasSensor.getCorrectedPPM(t, h);
  
  if (currentMillis - lastSampleTime >= sampleDelay) {
    lastSampleTime = currentMillis;

    if (isnan(t)) {
      Serial.println("Error reading temperature!");
    }
    else {
      
      client.publish(temperature_topic, String(t).c_str(), true);

      Serial.print("Temperature: ");
      Serial.print(t);
      Serial.println(" *C");
    }
    // Get humidity event and print its value.
    if (isnan(h)) {
      Serial.println("Error reading humidity!");
    }
    else {
      
      client.publish(humidity_topic, String(h).c_str(), true);

      Serial.print("Humidity: ");
      Serial.print(h);
      Serial.println("%");
    }
    client.publish(co2_topic, String(ppm).c_str(), true);

      Serial.print("CO2: ");
      Serial.print(ppm);
      Serial.println("ppm");
      Serial.print("Light: ");
  }
timer.run();
  }
MQ135.h

Kód: Vybrat vše

/**************************************************************************/
/*!
@file     MQ135.h
@author   G.Krocker (Mad Frog Labs)
@license  GNU GPLv3

First version of an Arduino Library for the MQ135 gas sensor
TODO: Review the correction factor calculation. This currently relies on
the datasheet but the information there seems to be wrong.

@section  HISTORY

v1.0 - First release
*/
/**************************************************************************/
#ifndef MQ135_H
#define MQ135_H
#if ARDUINO >= 100
 #include "Arduino.h"
#else
 #include "WProgram.h"
#endif

/// The load resistance on the board
#define RLOAD 10.0
/// Calibration resistance at atmospheric CO2 level
#define RZERO 263
/// Parameters for calculating ppm of CO2 from sensor resistance
#define PARA 116.6020682
#define PARB 2.769034857

/// Parameters to model temperature and humidity dependence
#define CORA 0.00035
#define CORB 0.02718
#define CORC 1.39538
#define CORD 0.0018

/// Atmospheric CO2 level for calibration purposes
#define ATMOCO2 397.13

class MQ135 {
 private:
  uint8_t _pin;

 public:
  MQ135(uint8_t pin);
  float getCorrectionFactor(float t, float h);
  float getResistance();
  float getCorrectedResistance(float t, float h);
  float getPPM();
  float getCorrectedPPM(float t, float h);
  float getRZero();
  float getCorrectedRZero(float t, float h);
};
#endif

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Kalibrace senzoru MQ135

Příspěvek od pavel1tu » 11 bře 2019, 13:47

Odkud senzor napájíte ?
Pokud z Arduina, je to špatně, musíte bokem - dost žere a Arduino to neutáhne.

Já po přečtení pár for šel raději do BME680.
Rok jsem ho "kalibroval" - nakonec jsem si půjčil NETATMO od známého a protože BME680 vrací "ohmy", udělal si převodní tabulku ohmy/co2. Teď už dobrý.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Bojkas
Příspěvky: 15
Registrován: 12 črc 2018, 12:41
Reputation: 0

Re: Kalibrace senzoru MQ135

Příspěvek od Bojkas » 11 bře 2019, 13:58

Právě že přímo z arduina na 5V, zapojeného přímo do zásuvky přes 1A adaptér. Jedná se o WEMOS D1.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Kalibrace senzoru MQ135

Příspěvek od pavel1tu » 11 bře 2019, 14:51

Ale ve všech návodech upozorňují - nenapájet z Arduina - spotřeba více jak 150mA (ty čínské některé ještě váce)
Vyzkoušet napájet přímo ze zdroje
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Bojkas
Příspěvky: 15
Registrován: 12 črc 2018, 12:41
Reputation: 0

Re: Kalibrace senzoru MQ135

Příspěvek od Bojkas » 11 bře 2019, 14:53

To by mohlo způsobit takový propastný rozdíl??? :shock: Hodně jsem četl i o nastavení odporu, ale to už je mimo moji ligu. Jinak kód se zdá v pořádku?

Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Kalibrace senzoru MQ135

Příspěvek od Axamith » 11 bře 2019, 15:37


Bojkas
Příspěvky: 15
Registrován: 12 črc 2018, 12:41
Reputation: 0

Re: Kalibrace senzoru MQ135

Příspěvek od Bojkas » 11 bře 2019, 15:43

Mohl by být problém, pokud jsem zapojil pouze ten analog?

afilip
Příspěvky: 116
Registrován: 26 črc 2017, 16:34
Reputation: 0
Kontaktovat uživatele:

Re: Kalibrace senzoru MQ135

Příspěvek od afilip » 11 bře 2019, 22:00

ppm čeho to má ukazovat? MQ135 reaguje na: "NH3,NOx, alcohol, Benzene, smoke,CO2 ,etc." Takže z toho žádnou rozumnou hodnotu nedostaneš, protože to reaguje na jakýkoliv bordel v ovzduší.

bestone
Příspěvky: 1
Registrován: 04 říj 2019, 15:27
Reputation: 0

Re: Kalibrace senzoru MQ135

Příspěvek od bestone » 04 říj 2019, 15:29

Ahoj, podařilo se to nejak vyřešit?

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Kalibrace senzoru MQ135

Příspěvek od pavel1tu » 05 říj 2019, 16:52

MQ135 nebrat
- má velkou spotřebu
- každý funguje jinak
mám jich tu někde 5ks, jestli jsem je nevyhodil, klidně komukoliv daruji

K senzorům plynů všeobecně, každý měří tzv. "bordel v ovzduší" ale doma kde toto nehrozí to lze jednoduše použít na tu detekci CO2
Z řady BMP i BME jsem vyzkoušel asi 4 různé senzory. Jsou drahé, ale mají nízkou spotřebu, jednoduché použití.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 9 hostů