Bonjour Astur,
Moi j’ai opté pour un ordre impose en touchant successivement et dans l’ordre les cibles 6, 5, 4, 3, 2, 1. Je dois préciser que c’est uniquement la cible 1 qui permet d’arrêter la partie si elle est touchée.
On commence d’abord par déterminer le nombre de tours à effectuer :
- Code:
void PreIPSCMode2() {
// Determination du nombre de tours a effectuer
digitalWrite(LED_VERTE, LOW); // Neige
digitalWrite(LED_ROUGE, HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Nombre de tours");
delay(300);
while(1) {
if(digitalRead(ButtonHaut) == HIGH) // si le bouton HAUT est appuye...
{tone(Buzzer, 800, 50);
NombreTours++; // on incremente le nombre de tours de +1
delay(DelayBP);}
if(digitalRead(ButtonBas) == HIGH) // si le bouton BAS est appuye...
{tone(Buzzer, 800, 50);
NombreTours--; // on decremente le nombre de tours de -1
delay(DelayBP);}
if(digitalRead(ButtonSelect) == HIGH) // si le bouton OK est appuye...
{tone(Buzzer, 800, 50);
PreIPSCMode2_B();} // on valide le nombre de tour et on se met en mode attente
// affichage du nombre de tour sur l'ecran LCD 16x2
if (NombreTours < 1 ) {NombreTours = 1;}
if (NombreTours > 99 ) {NombreTours = 99;}
if (NombreTours >= 10 ) {
lcd.setCursor(6,1);
lcd.print(NombreTours , DEC); }
if (NombreTours < 10 ) {
lcd.setCursor(6,1);
lcd.print("0");
lcd.setCursor(7,1);
lcd.print(NombreTours , DEC); }
}
}
Une fois le nombre de tours validé, on passe en mode attente
- Code:
void PreIPSCMode2_B() {
// mode attente
lcd.clear();
lcd.setCursor(3,0);
lcd.print("Quand pret");
lcd.setCursor(3,1);
lcd.print("Pressez OK");
delay(1000);
while(1) {
if(digitalRead(ButtonSelect) == HIGH) // si le bouton OK ets appuye...
{tone(Buzzer, 800, 50);
StartIPSCMode2();} // on declenche le compte a rebours
}
}
En mode attente, lorsqu’on valide avec le bouton OK, le compte à rebours est déclenché avec un temps aléatoire compris entre 5 et 10 secondes
- Code:
void StartIPSCMode2() {
// compte a rebours
lcd.clear();
lcd.setCursor(2,0);
lcd.print("Depart dans:");
lcd.setCursor(9,1);
lcd.print("sec");
randomSeed( millis() );
PreCounterseconde = random(5, 10); // chiffre aleatoire entre 5 et 10
while(1) {
if (PreCounterseconde >= 10 ) {
lcd.setCursor(6,1);
lcd.print(PreCounterseconde, DEC); }
if (PreCounterseconde < 10 ) {
lcd.setCursor(6,1);
lcd.print("0");
lcd.setCursor(7,1);
lcd.print(PreCounterseconde, DEC); }
delay(1000);
PreCounterseconde--;
if (PreCounterseconde == 0) // si le compte a rebours arrive a 0 (zero)...
{ Serial.println('S'); // on se connecte au boitier secondaire
digitalWrite(LED_VERTE, HIGH); // Neige
digitalWrite(LED_ROUGE, LOW);
tone(Buzzer, 1000, 800);
TempsInit = (millis()); // on initialise le chrono...
IPSCMode2_cible6(); } // on commence la partie avec la cible 6
}
}
Quand le compte à rebours arrive à 0 (zéro), la partie démarre avec la cible 6
- Code:
void IPSCMode2_cible6(){
// demarrage de la partie avec la cible 6
reset6:
if (Serial.available()>0) {Poubelle = Serial.read();}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tir sur Cible 6");
while (1) {
if (digitalRead(ButtonSelect) == HIGH) // si bouton OK est appuye...
{TempsReel = (millis() - TempsInit );
Serial.println('Z'); // fin de la partie
delay(500);
finIPSCMode2(); }
if (Serial.available()>0) {
received = Serial.read();
if(received == 'F') // si la cible 6 est touchee...
{tone(Buzzer, 1000, 100); // emettre un bip sonnore...
Zone6++; // incrementer Zone6 pour le comptage du nombre de coups dans cette cible...
Point = (Point + Cibles6); // comptage du nombre de point pour cette cible...
if (Serial.available()>0) {Poubelle = Serial.read();}
delay(200);
IPSCMode2_cible5(); // on passe a la cible suivante, ici cible 5
}
if(received ='A'||'B'||'C'||'D'||'E') // si la cible 6 n'est pas touchee, alors...
{tone(Buzzer, 100, 300);
if (Serial.available()>0) {Poubelle = Serial.read();}
delay(200);
goto reset6; } // ... on retourne en debut de procedure et on attend un autre tir dans la cible
} // fin if(Serial...
TempsReel = (millis() - TempsInit ); // calcul du temps reel effectue
CalculeMinSecMilli (); // conversion du temps effectue en minutes, seconde et millisecondes
PonctuationChrono (); // formatage de l'affichage du temps sur l'ecran LCD 16x2
} // fin while
} // fin void
Si la cible 6 est touchee, on passe a la cible suivante (ici la cible 5), sinon on recommence avec la cible 6
- Code:
if(received == 'F') // si la cible 6 est touchee...
{tone(Buzzer, 1000, 100); // emettre un bip sonnore...
Zone6++; // incrementer Zone6 pour le comptage du nombre de coups dans cette cible...
Point = (Point + Cibles6); // comptage du nombre de point pour cette cible...
if (Serial.available()>0) {Poubelle = Serial.read();}
delay(200);
IPSCMode2_cible5(); // on passe a la cible suivante, ici cible 5
}
Donc on suit l’ordre cible 6, cible 5, cible 4, cible 3, cible 2, cible 1.
Si la cible 1 est touchée et le nombre de tour est atteint (Tour == NombreTours), on calcule le temps effectue, la partie s’arrête, et on passe à l'affichage des informations. Si la cible 1 est touchée et le nombre de tour n'est pas encore atteint (Tour < NombreTours), on commence un autre tour en retournant à la cible 6.
- Code:
void IPSCMode2_cible1(){
reset1:
if (Serial.available()>0) {Poubelle = Serial.read();}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tir sur Cible 1");
while (1) {
if (digitalRead(ButtonSelect) == HIGH) // si bouton OK est appuye...
{TempsReel = (millis() - TempsInit );
Serial.println('Z'); // fin de la partie
delay(500);
finIPSCMode2(); }
if (Serial.available()>0) {
received = Serial.read();
if(received == 'A')
{tone(Buzzer, 1000, 100);
Zone1++;
Point = (Point + Cibles1);
if (Serial.available()>0) {Poubelle = Serial.read();}
delay(200);
Tour++;
if(Tour == NombreTours) { // si la cible 1 est touchee et le nombre de tour est atteint...
TempsReel = (millis() - TempsInit ); // on calcule le temps effectue...
hitfactor = (Point*1000)/TempsReel; // on calcul le facteur de tir...
Serial.println('Z'); // fin de la partie...
finIPSCMode2(); // on passe a l'affichage des informations
} // fin if(Tour == NombreTours)
else
if(Tour < NombreTours) { // si la cible 1 est touchee et le nombre de tour n'est pas encore atteint...
IPSCMode2_cible6(); // on commence un autre tour en retournant a la cible 6
}
} // if(received == 'A')
if(received ='B'||'C'||'D'||'E'||'F')
{tone(Buzzer, 100, 300);
if (Serial.available()>0) {Poubelle = Serial.read();}
delay(200);
goto reset1; }
} // fin if(Serial...
TempsReel = (millis() - TempsInit );
CalculeMinSecMilli (); // conversion du temps effectue en minutes, seconde et millisecondes
PonctuationChrono (); // formatage de l'affichage du temps sur l'ecran LCD 16x2
} // fin while
} // fin void
Avec ça, je peux faire jusqu’à 99 tours.
Voici le code complet de cette partie avec des variables à adapter selon votre cas.
- Code:
void PreIPSCMode2() {
// Determination du nombre de tours a effectuer
digitalWrite(LED_VERTE, LOW); // Neige
digitalWrite(LED_ROUGE, HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Nombre de tours");
delay(300);
while(1) {
if(digitalRead(ButtonHaut) == HIGH) // si le bouton HAUT est appuye...
{tone(Buzzer, 800, 50);
NombreTours++; // on incremente le nombre de tours de +1
delay(DelayBP);}
if(digitalRead(ButtonBas) == HIGH) // si le bouton BAS est appuye...
{tone(Buzzer, 800, 50);
NombreTours--; // on decremente le nombre de tours de -1
delay(DelayBP);}
if(digitalRead(ButtonSelect) == HIGH) // si le bouton OK est appuye...
{tone(Buzzer, 800, 50);
PreIPSCMode2_B();} // on valide le nombre de tour et on se met en mode attente
// affichage du nombre de tour sur l'ecran LCD 16x2
if (NombreTours < 1 ) {NombreTours = 1;}
if (NombreTours > 99 ) {NombreTours = 99;}
if (NombreTours >= 10 ) {
lcd.setCursor(6,1);
lcd.print(NombreTours , DEC); }
if (NombreTours < 10 ) {
lcd.setCursor(6,1);
lcd.print("0");
lcd.setCursor(7,1);
lcd.print(NombreTours , DEC); }
}
}
//-----------------------------------------------------------
void PreIPSCMode2_B() {
// mode attente
lcd.clear();
lcd.setCursor(3,0);
lcd.print("Quand pret");
lcd.setCursor(3,1);
lcd.print("Pressez OK");
delay(1000);
while(1) {
if(digitalRead(ButtonSelect) == HIGH) // si le bouton OK ets appuye...
{tone(Buzzer, 800, 50);
StartIPSCMode2();} // on declenche le compte a rebours
}
}
//-----------------------------------------------------------
void StartIPSCMode2() {
// compte a rebours
lcd.clear();
lcd.setCursor(2,0);
lcd.print("Depart dans:");
lcd.setCursor(9,1);
lcd.print("sec");
randomSeed( millis() );
PreCounterseconde = random(5, 10); // chiffre aleatoire entre 5 et 10
while(1) {
if (PreCounterseconde >= 10 ) {
lcd.setCursor(6,1);
lcd.print(PreCounterseconde, DEC); }
if (PreCounterseconde < 10 ) {
lcd.setCursor(6,1);
lcd.print("0");
lcd.setCursor(7,1);
lcd.print(PreCounterseconde, DEC); }
delay(1000);
PreCounterseconde--;
if (PreCounterseconde == 0) // si le compte a rebours arrive a 0 (zero)...
{ Serial.println('S'); // on se connecte au boitier secondaire
digitalWrite(LED_VERTE, HIGH); // Neige
digitalWrite(LED_ROUGE, LOW);
tone(Buzzer, 1000, 800);
TempsInit = (millis()); // on initialise le chrono...
IPSCMode2_cible6(); } // on commence la partie avec la cible 6
}
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void IPSCMode2_cible6(){
// demarrage de la partie avec la cible 6
reset6:
if (Serial.available()>0) {Poubelle = Serial.read();}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tir sur Cible 6");
while (1) {
if (digitalRead(ButtonSelect) == HIGH) // si bouton OK est appuye...
{TempsReel = (millis() - TempsInit );
Serial.println('Z'); // fin de la partie
delay(500);
finIPSCMode2(); }
if (Serial.available()>0) {
received = Serial.read();
if(received == 'F') // si la cible 6 est touchee...
{tone(Buzzer, 1000, 100); // emettre un bip sonnore...
Zone6++; // incrementer Zone6 pour le comptage du nombre de coups dans cette cible...
Point = (Point + Cibles6); // comptage du nombre de point pour cette cible...
if (Serial.available()>0) {Poubelle = Serial.read();}
delay(200);
IPSCMode2_cible5(); // on passe a la cible suivante, ici cible 5
}
if(received ='A'||'B'||'C'||'D'||'E') // si la cible 6 n'est pas touchee, alors...
{tone(Buzzer, 100, 300);
if (Serial.available()>0) {Poubelle = Serial.read();}
delay(200);
goto reset6; } // ... on retourne en debut de procedure et on attend un autre tir dans la cible
} // fin if(Serial...
TempsReel = (millis() - TempsInit ); // calcul du temps reel effectue
CalculeMinSecMilli (); // conversion du temps effectue en minutes, seconde et millisecondes
PonctuationChrono (); // formatage de l'affichage du temps sur l'ecran LCD 16x2
} // fin while
} // fin void
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void IPSCMode2_cible5(){
reset5:
if (Serial.available()>0) {Poubelle = Serial.read();}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tir sur Cible 5");
while (1) {
if (digitalRead(ButtonSelect) == HIGH) // si bouton OK est appuye...
{TempsReel = (millis() - TempsInit );
Serial.println('Z'); // fin de la partie
delay(500);
finIPSCMode2(); }
if (Serial.available()>0) {
received = Serial.read();
if(received == 'E')
{tone(Buzzer, 1000, 100);
Zone5++;
Point = (Point + Cibles5);
if (Serial.available()>0) {Poubelle = Serial.read();}
delay(200);
IPSCMode2_cible4();
}
if(received ='A'||'B'||'C'||'D'||'F')
{tone(Buzzer, 100, 300);
if (Serial.available()>0) {Poubelle = Serial.read();}
delay(200);
goto reset5; }
} // fin if(Serial...
TempsReel = (millis() - TempsInit );
CalculeMinSecMilli (); // conversion du temps effectue en minutes, seconde et millisecondes
PonctuationChrono (); // formatage de l'affichage du temps sur l'ecran LCD 16x2
} // fin while
} // fin void
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void IPSCMode2_cible4(){
reset4:
if (Serial.available()>0) {Poubelle = Serial.read();}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tir sur Cible 4");
while (1) {
if (digitalRead(ButtonSelect) == HIGH) // si bouton OK est appuye...
{TempsReel = (millis() - TempsInit );
Serial.println('Z'); // fin de la partie
delay(500);
finIPSCMode2(); }
if (Serial.available()>0) {
received = Serial.read();
if(received == 'D')
{tone(Buzzer, 1000, 100);
Zone4++;
Point = (Point + Cibles4);
if (Serial.available()>0) {Poubelle = Serial.read();}
delay(200);
IPSCMode2_cible3();
}
if(received ='A'||'B'||'C'||'E'||'F')
{tone(Buzzer, 100, 300);
if (Serial.available()>0) {Poubelle = Serial.read();}
delay(200);
goto reset4; }
} // fin if(Serial...
TempsReel = (millis() - TempsInit );
CalculeMinSecMilli (); // conversion du temps effectue en minutes, seconde et millisecondes
PonctuationChrono (); // formatage de l'affichage du temps sur l'ecran LCD 16x2
} // fin while
} // fin void
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void IPSCMode2_cible3(){
reset3:
if (Serial.available()>0) {Poubelle = Serial.read();}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tir sur Cible 3");
while (1) {
if (digitalRead(ButtonSelect) == HIGH) // si bouton OK est appuye...
{TempsReel = (millis() - TempsInit );
Serial.println('Z'); // fin de la partie
delay(500);
finIPSCMode2(); }
if (Serial.available()>0) {
received = Serial.read();
if(received == 'C')
{tone(Buzzer, 1000, 100);
Zone3++;
Point = (Point + Cibles3);
if (Serial.available()>0) {Poubelle = Serial.read();}
delay(200);
IPSCMode2_cible2();
}
if(received ='A'||'B'||'D'||'E'||'F')
{tone(Buzzer, 100, 300);
if (Serial.available()>0) {Poubelle = Serial.read();}
delay(200);
goto reset3; }
} // fin if(Serial...
TempsReel = (millis() - TempsInit );
CalculeMinSecMilli (); // conversion du temps effectue en minutes, seconde et millisecondes
PonctuationChrono (); // formatage de l'affichage du temps sur l'ecran LCD 16x2
} // fin while
} // fin void
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void IPSCMode2_cible2(){
reset2:
if (Serial.available()>0) {Poubelle = Serial.read();}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tir sur Cible 2");
while (1) {
if (digitalRead(ButtonSelect) == HIGH) // si bouton OK est appuye...
{TempsReel = (millis() - TempsInit );
Serial.println('Z'); // fin de la partie
delay(500);
finIPSCMode2(); }
if (Serial.available()>0) {
received = Serial.read();
if(received == 'B')
{tone(Buzzer, 1000, 100);
Zone2++;
Point = (Point + Cibles2);
if (Serial.available()>0) {Poubelle = Serial.read();}
delay(200);
IPSCMode2_cible1();
}
if(received ='A'||'C'||'D'||'E'||'F')
{tone(Buzzer, 100, 300);
if (Serial.available()>0) {Poubelle = Serial.read();}
delay(200);
goto reset2; }
} // fin if(Serial...
TempsReel = (millis() - TempsInit );
CalculeMinSecMilli (); // conversion du temps effectue en minutes, seconde et millisecondes
PonctuationChrono (); // formatage de l'affichage du temps sur l'ecran LCD 16x2
} // fin while
} // fin void
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void IPSCMode2_cible1(){
reset1:
if (Serial.available()>0) {Poubelle = Serial.read();}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tir sur Cible 1");
while (1) {
if (digitalRead(ButtonSelect) == HIGH) // si bouton OK est appuye...
{TempsReel = (millis() - TempsInit );
Serial.println('Z'); // fin de la partie
delay(500);
finIPSCMode2(); }
if (Serial.available()>0) {
received = Serial.read();
if(received == 'A')
{tone(Buzzer, 1000, 100);
Zone1++;
Point = (Point + Cibles1);
if (Serial.available()>0) {Poubelle = Serial.read();}
delay(200);
Tour++;
if(Tour == NombreTours) { // si la cible 1 est touchee et le nombre de tour est atteint...
TempsReel = (millis() - TempsInit ); // on calcule le temps effectue...
hitfactor = (Point*1000)/TempsReel; // on calcul le facteur de tir...
Serial.println('Z'); // fin de la partie...
finIPSCMode2(); // on passe a l'affichage des informations
} // fin if(Tour == NombreTours)
else
if(Tour < NombreTours) { // si la cible 1 est touchee et le nombre de tour n'est pas encore atteint...
IPSCMode2_cible6(); // on commence un autre tour en retournant a la cible 6
}
} // if(received == 'A')
if(received ='B'||'C'||'D'||'E'||'F')
{tone(Buzzer, 100, 300);
if (Serial.available()>0) {Poubelle = Serial.read();}
delay(200);
goto reset1; }
} // fin if(Serial...
TempsReel = (millis() - TempsInit );
CalculeMinSecMilli (); // conversion du temps effectue en minutes, seconde et millisecondes
PonctuationChrono (); // formatage de l'affichage du temps sur l'ecran LCD 16x2
} // fin while
} // fin void
//---------------------------------------------------------
void finIPSCMode2() {
// affichage des informations de fin de partie
digitalWrite(LED_VERTE, HIGH); // Neige
digitalWrite(LED_ROUGE, HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Fin de la partie");
// emission de 3 bips sonnores
tone(Buzzer, 100, 1000);
delay(1000);
tone(Buzzer, 1000, 1000);
delay(1000);
tone(Buzzer, 5000, 1000);
delay(1000);
CalculeMinSecMilli (); // conversion du temps effectue en minutes, seconde et millisecondes
while (1) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Fin de la partie");
PonctuationChrono (); // formatage de l'affichage du temps sur l'ecran LCD 16x2
========================================================
do {
suivant = false;
EtatButtonSelect = digitalRead(ButtonSelect);
EtatButtonHaut = digitalRead(ButtonHaut);
EtatButtonBas = digitalRead(ButtonBas);
if (EtatButtonSelect == HIGH || EtatButtonHaut == HIGH ||EtatButtonBas == HIGH)
{delay(250);tone(Buzzer,500,150);suivant = true;}
}
while (suivant != true);
// affichage des points
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(8,1);
lcd.print("points");
lcd.setCursor(2, 1);
lcd.print(Point);
========================================================
do {
suivant = false;
EtatButtonSelect = digitalRead(ButtonSelect);
EtatButtonHaut = digitalRead(ButtonHaut);
EtatButtonBas = digitalRead(ButtonBas);
if (EtatButtonSelect == HIGH || EtatButtonHaut == HIGH ||EtatButtonBas == HIGH)
{delay(250);tone(Buzzer,500,150);suivant = true;}
}
while (suivant != true);
========================================================
// affichage facteur de tir
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Facteur de tir");
lcd.setCursor(0, 1);
lcd.print(hitfactor);
========================================================
do {
suivant = false;
EtatButtonSelect = digitalRead(ButtonSelect);
EtatButtonHaut = digitalRead(ButtonHaut);
EtatButtonBas = digitalRead(ButtonBas);
if (EtatButtonSelect == HIGH || EtatButtonHaut == HIGH ||EtatButtonBas == HIGH)
{delay(250);tone(Buzzer,500,150);suivant = true;}
}
while (suivant != true);
AffichageZones ();
========================================================
do {
suivant = false;
EtatButtonSelect = digitalRead(ButtonSelect);
EtatButtonHaut = digitalRead(ButtonHaut);
EtatButtonBas = digitalRead(ButtonBas);
if (EtatButtonSelect == HIGH || EtatButtonHaut == HIGH ||EtatButtonBas == HIGH)
{delay(250);tone(Buzzer,500,150);suivant = true;}
}
while (suivant != true);
========================================================
// reinitialisation des variables
NbtiresReel = 0;
NombreTours = 0;
TempsInit = 0;
TempsPenal = 0;
TempsReel = 0;
TempsMin = 0;
TempsSec = 0;
TempsMil = 0;
Tour = 0;
hitfactor = 0;
Point = 0;
Zone1 = 0;
Zone2 = 0;
Zone3 = 0;
Zone4 = 0;
Zone5 = 0;
Zone6 = 0;
Menu(); // Retour au menu principal
}
}