Senzor oxidu uhelnatého je vstupní modul pro Arduino. Tento modul obsahuje senzor MQ-9, který dokáže detekovat více druhů vybraných plynů. Senzor reaguje nejvíce na oxid uhelnatý (CO) a hořlavé plyny Metan a Propan. Aktivním prvkem tohoto senzoru je tenká vrstva SnO2, jejíž odpor se mění s koncentrací zmíněných plynů.

Napájecí napětí senzoru MQ-9 je 5V. Proudový odběr je maximálně 70 mA při počátečním zahřívání senzoru. Pokud budete tedy chtít používat i další moduly na stejném napájení Arduina, je nutné si dávat pozor na celkový proudový odběr a případně použít pro senzor MQ externí zdroj.

Senzor oxidu uhelnatého MQ-9

Pro úspěšné propojení senzoru plynů MQ-9 a Arduino desky je nutné zapojit celkem 4 vodiče. Propojíme VCC s +5V Arduina, GND se zemí Arduina, D0 s pinem D2 a A0 s pinem A0. Pro analogový vstup je možné vybrat jiný analogový pin, ale je nutné tuto volbu provést také na začátku programu. Pro digitální vstup je nutné vybrat pin, který slouží jako přerušovací. Seznam těchto pinů pro jednotlivé desky si můžete prohlédnout zde.

Schéma zapojení Senzoru oxidu uhelnatého MQ-9

První ukázkový kód slouží pro zjištění měřící konstanty, která je následně použita v druhém programu. Na začátku prvního programu si nastavíme propojovací analogový pin a poté vytvoříme proměnné, které budeme používat pro měření. V podprogramu setup provedeme pouze inicializaci sériové linky, přes kterou budeme komunikovat.

Nekonečná smyčka loop v prvním kroku provede 100 měření, v kterých budeme přičítat do měřící proměnné hodnotu načtenou z analogového pinu. Po ukončení měření pak výsledek vydělíme 100 a tím získáme průměr. Tento průměr poté využijeme pro výpočet hodnoty vstupního napětí a následně odporu vzduchu. Pro získání potřebné konstanty R0 pak v posledním kroku vydělíme naměřený odpor hodnotou 9,9, která odpovídá křivce vzduchu na grafu níže. A poté následuje tisk všech údajů po sériové lince a pauza po dobu jedné sekundy.

// Senzor MQ-9, 1. část
// zjištění měřící konstanty R0

// nastavení propojovacího pinu
#define pinA A0
// měřící proměnné
float sensor_volt;
float RS_air;
float R0;
float sensorValue;

void setup() {
  // inicializace komunikace po sériové lince
  // rychlostí 9600 baud
  Serial.begin(9600);
}

void loop() {
  // smyčka pro načtení 100 měření
  sensorValue = 0;
  for (int x = 0 ; x < 100 ; x++) {
    // při každém běhu přičteme do proměnné novou hodnotu
    // analogového vstupu
    sensorValue = sensorValue + analogRead(pinA);
    delay(1);
  }
  // získání průměrné hodnoty
  sensorValue = sensorValue / 100.0;
  // výpočet hodnoty vstupního napětí
  sensor_volt = sensorValue / 1024 * 5.0;
  // výpočet odporu vzduchu
  RS_air = (5.0 - sensor_volt) / sensor_volt;
  // výpočet konstanty R0 - z grafu vyčtený poměr 9,9:1
  R0 = RS_air / 9.9;
  // výpis naměřených údajů po sériové lince
  Serial.print("Vstupni napeti: ");
  Serial.print(sensor_volt);
  Serial.println("V");
  Serial.print("Konstanta R0: ");
  Serial.println(R0);
  // pauza před novým měřením
  delay(1000);
}

Po nahrání prvního ukázkového kódu do Arduino desky s připojeným senzorem plynů MQ-9 dostaneme například tento výsledek:

Vstupni napeti: 0.29V
Konstanta R0: 1.62
Vstupni napeti: 0.29V
Konstanta R0: 1.62
Vstupni napeti: 0.29V
Konstanta R0: 1.62

Z prvního programu si zapíšeme naměřenou hodnotu R0, v mém případě je to 1,62. Je nutné počítat s tím, že každý senzor se může mírně lišit a také záleží, v jak čistém prostředí měříte svoji „nulovou“ hodnotu.

Druhý ukázkový program opět obsahuje na začátku nastavení propojovacích pinů, ale nyní je zde i digitální vstup, kterým můžeme detekovat přerušení pomocí komparátoru na modulu. Dále následují měřící konstanty a důležitá přenesená konstanta R0.

V podprogramu setup provedeme nejprve inicializaci sériové linky a poté nastavíme detekci přerušení na digitální pin, kdy při nástupné hraně (RISING) bude vykonán podprogram prerus.

