Detección de gas con Arduino y módulo MQ-2

Detección de gas con Arduino y módulo MQ-2

Para la detección de gas con nuestro Arduino vienen unos módulos muy practicos y bastante comunes basados en los sensores MQ. Existen una lista grande de sensores MQ donde cada uno fue diseñado para detectar un tipo de gas o sustancia especifica (o conjunto de ellas). Por ejemplo el que usaremos en el ejemplo es un MQ-2 que detecta gases combustibles, incluyendo propano, butano y gas natural. En las pruebas yo usaré un encendedor para mostrar su operación. Otros sensores pueden detectar gases más raros como el hidrogeno o CO (monoxido de carbono), o incluso gases toxicos como el amoníaco.

El módulo sensor de gas MQ-2

Nuestro sensor vienen en un módulo para una integración facil con cualquier placa (nosotros usaremos un Arduino UNO como es costumbre). En especial, el MQ-2 puede detectar: gas natural, butano, propano, metano, alcohol, hidrógeno y humo.

sensor de gas MQ-2  Sensor de gas MQ2 (reverso)

El sensor puede ser conectado de manera digital, analógica o mixta. Con la conexón digital podemos usarlo para detección de seguridad, con la analógica podemos medir la cantidad de gas en el aire en ppm (partes por millón), y si usamos ambos a la vez, podemos obtener una funcionalidad mixta muy completa e interesante incluyendo algunos trucos que les dejaré al final de la página.

Este sensor, al igual que otros similares, necesitan un tiempo de “calentamiento” antes de poder arrojar lecturas válidas. Le aconsejo un mínimo de 2 minutos de calentamiento antes de cada prueba efectiva. El calentamiento comenzará cuando lo alimente con voltaje (usualmente cuando conecta su Arduino a la computadora).

Les dejo un enlace al sensor (el componente, no el módulo): datasheet

Componentes necesarios para probar el módulo

Los componentes que usaremos son los siguientes:

  • Arduino UNO (o MEGA servirá también)
  • Cable USB para el Arduino
  • Módulo con sensor MQ-2 (servirá tambien cualquier módulo con un sensor MQ que ustedes puedan probar)
  • Breadboard o protoboard
  • 3 cables (4 para el experimento final)

Detección de gas con Arduino y módulo MQ-2

Detección de gas: conectando el módulo mediante su salida digital solamente

Como les comenté, una manera de conectar el módulo es mediante su salida digital. La salida digital, que en mi módulo es un pin de nombre D0, tendrá un estado 0 o 1, representando 0 = 0v, y 1 = 5v aprox., y que representan 0 = detección de gas, y 1 = sin detección de gas. Lo que haremos es conectar nuestro módulo usando el breadboard y los cables macho-macho, de la siguiente manera:

Módulo -> Arduino UNO
D0 -> pin 8
Gnd -> GND (cualquiera de los disponibles)
Vcc -> 5v

Y podemos gargar el siguiente Sketch en nuestro Arduino IDE:

// Pin del Arduino donde conectamos la pata D0 del módulo
#define GAS_PIN 8

void setup() {
  // Inicializamos el pin como entrada
  pinMode(GAS_PIN, INPUT);
  
  Serial.begin(9600);
  Serial.println("Deteccion de gas con MQ-2...");
}

// Para guardar el estado anterior y solo mostrar cambios
int digitalValue = -1;

void loop() {
  // Leemos el estado del módulo
  int digitalNew = digitalRead(GAS_PIN);
  
  // Si el estado del módulo cambió, informamos por el Monitor Serial
  if (digitalNew != digitalValue) {
    // Actualizamos el ultimo estado
    digitalValue = digitalNew;
    // Compartimos el nuevo estado
    Serial.println(String("Nuevo estado del modulo: ") + digitalValue);
  }
  
  // Repetimos 10 veces por segundo (cada 100ms)
  delay(100);
}

Luego de cargar el Sketch, podemos abrir el Monitor Serial de nuestro Arduino IDE y probar la detección de gas. El Monitor Serial debería verse asi:

Deteccion de gas con MQ-2...
Nuevo estado del modulo: 1

