Suivi sur une ligne de production avec un encodeur .

Je crois que les pièces sont posées en vrac et avancent sur un tapis roulant et seule la première d’un nouveau lot doit être vérifiée

Mais bon ce serait effectivement bien que l’OP clarifie l’usage et l’intérêt de ne traquer que le premier produit d’un changement de lot - par curiosité intellectuelle

Bonsoir J-M-L;

Je suis ok. J'aimerais en savoir plus ! §...)

taktin à exciter ma curiosité :slight_smile: pour avoir aborder un process de production.

On dirait bien un projet d'alternance.

Salutations.

Je ne vous ai pas oublié...
J’ai juste manqué de temps cette semaine
Je regarde vos réponse et je vous reviens bientôt ..

Merci

bonjour/soir J-M-L,

Bon j'ai commencer a écrire un sketch mais comme je vous l'avait dit au départ je ne suis pas très avancé en programmation. je veut apprendre.
Je sais que le meilleur moyen d'apprendre est la pratique et les essaie/erreur mais je commence a manquer de temps et mon patron songe a passer a autre chose :(..
J'ai utilisé ce que je savais et quelque exemple afin de donner forme a mes idées pour vous donner le plus d'outil possible pour que vous puissiez m'aider sans faire le travail a ma place.

Je crois que les commentaire explique mieux comment mon tableau devrait fonctionner ( si toute fois ma vision fait de sens ....

svp pardonnez mon manque d'expérience. :frowning:

/* ce projet consiste à suivre la première pièce d'un lot accroché sur une ligne en boucle, c'est-à-dire que les pièces reviennent au point de départ pour être d'échange
* Plusieurs lots peuvent être présent sur la ligne en même temps ils sont accrochés une pièce à la fois .
* Un encodeur est connecté à Pin2 digital
* un tour complet compte 2500 impulsions d'encoder 
* 6 stations à des positions fix par rapport à l'encoder attendre que les comptes dans le tableau atteignent leurs positions 
* station 1 250 
* station 2 378 
* station 3 426 
* station 4 678 
* station 5 1107 
* station 6 2500   
* Un tableau 6x6 garde les comptes ( position de la première pièce de chaque lot  
* lorsque l'on commence à accrocher un nouveau lot sur la ligne on appuie sur le bouton départ ce qui démarre un nouveau compteur . 
* le bouton départ est connecté au pin 3 
* au départ tous les compteurs sont à (0) 
* si on appuie sur le bouton départ le premier compteur qui est a (0) dans le tableau se met à un et incrémente à chacun pulse d'encodeur  
* si une case est a (0) elle n'incrémente pas  
* si une des cases du tableau atteint la position d'une station l'output de cette sortie s'allimente pour 750 ms. 
* si une case atteint 2501 ou plus elle est remise à (0) et elle redevient disponible en cas de besoin.  
* anybox sont les valeurs dans les case du tableau qui sont en fonction( donc qui ne sont pas a 0 )
*/

 int pinMatrix[3][3] = {
 
  {0,  0,  0  },
 
  {0,  0,  0  },
 
  {0,  0, 0  }
 
};

 const int depart = 3;            // debut d'un nouveau lot
 const int encoder = 2;           // avance de la ligne
 int var;                         // valeur du compteur de pulse
 int boutonstate = 0;             //etat de l'encoder
 const int station1 = 4;          // station 1 250 pulses
 const int station2 = 5;          // station 2 378 pulses
 const int station3 = 6;          // station 3 426 pulses
 const int station4 = 7;          // station 4 678 pulses
 const int station5 = 8;          // station 5 1107 pulses
 const int station6 = 9;          // station 6 2500 pulses
 int freebox //freebox est la premiere case du tableau libre ( donc a  0 )
 
void setup(){
  pinMode(depart, INPUT);
  pinMode(encoder, INPUT);
  pinMode(station1, OUTPUT);
  pinMode(station2, OUTPUT);
  pinMode(station3, OUTPUT);
  pinMode(station4, OUTPUT);
  pinMode(station5, OUTPUT);
  pinMode(station6, OUTPUT);
  Serial.begin(9600); // pour diagnostique futur
  

  }


void encodeur(){
static int prevBoutonstate=LOW;
boutonstate = digitalRead(encoder);

if(boutonstate == HIGH  && prevBoutonstate==LOW)
{
  var++;
  Serial.println(var);
}
prevBoutonstate=boutonstate;

if(var == 2501)
{
  var = 0;
  
}

delay(10);
}


void station(){

 // si une des valeur du tableau egal 250 
 } if (anybox == 250) {
    digitalWrite(station1, HIGH);
    delay(750);
  } else {
    digitalWrite(station1, LOW);
  }
// si une des valeur du tableau egal 378
  if (anybox == 378) {
    digitalWrite(station2, HIGH);
    delay(750);
  } else {
    digitalWrite(station2, LOW);
  }
  // si une des valeur du tableau egal 426
  if (anybox == 426) {
    digitalWrite(station3, HIGH);
    delay(750);
  } else {
    digitalWrite(station3, LOW);
  }
  // si une des valeur du tableau egal 678
  if (anybox == 678) {
    digitalWrite(station4, HIGH);
    delay(750);
  } else {
    digitalWrite(station4, LOW);
  }
  // si une des valeur du tableau egal 1500
  if (anybox == 1500) {
    digitalWrite(station5, HIGH);
    delay(750);
  } else {
    digitalWrite(station5, LOW);
  }
  // si une des valeur du tableau egal 2500
  if (anybox == 2500) {
    digitalWrite(station6, HIGH);
    delay(750);
  } else {
    digitalWrite(station6, LOW);
    
  }
  }

