Trastejant

Crea, comparte, aprende y disfruta

Sensores de gas

Sensor de gas

Los sensores MQ nos permiten tomar lecturas de distintos gases que puede haber en el aire, algunos de ellos extremadamente peligrosos y/o nocivos y difícilmente detectables sin hacer uso de la tecnología, por lo que la utilidad de estos pequeños- y en la mayoría de los casos económicos- sensores es enorme.

Existen distintos modelos de sensores MQ, cada uno de ellos especializado en detectar uno o varios gases determinados, veamos una lista de los sensores MQ más populares y que tipo de gases son capaces de detectar:

Modelo Gas detectado
MQ-2 Gases combustibles (Metano, propano… )
MQ-3 Alcohol
MQ-4 Gas natural y metano
MQ-5 Gas natural
MQ-6 Propano
MQ-7 Monóxido de carbono
MQ-8 Hidrógeno
MQ-9 CO y gases combustibles
MQ-131 Ozono
MQ-135 NH3, Benceno, Alcohol y humo
MQ-136 H2S
MQ-811 Dioxido de carbono

Pese al abanico de modelos todos ellos se conectan y usan de la misma forma, por lo que este tutorial es común para todos ellos.

Conexiones

Todos los sensores MQ-x cuentan con 6 patillas de un grosor superior al de un pin habitual.
Este es el pin out de estos sensores:

Sensor de calidad del aireConectando cada pin a dónde esta indicado y la salida (marcada cómo “to analogic input pin”) a la entrada analógica de cualquier microcontrolador (o a un pin analógico de Arduino) podríamos tomar medidas del sensor. De esta forma la salida del sensor nos estaría dando la cantidad de gas medido.

Ten en cuenta que esta forma de medir no nos dará directamente un resultado en partes por millón, sino que ultimamente tendremos un valor proporcional a la cantidad de gas que está leyendo el sensor dentro de la resolución de nuestro microcontrolador. Dicho de otra manera, supongamos que estamos usando Arduino para realizar estas lecturas. Los pines analógicos de Arduino pueden devolver un valor que va desde 0 (cuando reciben 0V) hasta 1023(cuando reciben 5V). El sensor nos va a devolver una tensión proporcional a la lectura que está tomando dentro de un margen de detección, es decir, si nuestro sensor es capaz de leer desde 20ppm hasta 50.000ppm Arduino nos motrará 0 cuando la lectura sea menor de 20ppm y 1023 cuando el sensor esté detectando 50.000ppm o más. Un poco más adelante veremos cómo convertir este valor en una medida que podamos emplear (en ppm)

Otra opción que podría resultar interesante sería leer el sensor de forma digital en lugar de analógica, es decir fijar un umbral a partir del cual la salida cambia de ser un 0 a ser un 1 y podemos decir que existe presencia de ese gas. Esto no puede hacerse directamente desde el sensor, pero podemos conseguirlo con un sencillo montaje:

Esquema MQCon el potenciómetro podemos ajustar el umbral a partir del cuál el sensor devolverá un 1.

Puesta en marcha y calibración

Antes de empezar a tomar medidas fiables de estos sensores tenemos que hacer un proceso de puesta en marcha y calibración de los mismos, este proceso consta de dos partes: El quemado y la calibración propiamente dicha.

La primera fase es la de quemado, para ello tenemos que dejar nuestro sensor conectado a su alimentación (las patillas 5V y GND) durante 24 de forma ininterrumpida.

A continuación explicaremos el proceso de calibración. Este proceso únicamente es necesario si queremos lecturas analógicas muy precisas, consiste en detectar que desviación tiene nuestro sensor respecto a la realidad y aplicarlo a la hora de calcular las lecturas.

Para ello todas las librerías que utilizamos llevan siempre un método llamado getRzero, cuya misión es devolvernos el valor de la resistencia del sensor. Al estar trabajando en valor analógicos cualquier resistencia interna del sensor se traduce en un margen de error en la lectura.