Lo que significa que nuestro módulo no detecta presencia de gas mayor a la normal. Y lo que debemos hacer es acercarle un poco de gas a nuestro sensor. Yo usé un encendedor (solo dejé escapar el gas) y eso fue suficiente (luego de ver la detección de gas en la pantalla no dejé escapar más gas. Luego de lo cual deberíamos ver algo asi:

Deteccion de gas con MQ-2...
Nuevo estado del modulo: 1
Nuevo estado del modulo: 0
Nuevo estado del modulo: 1

Y el estado o valor 0 marcó la detección, mientras que luego de detenerme con el encendedor (que no saliera más gas), volvió rápidamente al estado 1.

Calibrando el punto de detección de gas

Nuestro módulo posee un potenciómetro (un componente a veces azul, que posee una ranura como para ajustar con un destornillador pequeño) que nos permite calibrar el punto en donde queremos que reporte haber detectado gas. La calibración nos permite decidir que tan sensible será el módulo al gas en cuestión.

La manera de calibrarlo es mientras está conectado, no necesitamos ningun Sketch en nuestro Arduino, y simplemente giramos el potenciómetro hacia la izquierda hasta que una luz (verde en mi caso) se prende que es el testigo de detección de gas y ahí paramos. Ahora la sensibilidad dependerá de cada uno, pero si quiere que su módulo sea MUY sensible, entonces gire despacio hacia la derecha hasta que se apague la luz testigo, y pare ahi nomas. Sin embargo si quiere que su módulo sea más tolerante, continue girando hacia la derecha hasta el grado que lo deje más conforme. Al final le dejaré un truco para un ajuste más “técnico” que pueda hacer incluso para cumplir alguna normal industrial.

Conectando el módulo mediante su salida analógica solamente

Ahora veremos como leer cuanto gas está detectando nuestro módulo, lo que nos permite decidir “cuando” es suficiente sin que el módulo intervenga (decidimos por programa en lugar de dejarle el trabajo al módulo). Para ello conectaremos nuestro módulo de la siguiente manera (recuerde siempre desconectar su Arduino mientras trabaja conectando módulos, Shields, etc.):

Módulo -> Arduino UNO
A0 -> A0
Gnd -> GND (cualquiera de los disponibles)
Vcc -> 5v

Y luego conectamos nuestro Arduino a la computadora y le cargamos el siguiente Sketch:

// Pin del Arduino donde conectamos la pata A0 del módulo
#define GAS_PIN A0
// Cambio en las lecturas (en porcentaje) que consideraremos significativo
#define CAMBIO_SIGNIFICATIVO 3

void setup() {
  Serial.begin(9600);
  Serial.println("Deteccion de gas con MQ-2...");
}

// Para guardar el valor anterior y solo mostrar cambios significativos
int analogValue = -1;

void loop() {
  int analogNew = analogRead(GAS_PIN);

  // Si el nuevo valor es diferente al anterior en el porcentaje que usamos...
  if (abs(analogNew-analogValue) >= (10.23*CAMBIO_SIGNIFICATIVO)) { 
    // Actualizamos el nuevo valor
    analogValue = analogNew;
    // Mostramos el nuevo valor por el Monitor Serial
    Serial.println(String("Nuevo valor de gas detectado: ") + analogValue);
  }
  
  // Repetimos 10 veces por segundo (100 milisegundos)
  delay(100);
}

Recuerden darle unos minutos a que el sensor caliente para ponerlo a prueba. Durante ese período las lecturas pueden cambiar aun sin que usted le acerque gas al sensor. Luego de unos 2 minutos, haga la misma prueba que hizo en la conexión digital, y verifique lo que va ocurriendo a medida que deja salir gas del encendedor (frente al sensor o hacia el sensor). Acá hay un ejemplo de lo que se vé en el Monitor Serial:

Deteccion de gas con MQ-2...
Nuevo valor de gas detectado: 129
Nuevo valor de gas detectado: 98
Nuevo valor de gas detectado: 67 <-- Luego de calentar, este fue el valor normal para mi sensor
Nuevo valor de gas detectado: 146  <-- Acá comencé a liberar gas del encendedor
Nuevo valor de gas detectado: 222
Nuevo valor de gas detectado: 281
Nuevo valor de gas detectado: 321
Nuevo valor de gas detectado: 353
Nuevo valor de gas detectado: 384
Nuevo valor de gas detectado: 423  <-- Acá paré de liberar gas. Este fue el valor máximo de gas detectado
Nuevo valor de gas detectado: 391  <-- Inmediatamente luego de detenerme comenzó a bajar el nivel de gas detectado
Nuevo valor de gas detectado: 355
Nuevo valor de gas detectado: 318
Nuevo valor de gas detectado: 283
Nuevo valor de gas detectado: 252
Nuevo valor de gas detectado: 221
Nuevo valor de gas detectado: 190
Nuevo valor de gas detectado: 159
Nuevo valor de gas detectado: 128
Nuevo valor de gas detectado: 97
Nuevo valor de gas detectado: 67 <-- Le llevó varios segundos volver a su valor normal

Avanzado: Conectando el módulo a una interrupción

Una forma inteligente de usar estos módulos es usar la ventaja de que poseen 2 salidas (una digital y una analógica) y que la salida digital es activa hacia abajo, es decir que cuando detecta gas baja a 0v, para conectarla a algunas de las interrupciones que el Arduino posee. No explicaré el uso de interrupciones aqui, pero brevemente le comento que usando interrupciones usted puede liberar a su Arduino para hacer otras cosas mientras el módulo no detecte gas (ya que será la mayoría del tiempo), en lugar de tener a su Arduino todo el tiempo chequeando el módulo. Para esta última prueba conecte su módulo de la siguiente manera:

Módulo -> Arduino UNO
D0 -> Pin 3 (este pin puede ser 2 o 3 en un Arduino UNO pero deberá modificar el Sketch si quiere usar el 2)
A0 -> A0
Gnd -> GND (cualquiera de los disponibles)
Vcc -> 5v

Y luego cargue el siguiente Sketch en su Arduino y abra el Monitor Serial:

// Pin del Arduino donde conectamos la pata A0 del módulo
#define GAS_PIN A0
#define INT_PIN 3
// Cambio en las lecturas (en porcentaje) que consideraremos significativo
#define CAMBIO_SIGNIFICATIVO 3

void setup() {
  Serial.begin(9600);
  Serial.println("Deteccion de gas con MQ-2 (usando interrupcion)...");
  pinMode(INT_PIN, INPUT);
  attachInterrupt(digitalPinToInterrupt(INT_PIN), deteccion, CHANGE);
}

// Para guardar el valor anterior y solo mostrar cambios significativos
int analogValue = -1;
int analogCheck = false;

void loop() {
  if (analogCheck) {
    int analogNew = analogRead(GAS_PIN);
  
    // Si el nuevo valor es diferente al anterior en el porcentaje que usamos...
    if (abs(analogNew-analogValue) >= (10.23*CAMBIO_SIGNIFICATIVO)) { 
      // Actualizamos el nuevo valor
      analogValue = analogNew;
      // Mostramos el nuevo valor por el Monitor Serial
      Serial.println(String("Nuevo valor de gas detectado: ") + analogValue);
    }
  }
  
  // Acá podriamos hacer cualquier otra cosa que necesitemos ya que nuestro Arduino no hará nada hasta que detecte gas
  
  // Repetimos 10 veces por segundo (100 milisegundos)
  delay(100);
}

void deteccion() {
  // Leemos el valor del pin digital 
  int digitalValue = digitalRead(INT_PIN);
  
  // Si es 1, significa que no hay gas detectado
  if (digitalValue && analogCheck) {
    Serial.println("Presencia de gas en valores normales...");
    analogCheck = false;
  }
  // Si es 0, detectamos gas. Comenzamos lecturas analógicas...
  if (!digitalValue && !analogCheck) {
    Serial.println("Gas detectado, comenzando a leer valores...");
    analogCheck = true;
  }
}

Luego de abrir el Monitor Serial verá que no mostrará ninguna actividad hasta que lo ponga a prueba con gas. Puse un mensaje cuando la detección de gas ocurre y cuando deja de ocurrir solo a modo de prueba. También observará algun rebote al final cuando vuelve a su estado normal. Está bien que así sea y no se preocupe demasiado por ello. Si ese rebote le ocurre en un proyecto y desea eliminarlo escríbame un mensaje y le explicaré como eliminarlo.

La salida del Monitor Serial después de una prueba debería verse más o menos asi:

Deteccion de gas con MQ-2 (usando interrupcion)...
Gas detectado, comenzando a leer valores...
Nuevo valor de gas detectado: 267
Nuevo valor de gas detectado: 323
Nuevo valor de gas detectado: 369
Nuevo valor de gas detectado: 400
Nuevo valor de gas detectado: 448
Nuevo valor de gas detectado: 497
Nuevo valor de gas detectado: 418
Nuevo valor de gas detectado: 316
Nuevo valor de gas detectado: 284
Presencia de gas en valores normales...

Bueno, espero que les sirva lo explicado. Como siempre si tienen alguna duda o inconveniente me escriben y trataré de contestarles a la brevedad posible. Que lo disfruten!

Deja un comentario