//TABLEAU c'est la ou ca coince comment je peiut faire ca

void prochaincompter() {
 
  // si on appui sur le bouton " depart" on prend la prochaine case du tableau qui est libre (donc qui est a 0) et on inscrit (1) dedans
 // si une case n'est pas a (0) elle incremente de un a chaque pulse d'encoder
 // si elle attaint 2501 elle se met a (0)
  for(int i = 0; i < 3; i++){
 
    for(int j = 0; j < 3; j++){
 
      pinMode(pinMatrix[i][j], OUTPUT);
 
    }//close for i
 
  }//close for j
 
} //close setup()

Merci 1000*

Pour simplifier votre gestion des boutons (éventuellement y compris de l'encodeur,) utilisez la librairie de @bricoleau

vous aurez un bouton depart et un bouton tic et le code pourrait ressembler à un truc comme cela (tapé ici donc je ne sais pas si ça fonctionne mais c'est pour vous donner une idée sur le test dans le tableau)

#include <simpleBouton.h>

const byte pinDepart = 3; // debut d'un nouveau lot
const byte pinTic = 2; // un pas

simpleBouton boutonDepart(pinDepart);
simpleBouton tic(pinTic);

const byte pinStations[] = {4, 5, 6, 7, 8, 9};
const int etapeStations[] = {250, 378, 426, 678, 1107, 2500};
const byte nombreDeStations = sizeof(etapeStations) / sizeof(etapeStations[0]);

const byte maxObjetsEnCours = 20;
int objetsEnCours[maxObjetsEnCours];
int prochainObjet = 0;


void setup() {
  Serial.begin(115200);
  for (int i = 0; i < maxObjetsEnCours; i++) objetsEnCours[i] = -1; // pas commencé
  for (int i = 0; i < nombreDeStations; i++) pinMode(pinStations[i], OUTPUT); 
}

void loop() {

  // le bouton est-il appuyé ?
  if (boutonDepart) {
    Serial.println("Detection appui bouton");
    if (objetsEnCours[prochainObjet] == -1) {
      // la case est libre
      objetsEnCours[prochainObjet]  = 1; // ou 0, comme vous voulez. on est au début du tapis
      prochainObjet++; // on passe à la case suivante
      if (prochainObjet == maxObjetsEnCours) prochainObjet = 0; // si on est au bout on revient au début
    } else {
      // plus de cases dispo

      //
      // >>>  TRAITER LE CAS <<<<<
      //
    }
  }


  // a-t-on un tic
  if (tic) {
    Serial.println("un pas");
    for (int i = 0; i < maxObjetsEnCours; i++) {
      if (objetsEnCours[i] != -1) {
        // ce n'est pas une case libre
        objetsEnCours[i]++; // on augmente de 1
        for (int j = 0; j < nombreDeStations; j++) {
          if ( objetsEnCours[i] == etapeStations[j]) {
            // on a trouvé une station pour cet objet

            //
            // >>>  FAIRE QUELQUE CHOSE AVEC pinStations[j] <<<<<
            //

            if (j == (nombreDeStations - 1)) objetsEnCours[i] = -1; // c'était la dernière station, on libére la case
            break; // on sort du for j puisqu'on a trouvé une station
          } // fin de si on est arrivé à la station j
        } // fin de pour chaque station
      } // fin de si la case représente un objet en cours
    } // fin de pour chaque objet possible
  } 


}

Re bonjour

Bon j'ai enfin un model qui fonctionne assez bien Merci a Djamal et J-M-L pour vos exemples.
Je suis loin d’être devenu un pro mais j'ai beaucoup appris .
il me reste juste un problème a régler et je ne sais pas trop ce que je ne fait pas bien mais quand j'appuis sur le bouton (3) pour ajouter un ITEM et que je le maintient il ajoute a répétition même si j'ai mis une vérification de son état statechangedetection.....

Pourriez-vous m'aider avec ça svp j'ai vraiment essayer de placer ça de toute les façons mais j'ai toujours le même problème .

J'ai fait beaucoup d'autre changement pour adapter le programme a mes besoin mais il ne me reste que ça a régler

version avec statechangedetection (version sans statechangedetection )

Merci beaucoup

#include <simpleBouton.h> 
int Item_Conveyed=30;
bool start =0; 
bool starts[30];
int counter[30];
int timer = 20;       
const byte pinTic = 2;
const int  buttonPin = 3;
const int Station_Number1=4;
const int Station_Number2=12;
const int Station_Number3=15;
const int Station_Number4=22;
const int Station_Number5=30;
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button

simpleBouton tic(pinTic);

//const int Station_Location[]={48, 127, 302, 645};
int ledPins[] = { 4, 5, 6, 7, 8 };  // We have four leds that Simulate the four stations are connected to the ports 2, 7, 4 and 6
int Station_Count = 5;           // The number of Stations
int encoderState = 0;
void setup() {
  // the ports 2, 7, 4 and have to be configured as outputs
  for (int Station = 0; Station < Station_Count; Station++) {
    pinMode(ledPins[Station], OUTPUT);
    digitalWrite(ledPins[Station], HIGH);
    pinMode(buttonPin, INPUT);
  }
  
  
  pinMode(12, OUTPUT); // confirmation d'ajout d'ITEM
  pinMode(9, OUTPUT); //this port simulate the pulses of the system 
  pinMode(3, INPUT_PULLUP);  //This input port receive the start signal from the operator
  pinMode(2, INPUT);  //encoder
  Serial.begin(9600);

  // In the following for loop the Starts array as well as the counter Array are inilialised to zero
for (int j = 0; j < Item_Conveyed; j++) {
    starts[j]=0;
    counter[j]=0;
  }
}

void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) 
    // if the state has changed, increment the counter
    //if (buttonState == HIGH) 
   if (buttonState == HIGH) { // here we chack if thge operator pressed on the Start Button
      start=1;
      delay(500);
      
   }
    if (start==1){
      for (int i = 0; i < Item_Conveyed; i++) {
         if(starts[i]==0){
          starts[i]=1;
          counter[i]=0;
          digitalWrite(12, HIGH);
          delay(150);
          digitalWrite(12, LOW);
          Serial.print("The Item Number is: ");
          Serial.println(i);
          start=0;
          break;
         }

       }   
     }
if (tic) {
    Serial.print("Position ");
    Serial.println(counter[0]);
for (int k=0; k<Item_Conveyed; k++)
if (starts[k]==1){
  if (tic == HIGH);
  counter[k]++;
  digitalWrite(9, HIGH);
  delay(timer);
  digitalWrite(9, LOW);
  delay(timer); 
  
  switch (counter[k]) {
    case Station_Number1:
       Serial.print("Un Item No ");
       Serial.print(k);
       Serial.println(" est @ station 1");
       digitalWrite(4, LOW);
       delay(200);
       digitalWrite(4, HIGH);
      break;
    case Station_Number2:
        Serial.print("Un Item No ");
       Serial.print(k);
       Serial.println(" est @ station 2");
       digitalWrite(5, LOW);
       delay(200);
       digitalWrite(5, HIGH);
      break; 
    case Station_Number3:
        Serial.print("Un Item No ");
       Serial.print(k);
       Serial.println(" est @ station 3");
       digitalWrite(6, LOW);
       delay(200);
       digitalWrite(6, HIGH);
      break; 
    case Station_Number4:
       Serial.print("Un Item No ");
       Serial.print(k);
       Serial.println(" est @ station 4");
       digitalWrite(7, LOW);
       delay(200);
       digitalWrite(7, HIGH);
      break;  
    case Station_Number5:
      Serial.print(" ByeBye!!! Item No ");
      Serial.println(k); 
      Serial.println(" est @ station 5");
       digitalWrite(8, LOW);
       delay(200);
       digitalWrite(8, HIGH);
      starts[k]=0;
      counter[k]=0;
    break;
    default:
      // if nothing else matches, do the default
      // default is optional
      break;
  }
}

delay(timer);
}
}

