Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2014-12-04 10:26:15 Projet spiromètre processing - arduino

Guipoule
nouveau membre
Date d'inscription: 2014-12-04
Messages: 3

Projet spiromètre processing - arduino



Bonjour à tous!

Je fais actuellement connaissance avec les joies d'un semestre d'études à l'étranger, et aussi avec ses problèmes dues à la clarté de l'organisation.
Je me retrouve donc à devoir faire un cours avec un projet utilisant Arduino et Processing dont je ne connaissais pas l'existence il y a quelques jours. Je dois fabriquer un spiromètre et récupérer sur ordinateur le volume d'air soufflé à l'intérieur ainsi que le débit d'air.
J'ai déjà le code Arduino (non je ne l'ai pas fait moi même, j'aurais bien aimé), et je dois donc utiliser Processing pour afficher les courbes de volume d'air et de débit.

Voici le code Arduino :

/* 
  This Spirometer meters air preassure difference made by
  human blow in pipe.
  This preassure difference is calculated to airflow and airvolume
  and displayed on monitor or display.
 
  Pipe has different surface area or (flow area) which causes
  the difference in preassure 
  */
 
  //include the encanhced ADC library
  #include <eRCaGuy_analogReadXXbit.h>
 
  //instantiate an object of this library class; call it "adc"
  eRCaGuy_analogReadXXbit adc;
  // Global variables
  const unsigned int sensor_pin = A3;       // preassure sensor analog pin
  const float MAX_READING_12_bit = 4092.0; 
 
  unsigned int start_time;
  unsigned int interval_time; 
  float airflow;
  float air_volume;
 
  void setup() {
    Serial.begin(115200);
    Serial.print("start! \n\n");
   
  }
 
  void loop() {
   
   
    boolean i = 0;
   
    while(ad_conversion() > 1.0) {    // measurement is on-going when treshold is over x.x Volts
      if(i = 0) {                     // Do once
        i = 1;
        start_time = millis();        // for curiosity measure how long the expiration lasts: stop_time - start_time
        interval_time = millis();
      }
     
      unsigned int current_time = millis();
      if((current_time - interval_time) >= 200) {  // Do the integration every 200ms       
        Serial.print("air volume : ");
        Serial.println(math_air_volume(airflow));  // send the cumulative air_volume
        interval_time = current_time;
      }
     
      float voltage = ad_conversion();
      float pressure = math_pressure(voltage);
      airflow = math_airflow(pressure);
           
      Serial.print("voltage : ");
      Serial.println(voltage);                    // send voltage (unneccesary)
      Serial.print("pressure : ");
      Serial.println(pressure);                  // send pressure (unimportant)
      Serial.print("airflow : ");     
      Serial.println(airflow);                   // send airflow
     
       
    }
   
    if(i = 1) {                                   // do this right after previous while() loop ends
      unsigned int time_of_event = 0;             // reset the time_of_event
      stop_time = millis();                       // set the stop time
      time_of_event = stop_time - start_time;
      Serial.print("time_of_event : ");
      Serial.println(time_of_event);              // send the expiration time
     
    }
    // A : initialize START and STOP events for measurement time
   
    // B : measure the voltage of preassure sensor between START/STOP events
     
    // C : math funktions to calculate airflow with voltage value
            // Vout = 5V(0.09*Pressure + 0.04);     // transfer function
            // Pressure = (Vout / 5V - 0.04)/0.09;  // constants may change
            // airflow = alpha * pressure + beta;   // alpha and beta are the linear constants
           
    // D : math funktions to calculate air volume with airflow
            // air_volume = (timeA-timeB) * airflow;
         
    // E : send the results to processing
    // F : repreat
  }
 
  /*.............FUNCTIONS.............*/
 
  float ad_conversion() {                                           // reads sensor value and converts it to voltage
    float analog_reading = adc.analogReadXXbit(sensor_pin, 12, 1);  // pin A0, 12bit, 1 sample average
    float Vout = analog_reading / 4095 * 5.0;
    return Vout;                                                    // returns voltage
  }
 
  float math_pressure(float Vout){                          // Vout (of sensor) is given to this function
     // Vout equals Vs(0.09*Pressure + 0.04) ± (5% Vfss)    // this is the transfer function, Vs = 5VDC +-0.25V
    float pressure = (Vout / 5 - 0.04)/0.09;                // constants may change due calibration
    return pressure;
  }
 
  float math_airflow(float pressure) {        // pressure is given to this function
    float alpha = 1;                          // constants for linear function
    float beta = 1;
    airflow = alpha * pressure + beta;
    return airflow;                          // returns airflow
  }
 
  float math_air_volume(float airflow) {       // airflow is given to this function
    air_volume = air_volume + 0.200 * airflow; // 200ms * airflow (unit?)
    return air_volume;                         // returns air volume
  }


En fouillant un peu partout dans des exemples et tutoriels, j'ai seulement écrit ceci :

import processing.serial.*;

Serial myPort;  // Create object from Serial class
String val;     // Data received from the serial port

String portName = Serial.list()[0]; //change the 0 to a 1 or 2 etc. to match your port
myPort = new Serial(this, portName, 9600);
void draw()
{
  if ( myPort.available() > 0)
  {  // If data is available,
  val = myPort.readStringUntil('\n');         // read it and store it in val
  }
println(val); //print it out in the console
}


