Sensor MG811 (CO2) + Arduino

Standard

Hola amigos, ¿Cómo les ha tratado estas festividades? Espero que muy bien, y si te salio el monito de la rosca de reyes a pagar los tamales XD.

Ya entrando en el tema, en esta ocasión hablaremos del sensor MG811. El cual es uno parecido a este:

sensor-de-co2-dioxido-de-carbono-mg811-arduino-avr-pic-524201-MLM20295577058_052015-O

Este sensor, esta diseñado para para capturar el CO2 en el ambiente.

El dióxido de carbono es un gas incoloro, inholoro y vital para la vida en la Tierra. Este compuesto químico encontrado en la naturaleza está compuesto de un átomo de carbono unido con sendos enlaces covalentes dobles a dos átomos de oxígeno. El CO2 existe en la atmósfera de la Tierra como gas traza a una concentración de alrededor de 0,04 % (400 ppm) en volumen. Fuentes naturales incluyenvolcanes, aguas termales, geíseres y es liberado por rocas carbonatadas al diluirse en agua y ácidos. Dado que el CO2 es soluble en agua, ocurre naturalmente en aguas subterráneas, ríos, lagos, campos de hielo,glaciáres y mares. Está presente en yacimientos de petróleo y gas natural.

Y este tutorial esta centrado en este sensor, ya que, es el sensor comercial que más se menciona.  Aun cuando hay pocas aplicaciones en arduino, y mucho menos tutoriales  en español.

Este sensor (el gris) junto con el modulo (todo lo demás) contiene un circuito, para amplificar o ajustar la sensibilidad dependiendo del ambiente donde se quiera utilizar y tiene un comprador con umbral ajustable y una salida analógica, la cua,l el microcontrolador leerá. Este sensor puede leer concentraciones desde 350 a 100000pm (partes por millon)

Características del sensor:

  • voltaje 5v o mas.
  • salida digital DO (comparador)
  • Salida analógica AO (amplificador)
  • salida comparador de temperatura
  • potenciometro para ajustar amplificación
  • potenciometro para ajuste de  comparador
  • peso 10 g
  • El sensor se calienta  y se puede sentir al tacto. El voltaje se incrementa hasta que se nivela, ya que el sensor esté caliente, estará listo para detectar el CO2
  •  La salida analógica tiene un rango de 0- a 2v a mayor voltaje de salida es menor la concentración del gas, para mayor información revisar la hoja de datos.
  • Cuando la temperatura ambiente cambia el voltaje de salida también varia, y el sensor de CO2 a una temperatura mas alta detección mas eficaz

Diagrama típico:

Schematics

Como vemos el sensor tiene poca complicación,  junto con su modulo a la hora de entender y conectar, ahora utilizaremos el siguiente código   :

/*******************Demo for MG-811 Gas Sensor Module V1.1*****************************
Author: Tiequan Shao: tiequan.shao@sandboxelectronics.com
Peng Wei: peng.wei@sandboxelectronics.com

Lisence: Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)

Note: This piece of source code is supposed to be used as a demostration ONLY. More
sophisticated calibration is required for industrial field application. 

Sandbox Electronics 2012-05-31
************************************************************************************/

/************************Hardware Related Macros************************************/
#define MG_PIN (1) //pin analogico al arduino
#define BOOL_PIN (2) // pin al  umbral del comparador (puede se interrup)
#define DC_GAIN (4.5) //ganacia del ampliciador

/***********************Software Related Macros************************************/
#define READ_SAMPLE_INTERVAL (50) // cuantas muestras se tomaran
#define READ_SAMPLE_TIMES (5) // definir intervalo entre cada muestra


/**********************Application Related Macros**********************************/

#define ZERO_POINT_VOLTAGE (0.220) // define la salida del sensor en voltios cuando la concentracion de c02 es de 400 ppm
#define REACTION_VOLTGAE (0.020) //define la caida de tension cuando   se mueve el sensor a 1000 ppm

/*****************************Globals***********************************************/
float CO2Curve[3] = {2.602,ZERO_POINT_VOLTAGE,(REACTION_VOLTGAE/(2.602-3))}; 
//dos puntos se toman de la curva. 
//con estos dos puntos, se forma una línea que es 
//'aproximadamente equivalente' a la curva original.
//data format:{ x, y, slope}; point1: (lg400, 0.324), point2: (lg4000, 0.280) 
//slope = ( reaction voltage ) / (log400 –log1000) 

void setup()
{
Serial.begin(9600); 
pinMode(BOOL_PIN, INPUT); 
digitalWrite(BOOL_PIN, HIGH); 
Serial.print("MG-811 Demostration\n"); 
}

void loop()
{
int percentage;
float volts;
// lectura del sensor
volts = MGRead(MG_PIN);
Serial.print( "SEN-00007:" );
Serial.print(volts); 
Serial.print( "V " );
// porcentaje de co2 en el aire
percentage = MGGetPercentage(volts,CO2Curve);
Serial.print("CO2:");
if (percentage == -1) {
Serial.print( "<400" );
} else {
Serial.print(percentage);
}

Serial.print( "ppm" ); 
Serial.print("\n");
// aqui vemos el umbral del comparador
if (digitalRead(BOOL_PIN) ){
Serial.print( "=====BOOL is HIGH======" );
} else {
Serial.print( "=====BOOL is LOW======" );
}

Serial.print("\n");

delay(200);
}

/***************************** MGRead *********************************************
Entrada: mg_pin -   canal analógico 
Salida: salida del SEN-000007 
Observaciones: Esta función lee la salida del SEN-000007
************************************************************************************/ 
float MGRead(int mg_pin)
{
int i;
float v=0;

for (i=0;i<READ_SAMPLE_TIMES;i++) {
v += analogRead(mg_pin);
delay(READ_SAMPLE_INTERVAL);
}
v = (v/READ_SAMPLE_TIMES) *5/1024 ;
return v; 
}