version avant statechange detection

/*
  


 
 */
#include <simpleBouton.h> 
int Item_Conveyed=30;
bool start =0; 
bool starts[30];
int counter[30];
int timer = 20;       
const byte pinTic = 2;
const int Station_Number1=4;
const int Station_Number2=12;
const int Station_Number3=15;
const int Station_Number4=22;
const int Station_Number5=30;

simpleBouton tic(pinTic);

//const int Station_Location[]={48, 127, 302, 645};
int ledPins[] = { 4, 5, 6, 7, 8 };  // We have four leds that Simulate the four stations are connected to the ports 2, 7, 4 and 6
int Station_Count = 5;           // The number of Stations
int encoderState = 0;
void setup() {
  // the ports 2, 7, 4 and have to be configured as outputs
  for (int Station = 0; Station < Station_Count; Station++) {
    pinMode(ledPins[Station], OUTPUT);
    digitalWrite(ledPins[Station], HIGH);
  }
  
  
  pinMode(12, OUTPUT); // confirmation d'ajout d'ITEM
  pinMode(9, OUTPUT); //this port simulate the pulses of the system 
  pinMode(3, INPUT_PULLUP);  //This input port receive the start signal from the operator
  pinMode(2, INPUT);  //encoder
  Serial.begin(9600);

  // In the following for loop the Starts array as well as the counter Array are inilialised to zero
for (int j = 0; j < Item_Conveyed; j++) {
    starts[j]=0;
    counter[j]=0;
  }
}

