Analyseur Trimix :.

Slides:



Advertisements
Présentations similaires
Premier programme en C :
Advertisements

La boucle for : init7.c et init71.c
Les fonctions A quoi ça sert ?
Introduction au Langage C,C++
A RECUPERER EN ENTRANT Le polycopié de Caml Partie 1
Rappels C.
Développement logiciel sur micro-contrôleurs PIC en C
Introduction au langage C
C++ 6ème cours Patrick Reuter maître de conférences
Fonctionnement des convertisseurs
Qualification de Plongeur TRIMIX élémentaire
la programmation en langage C
Exercice 1 1 (père) et 1 (fils) 1 (père) et 0 (fils)
M. BENJELLOUN : Info II Mohammed BENJELLOUN Service dInformatique Faculté Polytechnique de Mons
Tableaux Certains problèmes nécessitent beaucoup de variables du même type. Exemple : relevé de températures matin et soir dans 10 villes pour 10 jours.
Technique Chapitre 8 Amplificateurs opérationnels et circuits logiques
Bac Blanc Mickaël LEVERT
Regrouper des éléments de même type et pouvoir y accéder à laide dun identificateur et dun indice. Objectif des tableaux.
Langage C Révision.
Arduino en technologie
Outillage ! outils matériels de prototypage rapide
BENABEN, PEREZ Mini projet: Détection d’obstacle.
Base de programmation Script unity en c#.
Bases de la programmation en C++ 1 Les enchaînementsdinstruction Séquentiels. Exécutions dinstructions les unes à la suite des autres. Instructions séparées.
Architecture introduction.
Mesure de l’état de maturation et du taux d’humidité des fruits
Révision des notions OO et Java Semaine 1 Jian-Yun Nie.
IFT 6800 Atelier en Technologies d’information
PROTOTYPE D’UN PROGRAMME ÉCRIT EN C++ BASÉ SUR OPENGL
Le cours de F6KGL présenté par F6GPX
Procédures et fonctions
Formation C++. Hello World ! #include /* Commentaire sur plusieurs lignes */ int main() { //Affiche hello world std::cout
Faculté Polytechnique de Mons
L’essentiel du langage C
Les robots Mayotte – ISN
TENSION ENTRE DEUX POINTS - Utilisation du voltmètre
Capteur en sortie de vanne Capteur dans la piscine Servomoteur commandant la vanne Alim V Capteur dans le tuyau.
SPIP SPIP est le système de publication développé par le minirézo.
Les Pointeurs et les Tableaux Statiques et Tableaux Dynamiques
Informatique de gestion – IO MER L3 – Pierre SOURNAC Informatique de Gestion part III – the macro rises L3 – IO MER
CSI2520  Cette fonction permet d’attribuer une valeur à une variable (set! nombre (+ 3 4)) (set! nombre (+ 1 nombre)) En SCHEME, les fonctions dont le.
7ième Classe (Mardi, 24 novembre) CSI2572. Devoir 3 ?
Argc et argv Utilisation des paramètres de la ligne de commande.
Un survol du language C.
Etude de cas: carte 80C552++ ‘APPALACHES’
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Les erreurs communes en Java.
Théorie Nitrox confirmé compliqué 3/3 François GAILLARD Mars 2007.
Novembre 2014J.Callot L.Piedfort1 TP1 Enoncé. novembre 2014J.Callot L.Piedfort2 Objectifs Générer un environnement de travail avec Code Warrior Prendre.
Microcontrôleurs PIC. 1ère séance Présentation du PIC16F876 Outils de programmation du PIC Le langage C Exemples d’applications simples 2ème séance Présentation.
Fiabilisation des lectures au clavier. Problèmes liés à scanf: rencontre de caractères invalides Sans arrêt prématuré: compte = scanf(``%d%c``;&n,&c);
Conception de Programmes - IUT de Paris - 1ère année – Cours 8 – Les entrées/sorties Comment fonctionnent les opérateurs > pour les types élémentaires.
Classe 1 CSI2572 Autres modificateurs de déclaration de variables: & volatile & register & static & auto & extern & const volatile Indique au compilateur.
Enhanced Queued Analog-to-Digital Converter eQADC Lecture d’un niveau de tension sur un potentiomètre de la carte CPU.
1 Programmation en C++ Marianne Morris. 2 Intro générale à la programmation On a déjà étudié le langage assembleur Langage de bas niveau Meilleur que.
Pthread Ordonnancement. #define _MULTI_THREADED #include #ifndef _CHECK_H #define _CHECK_H /* headers used by a majority of the example program */ #include.
Conception de Programmes - IUT de Paris - 1ère année Conception de Programmes Objectifs et organisation du cours Introduction à la P.O.O.
Sommaire : La programmation arduino
TP1 Enoncé 12/08/2013 JC/LP/MD.
Mesurer l’intensité du courant qui circule dans ce circuit électrique
Mode d'emploi simplifié
PRO-1027 Programmation Scientifique en C
Exercices sur les pointeurs. lireCar/remettreCar Lorsque l’on lit caractère par caractère, on ne peut pas savoir qu’on a atteint un caractère avant de.
Algorithmique Algorithmique  Pascal
Meetup maker girls Arduino et Capteurs
Le grille pain   Un grille-pain est un appareil permettant de maintenir des tranches de certains aliments, notamment le pain, devant une source de.
Initiation à l’Arduino
M. BENJELLOUN : 2005 Le but final est de programmer un jeu où l'ordinateur choisira un nombre aléatoire entre 0 et 100 que vous devez deviner.
Eléments de base du langage C
Eléments de base du langage C
Transcription de la présentation:

