Calibracion de sensor mq131

Hola amigos vengo con unas dudas del sensor mq131

se que el sensor necesita calibración y esto se logra poniéndole una resistencia, ya vienen sensores con esta resistencia pero es una resistencia variable,

|500x500

se puede ver lo azul la resistencia variable.

para calibrarlo se necesitan de dos formulas segun el datashed:

Pero tengo unas dudas con estas formulas

primero que nada

que significa:

Power of Sensitivity body(Ps).............. segun sangoogle es esto: "Poder de la sensibilidad corporal"

osea que sacando es resultado me dará que tanta sensibilidad tiene, no entiendo con esto, se refiere tan preciso me dará el resultado o hasta que escala de ozono me medirá bien?

bueno empezamos con las literales:

vc: es el voltaje de entrada

Rs: resistencia del sensor: la verdad no se que sea esto, si es una resistencia que tengo que añadir, o la resistencia del sensor osea la resistencia interna del sensor

VRL: se que es el voltaje que se mide poniendo el voltimetro en paralelo entra la resistencia RL

RL: es el valor de la resistencia.

Esas dos formulas me dan a entender que yo voy a ingresar un voltaje que quiera que no sea mayor a 24v por que lo dice la tabla, y que ademas voy a moverle la resistencia RL al valor que yo quiera, eso es lo que entiendo por la formula de "RS"

Ahora la formula de PS me da a entender que ahi me va a dar un valor y ese valor me va a decir que tan calibrado tengo mi sensor, es como asi del 1 al 100%, me dara un resultado por ejemplo que tengo un tolerancia de 4% o 5% o "x" numero,

Añado el datashed

http://www.cooking-hacks.com/skin/frontend/default/cooking/pdf/MQ-131.pdf

|500x430

Gracias por sus respuestas, Saludos

Yo tengo el mismo problema que tu. He encontrado esta página que puede ser de ayuda.

Para mi el problema tiene que ver con la respuesta del sensor a la mezcla de gases.

He encontrado que los fabricantes recomiendan calibrar a 50ppb que es la resistencia entre 100 y 200k una medida buena seria 150k, ahi el sensor ya da un medida muy exacta,

eso si debe de entrar al sensor 5v, y estar en un ambiente de humedad de 65% con 20°c, la medida se toma después de 24 horas encendido el sensor,

añado el datashed con la info de calibración

Fijate como subes las imagenes. Mira las normas del foro o usa servicios como www.tinypic.com

https://github.com/GeorgK/MQ135

He usado esa libreria

También estoy buscando como calibrarlos y tengo que calibrar a casi todos.

Load-resistor

The sensor needs a load-resistor at the output to ground. It's value could be from 2kOhm to 47kOhm. The lower the value, the less sensitive. The higher the value, the less accurate for higher concentrations of gas.

If only one specific gas is measured, the load-resistor can be calibrated by applying a know concentration of that gas. If the sensor is used to measure any gas (like in a air quality detector) the load-resistor could be set for a value of about 1V output with clean air.

Choosing a good value for the load-resistor is only valid after the burn-in time.

Bueno tal vez este hilo Reading different gases sea de lo mejor que he encontrado

Esta otra página tambien es aconsejable Air quality Sensor

Se que ambas usan sensores diferentes a tu consulta pero mira la analogía con tu problema.

y la cosa mejora porque ahora encuentro esto Cheap CO2 meter using the MQ135 sensor with AVR ATmega

bueno creo que este último link es la respuesta que tu y yo buscamos. A ver que podemos descifrar. Lo debo estudiar porque recién lo encuentro y lo comparto contigo para que lo vayamos desglozando. Es para un CO2 pero ya sabes, la idea es aplicable a cualquiera.

Hola a todos!

