Table des matières

Capteurs de gaz

La mesure de l'ozone est une donnée essentiel pour la détermination de la qualité de l'air. En effet ce gaz est défini comme nocif pour la santé puisqu'il endommage les muqueuse respiratoire ayant ainsi pour conséquence plusieurs troubles respiratoires. L'ozone est naturellement présent dans les hautes couche de l'atmosphère est contribue notamment à  l'absorption des rayons UV du soleil avec la couche d'ozone. La présence de ce gaz est en revanche plus problématique en basse altitudes pour les raisons citée plus hauts. Sa formation est avant tout dut aux activités industrielles et de transport qui, en produisant des oxydes d'azotes, vont contribuer à la formation d'ozone. Il est ainsi primordiale de mesurer l'ozone (O3) d'une part, mais aussi le dioxyde d'azote (NO2) qui contribue à sa formation.

Les capteurs utilisées ici ont tous le mode de fonctionnement on notera néanmoins une différence volumique entre les CMS et les composants “classiques”.

Généralités

Matériel

Un capteur de gaz est un élément constitué de différentes couches de semi conducteurs sensible à la présence de certains composés gazeux. De manière générale l'objectif est de mesurer la valeur de la résistance interne du capteur qui va varier selon le taux de gaz présent dans l'air. En réalisant un pont diviseur de tension il est possible d'obtenir la valeur de cette résistance sensible. Il est aussi possible de noter la présence d'une résistance de chauffage qui aura pour but de placer le capteur dans les conditions optimal pour les mesures.

Pour chacun des capteurs à tester on aura une connectique légèrement différente, la logique restera néanmoins toujours la même. Les données seront récupérée via une carte Arduino uno et stockée sur carte SD. Il faut donc désormais définir le code à utiliser.

Code

Le code qui suit correspond à la dernière version utilisée pour nos tests.

#include <SPI.h>
 
#include <SD.h>
 
int sd_cs=4; // carte sd commande
int sd_mosi=11;
int sd_miso=12;
int sck_sd=13;
int capteur;
int capteurmax= 19;
 
unsigned long debut=0;// temps depuis le démarrage de la dernière mesure
unsigned long temps=0; //temps depuis le début du test
unsigned long tempsmesure=300000; //temps de moyennage avant affichage
unsigned long totalduration=0; //durée de la mesure
float mesure[6]={0.0,0.0,0.0,0.0,0.0};
float tension[6]={0.0,0.0,0.0,0.0,0.0}; // tension mesurée par chacun des capteurs
float totaltension[6]={0.0,0.0,0.0,0.0,0.0}; // moyenne des mesures
float tauxgazs[6]={0.0,0.0,0.0,0.0,0.0}; // concentration en particules
float in_max=1023.0;
float in_min=0;
float out_max=100.0;
float out_min=0;
 
int jour=0;
int heure=0;
int minute=0;
int seconde=0;
int compteur=0
File fichier;
 
void setup() {
 
  //ouverture connection série
Serial.begin(9600);
 
 //initialisation de la carte sd
 Serial.print("Initialisation de la carte SD...");
  if (!SD.begin(sd_cs)) {
    Serial.println("Carte non reconnue");
    return;
  }
  Serial.println("OK!");
delay(1000);
if (SD.exists("data.txt")==true){
  Serial.println("Supression des anciennes données...");
SD.remove("data.txt");
Serial.println("Fichier supprimé");
delay(1000);
}
 
//Serial.println("Saisir le nombre de capteur:");
//while (capteurmax>6){
//  if (Serial.available()> 0) {
//capteurmax=Serial.read();
//capteurmax=capteurmax-'0';
//Serial.println(capteurmax);
//  }
//}
//  capteurmax=capteurmax+14;
 
   //définition de la PIN comme entrée
for (capteur=14;capteur<=capteurmax; capteur++){
pinMode (capteur, INPUT);
delay(100);
fichier=SD.open("data.txt", FILE_WRITE);
    if (fichier) {
       if (capteur<19){
         fichier.print("Capteur");
      fichier.print(capteur);
      fichier.print(";");
      }
      else{
        fichier.print("Capteur");
      fichier.println(capteur);
      }
      fichier.close();
    }
 
}
debut=millis();
Serial.print("Debut mesure: ");
date();
 
}
 