Analyseur Trimix :

Principe :   Utilisation d’une cellule oxygène pour mesurer le taux d’O2 du mélange (30€) Utilisation d’un capteur de conductivité thermique MD62 pour mesurer le taux d’hélium (25€) Utilisation d’une carte Arduino pour gérer logiciellement le calibrage des capteurs, compenser la non linéarité, afficher le Trimix ou Nitrox analysé et le MOD associé (3€) Utilisation d’une carte ADS1115 pour mesurer précisément des tensions entre 5mV et 200mV (ce que ne sait pas faire la carte Arduino nativement) (3€) Utilisation d’un générateur de tension LM2596 pour alimenter le pont de Wheatstone du capteur MD62 en 3V (2€) Utilisation d’un limiteur de flux DIN pour doser le flux de gaz circulant dans l’analyseur (49€) Pile 9V remplacée par une batterie LiPo pour plus d’autonomie Le gaz à analyser rentre à l’extrémité d’un bout de tube PVC diamètre 32, passe sur le capteur MD62, puis sur la cellule O2, et ressort à l’autre extrémité du tube.

convertisseur ADC 16 bits les ingrédients : carte Arduino écran LCD 4 lignes I2C 2004 résistance variable 500 ohm générateur de tension LM2596 capteur de conductivité thermique MD62 convertisseur ADC 16 bits ADS1115 batterie liPo 11,1V 2 résistances 2k cellule oxy AO2 Citycell

cablage pont Wheatstone et mesure O2 : on ajuste la résistance variable pour avoir une tension en entrée de l’ADS 1115 proche de 0mV à l’air libre (quand le taux d’hélium = 0) générateur de tension réglé à 3V convertisseur ADS1115 résistance variable 500 ohm entrées analogiques cellule Oxy capteur MD62

Datasheet du MD62:

vue d’ensemble :

zoom sur le montage : entrée gaz tube PVC diam 32 cellule oxy carte Arduino capteur MD62 résistances 2k convertisseur ADS1115 sortie gaz générateur de tension réglé à 3V

Le programme dans l’Arduino (déclarations) : #include <Wire.h> #include <Adafruit_ADS1015.h> #include <RunningAverage.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 20 chars and 4 line display Adafruit_ADS1115 ads; // convertisseur analogique --> digital ADS1115 // variables will change: float TensionCalib = 0; // mise a 0 de la tension de calibrage de la cellule float voltage = 0; // tension mesuree sur cellule float wheatstone = 0; // tension sur pont de wheatsone float gain = 0.03125; // gain du convertisseur ADS1115 float calibMD62 = 661.26; // valeur de la tension du pont avec 100% helium float WheatCalib = 10; // mise a 0 de la tension de calibrage du pont à l'air float CorrFroid = 0 ; // correction de lecture du fait de lecture a froid (capteur pas assez chaud) unsigned long time; // mesure du temps depuis allumage pour ajuster correction RunningAverage RA0(10); // moyennage O2 sur 10 valeurs RunningAverage RA1(10); // moyennage He sur 10 valeurs

