Partage
  • Partager sur Facebook
  • Partager sur Twitter

Arduino et commande d'une électrovanne

Test et contrôle d'une station de gonflage de bouteilles de plongée

    15 novembre 2019 à 11:52:31

    Bonjour,

    Je suis en train de réaliser un dispositif pour contrôler le pourcentage d'oxygène présent dans une bouteille de plongée.

    Pour info, en plongée, il est possible d'utiliser des mélanges respiratoires sur-oxygénés et selon le pourcentage d'O2, les paramètres de la plongée s'en trouvent modifiés.

    L'idée est dans un premier temps de contrôler le taux d'O2 et une fois atteint une valeur souhaitée, commander une electrovanne qui fermerait et/ou ouvrirait une bouteille de type B50, remplie d'O2 afin que le % d'O2 soit compris entre 30 et 32%.

    La partie matériel de ce projet est déjà fonctionnelle, je m'explique, la partie analyse et affichage du résultat fonctionne.

    En revanche, la partie commande soft de l'EV en fonction du % souhaité ....n'existe pas !

    Sur une base d'un programme existant que je souhaite bâtir l'extension commande électrovanne.

    Soyons clair.....je sèche !!!!!!!!!!!!!!!!!!!!!

    Si vous avez des pistes ou des solutions, je suis preneur.

    Merci de vos retours et coups de main éventuels.

    //////////////////////////////////////////////////////////////////////////////
    // Contrôle NITROX version 2.0
    //////////////////////////////////////////////////////////////////////////////

    #include <Wire.h>
    #include <LiquidCrystal.h>
    #include <Adafruit_ADS1015.h>
    #include <RunningAverage.h>


    Adafruit_ADS1115 ads;
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

    int opmode=0;
    int cnt;
    float oldRA;
    float sig1,sig,sig2;
    float relpourc;
    float gain = 0.0078125;
    float pour;
    RunningAverage RA(10);
    int samples=0;

    // Définition du gaz de référence
    float calibgas=20.95;

    void setup(void)
    {
    // Message d'accueil si besoin (nom, etc)
    lcd.begin(16, 2);
    lcd.setCursor(0,0);
    lcd.print("Arduitrox v1.0");
    lcd.setCursor(0,1);
    lcd.print("");
    delay(3000);
    Serial.begin(9600);
    ads.setGain(GAIN_SIXTEEN); // 16x gain 1 bit = 0.0078125mV
    ads.begin();
    oldRA=0;
    cnt=0;
    lcd.setCursor(0,0);
    lcd.print("Cal. auto");
    lcd.setCursor(0,1);
    lcd.print(" ");
    }


    void loop(void)
    {
    int16_t adc0;
    oldRA=RA.getAverage();
    adc0 = ads.readADC_Differential_0_1();
    RA.addValue(adc0);
    cnt=cnt+1;
    sig=(RA.getAverage()-oldRA)/oldRA;
    sig1=abs(sig);

    // Calibration Auto
    if (opmode==0) {
    if (sig1<0.0002) { // 0.0002
    samples=samples+1;
    } else {
    // samples = 0;
    }
    lcd.setCursor(0,1);
    lcd.print(RA.getAverage()*gain,2);
    lcd.print("mV ");
    lcd.print(calibgas,2);
    lcd.print("% ");
    lcd.setCursor(10,0);
    pour=samples/5;
    lcd.print(pour,0);
    lcd.print("% ");
    if ((RA.getAverage()*gain)<0.02) {
    lcd.setCursor(0,0);
    lcd.print("PANNE CELLULE O2");
    opmode=10;
    }
    Serial.print("CAL,");
    Serial.print(cnt);
    Serial.print(",");
    Serial.print(RA.getAverage()*gain,4);
    Serial.print(",");
    Serial.println(calibgas);
    if (samples==500) {
    samples=0;
    opmode=2;
    lcd.setCursor(0,0);
    lcd.print("CALIBR TERMINEE");
    lcd.setCursor(0,0);
    delay(3000);
    relpourc=100*calibgas/RA.getAverage();
    lcd.setCursor(0,0);
    lcd.print(" ");
    lcd.print(" ");
    lcd.begin(16, 2);
    delay(500);
    }
    }

    // Lecture des échantillons
    if (opmode==2) {
    lcd.setCursor(0,0);
    lcd.print("%O2: ");
    pour = RA.getAverage()*relpourc/100;
    lcd.print(pour,1);
    lcd.print(" ");
    lcd.setCursor(0,1);
    lcd.print("mV : ");
    lcd.print(RA.getAverage()*gain,2);
    lcd.print(" ");
    lcd.setCursor(10,0);
    if (sig1<0.0002) {
    lcd.print("====");
    } else {
    lcd.print(" ");
    }
    Serial.print("MES,");
    Serial.print(cnt);
    Serial.print(",");
    Serial.print(RA.getAverage()*gain,4);
    Serial.print(",");
    Serial.println(pour,2);
    delay(200);
    }

    // Calibration manuelle
    if ((analogRead(0)>600)&&(analogRead(0)<700)) {
    if (opmode<3) {
    opmode=3;
    samples=0;
    lcd.setCursor(0,0);
    lcd.print("Calibr. manuelle");
    lcd.setCursor(0,1);
    lcd.print(" ");
    delay(500);
    } else {
    lcd.setCursor(0,0);
    lcd.print(" ");
    lcd.setCursor(0,1);
    lcd.print(" ");
    delay(2000);
    lcd.setCursor(0,0);
    lcd.print("Cal. auto");
    lcd.setCursor(0,1);
    lcd.print(" ");
    opmode=0;
    }
    }
    if (opmode==3) {
    lcd.setCursor(0,1);
    lcd.print("%O2 REF: ");
    lcd.setCursor(9,1);
    lcd.print(calibgas,2);
    lcd.print(" ");
    if ((analogRead(0)==100)&&(calibgas<99)) {
    calibgas=calibgas+1;
    delay(100);
    }

    if ((analogRead(0)==0)&&(calibgas<100)) {
    calibgas=calibgas+0.05;
    delay(200);
    }

    if ((analogRead(0)==257)&&(calibgas>1)) {
    calibgas=calibgas-1;
    delay(100);
    }
    if ((analogRead(0)==411)&&(calibgas>0.05)) {
    calibgas=calibgas-0.05;
    delay(200);
    }
    }
    }

    • Partager sur Facebook
    • Partager sur Twitter
      18 novembre 2019 à 7:21:47

      Bonjour,

      Pour que ton code soit lisible, il faut le mettre entre balises </> (C+) dans l'éditeur.

      Tu peux aussi l'indenter pour que ça ressemble à quelque chose.

      Bonne continuation.

      • Partager sur Facebook
      • Partager sur Twitter

      Stringman | Jeux de plateforme : Nouvelle Démo. (màj : 09 janvier 2019)

      Arduino et commande d'une électrovanne

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      • Editeur
      • Markdown