Le code Processing :
import processing.serial.*;
Serial myPort;
// variables pour les températures
float f_tempX = 0;
float f_tempX_MAX = 0;
float f_tempX_MIN = 100;
float f_tempY =0;
float f_tempY_MAX = 0;
float f_tempY_MIN = 100;
float f_tempZ =0;
float f_tempZ_MAX = 0;
float f_tempZ_MIN = 100;
//variables pour le temps qui passe
float delai;
int i_delai;
int i_t_stockage;
// canal pour la sauvegarde des données
PrintWriter FILE;
String fichier;
// variables pour l'affichage des données
int xdata = 55;
int ydata = 50;
int offsetdata = 20;
// variables pour le tracage des repères , c'est plus ou moins "dynamique" ^^ !
int x_repA = 300;
int y_repA = 36;
int x_repB = x_repA;
int y_repB = 436 ;
int x_repC = 1100;
int y_repC = y_repB;
int zero_ordonnee = (y_repB - y_repA)/5 ;
int x_leg = x_repA -20;
int y_leg = 20;
int intleg = (y_repB - y_repA)/20;
// Echelle complete , ici 50°C : de -10 à 40
float f_maxEchelle = 50;
float f_facteur = (y_repB - y_repA)/f_maxEchelle ; // facteur pour caler la température sur le repère
//int x1_TX=0; int y1_TX=0; int x2_TX=0; int y2_TX=0;
//int x1_TY=0; int y1_TY=0; int x2_TY=0; int y2_TY=0;
//int x1_TZ=0; int y1_TZ=0; int x2_TZ=0; int y2_TZ=0;
float x1_TX=x_repA, y1_TX=y_repB, x2_TX=0, y2_TX=0;
float x1_TY=x_repA, y1_TY=y_repB, x2_TY=0, y2_TY=0;
float x1_TZ=x_repA, y1_TZ=y_repB, x2_TZ=0, y2_TZ=0;
int i_tps = 0;
int i_limit = 0;
int interval = 20;
int i;
int offsetaffichage=0;
// Flags
boolean tracage = false; // tracage des courbes
boolean stockage = false; // sauvegarde des données
boolean creation_fichier = false;
void setup()
{
size(1200, 600);//largeur , hauteur)
textAlign(LEFT);
delay(100);
printArray(Serial.list()); // affiche les ports dispo
try {
myPort = new Serial(this, Serial.list()[0], 115200); // je choisis le premier
myPort.bufferUntil('\n');
}
catch(Exception e) {
println("soucis");
}
background(255, 255, 255); // couleur du fond , ici blanc
}
void draw()
{
// refresh datas
stroke(255, 255, 255); // contour
fill(255, 255, 255); // intérieur
rect(0, 0, xdata*5 - 35, ydata*7);
fill(0, 0, 0); // legende datas
if (i_delai>5)
{
if (f_tempX < f_tempX_MIN) {
f_tempX_MIN = f_tempX;
}
if (f_tempX > f_tempX_MAX) {
f_tempX_MAX = f_tempX;
}
if (f_tempY < f_tempY_MIN) {
f_tempY_MIN = f_tempY;
}
if (f_tempY > f_tempY_MAX) {
f_tempY_MAX = f_tempY;
}
if (f_tempZ < f_tempZ_MIN) {
f_tempZ_MIN = f_tempZ;
}
if (f_tempZ > f_tempZ_MAX) {
f_tempZ_MAX = f_tempZ;
}
}
//datas pour 1 sonde mais on peut en rajouter 2 voir plus mais faut rajouter du code
text("Home :", xdata-40, ydata);
// text("YY :", xdata-40, ydata+offsetdata);
// text("ZZ :", xdata-40, ydata+(2*offsetdata));
text("Tps :", xdata-40, ydata+(3*offsetdata));
text("Home", xdata+30, ydata+(5*offsetdata));
// text("YY", xdata+80, ydata+(5*offsetdata));
// text("ZZ", xdata+130, ydata+(5*offsetdata));
text("MIN:", xdata-40, ydata+(6*offsetdata));
text("MAX:", xdata-40, ydata+(7*offsetdata));
text(f_tempX_MIN, xdata+30, ydata+(6*offsetdata));
// text(f_tempY_MIN, xdata+80, ydata+(6*offsetdata));
// text(f_tempZ_MIN, xdata+130, ydata+(6*offsetdata));
text(f_tempX_MAX, xdata+30, ydata+(7*offsetdata));
// text(f_tempY_MAX, xdata+80, ydata+(7*offsetdata));
// text(f_tempZ_MAX, xdata+130, ydata+(7*offsetdata));
text("°C", xdata+50, ydata);
// text("°C", xdata+50, ydata+offsetdata);
// text("°C", xdata+50, ydata+(2*offsetdata));
text("min", xdata+50, ydata+(3*offsetdata));
fill(0, 0, 255);
text(f_tempX, xdata, ydata);
fill(0, 255, 0);
// text(f_tempY, xdata, ydata+offsetdata);
fill(255, 0, 0);
// text(f_tempZ, xdata, ydata+(2*offsetdata));
fill(0, 0, 0);
text(i_delai, xdata, ydata+(3*offsetdata));
strokeWeight(2); // epaisseur courbe
//courbe sonde 1
stroke(0, 0, 255);
x2_TX = x_repB + i_delai-offsetaffichage*800;
y2_TX = y_repB - zero_ordonnee - (f_tempX * f_facteur);
line(x1_TX, y1_TX, x2_TX, y2_TX);
x1_TX = x2_TX ;
y1_TX = y2_TX ;
//courbe sonde 2
/* stroke(0, 255, 0);
x2_TY = x_repB+i_delai-offsetaffichage*800;
y2_TY = y_repB - zero_ordonnee - (f_tempY * f_facteur);
line(x1_TY, y1_TY, x2_TY, y2_TY);
x1_TY = x2_TY ;
y1_TY = y2_TY ;
//courbe sonde 3
stroke(255, 0, 0);
x2_TZ = x_repB+i_delai-offsetaffichage*800;
y2_TZ = y_repB - zero_ordonnee - (f_tempZ * f_facteur);
line(x1_TZ, y1_TZ, x2_TZ, y2_TZ);
x1_TZ = x2_TZ ;
y1_TZ = y2_TZ ;
*/
stroke(0, 0, 0);
strokeWeight(2);
line(x_repA, y_repA-15, x_repB, y_repB+15);
strokeWeight(1);
if (tracage == false) {
tracer();
}
//creation du txt pour la sauvegarde des données
if (creation_fichier == false && fichier!= null)
{
println(fichier);
FILE = createWriter(fichier);
FILE.println("TempX TempY TempZ tps(sec)");
creation_fichier = true;
}
// ecriture des données dans le txt
if (stockage == true && creation_fichier == true)
{
FILE.print(f_tempX);
FILE.print(" ");
FILE.print(f_tempY);
FILE.print(" ");
FILE.print(f_tempZ);
FILE.print(" ");
FILE.println(i_delai);
FILE.flush();
stockage = false;
println("sauvegarde"); // On se rassure
}
// Remet les choses comme il faut une fois la premiere "page" du graphe rempli
if (i_delai >= 800*(offsetaffichage+1))
{
background(255, 255, 255);
x1_TX=x1_TX - 800;
x1_TY=x1_TY - 800;
x1_TZ=x1_TZ - 800;
offsetaffichage ++;
// i_delai2 = 0;
// refresh legende x
stroke(255, 255, 255); // contour
fill(255, 255, 255); // intérieur
rect(x_leg-30, 0, 45, y_repB+25);
// refresh legende y
stroke(255, 255, 255); // contour
fill(255, 255, 255); //intérieur
rect(x_repA+10, y_repC+17, 850, 20);
tracage = false;
}
}
// récupération des données du port série
void serialEvent(Serial myPort)
{
println("test");
String Temperatures = myPort.readString();
String[] Sonde = split(Temperatures, ' ');
f_tempX = Float.parseFloat(Sonde[0]);
// f_tempY = Float.parseFloat(Sonde[1]);
// f_tempZ = Float.parseFloat(Sonde[2]);
delai = Float.parseFloat(Sonde[1]);
i_delai=int(delai);
//i_delai = i_delai * 100;
// println(i_delai);
//println(Sonde[4]);
i_t_stockage= i_delai;
println(i_delai);
// println(f_tempX);
stockage = true;
//creation du nom de fichier du txt
String nomFichier ="";
nomFichier += Sonde[2]; // récupere le buff du setup de l'arduino ;)
nomFichier += ".txt";
fichier = nomFichier;
nomFichier = "";
}
// reperes, legende ,etc
void tracer()
{
int dec = -5;
tracage = true;
//legende repere x
fill(0, 0, 0);
text("(°C)", x_leg-14, y_repB- (21*intleg)-dec);
text("40", x_leg-15, y_repB- (20*intleg)-dec);
text("37,5", x_leg-15, y_repB- (19*intleg)-dec);
text("35", x_leg-15, y_repB- (18*intleg)-dec);
text("32,5", x_leg-15, y_repB- (17*intleg)-dec);
text("30", x_leg-15, y_repB- (16*intleg)-dec);
text("27,5", x_leg-15, y_repB- (15*intleg)-dec);
text("25", x_leg-15, y_repB- (14* intleg)-dec);
text("22,5", x_leg-15, y_repB- (13* intleg)-dec);
text("20", x_leg-15, y_repB- (12*intleg)-dec);
text("17,5", x_leg-15, y_repB- (11*intleg)-dec);
text("15", x_leg-15, y_repB- (10*intleg)-dec);
text("12,5", x_leg-15, y_repB- (9*intleg)-dec);
text("10", x_leg-15, y_repB- (8*intleg)-dec);
text("7,5", x_leg-15, y_repB- (7*intleg)-dec);
text("5", x_leg-15, y_repB- (6*intleg)-dec);
text("2,5", x_leg-15, y_repB- (5* intleg)-dec);
text("0", x_leg-15, y_repB- (4*intleg)-dec);
text("-2,5", x_leg-15, y_repB- (3*intleg)-dec);
text("-5", x_leg-15, y_repB- (2*intleg)-dec);
text("-7,5", x_leg-15, y_repB- (1*intleg)-dec);
text("-10", x_leg-15, y_repB- (0*intleg)-dec);
text("(Heure)", x_repA +800 +30, y_repB+ 30-dec);
//repere secondaire
stroke(200, 200, 200);
strokeWeight(1);
for (i=0; i<21; i++)
{
line(x_leg+15, y_repB- (i*intleg), x_repC +15, y_repB- (i*intleg));
}
for (i=1; i<14; i++)
{
line(x_repA+60*i, y_repB+15, x_repA+60*i, y_repA-15);
text((i)+offsetaffichage*13, x_repA+60*i -3, y_repB+ 30);
}
// repere
stroke(0, 0, 0);
strokeWeight(2);
line(x_repA, y_repA-15, x_repB, y_repB+15);
//line(x_repB, y_repB, x_repC, y_repC);
line(x_repA-5, y_repB-zero_ordonnee, x_repC+15, y_repB-zero_ordonnee);
}