Station de mesure – Les capteurs 2/

Introduction :

Dans le cadre d’un projet de réalisation d’une station de mesures nous avons vu dans un premier article disponible ICI les capteurs DHT22 (Température et hygrométrie), BME280 (Température, pression atmosphérique et hygrométrie) et BH1750 (lumière visible en lux).

Dans cet article nous allons voir la série des capteurs MQ-xxx permettant de détecter et mesurer la concentration des gaz comme par exemple le Monoxyde de carbone, le Butane, etc.

Capteur MQ-2 (Détecteur de gaz)

Présentation :

Ce capteur utilise le dioxyde d’étain (SnO2) dont la conductivité électrique varie en fonction de la présence de polluants. Cela permet la détection de gaz à l’aide d’une résistance chauffante (RH) et d’une résistance (RS) dont la valeur diminue avec l’augmentation de la concentration en gaz. RS est branchée en série avec une résistance de charge RL (De 1 K Ohm par exemple sur mon breakout).

Ce capteur est très simple à utiliser, il a une sensibilité élevée et un temps de réponse rapide. Toutefois il ne peut être utilisé que pour des expérimentations et pas pour des dispositifs de sécurité car il n’est pas homologué pour cela. Il faut par ailleurs attendre 24 heures de préchauffage pour améliorer la précisions des mesures.

Il est sensible aux gaz suivants : Méthane (CH4), Butane (C4H10), GPL (Propane (C3H8) + Butane), hydrogène (H2) ainsi qu’aux alcools et aux fumées.

Le datasheet de ce capteur est disponible ICI.

Mon breakout comporte à la fois :

  • Une sortie numérique DOUT passant de 1 à 0 à partir d’un certain pourcentage de gaz détecté, celle-ci peut être branchée sur un voyant lumineux ou un buzzer par exemple pour prévenir de la présence de gaz,
  • une sortie analogique VOUT permettant de déterminer la concentration en gaz au prix de quelques calculs …

Sur le breakout que j’ai utilisé, le seuil de déclenchement pour le passage de DOUT de 1 à 0 est réglable à l’aide d’un potentiomètre (en bleu sur la photo de la face arrière de mon breakout ci-dessus).

Mise en œuvre :

Nous allons voir un montage utilisant un Arduino et un beakout MQ-2 permettant de détecter la présence de gaz GPL et de mesurer sa concentration en ppm (Partie par million, 10 000 ppm = 1%).

Montage :

Le circuit réalisé est très simple. Les branchements entre le breakout MQ-2 et l’Arduino sont détaillés ci-dessous :

phmarduino_mq2_montage

La valeur analogique renvoyée par le capteur via VOUT est lue par l’Arduino sur la patte A0.

La valeur numérique renvoyée par le capteur via DOUT est lue par l’Arduino sur la patte D12

Par ailleurs sur la plaque d’essai que l’on peut voir sur la photo de ma réalisation ci-dessous, deux LEDS sont ajoutées  en série avec des résistances d’environ 200 Ohms:

  • Une LED rouge branchée sur DOUT pour indiquer une détection de gaz,
  • Une LED verte indiquant un calibrage du détecteur en cours comme on le verra plus loin.

phmarduino_mq2_montage_photo_reduit

Code Arduino :

Le code ci-dessous disponible ICI est inspiré d’un exemple trouvé sur internet à l’adresse http://www.instructables.com/id/How-to-Detect-Concentration-of-Gas-by-Using-MQ2-Se/

/**************************************************************************** 
  Auteur : phmarduino
  Sketch : mq2_ppm_gpl.ino
  Date:2/9/2017 
  Description : Detection de gaz combustible avec un capteur MQ2 
  Inspire du source suivant :
  http://www.instructables.com/id/How-to-Detect-Concentration-of-Gas-by-Using-MQ2-Se/
****************************************************************************/

/************************Hardware Related Macros************************************/

const int calibrationLed=13;         // Sortie pour la LED indiquant un calibrage en cours
const int MQ_PIN=A0;                 // Entree analogique mesure tension retournee par le capteur
int RL_VALUE=1;                      // Load resistance en kilo ohms, 1 k ohm dans mon cas
float RO_CLEAN_AIR_FACTOR=9.8;       // RO_CLEAR_AIR_FACTOR = RS/RO avec air pur déduit du datasheet
 
/***********************Software Related Macros************************************/
int CALIBRATION_SAMPLE_TIMES=50;          //define how many samples you are going to take in the calibration phase
int CALIBRATION_SAMPLE_INTERVAL=500;      //define the time interal(in milisecond) between each samples in the
                                          //cablibration phase