Nekonečná smyčka loop v tomto případě už obsahuje pouze jedno načtení hodnoty z analogového pinu. Tuto hodnotu následně použijeme pro výpočet vstupního napětí a poté pro výpočet aktuální odporu. A když máme nyní k dispozici konstantu R0, můžeme vypočítat poměr Rs/R0, pomocí kterého můžeme vyčíst koncentraci daných plynů z grafu níže. Při čistém vzduchu bychom měli dostat poměr 9,9.

V následujícím kroku je proveden výpis dostupných informací po sériové lince. Přidal jsem také do programu přibližný výpočet koncentrace CO, kdy v případě, že je poměr menší než 1,5, tak přepočteme z grafu poměr 1,5 až 0,79 na koncentraci v rozsahu 200 až 1000. A po pauze jedné sekundy provedeme nové měření. V podprogramu prerus se při jeho zavolání vypíše pouze hláška na sériovou linku.

// Senzor MQ-9, 2. část
// měření koncentrací

// nastavení propojovacího pinu
#define pinA A0
#define pinD 2
// měřící proměnné
float sensor_volt;
float RS_gas;
float ratio;
int sensorValue;
// měřící konstanta z první části
const float R0 = 1.62;

void setup() {
  // inicializace komunikace po sériové lince
  // rychlostí 9600 baud
  Serial.begin(9600);
  // nastavení přerušení na pin 2 (int0)
  // při nástupné hraně (log0->log1) se vykoná program prerus
  attachInterrupt(digitalPinToInterrupt(pinD), prerus, RISING);
}

void loop() {
  // načtení hodnoty z analogového pinu
  sensorValue = analogRead(pinA);
  // výpočet vstupního napětí
  sensor_volt = (float)sensorValue / 1024 * 5.0;
  // výpočet aktuálního odporu
  RS_gas = (5.0 - sensor_volt) / sensor_volt;
  // výpočet poměru pro vyčtení z grafu
  ratio = RS_gas / R0;
  // výpis naměřených údajů po sériové lince
  Serial.print("Vstupni napeti: ");
  Serial.println(sensor_volt);
  Serial.print("Pomer Rs/R0: ");
  Serial.println(ratio);
  // pokud je poměr menší než 1.5,
  // vypočteme odhad koncentrace CO
  if ( ratio < 1.5 ) {
    // přepočet načtených dat, z rozsahu 0-700
    // na koncentraci 200-10000
    ratio = ratio*100;
    int ppm = map(ratio, 150, 79, 200, 1000);
    Serial.print("Priblizna koncentrace CO: ");
    Serial.print(ppm);
    Serial.println(" ppm.");
  }
  Serial.println();
  delay(1000);
}
void prerus() {
  // vypiš varovnou hlášku, pokud je aktivován digitální vstup
  Serial.println("Detekovano prekroceni hranice!");
}

Po nahrání druhého ukázkového kódu do Arduino desky s připojeným senzorem plynů MQ-9 dostaneme například tento výsledek:

Vstupni napeti: 0.29
Pomer Rs/R0: 9.91

Vstupni napeti: 0.29
Pomer Rs/R0: 9.91

Detekovano prekroceni hranice!
Vstupni napeti: 2.29
Pomer Rs/R0: 0.79
Priblizna koncentrace CO: 1000 ppm.

Detekční graf Senzoru oxidu uhelnatého MQ-9

Senzor oxidu uhelnatého je zajímavý modul pro Arduino, který nám umožňuje měřit koncentraci několika plynů v okolí. Může tedy nalézt uplatnění v projektech, které se zabývají měřením koncentrací těchto plynů jak v domácnosti, tak třeba i na pracovišti. V ukázce byl také uveden přepočet naměřeného poměru na koncentraci v jednotce ppm. Tento výpočet ale není příliš přesný, protože na grafu jsou obě osy uvedeny v logaritmickém měřítku.

Zde bych ještě rád zdůraznil několik informací. Zaprvé je nutné vždy senzor nechat řádně zahřát na pracovní teplotu, co znamená přibližně 5-10 minut, respektive do ustálení naměřené hodnoty. Zadruhé je s tím spojené upozornění ohledně umístění senzoru. Pracovní teplota kovového pouzdra senzoru je cca 40 °C (lze udržet v ruce), ale je nutné si dát na toto pozor při uzavírání do krabiček apod. A třetí věc souvisí s předchozími – díky nutnosti předehřátí senzoru a poměrně vysokému proudovému odběru tento senzor není příliš vhodný do bateriově napájených zařízení.

 

Seznam použitých komponent:

https://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html

https://dratek.cz/arduino/1169-arduino-co-senzor-oxidu-uhelnateho-1451756812.html

 

Poznámky:

Pro přesné měření hodnot CO je nutné přepínat mezi napájením 5V a 1,5V, přičemž napětí 1,5V musíme zajistit externím zdrojem. Pokud budete měřit pouze s 5V napájením, budete vždy měřit pouze koncentraci hořlavých plynů zmíněných v úvodu.
Datasheet výrobce: https://www.pololu.com/file/0J314/MQ9.pdf

FB tw

Další podobné články