Senzor plynů MQ-5 je vstupní modul pro Arduino. Tento modul obsahuje senzor MQ5, který dokáže detekovat více druhů vybraných plynů. Senzor reaguje nejvíce na plyny H2, LPG, CH4 a CO. S menší citlivostí reaguje také na alkohol a kouř. 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-5 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.
Pro úspěšné propojení senzoru plynů MQ-5 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.
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 například hodnotou 0.7, která odpovídá křivce LPG na grafu níže. A poté následuje tisk všech údajů po sériové lince a pauza po dobu jedné sekundy.
// Senzor MQ-5, 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 0.7 pro LPG R0 = RS_air / 0.7; // 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-5 dostaneme například tento výsledek:
Vstupni napeti: 0.38V Konstanta R0: 17.33 Vstupni napeti: 0.38V Konstanta R0: 17.33 Vstupni napeti: 0.38V Konstanta R0: 17.36
Z prvního programu si zapíšeme naměřenou hodnotu R0, v mém případě je to 17,3. 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 0.7.
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 LPG, kdy v případě, že je poměr menší než 0,7, tak přepočteme z grafu poměr 0,7 až 0,02 na koncentraci v rozsahu 200 až 10000. 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-5, 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 = 17.3; 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ž 0.7, // vypočteme odhad koncentrace LPG if ( ratio < 0.7 ) { // přepočet načtených dat, z rozsahu 0-700 // na koncentraci 200-10000 ratio = ratio*100; int ppm = map(ratio, 70, 2, 200, 10000); 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-5 dostaneme například tento výsledek:
Vstupni napeti: 0.39 Pomer Rs/R0: 0.69 Priblizna koncentrace CO: 344 ppm. Vstupni napeti: 0.39 Pomer Rs/R0: 0.69 Priblizna koncentrace CO: 344 ppm. Vstupni napeti: 0.53 Pomer Rs/R0: 0.49 Priblizna koncentrace CO: 3226 ppm. Vstupni napeti: 0.60 Pomer Rs/R0: 0.43 Priblizna koncentrace CO: 4235 ppm. Vstupni napeti: 0.68 Pomer Rs/R0: 0.37 Priblizna koncentrace CO: 5100 ppm. Detekovano prekroceni hranice!
Senzor plynů MQ5 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á podle výrobce až 24 hodin. Já jsem pro své testování použil alespoň 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/4870-senzor-plynu-mq5-mq-5-pro-arduino.html