int READ_SAMPLE_INTERVAL=50;              //define how many samples you are going to take in normal operation
int READ_SAMPLE_TIMES=5;                  //define the time interal(in milisecond) between each samples in 
                                          //normal operation
 
/**********************Application Related Macros**********************************/
#define         GAS_LPG             0   
 
/*****************************Globals***********************************************/
float           LPGCurve[3]  =  {2.3,0.2,-0.47};   //two points are taken from the curve. 
                                                    //with these two points, a line is formed which is "approximately equivalent"
                                                    //to the original curve. 
                                                    //data format:{ x, y, slope}; point1: (lg200=2.3, 0.2), point2: (lg10000=4, -0.6) 
float           Ro           =  10;                 //Ro is initialized to 10 kilo ohms

void setup()
{ 
  
  Serial.begin(9600);
  pinMode(calibrationLed,OUTPUT);
  pinMode(12,INPUT);
  digitalWrite(calibrationLed,HIGH); //Allumage de la LED verte indiquant un calibrage en cours dans un air pur

  Serial.println("Calibrage en cours (le capteur doit etre dans un air pur sans gaz) ...");                       
  
  Ro = MQCalibration(MQ_PIN);           // Lancement du calibrage avec de l air pur         
  digitalWrite(calibrationLed,LOW);     // Calibrage termine, extinction de la LED verte        
  
  Serial.println("Calibrage termine ... ");                                
  Serial.print("Ro = ");
  Serial.print(Ro);
  Serial.println(" K Ohm");
  delay(2000);
}
 
void loop()
{  
  long iPPM_LPG = 0;
  iPPM_LPG = MQGetGasPercentage(MQRead(MQ_PIN)/Ro,GAS_LPG); // Calcul ppm pour gaz GPL
  int DOUT = digitalRead(12);
  Serial.print("Concentration en gaz combustible GPL :  ");
    Serial.print(iPPM_LPG);
  Serial.print(" ppm - DOUT = ");   
  Serial.println(DOUT);
  delay(1000);
}
 
/****************** MQResistanceCalculation ****************************************/
// Calcul de la restistance RS du capteur dependant de la concentration en gaz
// avec la formule du pont diviseur de tension
float MQResistanceCalculation(int raw_adc)
{
  return ( ((float)RL_VALUE*(1023-raw_adc)/raw_adc));
}
 
/***************************** MQCalibration ****************************************/
// Calcul initilal de R0 sachant que RS/R0 egal à environ 9.8 en l absence de gaz
// comme indique dans le datasheet du MQ2
float MQCalibration(int mq_pin)
{
  int i;
  float val=0;

  for (i=0;i<CALIBRATION_SAMPLE_TIMES;i++) {            
    val += MQResistanceCalculation(analogRead(mq_pin));
    delay(CALIBRATION_SAMPLE_INTERVAL);
  }
  val = val/CALIBRATION_SAMPLE_TIMES;         
  val = val/RO_CLEAN_AIR_FACTOR;                                                      
  return val;                                  
}
 
/*****************************  MQRead *********************************************/
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 **********************************/
long MQGetGasPercentage(float rs_ro_ratio, int gas_id)
{
  if ( gas_id == GAS_LPG ) {
     return MQGetPercentage(rs_ro_ratio,LPGCurve);
  }    
  return 0;
}
 
/*****************************  MQGetPercentage **********************************/
long  MQGetPercentage(float rs_ro_ratio, float *pcurve)
{
  return (pow(10,( ((log10(rs_ro_ratio)-pcurve[1])/pcurve[2]) + pcurve[0])));
  // Il est important de bien utiliser la fonction log10 pas la fonction log de base
}


 

Résultats obtenus :

Après téléversement du code dans l’Arduino, il faut ouvrir le moniteur série.

Pendant la phase initiale de calibrage indiquée par un message dans le moniteur série et via la LED verte allumée, le capteur doit être dans un air pur sans gaz présent. A la fin de la phase de calibrage, la valeur de la résistance R0 trouvée est affichée.

Ensuite la concentration en ppm de GPL ainsi que l’indicateur de gaz détecté sont affichés en continu. Par ailleurs si du gaz est détecté, la LED rouge s’allume. Pour mémoire la sensibilité de détection pour l’allumage de cette LED est réglable avec le portentionmètre disponible sur mon breakout.

Pour faire un test de détection, il suffit d’approcher un briquet du capteur MQ-2.

