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
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
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.
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
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
regarde si cela va.
Hors ligne
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 ;
Hors ligne
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!
Hors ligne
Pages: 1