void loop() {
   if (digitalRead(3)==1){ // here we chack if thge operator pressed on the Start Button
      start=1;
      delay(500);
      
   }
    if (start==1){
      for (int i = 0; i < Item_Conveyed; i++) {
         if(starts[i]==0){
          starts[i]=1;
          counter[i]=0;
          digitalWrite(12, HIGH);
          delay(150);
          digitalWrite(12, LOW);
          Serial.print("The Item Number is: ");
          Serial.println(i);
          start=0;
          break;
         }

       }   
     }
if (tic) {
    Serial.print("Position ");
    Serial.println(counter[0]);
for (int k=0; k<Item_Conveyed; k++)
if (starts[k]==1){
  if (tic == HIGH);
  counter[k]++;
  digitalWrite(9, HIGH);
  delay(timer);
  digitalWrite(9, LOW);
  delay(timer); 
  
  switch (counter[k]) {
    case Station_Number1:
       Serial.print("Un Item No ");
       Serial.print(k);
       Serial.println(" est @ station 1");
       digitalWrite(4, LOW);
       delay(200);
       digitalWrite(4, HIGH);
      break;
    case Station_Number2:
        Serial.print("Un Item No ");
       Serial.print(k);
       Serial.println(" est @ station 2");
       digitalWrite(5, LOW);
       delay(200);
       digitalWrite(5, HIGH);
      break; 
    case Station_Number3:
        Serial.print("Un Item No ");
       Serial.print(k);
       Serial.println(" est @ station 3");
       digitalWrite(6, LOW);
       delay(200);
       digitalWrite(6, HIGH);
      break; 
    case Station_Number4:
       Serial.print("Un Item No ");
       Serial.print(k);
       Serial.println(" est @ station 4");
       digitalWrite(7, LOW);
       delay(200);
       digitalWrite(7, HIGH);
      break;  
    case Station_Number5:
      Serial.print(" ByeBye!!! Item No ");
      Serial.println(k); 
      Serial.println(" est @ station 5");
       digitalWrite(8, LOW);
       delay(200);
       digitalWrite(8, HIGH);
      starts[k]=0;
      counter[k]=0;
    break;
    default:
      // if nothing else matches, do the default
      // default is optional
      break;
  }
}

delay(timer);
}
}

merci encore

Dans le premier code vous avez oublié de changer lastButtonState

Quitte à utiliser la librairie SimpleBouton, pourquoi ne pas l’utiliser aussi pour votre bouton comme dans mon code?

Bonjour C'est encore moi .
pour l'exemple no1 du message précèdent:

J'ai bien regardé la version avec statechangedetection mais je ne vois pas ou j'ai "oublié de changer lastboutonstate" désolé .

Avec simple bouton J'ai bien cru que tout était bon mais....

Quand je démarre le programme un item(0) est insérer automatiquement
Il y a aussi l'encoder incrémente à (0) mais ca ce n'est pas grave .
Donc quand la ligne avance J'ai automatiquement un item qui se balade avant que j'ai appuyé sur le bouton. sans ma modification simple bouton ca ne fessait pas ça .
je n'ai peut etre pas bien fait quelque chose mais je ne trouve pas ..

Vraiment désolé :confused: excusez mon ignorance mais je veux comprendre ce que j'ai fait de travers.

merci

exemple avec Simple bouton

/*
  
 Ce Programme est une simulation pour un convoyeur ayant quatres station situées
 aux endroits 100, 200, 300 et 400. 

A chaque fois qu'on veux mettre sur le convoyeur un 'Item' on pese sur le boutton 'Star'. 
Dans cet exercice on suppose que sur le convoyeur on 4 Items au maximum.

Quatres LED simulent signalent le passage des items par chacune des quatres stations.


 

 */

