Go Down

Topic: Problème compteur (compte plusieurs fois) (Read 2 times) previous topic - next topic

gunsman76

May 16, 2013, 12:35 pm Last Edit: May 17, 2013, 01:02 pm by gunsman76 Reason: 1
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

lve123

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+

gunsman76

#2
May 17, 2013, 06:14 pm Last Edit: May 31, 2013, 03:15 pm by gunsman76 Reason: 1
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.



gunsman76

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.



lve123

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+

gunsman76

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++ ?

lve123

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


gunsman76


lve123

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+ 

gunsman76

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




lve123

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+

gunsman76

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.



BananaFanatics

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

gunsman76

2e partie du code :

Code: [Select]

// 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.

Go Up