J'ai donc plusieurs questions pour pouvoir continuer parce que je suis complètement noyé et il me faut boucler ce projet incessamment sous peu :
-dois-je recevoir les infos dans une boucle draw ou avec quelque chose appelé Serialevent comme sur cet exemple? http://www.iut-troyes.univ-reims.fr/wik … uinoProjet
-si j'ai bien compris, en utilisant readStringuntil() je vais recevoir des String sur processing, que je convertirais pour retrouver des floats pour tracer mes courbes, c'est ça?
-auriez-vous un bon tutoriel pour faire deux courbes pour mon volume et mon débit d'air, je n'en trouve pas...
-si vous avez tout tuyau ou bon site qui explique tout ça je suis preneur, ça fait plusieurs jours que j'épluche des sites pour avoir quelques idées.

Merci d'avance!!

Hors ligne

 

#2 2014-12-04 16:28:25 Re : Projet spiromètre processing - arduino

Guipoule
nouveau membre
Date d'inscription: 2014-12-04
Messages: 3

Re: Projet spiromètre processing - arduino



J'ai finalement trouvé un site pour mon code processing, et je commence à avoir les idées claires sur le fonctionnement. En faisant juste du copié collé qui ne correspond pas à mon cas j'ai ça :

import processing.serial.*; //import the Serial library
Serial myPort;  //the Serial port object
String val;
// since we're doing serial handshaking,
// we need to check if we've heard from the microcontroller
boolean firstContact = false;

void setup() {
  size(200, 200); //make our canvas 200 x 200 pixels big
  //  initialize your serial port and set the baud rate to 9600
  myPort = new Serial(this, Serial.list()[4], 9600);
  myPort.bufferUntil('\n');
}

void draw() {
  //we can leave the draw method empty,
  //because all our programming happens in the serialEvent (see below)
}

void serialEvent( Serial myPort) {
//put the incoming data into a String -
//the '\n' is our end delimiter indicating the end of a complete packet
val = myPort.readStringUntil('\n');
//make sure our data isn't empty before continuing
if (val != null) {
  //trim whitespace and formatting characters (like carriage return)
  val = trim(val);
  println(val);

  //look for our 'A' string to start the handshake
  //if it's there, clear the buffer, and send a request for data
  if (firstContact == false) {
    if (val.equals("A")) {
      myPort.clear();
      firstContact = true;
      myPort.write("A");
      println("contact");
    }
  }
  else { //if we've already established contact, keep getting and parsing data
    println(val);

    if (mousePressed == true)
    {                           //if we clicked in the window
      myPort.write('1');        //send a 1
      println("1");
    }

    // when you've parsed the data you have, ask for more:
    myPort.write("A");
    }
  }
}

Mais le problème est que je cherche à afficher deux valeurs différentes (le volume et de débit d'air), je me demandais comment les séparer dans val. Faut-il utiliser splitTokens() ou quelque chose d'autre?

Hors ligne

 

#3 2014-12-05 03:33:55 Re : Projet spiromètre processing - arduino

fabrice54
membre
Date d'inscription: 2012-06-07
Messages: 242

Re: Projet spiromètre processing - arduino



Bonjour.
Pour simplifier ton projet,tu télécharge FIRMATA standard dans ta carte Arduino,et ensuite ex:dans processing j'ai juste fais apparaître une valeur pour exemple.

Code (P5) :

import processing.serial.*;        
import cc.arduino.*;       
Arduino arduino; 
int val1;
int val2;
void setup(){
   println(Arduino.list()); 
     arduino = new Arduino(this, Arduino.list()[0], 57600); 
   size(500,500);  
     
}
void draw(){
  background(200);
  val1=arduino.analogRead(0);
  val2=arduino.analogRead(1);
  textSize(20);
  fill(255,0,0);
  text(val1,100,100);
  println(val2," ");
  
  
}

Hors ligne

 

#4 2014-12-05 09:25:17 Re : Projet spiromètre processing - arduino

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: Projet spiromètre processing - arduino



Je ne peux tester la validité de mon code mais je ferais un truc comme cela :

import processing.serial.*;
Serial myPort;
String val;
int suivant;
float fluxAir, volumeAir;

void setup() {
  size(200, 200);
  myPort = new Serial(this, Serial.list()[0], 115200);
  myPort.bufferUntil('\n');
}

void serialEvent(Serial myPort) {
  val = myPort.readStringUntil('\n');
  if (val != null) {
    if (val.equals("airflow : ")) {
      suivant = 1;
      return;
    }
    if (val.equals("air volume : ")) {
      suivant = 2;
      return;
    }
    switch (suivant) {
    case 1 :
      println("Flux d'air : " + val);
      fluxAir = Float.parseFloat(val); 
      suivant = 0;
      break;
    case 2 :
      println("Volume d'air : " + val);
      volumeAir = Float.parseFloat(val); 
      suivant = 0;
      break;
    }
  }
}

Hors ligne

 

#5 2014-12-05 11:24:45 Re : Projet spiromètre processing - arduino

fabrice54
membre
Date d'inscription: 2012-06-07
Messages: 242

Re: Projet spiromètre processing - arduino



regarde si cela va.

Code (P5) :

Hors ligne

 

#6 2014-12-06 04:17:27 Re : Projet spiromètre processing - arduino

fabrice54
membre
Date d'inscription: 2012-06-07
Messages: 242

Re: Projet spiromètre processing - arduino



Pas eus le temps de tester hier.Pour tes courbes il fraudas surement changer les valeurs dans l'instruction MAP et rebricoler le programme à ta convenance mais il fonctionne ;

Code (P5) :

Hors ligne

 

#7 2014-12-08 05:01:16 Re : Projet spiromètre processing - arduino

Guipoule
nouveau membre
Date d'inscription: 2014-12-04
Messages: 3

Re: Projet spiromètre processing - arduino



Oh super merci beaucoup! Je n'ai pas eu internet depuis vendredi, je viens de voir vos réponses, merci 100 fois! Je finis le projet cette semaine, je vous dirai le résultat. Merci encore! big_smile

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024