Problème compteur (compte plusieurs fois)

Bonjour à tous,

Mon problème de compteur a été solutionné il y a plusieurs semaines, cependant je suis confronté à un soucis avec certaines pièces qui coupe le faisceau laser et à des plantages réguliers. En gros je ne sais pas pourquoi, tout se bloque, l'horloge et le comptage et je ne peux reprendre la main, je dois faire un reset.

Je vous explique le problème auquel je suis confronté.

Si je compte des pièces opaques, pas de problème, mais lorsque je compte des pièces transparentes, je suis obligé de modifier la sensibilité du capteur. Le soucis c'est qu'étant plus sensible, je suis confronté à un problème de comptage irrégulier, il me compte, 2, voir 3 pièces. Solution, mettre un delay, mais ce n'est pas une bonne solution car il va falloir que je modifie ce délai si je fais de pièces plus petites et plus rapproché.

Voilà si vous avez une idée pour éviter le double comptage...

Merci

Bonjour
utiliser deux faisceaux laser parallèles et deux cellules à une distance égale à la largeur maximale d'un objet.
Au passage d'un objet le premier faisceau compte un objet puis se bloque tant que l'objet n'a pas coupé le deuxième faisceau.
A+

Merci pour ton aide, car je tourne en rond depuis 3 semaines.

C'est une bonne idée mais le problème c'est justement que les pièces n'ont pas toujours la même grandeur.

Je suis en train de regarder pour mettre en place une fonction booleen.

J'ai pas encore testé ce code avec la fonction booleen...

Par contre ça compile sans soucis

L'incrémentation du compteur se faisait à l'allumage de la led, je l'ai décalé pour faire l'incrémentation à l'extinction.

Bonjour
Il faut que la cellule détecte deux niveau: un niveau minimum quand un objet passe et un niveau maximum quand il n'y a pas d'objet. Un objet passe, le niveau descend en dessous du minimum le compteur compte +1 et se bloque tant que le niveau ne remonte pas au dessus du niveau maximum.Dans le programme: on a un drapeau (flag), on détecte le minimum, le flag est mis à un, on incrémente le compteur. Tant qu'il est à un, on attend un niveau maximum, un fois atteint le flag est remis à 0. On peut avoir deux potars un pour le minimum et un pour le maximum.
A+

En fait la detection fonctionne a merveille, c'est juste que le compteur lui s'affole.

Il faudrait juste que le compteur ne puisse s'incrementer qu'une fois par boucle.

Une interruption avec compteur++ ?

bonsoir
il manque une } entre
//compte = true;
}
}
else
..
A+

ça peut tout changer ?

ça ne compile pas...

Avec une oui