Supongamos que usamos Arduino y que tenemos la salida de nuestro sensor conectado al pin A0, ahora cargaríamos un sketch cómo este:

A continuación buscaríamos el fichero .h de nuestra librería (Estará en la carpeta libraries de Arduino, en una carpeta que se llamará igual que la librería.), abrimos el fichero con cualquier editor de texto plano (notepad, gedit…etc) y buscamos una línea en la que aparezca #define RZERO sustituimos el valor que pone a continuación por el que nos ha devuelto Arduino por su consola ¡y listo!

No necesito tanta precisión… ¡quiero algo más sencillo!

Si llevar la precisión hasta el limite no es algo necesario para ti puedes saltarte estos pasos y asumir que 0 se corresponde con el valor mínimo que el sensor es capaz de leer y 1023 con el máximo. De esta forma únicamente tienes que mapear los limites de sensibilidad del sensor a los limites de resolución del microcontrolador que estas utilizando, veamos un ejemplo y después veamos cómo ser haría:

Supongamos que estamos usando un sensor que puede leer desde 20ppm hasta 10.000, y que lo estamos leyendo con un Arduino que devuelve valores analógicos de entre 0 y 1023. En este caso podemos asumir que cuando Arduino lea 0 el valor será igual o menos a 20ppm y cuando lea 1023 será porque tenemos una concentración igual o superior a 10.000. Ahora lo que necesitamos es pedirle a Arduino a que se corresponden los valores intermedios y eso podemos hacerlo mapeando las lecturas de la siguiente forma:

1
2
3
4
5
6
7
8
9
10
11
    int lectura;  
 
    void setup(){  
        Serial.begin(9600);  
    }  
 
    void loop(){  
        lectura = analogRead(A0);  
        lecturaEnPPM = map(lectura, 0, 1023, 20, 1023);  
        Serial.println(lecturaEnPPM);  
    }

Librerías

Contamos con la librería MQ135 que nos ayudará a tomar lecturas precisas de nuestros sensores de gas, cuenta con los siguientes métodos y funciones que podemos emplear:

float getPPM();

Devuelve la lectura en unidades de partes por millón

float getCorrectedPPM(float t, float h);

Devuelve la lectura en unidades de partes por millón aplicando un factor de corrección en función de la humedad y la temperatura.

float getRZero();

Devuelve un valor de 0 que depende de la resistencia interna del sensor y que se utiliza para calibrarlo (consultar el apartado de calibración)

float getCorrectedRZero(float t, float h);

Devuelve un valor de 0 aplicando un factor de corrección en función de la humedad y la temperatura. Este valor depende de la resistencia interna del sensor y que se utiliza para calibrarlo (consultar el apartado de calibración)
Algunas librerías cuentan con más funciones, pero aquí hemos descrito las que son comunes a todas.

Esperamos que este tutorial te haya resultado útil, ¡ya puedes incluir sensores de gas en tus proyectos!


También te puede interesar...

No hay temas relacionados

3 respuestas a “Sensores de gas”

  1. SC dice:

    Hola!

    El comando lecturaEnPPM = map(lectura, 0, 1023, 20, 1023);
    Porque 1023 corresponde a 1023? No debería corresponder al valor máximo del sensor (10.000) o hay alguna razón en especifico?

    • crakernano dice:

      Hola!

      El motivo de poner 1023 es porque la limitación te la está dando la resolución de entrada de los pines de Arduino, que va de 0 a 1023. Por lo tanto da igual sea el máximo que pueda entregar el sensor, nunca seremos capaces de leer más de 1023.

      Salu2!

  2. Damarys Guevara dice:

    Hola! ya sé que el post es viejo, pero él se refería a que si estás haciendo un escalamiento de valores entre uno que está recibiendo el micro y lo que quieres que se muestre al usuario se debió haber colocado lecturaEnPPM = map(lectura, 0, 1023, 20, 10000);, ya se sabe que lo máximo que va leer el arduino serán 1023 pero eso en tu escalamiento son 10000 ppm, que solo afecta es en como lo va a visualizar el usuario final en la consola.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.