void loop() {
compteur++
  //boucle sur chaque capteur
  for (capteur=0;capteur<=capteurmax-14; capteur++){
 
  // Mesure la tension du capteur
  mesure[capteur]=analogRead(capteur);
 // conversion des données
  tension[capteur]= conversion(mesure[capteur],in_min,in_max,out_min,out_max);
 
   //mesure de la durée total de l'état bas
  totaltension[capteur]=(totaltension[capteur]+tension[capteur]/compteur);
 
  totalduration=millis()-debut;
 
  //affichage du taux de gaz
  if (totalduration>= tempsmesure){
    date();
    fichier=SD.open("data.txt", FILE_WRITE);
    fichier.print ("Jour ");
 fichier.print (jour);
 fichier.print (";");
 fichier.print (heure);
 fichier.print (":");
  fichier.print (minute);
 fichier.print (":");
 fichier.print (seconde);
 fichier.print (";");
 fichier.close();
    for (capteur=0;capteur<=capteurmax-14; capteur++){
      Serial.print("Capteur ");
      Serial.println(capteur);
      Serial.println (tension[capteur]);
    //faire conversion selon le capteur
//...
 
    fichier=SD.open("data.txt", FILE_WRITE);
    if (fichier) {
      Serial.print("Enregistrement sur carte SD...");
      if (capteur<5){
      fichier.print(tension[capteur]);
      fichier.print(";");
      }
      else{
      fichier.println(tension[capteur]);
      }
      fichier.close();
 
      Serial.println("Enregistrement terminé");
    }
    else {
      Serial.println ("erreur à l'ouverture");
    }
 
    duration[capteur]=0;
    debut=millis();
  }
 }
    }
 
}
// affichage de la date sur le port série
void date ()
{
  temps=millis();
  if (temps> 86400000){
  jour= temps/86400000;
  temps=temps†400000;
  }
 
  if (temps> 3600000){
  heure= temps/3600000;
  temps=temps600000;
  }
 
  if (temps> 60000){
  minute= temps/60000;
  temps=temps`000;
  }
 
  seconde= temps/1000;
   Serial.print ("Jour ");
 Serial.print (jour);
 Serial.print (" ");
 Serial.print (heure);
 Serial.print (" h ");
  Serial.print (minute);
 Serial.print (" min ");
 Serial.print (seconde);
 Serial.println (" s ");
 
}
 //fonction conversion des données brutes
float conversion (int in, float x_min, float x_max, float y_min, float y_max)
{
  float out=0;
  out = (in-x_max)*((y_max-y_min)/(x_max-x_min))+y_max;
  return out;
}

Procédure de test

De manière à s'assurer du bon fonctionnement de nos capteurs il faut comparer les résultats récupérés avec ceux d'un instrument de mesure. On utilisera ici le Personal Ozone Monitor (POM). Au cour de l'expérience il faudra aussi faire en sorte d'ajouter des source d'ozone et d'azote afin de vérifier que les composants répondent bien aux contraintes externes.

Pour ce faire plusieurs solution sont possible. L'ozone est d'avantage présent quand un fort champ électrique est appliqué dans un espace confiné. Pour produire de l'ozone on utilisera donc un arc électrique qui viendra polluer notre enceinte de test.Dans le cas du dioxyde d'azote, celui-ci est produit de manière générale par les activités industriel intense ou part des pots d'échappements. Une simple combustion peut néanmoins être suffisante pour recréer une atmosphère polluée.

Les composants sont de types CMS, par conséquent l'implémentation sera plus délicate. L'idée est d'utiliser une carte de soudure “classique”. Les pastilles de ce type de surface sont trop larges pour les capteurs utilisés, on va donc les diviser en deux à l'aide d'un cuter. La démarche est délicate et nécessite de bien vérifier qu'il n'y est pas de faux contact, néanmoins les résultats sont satisfaisant puisqu'il est possible d'observer à l’oscilloscope une courbe de tension qui varie quand on applique quelques contraintes.