Problème :Données erronées sur mon port série ????

Bonjour,

J'ai bien avancé dans ma machine à faire des gouttes pour les photographier ... Pour le moment je commande la led de l'arduino, mais par la suite je commanderais une électrovanne.

J'utilise une interface avec des sliders dans processing et envoie via le câble usb des valeurs vers la carte arduino.

Tout marche bien dans 98% des envois, mais de temps en temps les données reçues sont mauvaises ...

Pour vérifier, j'ai branché sur la carte un petit écran lcd qui m'affiche mes variables ... Et quelque fois, la variable ne correspond plus à ce que processing à envoyé ... ??? Et les nombres qui reviennent sont souvent les mêmes : 6464;3564;9564;10100 ....

J'ai essayé de mettre des poses un peu partout, mais rien n'y fait, si quelqu'un pouvais m'aider un peu .... J'en ai assez de voire cette loupiote clignoter, J'ai hâte de brancher mon électrovanne ...

Je vous mets ici mes codes :
Processing:

import processing.serial.*;
Serial port;

PFont fontA;
import controlP5.*;
ControlP5 controlP5;

int posgo =70;
int epaigo = 8;
int grossgo =12;

boolean toggleValue = false;

int NBG = 4;//Nombre de gouttes (de 1-5)1 slider - Tag A
int GG1s = 0;//Grosseur de la goutte ou temps d'ouverture de l'électrovanne (de 1ms à  5s) 3 sliders (1ms*100;10ms*100;1s*5) - Tag B
int GG10ms = 10;//Tag C
int GG1ms = 0;//Tag D
int TEGGtot=0;

int TECG1s = 0;//Temps entre chaque goutte (de 1ms à  5s) 3 sliders (1ms*100;10ms*100;1s*5) - Tag E
int TECG10ms = 10;//Tag F
int TECG1ms = 0;//Tag G

int TECGtot=0;

int TEGG = 1;//Temps entre Groupe de gouttes (de 1s à  20s) 1 slider - Tag H

int TDEC1s = 0;//Temps avant déclenchement de l'appareil photo (de 1ms à  5s) 3 sliders (1ms*100;10ms*100;1s*5) - Tag J
int TDEC10ms = 10;//Tag K
int TDEC1ms = 0;//Tag L
int TDECtot =0;

int DEB =0;// Bouton de validation de laché de gouttes