Estoy intentando hacer funcionar el sensor mq131 y he leído en muchos foros me sigue quedando un vacio muy grande, ya que de este sensor no hay nada o casi nada. No tengo claro como hay que calibrarlo, además yo estoy probando con resistencia de 100kilo hasta 200kilo como todo el mundo pone en los foros. Si pongo la de 100k me da unos valores analógicos comprendidos entre 500 hasta 600 mas o menos y si pongo la de 200k me de unos valores de 700 hasta 800. Y si expongo mi sensor a gas ozono esos valores decrecen siempre. Luego yo estoy metiendo este programa para calibrarlo pero siempre me da 0ppb y eso es porque no tengo ni idea de como coger la tabla de calibración y me gustaría haber si alguien puede ayudarme y decirme que mal tengo en mi programa que pongo a continuación:

************************Hardware Related Macros************************************/
#define         MQ_PIN                       (0)     //define which analog input channel you are going to use
#define         RL_VALUE                     (100)    //define the load resistance on the board, in kilo ohms
#define         RO_CLEAN_AIR_FACTOR          (9.83)  //RO_CLEAR_AIR_FACTOR=(Sensor resistance in clean air)/RO,
                                                    //which is derived from the chart in datasheet

/***********************Software Related Macros************************************/
#define         CALIBARAION_SAMPLE_TIMES     (50)    //define how many samples you are going to take in the calibration phase
#define         CALIBRATION_SAMPLE_INTERVAL  (500)   //define the time interal(in milisecond) between each samples in the
                                                    //cablibration phase
#define         READ_SAMPLE_INTERVAL         (50)    //define how many samples you are going to take in normal operation
#define         READ_SAMPLE_TIMES            (5)     //define the time interal(in milisecond) between each samples in 
                                                    //normal operation

/**********************Application Related Macros**********************************/
#define         GAS_O3                      (0)

/*****************************Globals***********************************************/
float           O3Curve[3]  =  {0.69, 0.69,-0.76};    //two points are taken from the curve in datasheet. 
                                                    //with these two points, a line is formed which is "approximately equivalent" 
                                                    //to the original curve. 
                                                    //data format:{ x, y, slope}; point1: (lg200, lg8.5), point2: (lg10000, lg0.03) 

float           Ro           =  10;                  //Ro is initialized to 10 kilo ohms

void setup()
{
 Serial.begin(9600);                                //UART setup, baudrate = 9600bps
 Serial.print("Calibrating...\n");                
 Ro = MQCalibration(MQ_PIN);                        //Calibrating the sensor. Please make sure the sensor is in clean air 
                                                    //when you perform the calibration                    
 Serial.print("Calibration is done...\n"); 
 Serial.print("Ro=");
 Serial.print(Ro);
 Serial.print("kohm");
 Serial.print("\n");
}

void loop()
{
  Serial.print("O3:"); 
  Serial.print(MQGetGasPercentage(MQRead(MQ_PIN)/Ro,GAS_O3) );
  Serial.print( "ppb" );
  Serial.print("\n");
  delay(200);
}

/****************** MQResistanceCalculation ****************************************
Input:   raw_adc - raw value read from adc, which represents the voltage
Output:  the calculated sensor resistance
Remarks: The sensor and the load resistor forms a voltage divider. Given the voltage
        across the load resistor and its resistance, the resistance of the sensor
        could be derived.
************************************************************************************/ 
float MQResistanceCalculation(int raw_adc)
{
 return ( ((float)RL_VALUE*(1023-raw_adc)/raw_adc));
}