Le programme dans l’Arduino (setup) : for(i = 1; i <10 or (abs (voltage - (tensionMoyenne / (i-1)))) > 0.001; i++) { adc0 = ads.readADC_Differential_0_1(); RA0.addValue(adc0); voltage = abs(RA0.getAverage()*gain); tensionMoyenne = tensionMoyenne + voltage; delay(200); } lcd.clear(); lcd.setCursor(0,1); lcd.print(" Calibrage OK"); tensionMoyenne = tensionMoyenne / (i - 1); TensionCalib = tensionMoyenne; lcd.setCursor(0,2); lcd.print("V calib = "); lcd.print(TensionCalib,2); lcd.print("mV"); delay(2000); lcd.setCursor(0,0); lcd.print("Prechauffage du"); lcd.print(" capteur Helium..."); delay(500); while(wheatstone > 10){ adc1 = ads.readADC_Differential_2_3(); RA1.addValue(adc1); wheatstone = RA1.getAverage()*gain; lcd.setCursor(4,3); lcd.print("Vpont="); lcd.print(wheatstone,0); lcd.print("mV "); delay(50); lcd.print(" Capteur He OK"); void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); lcd.begin(); lcd.backlight(); lcd.print(" Analyseur Trimix"); ads.setGain(GAIN_FOUR); // 4x gain 1 bit = 0.03125mV ads.begin(); int16_t adc0; int16_t adc1; adc0 = ads.readADC_Differential_0_1(); RA0.addValue(adc0); voltage = abs(RA0.getAverage()*gain); adc1 = ads.readADC_Differential_2_3(); RA1.addValue(adc1); wheatstone = RA1.getAverage()*gain; // affichage de la tension lcd.setCursor(0,2); lcd.print("V cell = "); lcd.print(voltage,2); lcd.print("mV"); lcd.setCursor(0,3); lcd.print("V pont = "); lcd.print(wheatstone,2); delay(2000); lcd.clear(); lcd.setCursor(0,1); lcd.print(" Calib. en cours ..."); lcd.print("(utiliser de l'air)"); // determination de la tension moyenne de la cellule à l'air libre int i = 0; float tensionMoyenne = 0;

Le programme dans l’Arduino (loop) : lcd.setCursor(0,3); lcd.print("Vpont="); lcd.print(wheatstone,0); lcd.print("mV "); wheatstone = wheatstone - WheatCalib; if (time < 480000) { CorrFroid = 1 ; } // correction de la tension lue en fonction du temps de chauffe du capteur if (time < 360000) { CorrFroid = 2 ; } if (time < 300000) { CorrFroid = 3 ; } if (time < 270000) { CorrFroid = 4 ; } if (time < 240000) { CorrFroid = 5 ; } if (time < 210000) { CorrFroid = 6 ; } if (time < 180000) { CorrFroid = 7 ; } if (time < 165000) { CorrFroid = 8 ; } if (time < 150000) { CorrFroid = 9 ; } if (time < 120000) { CorrFroid = 10 ; } if (time < 105000) { CorrFroid = 11 ; } if (time < 90000) { CorrFroid = 12 ; } if (time < 80000) { CorrFroid = 13 ; } if (time < 70000) { CorrFroid = 14 ; } if (time < 60000) { CorrFroid = 15 ; } if (time < 50000) { CorrFroid = 16 ; } if (time < 40000) { CorrFroid = 17 ; } if (time < 30000) { CorrFroid = 18 ; } wheatstone = wheatstone - CorrFroid; // ajustement car capteur pas assez chaud lcd.setCursor(0,1); lcd.print("Helium = "); helium = 100 * wheatstone / calibMD62; if (helium > 50) { helium = helium * (1 + (helium - 50) * 0.4 / 100); } if (helium > 2) { lcd.print(helium,1); lcd.print("% "); else { helium = 0; lcd.print("0% "); void loop() { // put your main code here, to run repeatedly: int16_t adc0; int16_t adc1; adc0 = ads.readADC_Differential_0_1(); adc1 = ads.readADC_Differential_2_3(); time = millis(); // temps en ms depuis démarrage programme RA0.addValue(adc0); voltage = abs(RA0.getAverage()*gain); RA1.addValue(adc1); wheatstone = RA1.getAverage()*gain; float nitrox = 0; int MOD = 0; // valeur de MOD du mélange int EAD = 0; // prof equivalente Air pour narcose 30m float helium = 0; nitrox = voltage * (20.9 / TensionCalib); MOD = 10 * ( (160/nitrox) - 1); lcd.setCursor(0,0); if (voltage > 1) { lcd.print("Oxygene = "); lcd.print(nitrox,1); lcd.print("% "); lcd.setCursor(12,2); lcd.print(" MOD"); lcd.print(MOD); lcd.print("m"); if (MOD < 100) { lcd.print(" "); } else { lcd.print("Cell O2 HS !!! ");

Le programme dans l’Arduino (loop) : lcd.setCursor(0,2); if (helium > 0) { lcd.print("Trimix "); lcd.print(nitrox,0); lcd.print("/"); lcd.print(helium,0); lcd.print(" "); lcd.setCursor(12,3); lcd.print(" EAD"); EAD = 10 * ( 100 * 3.2 / (100 - helium - nitrox) -1 ); lcd.print(EAD); lcd.print("m"); if (EAD < 100) { } else { lcd.print("Nitrox "); lcd.print(" "); lcd.print(" ");

Les éléments à acheter :   Carte Arduino Uno : ici Ecran LCD 2004 I2C : ici Carte ADS1115 : ici Générateur de tension LM2596 : ici Capteur MD62 : ici Cellule oxy : ici Batterie LiPo 11,1V : ici le boitier : ici Limiteur de flux : ici