void setup() {
  
  size(600, 700);
  smooth();

  fontA = loadFont("ComicSansMS-16.vlw");
  textFont(fontA, 12);
  
  controlP5 = new ControlP5(this);
 
  controlP5.setColorForeground(0xff6666ff);
  controlP5.setColorBackground(0xff0000ff);
  controlP5.setColorLabel(0x0);
  controlP5.setColorValue(0xffffffff);
  controlP5.setColorActive(0xff6666ff);

  println("Available serial ports:");
  println(Serial.list());
  port = new Serial(this, Serial.list()[3], 19200);
  
  //Slider Nombre de gouttes
  controlP5.addSlider("NBG",0,5,4,10,75,300,10)
  .setLabel("");

  //Slider Grosseur de la goutte
  controlP5.addSlider("GG1s",0,5,0,10,140,300,10)
   .setLabel("");
  controlP5.addSlider("GG10ms",0,100,10,10,170,300,10)
   .setLabel("");
  controlP5.addSlider("GG1ms",0,100,0,10,200,300,10)
   .setLabel("");
 
  //Slider Temps entre chaque goutte
  controlP5.addSlider("TECG1s",0,5,0,10,270,300,10)
   .setLabel("");
  controlP5.addSlider("TECG10ms",0,100,10,10,300,300,10)
   .setLabel("  ");
  controlP5.addSlider("TECG1ms",0,100,0,10,330,300,10)
   .setLabel("");

  //Slider Temps entre Groupe de gouttes
  controlP5.addSlider("TEGG",0,20,5,10,400,300,10)
   .setLabel("");

  //Slider Temps avant déclenchement de l'appareil photo
  controlP5.addSlider("TDEC1s",0,5,0,10,490,300,10)
   .setLabel("");
  controlP5.addSlider("TDEC10ms",0,100,10,10,520,300,10)
   .setLabel("  ");
  controlP5.addSlider("TDEC1ms",0,100,0,10,550,300,10)
   .setLabel("");
  
  //Bouton de validation
  controlP5.addToggle("toggleValue",false,135,655,50,20);

}
 
 
  void draw() {
  background(0);
 
epaigo=((GG1s*1000 + GG10ms*10 + GG1ms)/20);
grossgo=((GG1s*1000 + GG10ms*10 + GG1ms)/15);  
TECGtot=((TECG1s*1000 + TECG10ms*10 + TECG1ms)/7); // Temps total en ms entre chaque goutte; 
TEGGtot=(TEGG*1000/20); 
TDECtot=(TDEC1s*1000 + TDEC10ms*10 + TDEC1ms);

ellipse (530,posgo, epaigo, grossgo);  
ellipse (530,posgo + TECGtot,epaigo, grossgo);
ellipse (530,posgo + TECGtot + TEGGtot,epaigo, grossgo);
ellipse (530,posgo + TECGtot*2 + TEGGtot,epaigo, grossgo);

  

fill(0xFFFFFFFF); // La couleur de remplissage texte
text("ARDUGOUTTE V1.0 Daniel WAMBACH 21-09-10",8,15); 
fill(0xFFFFccCC);
text("NOMBRE DE GOUTTES (2 par defaut)",10,65); 
text("GROSSEUR DES GOUTTES (200 par defaut)",10,130);
text("TEMPS ENTRE CHAQUE GOUTTE EN MS(300 ms par defaut)",10,260);
text("TEMPS ENTRE GROUPE DE GOUTTES EN SEC (5sec par defaut)",10,390);
text("TEMPS AVANT LE DECLENCHEMENT DE L'APPAREIL PHOTO (300 ms par defaut)",10,478);
text("    1 Ã  5 Gouttes",310,85); 
text(    NBG +"  Gouttes d'une grosseur de "+(GG1s*1000 + GG10ms*10 + GG1ms) + "  espacées de  " + (TECG1s*1000 + TECG10ms*10 + TECG1ms)+ "ms tombent tout les  "+  TEGG + " Secondes  ",10,600); 
text(   "L'appareil photo se déclenchera au bout de " + TDECtot + "ms ",10,635);
text("    Secondes",310,150);
text("    10 MiliSecondes",310,180);
text("    MiliSecondes",310,210);
text("     Secondes",310,280);
text("     10 MiliSecondes",310,310);
text("     MiliSecondes",310,340);
text("     1 Ã  20 Secondes",310,410);
text("     Secondes",310,500);
text("     10 MiliSecondes",310,530);
text("     MiliSecondes",310,560);
text("    VALIDATION",30,670);


delay(10);
  port.write(NBG);
  port.write('A');
  println (NBG);
  println ('A');
delay(10);
  port.write(GG1s);
  port.write('B');
  println (GG1s);
  println ('B');
delay(10);
  port.write(GG10ms);
  port.write('C');
  println (GG10ms);
  println ('C'); 
delay(10);
  port.write(GG1ms);
  port.write('D');
  println (GG1ms);
  println ('D'); 
delay(10);  
  port.write(TECG1s);
  port.write('E');
  println (TECG1s);
  println ('E');  
delay(10);
  port.write(TECG10ms);
  port.write('F');
  println (TECG10ms);
  println ('F');  
delay(10);
  port.write(TECG1ms);
  port.write('G');
  println (TECG1ms);
  println ('G');  
delay(10);
  port.write(TEGG);
  port.write('H');
  println (TEGG);
  println ('H');
delay(10);
  port.write(TDEC1s);
  port.write('J');
  println (TDEC1s);
  println ('J');  
delay(10);
  port.write(TDEC10ms);
  port.write('K');
  println (TDEC10ms);
  println ('K');  
delay(10);
  port.write(TDEC1ms);
  port.write('L');
  println (TDEC1ms);
  println ('L');  
delay(10);  

  if(toggleValue==true) {
    DEB=1;
    posgo=posgo+10;
  } else {
    DEB=0;
    posgo=70;
  }
  
delay(10);
  port.write(DEB);
  port.write('I');
  println (DEB);
  println ('I');

delay(10);
}

Et arduino

// --- Inclusion des librairies utilisées ---
#include <LiquidCrystal.h> // Inclusion de la librairie pour afficheur LCD 

// --- constantes des broches ---
const int RS=2; //declaration constante de broche 
const int E=3; //declaration constante de broche 
const int D4=4; //declaration constante de broche 
const int D5=5; //declaration constante de broche 
const int D6=6; //declaration constante de broche 
const int D7=7; //declaration constante de broche 


// --- Initialisation des fonctionnalités utilisées ---
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);// initialisation LCD en mode 4 bits 