/***************************** MQCalibration ****************************************
Input:   mq_pin - analog channel
Output:  Ro of the sensor
Remarks: This function assumes that the sensor is in clean air. It use  
        MQResistanceCalculation to calculates the sensor resistance in clean air 
        and then divides it with RO_CLEAN_AIR_FACTOR. RO_CLEAN_AIR_FACTOR is about 
        10, which differs slightly between different sensors.
************************************************************************************/ 
float MQCalibration(int mq_pin)
{
 int i;
 float val=0;

 for (i=0;i<CALIBARAION_SAMPLE_TIMES;i++) {            //take multiple samples
   val += MQResistanceCalculation(analogRead(mq_pin));
   delay(CALIBRATION_SAMPLE_INTERVAL);
 }
 val = val/CALIBARAION_SAMPLE_TIMES;                   //calculate the average value

 val = val/RO_CLEAN_AIR_FACTOR;                        //divided by RO_CLEAN_AIR_FACTOR yields the Ro 
                                                       //according to the chart in the datasheet 

 return val; 
}
/*****************************  MQRead *********************************************
Input:   mq_pin - analog channel
Output:  Rs of the sensor
Remarks: This function use MQResistanceCalculation to caculate the sensor resistenc (Rs).
        The Rs changes as the sensor is in the different consentration of the target
        gas. The sample times and the time interval between samples could be configured
        by changing the definition of the macros.
************************************************************************************/ 
float MQRead(int mq_pin)
{
 int i;
 float rs=0;

 for (i=0;i<READ_SAMPLE_TIMES;i++) {
   rs += MQResistanceCalculation(analogRead(mq_pin));
   delay(READ_SAMPLE_INTERVAL);
 }

 rs = rs/READ_SAMPLE_TIMES;

 return rs;  
}

/*****************************  MQGetGasPercentage **********************************
Input:   rs_ro_ratio - Rs divided by Ro
        gas_id      - target gas type
Output:  ppm of the target gas
Remarks: This function passes different curves to the MQGetPercentage function which 
        calculates the ppm (parts per million) of the target gas.
************************************************************************************/ 
int MQGetGasPercentage(float rs_ro_ratio, int gas_id)
{
 if ( gas_id == GAS_O3) {
    return MQGetPercentage(rs_ro_ratio,O3Curve);
 }  
 return 0;
}

/*****************************  MQGetPercentage **********************************
Input:   rs_ro_ratio - Rs divided by Ro
        pcurve      - pointer to the curve of the target gas
Output:  ppm of the target gas
Remarks: By using the slope and a point of the line. The x(logarithmic value of ppm) 
        of the line could be derived if y(rs_ro_ratio) is provided. As it is a 
        logarithmic coordinate, power of 10 is used to convert the result to non-logarithmic 
        value.
************************************************************************************/ 
int  MQGetPercentage(float rs_ro_ratio, float *pcurve)
{
 return (pow(10,( ((log(rs_ro_ratio)-pcurve[1])/pcurve[2]) + pcurve[0])));
}

Espero que alguien pueda ayudarme.
Un saludo

Mira estos sensores son para mi una caja de pandora. Que nadie que los fabrique se ofenda pero son para usarlos para alarma no para medir (desde mi humilde punto de vista). Veo gran dispersión en sus parámetros.
Un proceso de calibración como mínimo engorroso o confuso.
Y además, inevitablemente, una posible interacción con otros gases que “dificulta” lo que estamos queriendo leer.
Si miras. Cada curva tambien responde a otros gases, que no deben estar en concentraciones importantes para no “afectar” la lectura que buscas.

En el hilo puse creo un enlace interesante.
En mi proyecto tenía que medir muchos gases pero tuve que pasar a instrumentos mas caros que garanticen las mediciones. También los compré pero ya sabes, luego no tienes tiempo para hacer las comparaciones.

ok, muchas gracias. De todos modos seguiré intentando haber si puedo conseguir calibrarlo adecuadamente y ver que mide.

Un saludo

Hola a todos. He mirado multitud de foros para calibrar el sensor mq131 y en ninguno se explica bien cómo hacerlo, hay datos que no se pueden calcular para sensores con resistencia variable o hay datos de partida que no son ciertos. Os voy a explicar cómo lo he hecho yo después de haberle dedicado mucho tiempo y muchos quebraderos de cabeza:

Lo primero es dejar el sensor midiendo durante 24 horas.

A partir de aquí, los parámetros que nos interesa calcular es la resistencia del sensor. Para ello pasamos primero el valor del sensor a voltios, y luego calculamos su resistencia:
El sensor nos mide valores entre 0 y 1023. Para pasarlo a valores de voltios hacemos:

V = Valor del sensor/1024*5