Messages affichés dans le moniteur série :

On voit que dans mon cas la résistance R0 vaut 1.85 K Ohms

phmarduino_mq2_moniteur_serie.jpg

LED verte allumée pendant la phase de calibrage :

phmarduino_mq2_led verte_reduit

LED rouge allumée en détection de gaz :

phmarduino_mq2_led rouge_reduit

Quelques explications 🙂

La résistance RS du capteur qui dépend de la présence de gaz est insérée dans un montage classique de pont diviseur de tension :

phmarduino_mq2_diviseur de tension

Par ailleurs, le datasheet nous donne les courbes du ratio RS/R0 en fonction de la concentration en gaz en ppm (Attention les échelles sont en log décimal) :

phmarduino_mq2_datashett courbes.jpg

Cela permet lors de la phase de calibrage de trouver R0 car en effet la formule du pont diviseur de tension nous donne :

VOUT = VCC * RL / (RS + RL)

soit RS = RL * (VCC -VOUT) / VOUT = (VCC -VOUT) / VOUT car dans mon cas RL = 1 K Ohm

Une fois que l’on a VOUT, on peut donc en déduire RS, puis R0 on sait grace aux courbes sur le datasheet que RS/R0 est égal à environ 9.8 en l’absence de gaz dans de l’air pur.

Une fois le calibrage terminé et la valeur de R0 trouvée on peut désormais calculer le taux de gaz en effet on a toujours :

RS  = (VCC -VOUT) / VOUT

La tension mesurée sur A0 par l’Arduino nous permet donc de touver RS puis RS/R0 grace à la valeur de R0 trouvée précédement.

On peut ensuite grace au ration RS/R0 et les courbes dans le datasheet trouver graphiquement la valleur en ppm du GPL présent.

Pour éviter d’avoir à utiliser manuellement le graphique pour trouver la concentration en ppm à l’aide du ration RS/R0, on peut utiliser les équations détaillées ci-dessous.

Tout d’abord à l’aide du datasheet MQ-2 on calcule la pente de la droite en échelle log10 donnant les ppm GPL en fonction du ratio RS/R0 :

phmarduino_mq2_calcul pente

Cette pente est égale à -0.8 / 1.7 soit environ -0.47

A l’aide de cette pente, du point de coordonnées 2.3, 0.2 et d’un ratio RS/R0 donné on peut calculer trouver la concetration en ppm.

NB : On retrouve ces données dans le code Arduino en ligne 29 comme indiqué ci-dessous :

float           LPGCurve[3]  =  {2.3,0.2,-0.47};

Le calcul du ppm pour un ratio RS/R0 est détaillé ci-dessous :

phmarduino_mq2_calcul ppm

pente = -0,45 = (log10 (RS/R0) – 0.2) / ( log10(ppm) -2.3)

donc log10 (ppm) = 2.3 + (log10 (RS/R0) – 0.2) / – 0.45

soit ppm = 10 ^ (2.3 + (log10 (RS/R0) – 0.2) / – 0.45)

NB : On retrouve cette formule en ligne 117 dans le code Arduino.

Conclusions :

Nous avons vu comment utiliser un capteur MQ-2 pour détecter du gaz combustible ainsi que sa concentration.

Ce détecteur MQ-2 permettant de détecter plusieurs types de gaz, le calcul de la concentration en gaz ne peut être effectuée que si un seul gaz est présent. Dans ce cas pour avoir la concentration pour un gaz précis, il faut utiliser des capteurs spécialisés de la série MQ.

Il existe tout une série de capteur MQ permettant de détecter d’autres éléments comme :

  • MQ-3 : Alcool, Éthanol et fumées,
  • MQ-4 : Méthane (CH4),
  • MQ-5 : Gaz naturel, GPL (Butane et Propane),
  • MQ-6 : GPL, Butane,
  • MQ-7 : Monoxyde de carbone (CO),
  • MQ-8: Hydrogène (H2),
  • MQ-9 : Monoxyde de carbone (CO), Méthane (CH4), GPL),
  • MQ-131 : Ozone,
  • MQ-135 : Qualité de l’air,
  • MQ-136 : Sulfure d’hydrogène (H2S),
  • MQ-137 : Ammoniac,
  • MQ-138 : Formaldéhyde, Hydrogène (H2),
  • Etc.

 

Dans un prochain article disponible ICI sur les capteurs nous verrons le capteur de particule fine GP2Y10.

 

 

 


					
Publicités

2 réflexions au sujet de « Station de mesure – Les capteurs 2/ »

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s