Bonjour
1°- serait-il possible d'avoir la totalité de ton programme après avoir enlever toutes les instructions précédées de //; c'est pas évident de suivre le déroulement.
2°- dans le morceau de programme que tu as fournit,
else {
digitalWrite( Ledverte,LOW) ;
s'applique au
if (compte==false) {
de ce fait
si mesureIR < potard, tu allume Ledverte; ensuite tu regardes si compte = false, si oui tu le mets true; lcd...
puis tu continues la boucle sans passer par else ...
A la boucle suivante si tu as toujours mesureIR < potard, compte étant true, tu vas dans le else où tu incrémentes le compteur et tu mets compte = false; puis tu continues la boucle.
A la boucle suivante si mesureIR est toujours < potard tu vas repasser dans if (compte ==false) {.
résultat: si l'objet est assez large pour que le programme ait le temps (suivant les delay's) de faire plusieurs boucles ton compteur sera plusieurs fois incrémenté pour le même objet.
C'est pourquoi (avec ce bout de programme) le else précité doit allez avec le if (mesureIR < potard).
Si cette condition est remplie on allume la led, on regarde si on est déjà passé [if (compte == false)] , lcd ...,
compte = true (on vient d'y passer) tant qu'on a mesureIR < potard on y passera plus. dès qu'on plus cette condition,
on passe par le else, on éteint le led, on incrémente les compteur et on réarme [compte = false] pour l'objet suivant.
Avec le programme que tu as donné, suivant la taille de l'objet et la durée de la boucle, ton compteur pouvait être incrémenté une ou plusieurs fois.
A+

J'ai dû enlever une partie du code, j'avais dépassé les 9500 caractères...

Bonjour
première analyse:
je pense que le problème vient du
do {

  • mesureIR = analogueRead(photoIR);*
  • }*
    While (mesureIR < potard;
    qui est sensée (je pense) tourner en boucle tant que l'objet passe dans le faisceau laser et ainsi on ne compte qu'une fois l'objet.
    le problème (je pense toujours) est que si la condition [mesureIR < potard] n'est pas remplie un court instant, on quitte cette boucle et on compte une ou plusieurs fois le même objet.
    A+

Oui je pensais comme toi, j'ai donc modifié cette ligne en remplaçant "potard" par 10, histoire de voir si le plantage se produisait. Résultat l'erreur se produit, l'affichage se fige et je dois rebooter la carte.

J'ai essayé de complètement supprimé cette partie du programme, en enlevant le do while. Idem, plantage.

J'en suis donc arrivé à la conclusion que la carte avait un problème, j'ai installé une carte neuve. Toujours le même soucis. J'ai également changé la carte DS1307, pensant que ma colle à chaud aurait pu l'abimer. Idem toujours le même plantage.

Je te remercie de t'interessé à mon soucis qui devant relativement gênant et sur lequel je cherche une solution depuis plusieurs jours.

Salut
Pourrais-tu joindre la totalité du projet ?
Ça sera plus simple pour pouvoir tester certaines modification et voir au niveau de la compilation.

2e partie du code :

// déclenchement lundi number 1

if (now.dayOfWeek() == 1 && now.hour() == 12 && now.minute() == 40 && now.second() == 58 ) {
  //EEPROM_writeAnything (0,compteurequipe); 
 lcd.setCursor (15,4);
 lcd.print (compteurequipe);
 delay (1000);
 lcd.setCursor (10,2);
 lcd.print ("         ");
 compteurequipe = 0;
 digitalWrite (Ledrouge, HIGH);
 
}
 
if (now.dayOfWeek() == 1 && now.hour() == 12 && now.minute() == 59 && now.second() == 58 ) {
lcd.setCursor (14,3);
 lcd.print ("------");
lcd.setCursor (14,4);
 lcd.print ("------");
 digitalWrite (Ledrouge, LOW);
 
}

// déclenchement Mardi number 2

if (now.dayOfWeek() == 2 && now.hour() == 12 && now.minute() == 40 && now.second() == 58 ) {
  //EEPROM_writeAnything (0,compteurequipe); 
 lcd.setCursor (15,4);
 lcd.print (compteurequipe);
 delay (1000);
 lcd.setCursor (10,2);
 lcd.print ("         ");
 compteurequipe = 0;
 digitalWrite (Ledrouge, HIGH);
 
}
 
 
if (now.dayOfWeek() == 2 && now.hour() == 12 && now.minute() == 59 && now.second() == 58 ) {
lcd.setCursor (14,3);
 lcd.print ("------");
lcd.setCursor (14,4);
 lcd.print ("------");
 digitalWrite (Ledrouge, LOW);
 
}

// déclenchement mercredi number 3

if (now.dayOfWeek() == 3 && now.hour() == 12 && now.minute() == 40 && now.second() == 58 ) {
  //EEPROM_writeAnything (0,compteurequipe); 
 lcd.setCursor (15,4);
 lcd.print (compteurequipe);
 delay (1000);
 lcd.setCursor (10,2);
 lcd.print ("         ");
 compteurequipe = 0;
 digitalWrite (Ledrouge, HIGH);
}
 
 
if (now.dayOfWeek() == 3 && now.hour() == 12 && now.minute() == 59 && now.second() == 58 ) {
lcd.setCursor (14,3);
 lcd.print ("------");
lcd.setCursor (14,4);
 lcd.print ("------");
 digitalWrite (Ledrouge, LOW);
 
}

// déclenchement jeudi number 4

if (now.dayOfWeek() == 4 && now.hour() == 12 && now.minute() == 40 && now.second() == 58 ) {
  //EEPROM_writeAnything (0,compteurequipe); 
 lcd.setCursor (15,4);
 lcd.print (compteurequipe);
 delay (1000);
 lcd.setCursor (10,2);
 lcd.print ("         ");
 compteurequipe = 0;
 digitalWrite (Ledrouge, HIGH);
}
 
 
if (now.dayOfWeek() == 4 && now.hour() == 12 && now.minute() == 59 && now.second() == 58 ) {
lcd.setCursor (14,3);
 lcd.print ("------");
lcd.setCursor (14,4);
 lcd.print ("------");
 digitalWrite (Ledrouge, LOW);
 
}



// ************* APRES MIDI *************

// déclenchement lundi number 1

if (now.dayOfWeek() == 1 && now.hour() == 20 && now.minute() == 40 && now.second() == 58 ) {
  //EEPROM_writeAnything (0,compteurequipe); 
 lcd.setCursor (15,4);
 lcd.print (compteurequipe);
 delay (1000);
 lcd.setCursor (10,2);
 lcd.print ("         ");
 compteurequipe = 0;
 digitalWrite (Ledrouge, HIGH);
 
}
 
 
if (now.dayOfWeek() == 1 && now.hour() == 20 && now.minute() == 59 && now.second() == 58 ) {
lcd.setCursor (14,3);
 lcd.print ("------");
lcd.setCursor (14,4);
 lcd.print ("------");
 digitalWrite (Ledrouge, LOW);
 
}

// déclenchement Mardi number 2

if (now.dayOfWeek() == 2 && now.hour() == 20 && now.minute() == 40 && now.second() == 58 ) {
  //EEPROM_writeAnything (0,compteurequipe); 
 lcd.setCursor (15,4);
 lcd.print (compteurequipe);
 delay (1000);
 lcd.setCursor (10,2);
 lcd.print ("         ");
 compteurequipe = 0;
 digitalWrite (Ledrouge, HIGH);
 
}
 
 
if (now.dayOfWeek() == 2 && now.hour() == 20 && now.minute() == 59 && now.second() == 58 ) {
lcd.setCursor (14,3);
 lcd.print ("------");
lcd.setCursor (14,4);
 lcd.print ("------");
 digitalWrite (Ledrouge, LOW);
 
}

// déclenchement mercredi number 3

if (now.dayOfWeek() == 3 && now.hour() == 20 && now.minute() == 40 && now.second() == 58 ) {
  //EEPROM_writeAnything (0,compteurequipe); 
 lcd.setCursor (15,4);
 lcd.print (compteurequipe);
 delay (1000);
 lcd.setCursor (10,2);
 lcd.print ("         ");
 compteurequipe = 0;
 digitalWrite (Ledrouge, HIGH);
}
 
 
if (now.dayOfWeek() == 3 && now.hour() == 20 && now.minute() == 59 && now.second() == 58 ) {
lcd.setCursor (14,3);
 lcd.print ("------");
lcd.setCursor (14,4);
 lcd.print ("------");
 digitalWrite (Ledrouge, LOW);
 
}

// déclenchement jeudi number 4

if (now.dayOfWeek() == 4 && now.hour() == 20 && now.minute() == 40 && now.second() == 58 ) {
  //EEPROM_writeAnything (0,compteurequipe); 
 lcd.setCursor (15,4);
 lcd.print (compteurequipe);
 delay (1000);
 lcd.setCursor (10,2);
 lcd.print ("         ");
 compteurequipe = 0;
 digitalWrite (Ledrouge, HIGH);
}
 
 
if (now.dayOfWeek() == 4 && now.hour() == 20 && now.minute() == 59 && now.second() == 58 ) {
lcd.setCursor (14,3);
 lcd.print ("------");
lcd.setCursor (14,4);
 lcd.print ("------");
 digitalWrite (Ledrouge, LOW);
 
}

// déclenchement vendredi number 5

if (now.dayOfWeek() == 5 && now.hour() == 19 && now.minute() == 40 && now.second() == 58 ) {
  //EEPROM_writeAnything (0,compteurequipe); 
 lcd.setCursor (15,4);
 lcd.print (compteurequipe);
 delay (1000);
 lcd.setCursor (10,2);
 lcd.print ("         ");
 compteurequipe = 0;
 digitalWrite (Ledrouge, HIGH);
}
 
 
if (now.dayOfWeek() == 5 && now.hour() == 19 && now.minute() == 59 && now.second() == 58 ) {
lcd.setCursor (14,3);
 lcd.print ("------");
lcd.setCursor (14,4);
 lcd.print ("------");
 digitalWrite (Ledrouge, LOW);
 
}



// ************* NUIT *************

// déclenchement lundi number 1

if (now.dayOfWeek() == 2 && now.hour() == 4 && now.minute() == 40 && now.second() == 58 ) {
  //EEPROM_writeAnything (0,compteurequipe); 
 lcd.setCursor (15,4);
 lcd.print (compteurequipe);
 delay (1000);
 lcd.setCursor (10,2);
 lcd.print ("         ");
 compteurequipe = 0;
 digitalWrite (Ledrouge, HIGH);
 
}
 
 
if (now.dayOfWeek() == 2 && now.hour() == 4 && now.minute() == 59 && now.second() == 58 ) {
lcd.setCursor (14,3);
 lcd.print ("------");
lcd.setCursor (14,4);
 lcd.print ("------");
 digitalWrite (Ledrouge, LOW);
 
}

// déclenchement Mardi number 2

if (now.dayOfWeek() == 3 && now.hour() == 4 && now.minute() == 40 && now.second() == 58 ) {
  //EEPROM_writeAnything (0,compteurequipe); 
 lcd.setCursor (15,4);
 lcd.print (compteurequipe);
 delay (1000);
 lcd.setCursor (10,2);
 lcd.print ("         ");
 compteurequipe = 0;
 digitalWrite (Ledrouge, HIGH);
 
}
 
 
if (now.dayOfWeek() == 3 && now.hour() == 4 && now.minute() == 59 && now.second() == 58 ) {
lcd.setCursor (14,3);
 lcd.print ("------");
lcd.setCursor (14,4);
 lcd.print ("------");
 digitalWrite (Ledrouge, LOW);
 
}

// déclenchement mercredi number 3

if (now.dayOfWeek() == 4 && now.hour() == 4 && now.minute() == 40 && now.second() == 58 ) {
  //EEPROM_writeAnything (0,compteurequipe); 
 lcd.setCursor (15,4);
 lcd.print (compteurequipe);
 delay (1000);
 lcd.setCursor (10,2);
 lcd.print ("         ");
 compteurequipe = 0;
 digitalWrite (Ledrouge, HIGH);
}
 
 
if (now.dayOfWeek() == 4 && now.hour() == 4 && now.minute() == 59 && now.second() == 58 ) {
lcd.setCursor (14,3);
 lcd.print ("------");
lcd.setCursor (14,4);
 lcd.print ("------");
 digitalWrite (Ledrouge, LOW);
 
}

// déclenchement jeudi number 4

if (now.dayOfWeek() == 5 && now.hour() == 4 && now.minute() == 40 && now.second() == 58 ) {
  //EEPROM_writeAnything (0,compteurequipe); 
 lcd.setCursor (15,4);
 lcd.print (compteurequipe);
 delay (1000);
 lcd.setCursor (10,2);
 lcd.print ("         ");
 compteurequipe = 0;
 digitalWrite (Ledrouge, HIGH);
}
 
 
if (now.dayOfWeek() == 5 && now.hour() == 4 && now.minute() == 59 && now.second() == 58 ) {
lcd.setCursor (14,3);
 lcd.print ("------");
lcd.setCursor (14,4);
 lcd.print ("------");
 digitalWrite (Ledrouge, LOW);
 
}

// déclenchement vendredi number 5

if (now.dayOfWeek() == 6 && now.hour() == 2 && now.minute() == 40 && now.second() == 58 ) {
  //EEPROM_writeAnything (0,compteurequipe); 
 lcd.setCursor (15,4);
 lcd.print (compteurequipe);
 delay (1000);
 lcd.setCursor (10,2);
 lcd.print ("         ");
 compteurequipe = 0;
 digitalWrite (Ledrouge, HIGH);
}
 
 
if (now.dayOfWeek() == 6 && now.hour() == 2 && now.minute() == 59 && now.second() == 58 ) {
lcd.setCursor (14,3);
 lcd.print ("------");
lcd.setCursor (14,4);
 lcd.print ("------");
 digitalWrite (Ledrouge, LOW);
 
}


// déclenchement Samedi matin heure sup !

if (now.dayOfWeek() == 6 && now.hour() == 12 && now.minute() == 40 && now.second() == 58 ) {
  //EEPROM_writeAnything (0,compteurequipe); 
 lcd.setCursor (15,4);
 lcd.print (compteurequipe);
 delay (1000);
 lcd.setCursor (10,2);
 lcd.print ("         ");
 compteurequipe = 0;
 digitalWrite (Ledrouge, HIGH);
 
}
 
 
if (now.dayOfWeek() == 6 && now.hour() == 12 && now.minute() == 59 && now.second() == 58 ) {
lcd.setCursor (14,3);
 lcd.print ("------");
lcd.setCursor (14,4);
 lcd.print ("------");
 digitalWrite (Ledrouge, LOW);
 
}
  }
  }

Voilà, en gros la 2e partie ne sert qu'au comptes journalier.

Première amélioration que je vais essayé d'apporter c'est de transformer le delay() en millis.

Je dois cogiter un peu, mais ça doit être possible

Faudrais déjà m'expliquer l'utilité du delay ici, surtout lorsque celui-ci fait une seconde entière :

if (now.dayOfWeek() == 1 && now.hour() == 12 && now.minute() == 40 && now.second() == 58 ) {
//EEPROM_writeAnything (0,compteurequipe);
lcd.setCursor (15,4);
lcd.print (compteurequipe);
delay (1000);
lcd.setCursor (10,2);
lcd.print (" ");
compteurequipe = 0;
digitalWrite (Ledrouge, HIGH);

C'est pour éviter qu'un 0 s'affiche à la place du compte de la journée. J'ai peur que si je ne le mette pas, comme on demarre à 58 secondes, qu'il remette à 0 le compteur.

Je peux l'effacer sans problème ? ce serait ça qui me bloque tout ?

Bon j'ai enlevé tous les delay(), dans le doute, on verra si les comptes s'effacent ou pas.

Je peux encore modifier l'horloge pour déclencher à 59 au lieu de 58.

C'est pas forcément ces delays là qui bloquent ton programme parce que ils ne surviennent qu'à des moments précis et rares. Par contre si tu mets une pièce exactement à ce moment là elle ne sera pas comptée donc il est préférable de se débarrasser des delays.
Sinon au début du programme:

const int inter=9;
// [...]
pinMode (inter, OUTPUT); 
digitalWrite (inter,HIGH);
// [...]
if (digitalRead (inter)==LOW) {
 [...]
}
else () {
[...]
}

inter ne pourras jamais être à l'état bas si tu le mets en sortie à l'état haut.
C'est surement une simple étourderie et tu devais surement vouloir le mettre en entrée.