/***************************** MQGetPercentage **********************************
Entrada: voltios - SEN-000007 de salida medido en voltios 
pcurve - puntero a la curva de la salida de gas
 salida: ppm del gas objetivo
Observaciones: Mediante el uso de la pendiente y un punto de la línea. La x (valor logarítmico de ppm) e la línea podría derivarse si se proporciona y (salida de MG-811). Como es una logaritmica de coordenadas, potencia de 10 se   utiliza para convertir el resultado a un valor no logarítmico.
************************************************************************************/ 
int MGGetPercentage(float volts, float *pcurve)
{
 if ((volts/DC_GAIN )>=ZERO_POINT_VOLTAGE) {
 return -1;
 } else { 
 return pow(10, ((volts/DC_GAIN)-pcurve[1])/pcurve[2]+pcurve[0]);
 }
}

Ese es el código básico de uso del sensor, donde  el bool pin como se mencionó, es el umbral del comparador el cual se puede modificar con  el primer  potenciómetro.

Nuestra salida ADC es donde se toma una cantidad 5 de muestras, para obtener un promedio y sacar una medida mas exacta. Si se necesita alguna configuración especial  solo es cuestión de tomar el código de arriba como base. y modificarlo.

Espero les haya servido, y vernos pronto con más de estos temas.

Éxito!

13 thoughts on “Sensor MG811 (CO2) + Arduino

  1. Mario Mundaca

    Hola,

    Tengo una duda.
    Si la salida es 2v entonces el valor de medida es 0 pmm o 400 pmm? cuando se tiene 0v, el valor es 10000 ppm?

    Gracias

    • Jaime Becerra

      Hola mario
      lo primero ahi que tener en cuenta que estos dispositivos muchas veces necesitan una calibracion, aunque para mas informacion detalla recomiendo irte al datasheet http://www.dfrobot.com/image/data/SEN0159/CO2b%20MG811%20datasheet.pdf, ahora en teoria al tener el voltaje maximo de 2v tendria 350 ppm o menos (debido a que el sensor comienza a mostrar variacion despues de 350 ppm) por esa razon se necesita calibrar con algun otro dispositivo o metodo, para saber con precision, y la variacion maxima del sensor (segun el data) y su resolucion es de 30 a 50mv ahora segun en la grafica deberia ser cercano a 0 cuando te acercas a los 10000ppm

      saludos

      • Mario Mundaca

        Gracias por tu repuesta.

        Tengo otra consulta, al momento de probar el sensor, aplico co2 al sensor (exhalo) y el voltaje disminuye, pero se demora mucho para volver al valor que estaba antes, unos minutos. Está trabajando bien el sensor?

        Saludos.

        • Jaime Becerra

          hola mario de nuevo
          mario recuerda que en primer lugar el sensor necesita un periodo de pre calentamiento (segun el data) puede durar hasta 24 horas y lo segundo es si tiene el espacio adecuado para que halla reflujo de aire, por o demas la toma de medida toma un tiempo para estabilizarse

          • Mario Mundaca

            Estimado, el tiempo de pre calentamiento puede durar 24 horas? había leído que era al rededor de 1 hora.

          • Jaime Becerra

            hola mario ante todo gracias por tu interes

            ahora respondiendo a tu pregunta de una hora para que sea una medida cercana a lo real, mas para que sea lo mas estable posible se recmoienda 24, o esto es lo que demostrado la practica, porque por desgracia el datasheet no contiene mucha informacion. al igual que te recomendaria utilizarlo a 6v

            saludos cordiales mario

  2. Diego Ortega

    Una pregunta acerca del código, me puedes explicar de donde se obtiene que el DC_GAIN es 4,5?
    #define DC_GAIN (4.5). como lo calculas? ya que en el Data Sheet del sensor no logro identificar ese valor?

  3. Citlali Melchor

    ¡Hola Jaime!
    Acabo de adquirir este sensor en la versión que tiene dos potenciómetros y no tiene alimentación extra como en el caso de los de Sandbox, tengo dos preguntas:
    ¿cómo ajustar los potenciómetros?
    ¿en VDD y GND puedo (o debo) conectar una fuente de 6V en lugar de los 5V del arduino?
    Gracias 🙂

    • Jaime Becerra

      hola Citlali
      hablando de tu modelo muy posiblemente un potenciometro sea para el comparador y otro para la ganancia, el mas importante es la ganancia, pues lo ajustas a tu señal, te recomendaria utilizar fuente externa no tanto por el voltaje aunque el ideal es 6v, si no por la corriente, pues es frecuente que el arduino no logre darte el necesario

      Saludos !!

  4. Byron Bravo

    Hola que tal tengo una pregunta cual es el método mas viable para realizar la calibración del modulo y para el precalentamiento es necesario hacerlo mas de una vez si se deja de utilizar el sensor o solo se lo realiza la primera vez desde que lo adquirimos????

    Tengo el modulo de dos potenciometros. muchas gracias de antemano

  5. Oswaldo

    Cordial saludo Jaime,

    Una pregunta depronto tu tendrás como se hace la conexión del sensor con el arduino? soy algo nuevo en esto.

    Muchas gracias.

  6. Jorge A.

    Buenas tardes, cual debería ser una salida normal del sensor? Las salidas que tengo son:
    SEN-00007:0.62V CO2:16945ppm
    =====BOOL is LOW======

    En una habitación a uno 24 grados centigrados con una humedad relativa del 60%.

    Tienes mas detalles del proceso de calibración? No logro encontrar información. Gracias

Leave a Reply

Your email address will not be published. Required fields are marked *