#include <simpleBouton.h> 
int Item_Conveyed=30;
bool start =0; 
bool starts[30];
int counter[30];
int timer = 20; 
const byte pinDepart = 3;      
const byte pinTic = 2;
const int Station_Number1=4;
const int Station_Number2=12;
const int Station_Number3=15;
const int Station_Number4=22;
const int Station_Number5=30;
simpleBouton tic(pinTic);
simpleBouton boutonDepart(pinDepart);
//const int Station_Location[]={48, 127, 302, 645};
int ledPins[] = { 4, 5, 6, 7, 8 };  // We have four leds that Simulate the four stations are connected to the ports 2, 7, 4 and 6
int Station_Count = 5;           // The number of Stations
int encoderState = 0;
void setup() {
  // the ports 2, 7, 4 and have to be configured as outputs
  for (int Station = 0; Station < Station_Count; Station++) {
    pinMode(ledPins[Station], OUTPUT);
    digitalWrite(ledPins[Station], HIGH);
  }
  
  
  pinMode(12, OUTPUT); // confirmation d'ajout d'ITEM
  pinMode(9, OUTPUT); //this port simulate the pulses of the system 
  pinMode(3, INPUT_PULLUP);  //This input port receive the start signal from the operator
  pinMode(2, INPUT);// encoder
  Serial.begin(9600);

  // In the following for loop the Starts array as well as the counter Array are inilialised to zero
for (int j = 0; j < Item_Conveyed; j++) {
    starts[j]=0;
    counter[j]=0;
  }
}

void loop() {
   if (boutonDepart){ // here we chack if thge operator pressed on the Start Button
      start=1;
      delay(500);
      
   }
    if (start==1){
      for (int i = 0; i < Item_Conveyed; i++) {
         if(starts[i]==0){
          starts[i]=1;
          counter[i]=0;
          digitalWrite(12, HIGH);
          delay(150);
          digitalWrite(12, LOW);
          Serial.print("The Item Number is: ");
          Serial.println(i);
          start=0;
          break;
         }

       }   
     }
if (tic) {
    Serial.print("Position ");
    Serial.println(counter[0]);
for (int k=0; k<Item_Conveyed; k++)
if (starts[k]==1){
  if (tic == HIGH);
  counter[k]++;
  digitalWrite(9, HIGH);
  delay(timer);
  digitalWrite(9, LOW);
  delay(timer); 
  
  switch (counter[k]) {
    case Station_Number1:
       Serial.print("Un Item No ");
       Serial.print(k);
       Serial.println(" est @ station 1");
       digitalWrite(4, LOW);
       delay(200);
       digitalWrite(4, HIGH);
      break;
    case Station_Number2:
        Serial.print("Un Item No ");
       Serial.print(k);
       Serial.println(" est @ station 2");
       digitalWrite(5, LOW);
       delay(200);
       digitalWrite(5, HIGH);
      break; 
    case Station_Number3:
        Serial.print("Un Item No ");
       Serial.print(k);
       Serial.println(" est @ station 3");
       digitalWrite(6, LOW);
       delay(200);
       digitalWrite(6, HIGH);
      break; 
    case Station_Number4:
       Serial.print("Un Item No ");
       Serial.print(k);
       Serial.println(" est @ station 4");
       digitalWrite(7, LOW);
       delay(200);
       digitalWrite(7, HIGH);
      break;  
    case Station_Number5:
      Serial.print(" ByeBye!!! Item No ");
      Serial.println(k); 
      Serial.println(" est @ station 5");
       digitalWrite(8, LOW);
       delay(200);
       digitalWrite(8, HIGH);
      starts[k]=0;
      counter[k]=0;
    break;
    default:
      // if nothing else matches, do the default
      // default is optional
      break;
  }
}

delay(timer);
}
}

exemple précedent sans simple bouton sur le bouton ITEM

/*
  


 
 */
#include <simpleBouton.h> 
int Item_Conveyed=30;
bool start =0; 
bool starts[30];
int counter[30];
int timer = 20;       
const byte pinTic = 2;
const int Station_Number1=4;
const int Station_Number2=12;
const int Station_Number3=15;
const int Station_Number4=22;
const int Station_Number5=30;

simpleBouton tic(pinTic);

//const int Station_Location[]={48, 127, 302, 645};
int ledPins[] = { 4, 5, 6, 7, 8 };  // We have four leds that Simulate the four stations are connected to the ports 2, 7, 4 and 6
int Station_Count = 5;           // The number of Stations
int encoderState = 0;
void setup() {
  // the ports 2, 7, 4 and have to be configured as outputs
  for (int Station = 0; Station < Station_Count; Station++) {
    pinMode(ledPins[Station], OUTPUT);
    digitalWrite(ledPins[Station], HIGH);
  }
  
  
  pinMode(12, OUTPUT); // confirmation d'ajout d'ITEM
  pinMode(9, OUTPUT); //this port simulate the pulses of the system 
  pinMode(3, INPUT_PULLUP);  //This input port receive the start signal from the operator
  pinMode(2, INPUT);  //encoder
  Serial.begin(9600);

  // In the following for loop the Starts array as well as the counter Array are inilialised to zero
for (int j = 0; j < Item_Conveyed; j++) {
    starts[j]=0;
    counter[j]=0;
  }
}