Ahora podemos calcular su resistencia:
Rs = (5-V)/V

Debido a que la humedad relativa y la temperatura afectan a la medición, he instalado también un sensor DTH22 para conocer sus valores y ajustar la lectura del sensor de Ozono.

Para que el valor de la medición del sensor sea lo más constante y no se vea influenciado por corrientes de aire, he introducido el sensor en una bolsa de plástico cerrada.

Después de anotar unas cuantas mediciones de tª, H y Rs a lo largo de un tiempo (mejor cuanto más datos hayamos tomado) y partiendo de los diagramas del Datasheet MQ131 (http://www.cooking-hacks.com/skin/frontend/default/cooking/pdf/MQ-131.pdf) se puede obtener todo lo demás. Únicamente tendremos que conocer la concentración de O3 del aire donde estamos calibrando el sensor.
Yo he tomado el valor de 50ppm debido a que algunos estudios recientes por mi zona (Granada) han determinado esos valores medios.

Partiendo del primer gráfico del datasheet del sensor MQ131 he obtenido la ecuación que relaciona la concentración de O3 en ppb con R0/Rs siendo:

log(ppb) = -1,1428*(R0/Rs) + 1,3859 con un coeficiente de correlación R²=1

ppb=10^(-1.1428*(log R0/Rs)+1.3859)

(Estas ecuaciones las he obtenido interpolando 3 valores de la gráfica con ayuda de autocad, ya que las escalas son logarítmicas y a simple vista no se podría obtener con precisión)

Una vez obtenido R0/Rs y mirando el gráfico 2 hay que ajustar su valor por la influencia de la temperatura y la humedad, ya que los valores del gráfico 1 están representados para una tª de 20ºC y una H.R. del 65%

En función de la humedad (midiendo 3 puntos de las 3 series a 20ºC)

Fh=6,4502*tª^(-0,438) => R²=0,9996

En función de la humedad (midiendo 4 puntos de serie de 60%)

Ft=((Tª-107,56)/(-80,818))-0,02155 => R²=0,9931

Estos factores de corrección están referidos a Rs/R0, por tanto para corregir el valor (R0/Rs) obtenido de la primera ecuación haremos:

(R0/Rs)correg. = (R0/Rs)obtenido / (Fh*Ft)

Finalmente el valor buscado R0 de nuestra sonda será:

R0sonda = (R0/Rs)correg.*Rs

Este proceso lo he hecho para todos los datos de tª, H y Rs que he tomado y finalmente he estimado el R0sonda medio. (mejor hacerse una hoja de cálculo)

(En algún foro, algún forero ha puesto que"The ratio of RS/R0 is 10 in a clear air", sin embargo mirando la primera gráfica del datasheet o interpolando en la primera ecuación que he calculado, para ese valor el aire limpio tendría una concentración de más de 123ppb y eso seguro que no es aire limpio)

Finalmente, con el valor de R0 de nuestra sonda ya lo tenemos todo para poder pasar valores del sensor a ppb de Ozono aplicando las ecuaciones expuestas anteriormente con el siguiene proceso:

  1. Calculamos Rs
  2. Calculamos (R0/Rs)
  3. Compensamos su valor por el efecto de la tª y la Humedad (Tened en cuenta que ahora estos factores multiplica a R0/Rs ya que estamos operando de manera inversa)
  4. A partir de la primera ecuación sustituimos el valor compensado de (R0/Rs), y despejamos el valor de ppb.

Nota: Las ecuaciones obtenidas tienen bastante precisión, sin embargo el parámetro que no tiene tanta precisión es el hipotético de 50ppb que he tomado del aire de partida aunque no podrá diferir mucho de la realidad. No obstante para lo que quiero utilizar el sensor es para mantener valores altos en una cámara entre 200 y 300 ppb, por lo que no preciso una precisión tan absoluta. Se me ocurre para mejorar la precisión introducir el sensor de ozono en un recipiente al vacío y tomar 0ppb.

Espero que os haya gustado este método y podáis aplicarlo si os parece bien.