Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
wiki:projets:open-air:home:journal:decembre [2016/03/30 10:34] sguillie créée |
wiki:projets:open-air:home:journal:decembre [2016/09/11 11:17] (Version actuelle) |
||
---|---|---|---|
Ligne 3: | Ligne 3: | ||
===== Matériel à disposition ===== | ===== Matériel à disposition ===== | ||
+ | |||
+ | ==== LATMOS ==== | ||
Pour caractériser un capteur, l' | Pour caractériser un capteur, l' | ||
Ligne 11: | Ligne 13: | ||
Le LATMOS possède 2 OSIRIS, 1 DUSTMATE, 2 POM et 1 NOx. | Le LATMOS possède 2 OSIRIS, 1 DUSTMATE, 2 POM et 1 NOx. | ||
- | Même si la qualité de ces appareils semble satisfaisante, | + | Même si la qualité de ces appareils semble satisfaisante, |
+ | |||
+ | ==== Fablab ==== | ||
+ | |||
+ | Les équipement du Fablab (découpe laser, photogravure, | ||
+ | |||
+ | ===== Caractérisation capteur ===== | ||
+ | |||
+ | On se propose ici d’effectuer l’étude de différents capteurs de gaz et de particules fines. En effet pour l’élaboration de nos capteurs il est intéressant d’avoir une indication sur le taux de NO2, d’ozone et des micro particules contenus dans l’air. L’objectif est de récupérer les données de ces capteurs et de tester leurs exactitudes. | ||
+ | |||
+ | ==== Listes des capteurs à tester ==== | ||
+ | |||
+ | Le Fablab possède différents capteurs de gaz qu'il est intéressant de tester: | ||
+ | |||
+ | |** Nom**|** Fonction**| | ||
+ | |MSQ-131|Détecteur de NO2, O3 et CL2| | ||
+ | |MICS-2714|Détecteur de NO2 et H2| | ||
+ | |SGX-4NO2 |Détecteur de NO2| | ||
+ | |MICS-2614|Détecteur de O3| | ||
+ | |SHARP GP2Y1010AU0F|Détecteur de PM 2.5| | ||
+ | |SHINYEI PPD42NS|Détecteur de PM 2.5| | ||
+ | |||
+ | ==== Mise en place du banc de test ==== | ||
+ | |||
+ | L’idée est de concevoir une expérience permettant de comparer deux capteurs différents. Le processus envisagé pour chacun des éléments sera le suivant. On prend pour chacun des produits à comparer au minimum 3 échantillons différents. On connecte tout ces échantillons à une Arduino Uno et on effectue les mesures pour une durée de quelques jours. Un instrument de mesure plus précis sera aussi installé pour cette même durée afin d’obtenir des résultats de référence. Il est possible d’émettre au cours du test différentes contraintes significative afin d’observer la réaction de chacun des éléments à tester. | ||
+ | |||
+ | ==== Capteur de particule fines ==== | ||
+ | |||
+ | |||
+ | Un capteur de particule, comme son nom l' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | D'un point de vue de l' | ||
+ | |||
+ | === Connectiques SHARP et SHINYEI=== | ||
+ | |||
+ | Pour chacun des composants à tester les branchements sont explicités dans la datasheet. | ||
+ | |||
+ | Pour le SHARP, l' | ||
+ | |||
+ | Les connections sur la LED sont définis de la manière suivante: | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Un signal créneau doit être envoyé sur la patte 3 du composant afin d' | ||
+ | |||
+ | Concernant le SHINYEI, le branchement est "plus classique" | ||
+ | |||
+ | Pour chacun des capteurs c'est la carte Arduino Uno qui est utilisée pour le traitement des données. Le stockage sera quant à lui réalisé sur une carte SD. La partie matériel étant définie il convient désormais de définir le code utilisé par l' | ||
+ | |||
+ | === Code V1 === | ||
+ | |||
+ | De part la nature du signal à mesurer on aura deux codes différents selon le capteur. Pour chacun la dernière version est décrite dans l' | ||
+ | |||
+ | < | ||
+ | ''// | ||
+ | |||
+ | #include < | ||
+ | |||
+ | #include < | ||
+ | |||
+ | // | ||
+ | int capteur;// | ||
+ | int sd_cs=4; // carte sd commande | ||
+ | int sd_mosi=11; | ||
+ | int sd_miso=12; | ||
+ | int sck_sd=13; | ||
+ | |||
+ | //Alim Led | ||
+ | int interupteur=2; | ||
+ | int charge=280; | ||
+ | int lecture=40; | ||
+ | float offTime=9680; | ||
+ | |||
+ | // | ||
+ | float in_max=1023.0; | ||
+ | float in_min=0; | ||
+ | float out_max=5.0; | ||
+ | float out_min=0; | ||
+ | float taux=0;// | ||
+ | unsigned long temps; | ||
+ | float tauxconv=0;// | ||
+ | float data=0; | ||
+ | |||
+ | //date | ||
+ | unsigned long jour=0; | ||
+ | unsigned long heure=0; | ||
+ | unsigned long minute=0; | ||
+ | unsigned long seconde=0; | ||
+ | |||
+ | //autre | ||
+ | unsigned long tempsmesure=30000; | ||
+ | unsigned long debut=0;// temps du début de la mesure | ||
+ | unsigned long totalduration=0; | ||
+ | int capteurmax=1000; | ||
+ | int compteur=0; | ||
+ | float somme[6]={0, | ||
+ | |||
+ | File fichier; | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | |||
+ | // init port série | ||
+ | |||
+ | Serial.begin(9600); | ||
+ | |||
+ | // | ||
+ | Serial.print(" | ||
+ | if (!SD.begin(sd_cs)) { | ||
+ | Serial.println(" | ||
+ | return; | ||
+ | } | ||
+ | Serial.println(" | ||
+ | delay(1000); | ||
+ | if (SD.exists(" | ||
+ | Serial.println(" | ||
+ | SD.remove(" | ||
+ | Serial.println(" | ||
+ | delay(1000); | ||
+ | } | ||
+ | pinMode(interupteur, | ||
+ | |||
+ | Serial.println(" | ||
+ | while (capteurmax> | ||
+ | if (Serial.available()> | ||
+ | capteurmax=Serial.read(); | ||
+ | capteurmax=capteurmax-' | ||
+ | Serial.println(capteurmax); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | fichier=SD.open(" | ||
+ | if (fichier) { | ||
+ | fichier.print(" | ||
+ | } | ||
+ | fichier.close(); | ||
+ | delay(100); | ||
+ | for (capteur=0; | ||
+ | delay(100); | ||
+ | fichier=SD.open(" | ||
+ | if (fichier) { | ||
+ | if (capteur< | ||
+ | | ||
+ | fichier.print(capteur); | ||
+ | fichier.print(";" | ||
+ | } | ||
+ | else{ | ||
+ | fichier.print(" | ||
+ | fichier.println(capteur); | ||
+ | } | ||
+ | fichier.close(); | ||
+ | } | ||
+ | else { | ||
+ | Serial.println (" | ||
+ | } | ||
+ | } | ||
+ | debut=millis(); | ||
+ | Serial.print(" | ||
+ | } | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | |||
+ | | ||
+ | |||
+ | digitalWrite(interupteur, | ||
+ | delayMicroseconds(charge); | ||
+ | //mesure du temps | ||
+ | temps= millis(); | ||
+ | if (temps> 86400000){ | ||
+ | jour= temps/ | ||
+ | temps=temps400000; | ||
+ | } | ||
+ | |||
+ | if (temps> 3600000){ | ||
+ | heure= temps/ | ||
+ | temps=temps600000; | ||
+ | } | ||
+ | |||
+ | if (temps> 60000){ | ||
+ | minute= temps/ | ||
+ | temps=temps`000; | ||
+ | } | ||
+ | |||
+ | seconde= temps/ | ||
+ | |||
+ | for (capteur=0; capteur< | ||
+ | //Lecture des données brut | ||
+ | |||
+ | | ||
+ | |||
+ | // conversion des données | ||
+ | tauxconv = conversion(taux, | ||
+ | data=conversion(tauxconv, | ||
+ | |||
+ | somme[capteur]= somme[capteur]+data; | ||
+ | } | ||
+ | // calcul de la durée de l' | ||
+ | totalduration=millis()-debut; | ||
+ | |||
+ | if (totalduration> | ||
+ | |||
+ | delayMicroseconds(lecture); | ||
+ | digitalWrite(interupteur, | ||
+ | for (capteur=0; capteur< | ||
+ | float average=0; | ||
+ | average= somme[capteur]/ | ||
+ | if(capteur==0){ | ||
+ | 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 "); | ||
+ | } | ||
+ | Serial.print (" | ||
+ | Serial.println(capteur); | ||
+ | // Serial.print(" | ||
+ | // Serial.println(taux conv); | ||
+ | Serial.print(" | ||
+ | Serial.println(average); | ||
+ | |||
+ | //stockage dans la carte sd | ||
+ | |||
+ | //ouverture du fichier | ||
+ | |||
+ | fichier=SD.open(" | ||
+ | |||
+ | if (fichier) { | ||
+ | Serial.print(" | ||
+ | // | ||
+ | if(capteur==0){ | ||
+ | fichier.print ("Jour "); | ||
+ | fichier.print (jour); | ||
+ | fichier.print (" ; "); | ||
+ | fichier.print (heure); | ||
+ | fichier.print (" h "); | ||
+ | fichier.print (minute); | ||
+ | fichier.print (" min "); | ||
+ | fichier.print (seconde); | ||
+ | fichier.print (" s ;"); | ||
+ | delay(100); | ||
+ | } | ||
+ | fichier.print(average); | ||
+ | fichier.print(";" | ||
+ | if (capteur==4){ | ||
+ | fichier.println(); | ||
+ | } | ||
+ | delay(1000); | ||
+ | // | ||
+ | |||
+ | fichier.close(); | ||
+ | Serial.println(" | ||
+ | } | ||
+ | else { | ||
+ | Serial.println (" | ||
+ | } | ||
+ | somme[capteur]=0; | ||
+ | } | ||
+ | |||
+ | compteur=0; | ||
+ | debut=millis(); | ||
+ | |||
+ | } | ||
+ | |||
+ | delayMicroseconds(lecture); | ||
+ | digitalWrite(interupteur, | ||
+ | delayMicroseconds(offTime); | ||
+ | } | ||
+ | |||
+ | // | ||
+ | float conversion (float in, float x_min, float x_max, float y_min, float y_max) | ||
+ | { | ||
+ | float out=0; | ||
+ | out = (in-x_max)*((y_max-y_min)/ | ||
+ | return out; | ||
+ | } | ||
+ | |||
+ | //capteur shinyei | ||
+ | |||
+ | #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=1000; | ||
+ | int pin; | ||
+ | |||
+ | unsigned long duration[7]={0, | ||
+ | unsigned long start=0; //heure de passage à l' | ||
+ | unsigned long stopp=0; //heure de passage à l' | ||
+ | unsigned long totallow[7]={0, | ||
+ | unsigned long debut=0;// temps du début de la mesure | ||
+ | unsigned long temps; //temps depuis le début du test | ||
+ | unsigned long tempsmesure=30000; | ||
+ | unsigned long totalduration=0; | ||
+ | float tauxparticules[7]={0.0, | ||
+ | float ratio[7]={0, | ||
+ | int etat[7]={1, | ||
+ | int previous[7]={1, | ||
+ | int jour=0; | ||
+ | int heure=0; | ||
+ | int minute=0; | ||
+ | int seconde=0; | ||
+ | File fichier; | ||
+ | |||
+ | void setup() { | ||
+ | |||
+ | //ouverture connection série | ||
+ | Serial.begin(9600); | ||
+ | |||
+ | // | ||
+ | | ||
+ | if (!SD.begin(sd_cs)) { | ||
+ | Serial.println(" | ||
+ | return; | ||
+ | } | ||
+ | Serial.println(" | ||
+ | delay(1000); | ||
+ | if (SD.exists(" | ||
+ | Serial.println(" | ||
+ | SD.remove(" | ||
+ | Serial.println(" | ||
+ | delay(1000); | ||
+ | } | ||
+ | |||
+ | Serial.println(" | ||
+ | while (capteurmax> | ||
+ | if (Serial.available()> | ||
+ | capteurmax=Serial.read(); | ||
+ | capteurmax=capteurmax-1-' | ||
+ | Serial.println(capteurmax); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // | ||
+ | fichier=SD.open(" | ||
+ | if (fichier) { | ||
+ | fichier.print(" | ||
+ | } | ||
+ | | ||
+ | | ||
+ | for (capteur=0; | ||
+ | pin=capteur+14; | ||
+ | pinMode (pin, INPUT); | ||
+ | delay(100); | ||
+ | fichier=SD.open(" | ||
+ | if (fichier) { | ||
+ | if (capteur< | ||
+ | | ||
+ | fichier.print(capteur); | ||
+ | fichier.print(";" | ||
+ | } | ||
+ | else{ | ||
+ | fichier.print(" | ||
+ | fichier.println(capteur); | ||
+ | } | ||
+ | fichier.close(); | ||
+ | } | ||
+ | else { | ||
+ | Serial.println (" | ||
+ | } | ||
+ | } | ||
+ | debut=millis(); | ||
+ | Serial.print(" | ||
+ | date(); | ||
+ | |||
+ | } | ||
+ | void loop() { | ||
+ | |||
+ | //boucle sur chaque capteur | ||
+ | for (capteur=0; | ||
+ | pin=capteur+14; | ||
+ | // Vérifie l' | ||
+ | previous[capteur]=etat[capteur]; | ||
+ | |||
+ | etat[capteur]=digitalRead (pin); | ||
+ | if(etat[capteur]==LOW && previous[capteur]==HIGH){ | ||
+ | start=millis(); | ||
+ | } | ||
+ | else if(previous[capteur]==LOW && etat[capteur]==HIGH){ | ||
+ | | ||
+ | duration[capteur]= stopp-start; | ||
+ | |||
+ | // | ||
+ | totallow[capteur]=totallow[capteur]+duration[capteur]; | ||
+ | |||
+ | } | ||
+ | } | ||
+ | |||
+ | // calcul de la durée de l' | ||
+ | totalduration=millis()-debut; | ||
+ | |||
+ | //affichage du taux de particule en pcs toute les 30 secondes | ||
+ | if (totalduration> | ||
+ | date(); | ||
+ | fichier=SD.open(" | ||
+ | fichier.print ("Jour "); | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | fichier.print (minute); | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | for (capteur=0; | ||
+ | Serial.print(" | ||
+ | Serial.println(capteur); | ||
+ | Serial.println (totallow[capteur]); | ||
+ | ratio[capteur] = (totallow[capteur]*100.0)/ | ||
+ | tauxparticules[capteur]=1.1*pow(ratio[capteur], | ||
+ | Serial.println (tauxparticules[capteur]); | ||
+ | fichier=SD.open(" | ||
+ | if (fichier) { | ||
+ | Serial.print(" | ||
+ | if (capteur< | ||
+ | fichier.print(tauxparticules[capteur]); | ||
+ | fichier.print(";" | ||
+ | } | ||
+ | else{ | ||
+ | fichier.println(tauxparticules[capteur]); | ||
+ | } | ||
+ | fichier.close(); | ||
+ | |||
+ | Serial.println(" | ||
+ | } | ||
+ | else { | ||
+ | Serial.println (" | ||
+ | } | ||
+ | totallow[capteur]=0; | ||
+ | duration[capteur]=0; | ||
+ | debut=millis(); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | void date () | ||
+ | { | ||
+ | temps=millis(); | ||
+ | if (temps> 86400000){ | ||
+ | jour= temps/ | ||
+ | temps=temps400000; | ||
+ | } | ||
+ | |||
+ | if (temps> 3600000){ | ||
+ | heure= temps/ | ||
+ | temps=temps600000; | ||
+ | } | ||
+ | |||
+ | if (temps> 60000){ | ||
+ | minute= temps/ | ||
+ | temps=temps`000; | ||
+ | } | ||
+ | |||
+ | seconde= temps/ | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | Serial.print (minute); | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== Capteurs de Gaz ==== | ||
+ | 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' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Pour chacun des capteurs à tester on aura une connectique légèrement différente, | ||
+ | |||
+ | ==== Code V1 ==== | ||
+ | |||
+ | Le code qui suit correspond à la première version utilisée pour nos tests. | ||
+ | |||
+ | <code =cpp> | ||
+ | #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; | ||
+ | unsigned long totalduration=0; | ||
+ | float mesure[6]={0.0, | ||
+ | float tension[6]={0.0, | ||
+ | float totaltension[6]={0.0, | ||
+ | float tauxgazs[6]={0.0, | ||
+ | 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); | ||
+ | |||
+ | // | ||
+ | | ||
+ | if (!SD.begin(sd_cs)) { | ||
+ | Serial.println(" | ||
+ | return; | ||
+ | } | ||
+ | Serial.println(" | ||
+ | delay(1000); | ||
+ | if (SD.exists(" | ||
+ | Serial.println(" | ||
+ | SD.remove(" | ||
+ | Serial.println(" | ||
+ | delay(1000); | ||
+ | } | ||
+ | |||
+ | // | ||
+ | //while (capteurmax> | ||
+ | // if (Serial.available()> | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | // } | ||
+ | //} | ||
+ | // capteurmax=capteurmax+14; | ||
+ | |||
+ | // | ||
+ | for (capteur=14; | ||
+ | pinMode (capteur, INPUT); | ||
+ | delay(100); | ||
+ | fichier=SD.open(" | ||
+ | if (fichier) { | ||
+ | if (capteur< | ||
+ | | ||
+ | fichier.print(capteur); | ||
+ | fichier.print(";" | ||
+ | } | ||
+ | else{ | ||
+ | fichier.print(" | ||
+ | fichier.println(capteur); | ||
+ | } | ||
+ | fichier.close(); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | debut=millis(); | ||
+ | Serial.print(" | ||
+ | date(); | ||
+ | |||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | compteur++ | ||
+ | //boucle sur chaque capteur | ||
+ | for (capteur=0; | ||
+ | |||
+ | // Mesure la tension du capteur | ||
+ | mesure[capteur]=analogRead(capteur); | ||
+ | // conversion des données | ||
+ | tension[capteur]= conversion(mesure[capteur], | ||
+ | |||
+ | // | ||
+ | totaltension[capteur]=(totaltension[capteur]+tension[capteur]/ | ||
+ | |||
+ | totalduration=millis()-debut; | ||
+ | |||
+ | //affichage du taux de gaz | ||
+ | if (totalduration> | ||
+ | date(); | ||
+ | fichier=SD.open(" | ||
+ | fichier.print ("Jour "); | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | fichier.print (minute); | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | for (capteur=0; | ||
+ | Serial.print(" | ||
+ | Serial.println(capteur); | ||
+ | Serial.println (tension[capteur]); | ||
+ | //faire conversion selon le capteur | ||
+ | //... | ||
+ | |||
+ | fichier=SD.open(" | ||
+ | if (fichier) { | ||
+ | Serial.print(" | ||
+ | if (capteur< | ||
+ | fichier.print(tension[capteur]); | ||
+ | fichier.print(";" | ||
+ | } | ||
+ | else{ | ||
+ | fichier.println(tension[capteur]); | ||
+ | } | ||
+ | fichier.close(); | ||
+ | |||
+ | Serial.println(" | ||
+ | } | ||
+ | else { | ||
+ | Serial.println (" | ||
+ | } | ||
+ | |||
+ | duration[capteur]=0; | ||
+ | debut=millis(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | // affichage de la date sur le port série | ||
+ | void date () | ||
+ | { | ||
+ | temps=millis(); | ||
+ | if (temps> 86400000){ | ||
+ | jour= temps/ | ||
+ | temps=temps400000; | ||
+ | } | ||
+ | |||
+ | if (temps> 3600000){ | ||
+ | heure= temps/ | ||
+ | temps=temps600000; | ||
+ | } | ||
+ | |||
+ | if (temps> 60000){ | ||
+ | minute= temps/ | ||
+ | temps=temps`000; | ||
+ | } | ||
+ | |||
+ | seconde= temps/ | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | Serial.print (minute); | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | } | ||
+ | // | ||
+ | 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)/ | ||
+ | return out; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | =====9/ | ||
+ | |||
+ | Pour cette manipulation seul les composant de type SHARP ont été testés. Trois d' | ||
+ | |||
+ | L' | ||
+ | |||
+ | L' | ||
+ | |||
+ | Le but ici n'est pas tant d' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Après récupération des résultats plusieurs constats peuvent être fait. Tout d' | ||
+ | |||
+ | L' | ||
+ | |||
+ | Du point de vue résultats les capteurs semblent bien répondre aux contraintes extérieures, | ||
+ | |||
+ | ===== Bilan Décembre ===== | ||
+ | |||
+ | Ce premier mois à été d' | ||