void loop() {
   if (digitalRead(3)==1){ // here we chack if thge operator pressed on the Start Button
      start=1;
      delay(500);
      
   }
    if (start==1){
      for (int i = 0; i < Item_Conveyed; i++) {
         if(starts[i]==0){
          starts[i]=1;
          counter[i]=0;
          digitalWrite(12, HIGH);
          delay(150);
          digitalWrite(12, LOW);
          Serial.print("The Item Number is: ");
          Serial.println(i);
          start=0;
          break;
         }

       }   
     }
if (tic) {
    Serial.print("Position ");
    Serial.println(counter[0]);
for (int k=0; k<Item_Conveyed; k++)
if (starts[k]==1){
  if (tic == HIGH);
  counter[k]++;
  digitalWrite(9, HIGH);
  delay(timer);
  digitalWrite(9, LOW);
  delay(timer); 
  
  switch (counter[k]) {
    case Station_Number1:
       Serial.print("Un Item No ");
       Serial.print(k);
       Serial.println(" est @ station 1");
       digitalWrite(4, LOW);
       delay(200);
       digitalWrite(4, HIGH);
      break;
    case Station_Number2:
        Serial.print("Un Item No ");
       Serial.print(k);
       Serial.println(" est @ station 2");
       digitalWrite(5, LOW);
       delay(200);
       digitalWrite(5, HIGH);
      break; 
    case Station_Number3:
        Serial.print("Un Item No ");
       Serial.print(k);
       Serial.println(" est @ station 3");
       digitalWrite(6, LOW);
       delay(200);
       digitalWrite(6, HIGH);
      break; 
    case Station_Number4:
       Serial.print("Un Item No ");
       Serial.print(k);
       Serial.println(" est @ station 4");
       digitalWrite(7, LOW);
       delay(200);
       digitalWrite(7, HIGH);
      break;  
    case Station_Number5:
      Serial.print(" ByeBye!!! Item No ");
      Serial.println(k); 
      Serial.println(" est @ station 5");
       digitalWrite(8, LOW);
       delay(200);
       digitalWrite(8, HIGH);
      starts[k]=0;
      counter[k]=0;
    break;
    default:
      // if nothing else matches, do the default
      // default is optional
      break;
  }
}

delay(timer);
}
}