int posgo=70;//initialisation des variables 
int epaigo=8;
int grossgo=12;
int TECGtot=200;
int TEGGtot=200;
int TDECtot=200;
int NBG=2;//Nombre de gouttes (de 1-5)1 slider - Tag A
int GG1s=0;//Grosseur de la goutte ou temps d'ouverture de l'électrovanne (de 1ms à   5s) 3 sliders (1ms*100;10ms*100;1s*5) - Tag B
int GG10ms=20;//Tag C
int GG1ms=0;//Tag D
int TECG1s=0;//Temps entre chaque goutte (de 1ms à   5s) 3 sliders (1ms*100;10ms*100;1s*5) - Tag E
int TECG10ms=30;//Tag F
int TECG1ms=0;//Tag G
int TEGG=5;//Temps entre Groupe de gouttes (de 1s à   20s) 1 slider - Tag H
int TDEC1s=0;//Temps avant déclenchement de l'appareil photo (de 1ms à   5s) 3 sliders (1ms*100;10ms*100;1s*5) - Tag J
int TDEC10ms=30;//Tag K
int TDEC1ms=0;//Tag L
int DEB=0;// Bouton de validation de laché de gouttes //Tag I

boolean toggleValue = false;

char buff[]="0000000000";

int ledpin=13; //choix de sortie 13 de l'arduino

void setup() {
  
Serial.begin(19200);// Vitesse de transfert vers le port série

pinMode(ledpin,OUTPUT);

lcd.begin(20,4); // Initialise le LCD avec 20 colonnes x 4 lignes 

delay(10); // pause rapide pour laisser temps initialisation

// Test du LCD

lcd.print("LCD OK") ; // affiche la chaîne texte - message de test
delay(2000); // pause de 2 secondes

lcd.clear(); // // efface écran et met le curseur en haut à gauche
delay(10); // pour laisser temps effacer écran
}

void loop() {
    
lcd.clear(); // // efface écran et met le curseur en haut à gauche
delay(10); // pour laisser temps effacer écran
  
lcd.setCursor(0, 0) ; // 10ème col - 2ème ligne - positionne le curseur à l'endroit voulu (colonne, ligne) (1ère=0 !) 
lcd.print ("NB Goutte=") ; // affiche la chaîne texte - message de test
lcd.setCursor(14, 0) ;  
lcd.print (NBG) ;


lcd.setCursor(0, 1) ; 
lcd.print ("Grosseur=") ; 
lcd.setCursor(14, 1) ; 
lcd.print (grossgo) ;



lcd.setCursor(0, 2) ; 
lcd.print ("temps entre=") ; 
lcd.setCursor(14, 2) ;   
lcd.print (TECGtot) ; 



lcd.setCursor(0, 3) ; 
lcd.print ("groupe=") ; 
lcd.setCursor(14, 3) ;  
lcd.print (TEGGtot) ; 


for (int nb=0; nb<NBG; nb++) {
  digitalWrite(ledpin, HIGH);   // allume la LED
  delay(grossgo);               //Pendant grosseur goutte
  digitalWrite(ledpin, LOW);    // Ã?©teint la LED
  delay(TECGtot);               // Pendant temps entre chaque gouttes
  
}
  
  delay(TEGGtot);
 delay(100);
 
  while (Serial.available()>0) {
    
    for (int i=0; i<10; i++) {
        buff[i]=buff[i+1];
       
      }
      
      buff[10]=Serial.read();
        
    
          if (buff[10]=='A') { // Test la lettre envoyer sur le port série et en prends la valeur qui la precede
        NBG=int(buff[9]);
      }
         if (buff[10]=='B') {
        GG1s=int(buff[9]);
      }
         if (buff[10]=='C') {
        GG10ms=int(buff[9]);
      }
         if (buff[10]=='D') {
        GG1ms=int(buff[9]);
      }
         if (buff[10]=='E') {
        TECG1s=int(buff[9]);
      }
         if (buff[10]=='F') {
        TECG10ms=int(buff[9]);
      }
         if (buff[10]=='G') {
        TECG1ms=int(buff[9]);
      }
         if (buff[10]=='H') {
        TEGG=int(buff[9]);
      }
         if (buff[10]=='I') {
        DEB=int(buff[9]);
      }
        if (buff[10]=='J') {
        TDEC1s=int(buff[9]);
      }
        if (buff[10]=='K') {
        TDEC10ms=int(buff[9]);
      }
        if (buff[10]=='L') {
        TDEC1ms=int(buff[9]);
      }
    
grossgo =(GG1s*1000 + GG10ms*10 + GG1ms); // taille de la goutte totale
TECGtot =(TECG1s*1000 + TECG10ms*10 + TECG1ms); // Temps total en ms entre chaque goutte; 
TEGGtot = TEGG*1000; //Temps total entre groupe de goutte;
TDECtot = (TDEC1s*1000 + TDEC10ms*10 + TDEC1ms);//Temps total avant declenchement de l'appareil photo;

  }
  
  delay(50);
}

Merci à vous,

Dan,