====== 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. {{ :wiki:projets:open-air:home:gazsensor.png?nolink&516x222 }} 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 #include 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.