:-[

J'ai bien regardé la version avec statechangedetection mais je ne vois pas ou j'ai "oublié de changer lastboutonstate" désolé .

vous faites

void loop() {
  buttonState = digitalRead(buttonPin);

  if (buttonState != lastButtonState)
    if (buttonState == HIGH) { // here we chack if thge operator pressed on the Start Button
      start = 1;
      delay(500);
    }

mais où affectez vous lastButtonState une fois la comparaison effectuée et le cas traité?


dans le code ci dessus avec la librairie de boutons, il ne faut pas mettre la pin 3 en INPUT_PULLUP  pinMode(3, INPUT_PULLUP);  //This input port receive the start signal from the operatorcar vous l'avez confié à la classe SimpleButton qui s'en charge pour vous

const byte pinDepart = 3;
simpleBouton boutonDepart(pinDepart);

encore plus grave pour l'encoder  pinMode(2, INPUT);// encodercar SimpleButton vous met en INPUT_PULLUP et vous l'enlevez...

ça ne sert à rien de causer lentement sur le port série... passez au moins à 115200 bauds

  Serial.begin(9600);

Dans mon code j'avais initialisé les objets à la position -1  for (int i = 0; i < maxObjetsEnCours; i++) objetsEnCours[i] = -1; // pas commencédans le votre vous les mettez à 0

  for (int j = 0; j < Item_Conveyed; j++) {
    starts[j] = 0;
    counter[j] = 0;
  }

le start ici ne sert à rien, utilisez juste le bouton...

if (boutonDepart) { // here we chack if thge operator pressed on the Start Button
    start = 1;
    delay(500);
  }
  if (start == 1) {

pour faire ce qu'il faut quand le bouton est appuyé. Le delay(500) est mortel pour la réactivité de votre système... virez le et le code devient donc

    for (int i = 0; i < Item_Conveyed; i++) {
      if (starts[i] == 0) {
        starts[i] = 1;
        counter[i] = 0;
        digitalWrite(12, HIGH);
        delay(150);
        digitalWrite(12, LOW);
        Serial.print("The Item Number is: ");
        Serial.println(i);
        break;
      }
    }

Qu'est-ce que vous avez en tête avec ce test ??        if (tic == HIGH);il ne sert à rien, il est viré par le compilateur

il y a bcp de delay() dans le code qui vont nuire à la réactivité.

Merci ça fonctionne à la perfection !!!
C'est la première fois que je cite quelqu’un
j'espère que j'ai fait ça comme il faut.

J-M-L:

dans le code ci dessus avec la librairie de boutons, il ne faut pas mettre la pin 3 en INPUT_PULLUP  pinMode(3, INPUT_PULLUP);  //This input port receive the start signal from the operatorcar vous l'avez confié à la classe SimpleButton qui s'en charge pour vous

const byte pinDepart = 3;

simpleBouton boutonDepart(pinDepart);




encore plus grave pour l'encoder`  pinMode(2, INPUT);// encoder`car SimpleButton vous met en INPUT_PULLUP et vous l'enlevez...

1. j'ai supprimé les deux pinMode pour 2 et 3 / je vais étudier la librairie simple bouton un peu mieux :)

ça ne sert à rien de causer lentement sur le port série... passez au moins à 115200 bauds


Serial.begin(9600);




2. J'avais mis à 9600 car si je met a 115200 je n'ai que des carrés et des "Space invader" dans le moniteur series. 

Dans mon code j'avais initialisé les objets à la position -1`  for (int i = 0; i < maxObjetsEnCours; i++) objetsEnCours[i] = -1; // pas commencé`dans le votre vous les mettez à 0

for (int j = 0; j < Item_Conveyed; j++) {
    starts[j] = 0;
    counter[j] = 0;
  }




3. j'ai mis int i=-1 et mon problème de départ est réglé



for (int i = -1; i < Item_Conveyed; i++) {
      if (starts[i] == 0) {
        starts[i] = 1;
        counter[i] = 0;
        digitalWrite(12, HIGH);
        delay(150);
        digitalWrite(12, LOW);
        Serial.print("The Item Number is: ");
        Serial.println(i);
        break;
      }
    }




le start ici ne sert à rien, utilisez juste le bouton...

if (boutonDepart) { // here we chack if thge operator pressed on the Start Button
    start = 1; }
4.  J'ai enlevé ce  delay(500);

  1. si j'enleve le Start=1 le bouton ajout ne fonctionne plus

if (start == 1) {


pour faire ce qu'il faut quand le bouton est appuyé. Le delay(500) est mortel pour la réactivité de votre système... virez le et le code devient donc


for (int i = 0; i < Item_Conveyed; i++) {
      if (starts[i] == 0) {
        starts[i] = 1;
        counter[i] = 0;
        digitalWrite(12, HIGH);
        delay(150);
        digitalWrite(12, LOW);
        Serial.print("The Item Number is: ");
        Serial.println(i);
        break;
      }
    }





Qu'est-ce que vous avez en tête avec ce test ??

6.0 j'ai aussi enlevé ce test c'étais une tentative que J'avait oublié
if (tic == HIGH);


il ne sert à rien, il est viré par le compilateur

il y a bcp de delay() dans le code qui vont nuire à la réactivité.

Super :slight_smile:

Pour la citation vous devez voir des balises [quote]...[/quote]il ne fait pas taper votre réponse au sein de la valise sinon comme vous pouvez le voir votre répouse se mélange à mon texte. Il faut mettre juste des petites balises [quote]...[/quote] en citant ce que vous voulez commenter au milieu et après la balises [/quote] mettre votre réponse

J'avais mis à 9600 car si je met a 115200 je n'ai que des carrés et des "Space invader" dans le moniteur series.

oui il faut passer la console aussi à 115200. Il y a un pop up menu avec les différentes vitesses, il doit afficher 9600 pour le moment, basculez sur 115200

j'ai mis int i=-1 et mon problème de départ est réglé

Non c’est certainement pas ça qui a réglé le pb, vous venez d’introduire un bug car

for (int i = -1; i < Item_Conveyed; i++) {
      if (starts[i] == 0) {
        starts[i] = 1;
        counter[i] = 0;
...

les tableaux n’ont pas d’indice -1 et si par hasard vous rentriez dans le If, vous vous mettriez à écrire n’importe où en mémoire; Mon point était plutôt de savoir si vous vouliez démarrer [nobbc]counter[i][/nobbc] à 0 ou -1

J-M-L:
Super :slight_smile:

:grin:

En général , un bon éléve disposant d'un excellent pédagogue à son écoute, obtient souvent de trés bons résulats

J-M-L:
Non c’est certainement pas ça qui a réglé le pb, vous venez d’introduire un bug car

for (int i = -1; i < Item_Conveyed; i++) {

if (starts[i] == 0) {
        starts[i] = 1;
        counter[i] = 0;
...



les tableaux n’ont pas d’indice -1 et si par hasard vous rentriez dans le If, vous vous mettriez à écrire n’importe où en mémoire; Mon point était plutôt de savoir si vous vouliez démarrer `[nobbc]counter[i][/nobbc]` à 0 ou -1

Arghh .. non c'est sur, je ne veux pas de Bug.

D’abord merci de votre patience M. J-M-L.

Je sais que j'ai beaucoup de chemin a faire mais j'aime bien apprendre ,meme si la j'avoue que je suis un peu découragé.(J'espère que ce n'est pas votre cas ). :stuck_out_tongue:

Juste pour être plus clair
voici ce que le moniteur série m'affiche au démarrage
qu'il m'affiche la position n'est pas un problème un compte d'encoder sur 8000 n'est pas vraiment un problème :slight_smile:

Position 0
The Item Number is: 0

J'ai essayer de remettre le for (int i = -1;... @ for (int i =0;... Mais je me retrouve avec le même problème un ITEM est inséré sur la ligne lors du démarrage du System.
Avec -1 pas de souci mais si ce n'est pas conseillé , je préfère éviter.Il n'y aurait pas un moyen de
ne pas executer cette ligne au démarrage ou d'ignorer " the item number = 0·"

Pour votre question au sujet de mon counter = 0; Pourquoi voulez-vous savoir si je veut 0 ou -1 ?
Je ne comprend pas .
Il s'agit de mon compteur de pulse d'encodeur donc je crois que 0 est correct . Non?!
J'ai encore allégé le code et retirer des choses qui ne servirons pas en fonction normal (Je les ai mis en commentaire).
```
*#include <simpleBouton.h>
int Item_Conveyed=30;
bool start =0;
bool starts[30];
int counter[30];
int timer = 20;
const byte pinDepart = 3;     
const byte pinTic = 2;
const int Station_Number1=4;
const int Station_Number2=12;
const int Station_Number3=15;
const int Station_Number4=22;
const int Station_Number5=30;
simpleBouton tic(pinTic);
simpleBouton boutonDepart(pinDepart);
//const int Station_Location[]={48, 127, 302, 645};
int ledPins[] = { 4, 5, 6, 7, 8 };  // We have four leds that Simulate the four stations are connected to the ports 2, 7, 4 and 6
int Station_Count = 5;          // The number of Stations
int encoderState = 0;
void setup() {
  // the ports 2, 7, 4 and have to be configured as outputs
  for (int Station = 0; Station < Station_Count; Station++) {
    pinMode(ledPins[Station], OUTPUT);
    digitalWrite(ledPins[Station], HIGH);
  }
 
 
  pinMode(12, OUTPUT); // confirmation d'ajout d'ITEM
  pinMode(9, OUTPUT); //this port simulate the pulses of the system
  //pinMode(3, INPUT_PULLUP);  //This input port receive the start signal from the operator
  //pinMode(2, INPUT);// encoder
  Serial.begin(115200);

// In the following for loop the Starts array as well as the counter Array are inilialised to zero
for (int j = 0; j < Item_Conveyed; j++) {
    starts[j]=0;
    counter[j]=0;
  }
}

void loop() {
  if (boutonDepart){ // here we chack if thge operator pressed on the Start Button
      start=1;
     
     
  }
    if (start==1){
      for (int i = 0; i < Item_Conveyed; i++) { //si je met int i = -1 ca fonctionne
        if(starts[i]==0){
          starts[i]=1;
          counter[i]=0;
          /*
          digitalWrite(12, HIGH);
          delay(10);
          digitalWrite(12, LOW);
          */
          Serial.print("The Item Number is: ");
          Serial.println(i);
          start=0;
          break;
        }


    }
if (tic) {
    Serial.print("Position ");
    Serial.println(counter[0]);
for (int k=0; k<Item_Conveyed; k++)
if (starts[k]==1){
  counter[k]++;
  /*
  digitalWrite(9, HIGH);
  delay(timer);
  digitalWrite(9, LOW);
  delay(timer);
  */

switch (counter[k]) {
    case Station_Number1:
      Serial.print("Un Item No ");
      Serial.print(k);
      Serial.println(" est @ station 1");
      digitalWrite(4, LOW);
      delay(200);
      digitalWrite(4, HIGH);
      break;
    case Station_Number2:
        Serial.print("Un Item No ");
      Serial.print(k);
      Serial.println(" est @ station 2");
      digitalWrite(5, LOW);
      delay(200);
      digitalWrite(5, HIGH);
      break;
    case Station_Number3:
        Serial.print("Un Item No ");
      Serial.print(k);
      Serial.println(" est @ station 3");
      digitalWrite(6, LOW);
      delay(200);
      digitalWrite(6, HIGH);
      break;
    case Station_Number4:
      Serial.print("Un Item No ");
      Serial.print(k);
      Serial.println(" est @ station 4");
      digitalWrite(7, LOW);
      delay(200);
      digitalWrite(7, HIGH);
      break; 
    case Station_Number5:
      Serial.print(" ByeBye!!! Item No ");
      Serial.println(k);
      Serial.println(" est @ station 5");
      digitalWrite(8, LOW);
      delay(200);
      digitalWrite(8, HIGH);
      starts[k]=0;
      counter[k]=0;
    break;
    default:
      // if nothing else matches, do the default
      // default is optional
      break;
  }
}

delay(timer);
}
}*
```
Encore Merci pour votre aide

Bonjour/soir,
Ca fait bientot 2 ans que c'est en fonction et tout fonctionne à merveille .
erci encore pour votre aide .