Besoin d aide chronomètre voiture rc

Bonjour a tous,

j'ai rejoins le forum car j'ai besoin de votre aide. Je suis novice dans l'utilisation d’Arduino (j'ai reçu ma première il y a 2 mois).
Je suis en train de faire un chronomètre pour voiture rc tt 1/8.
Pour le moment, j'ai une carte Arduino nano qui capte un code ir envoyer par une puce quand celle ci passe devant le capteur, un écran lcd en I²C et 4 boutons poussoirs.
Le lcd affiche des infos : temps total, moyenne, meilleur temps, temps par tour...
Les bp droites et gauches servent a circuler dans les menus.
Le bp dessous réinitialise la carte (boitier imprimer en 3d donc plus pratique que sur la carte).
Le bp dessus servira a changer d'utilisateur.

Maintenant que je penses vous avoir bien détaillé mon projet, voici mon problème :
J'aimerais que plusieurs personnes (mini 2 ; maxi 4) puissent se "connecter" grâce a des puces avec des codes différents sur la "boucle de comptage" et puissent voir leurs temps, moyennes...

J'ai essayer de dupliquer tout mon code et de remplacer les variables (ex : menu et menu1) mais c'est un travail énorme et a ce rythme la carte va être vite saturé (pour 2 c'est encore bon)...

Si quelqu'un a une solution a me proposer je suis preneur.
Merci beaucoup :smiley:

Ps : si quelqu'un a des idées pour améliorer mon code existant...

Schéma du montage :

Le code a part il ne tenait pas sur la page :smiley:

//--------------------------------------INITIALISATION-----------------------------------------------------------------------
int alll = 0;
int m = 0;
int s = 0;
int ms = 0;
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#include "IRremote.h"

double i = 0;
double a = millis();
double c ;  
int nombrelap = 0;
float moy = 0;
float all = 0;
const int capteur = 2; //pin du capteur
const int boutonG = 6; //pin du bouton gauche
const int boutonD = 4; //pin du bouton droite
const int boutonH = 5; //pin du bouton haut
const int boutonB = 7; //pin du bouton bas


unsigned long tempsActu = 0;   //gestion menu
const long intervalle = 150;   //gestion menu
int menu = 0;                  //gestion menu

unsigned long tempsActu1 = 0; //temps capteur ir
const long intervalle1 = 1000;//temps capteur ir


void(* reboot) (void) = 0; //déclaration reset
//-------------tours---------------------- 
float lap[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//---------------minimum-----------------------------   
float minimum = 0;

  //------reception ir--------
  int receiverPin = 3;
  IRrecv irrecv(receiverPin);     
  decode_results results;  
  int receptionIr = 0;
  
//-------------------------------------SETUP--------------------------------------------------------

void setup()
{

  lcd.init();                   
  lcd.backlight();

  Serial.begin(9600);

  pinMode(capteur, INPUT_PULLUP); //capteur voiture
  digitalWrite(capteur, HIGH);    //capteur voiture

  pinMode(boutonG,INPUT_PULLUP);
  pinMode(boutonD,INPUT_PULLUP);
  pinMode(boutonH,INPUT_PULLUP);
  pinMode(boutonB,INPUT_PULLUP);

  // pinMode(8,OUTPUT); //led cut off

  //------capteur ir--------
  irrecv.enableIRIn();    //demare le recepteur
}

//--------------------------------------LOOP----------------------------------------------------------

void loop()
{

//-------------------reception d ir------------------


   if (irrecv.decode(&results)){ // IR signal received?
     
       if(results.value == 2704){
         receptionIr = 1;  
      }
    else{
      receptionIr = 0;
      }
    irrecv.resume(); // receive the next value
  } 
  unsigned long temps1 = millis();
  if ((temps1 - tempsActu1 >= intervalle1) and(receptionIr == 1)) {
    tempsActu1 = temps1;
    receptionIr = 0;
  }
//-----------comptage du temps--------------  
  delay(10);
  if(receptionIr == 1) 
   {
   c = millis();
   i = (c - a) / 1000;
   if(i > 99.99)
   {
      i=99;
   }

  
   if(i > 10 and i <= 99)
    { 

      nombrelap++;
      a = millis();

 
    
//-------------récuperation valeur i pour chaque tour----------------
      if(nombrelap == 1){
        lap[0]=i;
      }
      if(nombrelap == 2){
        lap[1]=i;
      }   
      if(nombrelap == 3){
        lap[2]=i;
      }
      if(nombrelap == 4){
        lap[3]=i;
      }
      if(nombrelap == 5){
        lap[4]=i;
      }
      if(nombrelap == 6){
        lap[5]=i;
      }
      if(nombrelap == 7){
        lap[6]=i;
      }
      if(nombrelap == 8){
        lap[7]=i;
      }
      if(nombrelap == 9){
        lap[8]=i;
      }
      if(nombrelap == 10){
        lap[9]=i;
      }
      if(nombrelap == 11){
        lap[10]=i;
      }
      if(nombrelap == 12){
        lap[11]=i;
      }   
      if(nombrelap == 13){
        lap[12]=i;
      }
      if(nombrelap == 14){
        lap[13]=i;
      }
      if(nombrelap == 15){
        lap[14]=i;
      }
      if(nombrelap == 16){
        lap[15]=i;
      }
      if(nombrelap == 17){
        lap[16]=i;
      }
      if(nombrelap == 18){
        lap[17]=i;
      }
      if(nombrelap == 19){
        lap[18]=i;
      }
      if(nombrelap == 20){
        lap[19]=i;
      }
//---------moyenne et total--------------
      all = lap[0]+lap[1]+lap[2]+lap[3]+lap[4]+lap[5]+lap[6]+lap[7]+lap[8]+lap[9]+lap[10]+lap[11]+lap[12]+lap[13]+lap[14]+lap[15]+lap[16]+lap[17]+lap[18]+lap[19];
      moy=all/nombrelap; 

//---------------minimum-----------------------------   
      if(lap[0] != 0 and lap[1] == 0){
        minimum = lap[0];
      }
      if(lap[1] != 0 and lap[2] == 0){
        minimum = min(minimum , lap[1]);
      }
      if(lap[2] != 0 and lap[3] == 0){
        minimum = min(minimum , lap[2]);
      }
      if(lap[3] != 0 and lap[4] == 0){
        minimum = min(minimum , lap[3]);
      }
      if(lap[4] != 0 and lap[5] == 0){
        minimum = min(minimum , lap[4]);
      }
      if(lap[5] != 0 and lap[6] == 0){
        minimum = min(minimum , lap[5]);
      }
      if(lap[6] != 0 and lap[7] == 0){
        minimum = min(minimum , lap[6]);
      }
      if(lap[7] != 0 and lap[8] == 0){
        minimum = min(minimum , lap[7]);
      }
      if(lap[8] != 0 and lap[9] == 0){
        minimum = min(minimum , lap[8]);
      }
      if(lap[9] != 0 and lap[10] == 0){
        minimum = min(minimum , lap[9]);
      }
      if(lap[10] != 0 and lap[11] == 0){
        minimum = min(minimum , lap[10]);
      }
      if(lap[11] != 0 and lap[12] == 0){
        minimum = min(minimum , lap[11]);
      }
      if(lap[12] != 0 and lap[13] == 0){
        minimum = min(minimum , lap[12]);
      }
      if(lap[13] != 0 and lap[14] == 0){
        minimum = min(minimum , lap[13]);
      }
      if(lap[14] != 0 and lap[15] == 0){
        minimum = min(minimum , lap[14]);
      }
      if(lap[15] != 0 and lap[16] == 0){
        minimum = min(minimum , lap[15]);
      }
      if(lap[16] != 0 and lap[17] == 0){
        minimum = min(minimum , lap[16]);
      }
      if(lap[17] != 0 and lap[18] == 0){
        minimum = min(minimum , lap[17]);
      }
      if(lap[18] != 0 and lap[19] == 0){
        minimum = min(minimum , lap[18]);
      }
      if(lap[19] != 0){
        minimum = min(minimum , lap[19]);
      }

    }
  }

Et la deuxième partie, le code était trop long

 //--------definition du menu------------------
  unsigned long temps = millis();
  
  if (temps - tempsActu >= intervalle) {
    tempsActu = temps;

    if (digitalRead(boutonD) == LOW) {
      menu=menu+1;
      lcd.clear();
    } 
    if (digitalRead(boutonG) == LOW){
      menu=menu-1;
      lcd.clear();
      
    }
  }
  if(menu<=1){
    menu=1;
  }
  if(menu>=13){
    menu=13;
  }
  //-------temps total------------------------
  alll = all*100;
  ms = alll % 100;
  s = (alll / 100) % 60;
  m = (alll / 100) / 60;
  //------------affichage lcd menu 1----------
  if(menu == 1){
    lcd.setCursor(0,0);
    lcd.print("Nb Tours:");
    lcd.setCursor(10,0);
    lcd.print(nombrelap);
    lcd.setCursor(0,1);
    lcd.print("Ttot:");
    lcd.setCursor(6,1);
    lcd.print(m);
    lcd.setCursor(8,1);
    lcd.print("'");
    lcd.setCursor(9,1);
    lcd.print(s);
    lcd.setCursor(11,1);
    lcd.print("''");
    lcd.setCursor(13,1);
    lcd.print(ms);
    
  }
  //------------affichage lcd menu 2----------
  if(menu == 2){
    lcd.setCursor(9,0);
    lcd.print(moy);
    lcd.setCursor(0,0);
    lcd.print("Moyenne:");
    lcd.setCursor(0,1);
    lcd.print("Meilleur T:");
    lcd.setCursor(11,1);
    lcd.print(minimum);

  }
  //-------affichage lcd tours---------------------
  if(menu == 4){
    lcd.setCursor(0,0);
    lcd.print("Tour 1:");
    lcd.setCursor(7,0);
    lcd.print(lap[0]);
    lcd.setCursor(0,1);
    lcd.print("Tour 2:");
    lcd.setCursor(7,1);
    lcd.print(lap[1]);
  }
  if(menu == 5){
    lcd.setCursor(0,0);
    lcd.print("Tour 3:");
    lcd.setCursor(7,0);
    lcd.print(lap[2]);
    lcd.setCursor(0,1);
    lcd.print("Tour 4:");
    lcd.setCursor(7,1);
    lcd.print(lap[3]);
  }
  if(menu == 6){
    lcd.setCursor(0,0);
    lcd.print("Tour 5:");
    lcd.setCursor(7,0);
    lcd.print(lap[4]);
    lcd.setCursor(0,1);
    lcd.print("Tour 6:");
    lcd.setCursor(7,1);
    lcd.print(lap[5]);
  }
  if(menu == 7){
    lcd.setCursor(0,0);
    lcd.print("Tour 7:");
    lcd.setCursor(7,0);
    lcd.print(lap[6]);
    lcd.setCursor(0,1);
    lcd.print("Tour 8:");
    lcd.setCursor(7,1);
    lcd.print(lap[7]);
  }
  if(menu == 8){
    lcd.setCursor(0,0);
    lcd.print("Tour 9:");
    lcd.setCursor(8,0);
    lcd.print(lap[8]);
    lcd.setCursor(0,1);
    lcd.print("Tour 10:");
    lcd.setCursor(8,1);
    lcd.print(lap[9]);
  }
  if(menu == 9){
    lcd.setCursor(0,0);
    lcd.print("Tour 11:");
    lcd.setCursor(8,0);
    lcd.print(lap[10]);
    lcd.setCursor(0,1);
    lcd.print("Tour 12:");
    lcd.setCursor(8,1);
    lcd.print(lap[11]);
  }
  if(menu == 10){
    lcd.setCursor(0,0);
    lcd.print("Tour 13:");
    lcd.setCursor(8,0);
    lcd.print(lap[12]);
    lcd.setCursor(0,1);
    lcd.print("Tour 14:");
    lcd.setCursor(8,1);
    lcd.print(lap[13]);
  }
  if(menu == 11){
    lcd.setCursor(0,0);
    lcd.print("Tour 15:");
    lcd.setCursor(8,0);
    lcd.print(lap[14]);
    lcd.setCursor(0,1);
    lcd.print("Tour 16:");
    lcd.setCursor(8,1);
    lcd.print(lap[15]);
  }
  if(menu == 12){
    lcd.setCursor(0,0);
    lcd.print("Tour 17:");
    lcd.setCursor(8,0);
    lcd.print(lap[16]);
    lcd.setCursor(0,1);
    lcd.print("Tour 18:");
    lcd.setCursor(8,1);
    lcd.print(lap[17]);
  }
  if(menu == 13){
    lcd.setCursor(0,0);
    lcd.print("Tour 19:");
    lcd.setCursor(8,0);
    lcd.print(lap[18]);
    lcd.setCursor(0,1);
    lcd.print("Tour 20:");
    lcd.setCursor(8,1);
    lcd.print(lap[19]);
  }
  //---------reset-----------------
  if(digitalRead(boutonB) == 0){
    reboot();
  }
//--------------cut off-------------------------- /////////////////////// a finir
  //int resultBinary = analogRead(A0);
  //float resultVolts = resultBinary/1023.0*5.0;
  //float tension = resultVolts/10000*20000;


    
  

  

 

//---------------------------------------------FIN-------------------------------------------------------------------
}

Voila tout est en ordre :wink: .
Pour la partie émission d’ir : j’utilise pour faire les tests une carte arduino nano avec une led ir et sa résistance sur le port D3.

/*
  Emission infrarouge
*/

#include <IRremote.h>

IRsend irsend; // crée une instance

void setup()
{
}

void loop()
{
   irsend.sendRC5(0xA90,12);
   delay(5);
}

Voila vous savez tout.

Merci d’avance pour vos réponses. :wink:

?

?

       if(results.value == 2704){

la première solution qui vient à l’esprit est de prendre en compte plusieurs codes et afficher ce code sur l’afficheur, ou un identifiant correspondant à ce code (prénom, pseudo).

Bonjour,

merci hbachetti pour ta réponse !

Oui je pensais en effet prendre un autre code. Le problème c’est que le code devient vite très lourd (70% de mon arduino nano) et cela devient très compliqué (pour moi) de tout réadapter sans faire de fautes…

Je me demandais donc si il y avais des solutions pour faire une même me chose 2 fois mais avec des utilisateurs différents (besoin donc de changer toutes les variables pour un autre utilisateur mais en soit le reste du code reste le même).

Si il n’y a pas de solution j’essaierai de tout réadapter pour un autre utilisateur.
Merci

Je parlais de code infrarouge, pas de code C.

Plusieurs utilisateurs veut dire quoi ?
Plusieurs voitures avec des émetteurs infrarouge émettant des codes différents ?
Plusieurs utilisateurs avec la même voiture ?

S'il s'agit de plusieurs codes infrarouge différents je ne vois pas le problème.

       if(results.value == 2704 || results.value == 2705 || results.value == 2706) {
         // mémoriser le code infrarouge

Oui j’avais compris que vous parliez de code ir.

Plusieurs utilisateur veut dire entre 1 et 4 personnes qui roulent en même temps avec leur propre voiture et donc des code ir différents.

Le problème c’est qu avec plusieurs utilisateur, il faut plusieurs tableaux, trouver le meilleur temps pour chaque utilisateur... Ca fait un code très long et pour deux utilisateur 70% de la mémoire de ma carte est prise.

Chaque utilisateur doit pouvoir voir ses propres temps, moyenne... il faut donc pour chaque utilisateur le même code C mais avec des variables différentes (ex: moyenneUtil1 ; moyenneUtil2 ; moyenneUtil3 ; moyenneUtil4).

Hello
dans ton code, tu uilises

minimum = min(minimum , lap[19]);

mais je ne vois pas la fonction min

tu peux éclaircir ?

Pour mon minimum, j’utilise bien la fonction (tu l’a même copier dans le code ;-)). Pour mes minimum, comme certain tours peuvent être à 0, je fait le minimum tour par tour tant que tour != de 0.

minimum = MIN(minimum , lap[19]);

Je t’ai mis la fonction min en majuscules.

J’espère que j’ai répondu à ta question.

non laisses la en minuscules
j’ai trouvé
#define min(a,b) ((a)<(b)?(a):(b))

comment fonctionne ta reconnaissance des voitures?
l’infra rouge, c’est 1 ou 0

un debut

//--------------------------------------INITIALISATION-----------------------------------------------------------------------
int alll = 0;
int m = 0;
int s = 0;
int ms = 0;
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#include "IRremote.h"
unsigned long i = 0;
unsigned long a = millis();
unsigned long c ;
int nombrelap = 0;
float moy = 0;
float all = 0;
const int capteur = 2; //pin du capteur
const int boutonG = 6; //pin du bouton gauche
const int boutonD = 4; //pin du bouton droite
const int boutonH = 5; //pin du bouton haut
const int boutonB = 7; //pin du bouton bas
unsigned long tempsActu = 0;   //gestion menu
const long intervalle = 150;   //gestion menu
int menu = 0;                  //gestion menu
unsigned long tempsActu1 = 0; //temps capteur ir
const long intervalle1 = 1000;//temps capteur ir

void(* reboot) (void) = 0; //déclaration reset
//-------------tours----------------------
unsigned long lap[4][21] 
{
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
//---------------minimum-----------------------------
unsigned long minimum = 0;

//------reception ir--------
int receiverPin = 3;
IRrecv irrecv(receiverPin);
decode_results results;
int receptionIr = 0;

//-------------------------------------SETUP--------------------------------------------------------

void setup()
{
  lcd.begin();
  //lcd.init();
  lcd.backlight();
  Serial.begin(1000000);
  pinMode(capteur, INPUT_PULLUP); //capteur voiture
  pinMode(boutonG, INPUT_PULLUP);
  pinMode(boutonD, INPUT_PULLUP);
  pinMode(boutonH, INPUT_PULLUP);
  pinMode(boutonB, INPUT_PULLUP);
  irrecv.enableIRIn();    //demare le recepteur
}

//--------------------------------------LOOP----------------------------------------------------------

void loop()
{
  //-------------------reception d ir------------------
  if (irrecv.decode(&results)) { // IR signal received?
    if (results.value == 2704) {
      receptionIr = 1;
    }
    else {
      receptionIr = 0;
    }
    irrecv.resume(); // receive the next value
  }
  unsigned long temps1 = millis();
  if ((temps1 - tempsActu1 >= intervalle1) and (receptionIr == 1)) {
    tempsActu1 = temps1;
    receptionIr = 0;
  }
  //-----------comptage du temps--------------
  delay(10);
  if (receptionIr == 1)
  {
    c = millis();
    i = (c - a) / 1000;
    if (i > 99.99)
    {
      i = 99;
    }
    if (i > 10 and i <= 99)
    {
      nombrelap++;
      a = millis();
      //-------------récuperation valeur i pour chaque tour----------------
      for (byte f = 1; f <= 20; f++)
      {
        if (nombrelap == f)
        {
         lap[1][f - 1] = i;
        }
      }

      //---------moyenne et total--------------
      for (byte f = 0; f <= 19; f++)
      {
       all = all + lap[1][f];
      }
      moy = all / nombrelap;

      //---------------minimum-----------------------------
      if (lap[1][0] != 0 and lap[1][1] == 0)//***********************************
      {
        minimum = lap[1][0];//***************************************************
      }
      for (int f = 1; f <= 18; f++)
      {
        if (lap[1][f] != 0 and lap[1][f + 1] == 0)//******************************
        {
          minimum = min(minimum , lap[1][f]);//********************************
        }
      }
      if (lap[1][19] != 0)//******************************************************
      {
        minimum = min(minimum , lap[1][19]);//************************************
       
      // #define min(a,b) ((a)<(b)?(a):(b))
      }
    }
  }

  //--------definition du menu------------------
  unsigned long temps = millis();
  if (temps - tempsActu >= intervalle)
  {
    tempsActu = temps;
    if (digitalRead(boutonD) == LOW)
    {
      menu = menu + 1;
      lcd.clear();
    }
    else
    {
      if (digitalRead(boutonG) == LOW)
      {
        menu = menu - 1;
        lcd.clear();
      }
    }
  }
  if (menu <= 1) {
    menu = 1;
  }
  if (menu >= 13) {
    menu = 13;
  }
  //-------temps total------------------------
  alll = all * 100;
  ms = alll % 100;
  s = (alll / 100) % 60;
  m = (alll / 100) / 60;
  //------------affichage lcd menu 1----------
  if (menu == 1) {
    lcd.setCursor(0, 0);
    lcd.print("Nb Tours:");
    lcd.setCursor(10, 0);
    lcd.print(nombrelap);
    lcd.setCursor(0, 1);
    lcd.print("Ttot:");
    lcd.setCursor(6, 1);
    lcd.print(m);
    lcd.setCursor(8, 1);
    lcd.print("'");
    lcd.setCursor(9, 1);
    lcd.print(s);
    lcd.setCursor(11, 1);
    lcd.print("''");
    lcd.setCursor(13, 1);
    lcd.print(ms);

  }
  //------------affichage lcd menu 2----------
  if (menu == 2) {
    lcd.setCursor(9, 0);
    lcd.print(moy);
    lcd.setCursor(0, 0);
    lcd.print("Moyenne:");
    lcd.setCursor(0, 1);
    lcd.print("Meilleur T:");
    lcd.setCursor(11, 1);
    lcd.print(minimum);

  }
  //-------affichage lcd tours---------------------

  for (int f = 4; f <= 13; f++)
  {
    if (menu == f)
    {
      int offset = (f * 2) - 8;
      int tr = (f * 2) - 7;
      lcd.setCursor(0, 0);
      lcd.print("Tour "); lcd.print(tr); lcd.print(" : ");
      lcd.setCursor(10, 0);
      lcd.print(lap[1][offset]);//*******************************************
      lcd.setCursor(0, 1);
      lcd.print("Tour "); lcd.print(tr + 1); lcd.print(" :");
      lcd.setCursor(10, 1);
      offset++;
      lcd.print(lap[1][offset + 1]);//***************************************
    }
  }
  //---------reset-----------------
  if (digitalRead(boutonB) == 0) {
    reboot();
  }
  //--------------cut off-------------------------- /////////////////////// a finir
  //int resultBinary = analogRead(A0);
  //float resultVolts = resultBinary/1023.0*5.0;
  //float tension = resultVolts/10000*20000;

  //---------------------------------------------FIN-------------------------------------------------------------------
}

Merci beaucoup pour l’optimisation du code !

Pour la détection des voiture, une led ir envoie un code 2704. Quand mon capteur reçoit 2704, il met receptionIR a 1. Si receptionIR=1 ça ajoute un tour.

Petite question a quoi ca sert de mettre le serial begin a 1000000 ? Je le met toujours a 9600.

avec ton systeme ir, tu detectes un passage de voiture, mais comment sais tu laquelle est passée?

le serial begin(1000000): pourquoi lambiner pour ecrire sur le moniteur?

Je n’ai fait que pour une seul voiture mais la puce émet un code ir (ici 2704) je pensais a faire des code différents pour les autres puces 2705, 2706.

Ps: le code est 2704 parce que c’était ca sur le tuto que j’ai vu

IReemote, je voyais plutot ca pour recevoir et decoder les trames d'une telecommande IR ( style TV )

tu as un lien sur ton systeme?

ou alors chaquevoiyure es equipée d'une nano?
qui émet son code au moment de passer devant le recepteur?

la vitesse de la voiture sera telle appropriée au temps d'émission?
elle ne resera peut etre pas assez de temps devant la cellule de reception

Oui chaque voiture aura une nano.
En fin de ligne droite la voiture ira trop vite mais avant un virage en epingle ce sera ok.

//--------------------------------------INITIALISATION-----------------------------------------------------------------------
int alll = 0;
int m = 0;
int s = 0;
int ms = 0;
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#include "IRremote.h"
double i = 0;
double a = millis();
double c ;  
int nombrelap = 0;
float moy = 0;
float all = 0;
const int capteur = 2; //pin du capteur
const int boutonG = 6; //pin du bouton gauche
const int boutonD = 4; //pin du bouton droite
const int boutonH = 5; //pin du bouton haut
const int boutonB = 7; //pin du bouton bas
unsigned long tempsActu = 0;   //gestion menu
const long intervalle = 150;   //gestion menu
int menu = 0;                  //gestion menu
byte util = 1;
unsigned long tempsActu1 = 0; //temps capteur ir
const long intervalle1 = 1000;//temps capteur ir

void(* reboot) (void) = 0; //déclaration reset
//-------------tours---------------------- 
float lap[4][21]
{
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
//---------------minimum-----------------------------   
float minimum = 0;
//------reception ir--------
int receiverPin = 3;
IRrecv irrecv(receiverPin);     
decode_results results;  
int receptionIr = 0;
  
//-------------------------------------SETUP--------------------------------------------------------

void setup()
{
  lcd.init();                   
  lcd.backlight();
  Serial.begin(9600);
  pinMode(capteur, INPUT_PULLUP); //capteur voiture
  digitalWrite(capteur, HIGH);    //capteur voiture
  pinMode(boutonG,INPUT_PULLUP);
  pinMode(boutonD,INPUT_PULLUP);
  pinMode(boutonH,INPUT_PULLUP);
  pinMode(boutonB,INPUT_PULLUP);
  // pinMode(8,OUTPUT); //led cut off
  irrecv.enableIRIn();    //demare le recepteur
}

//--------------------------------------LOOP----------------------------------------------------------

void loop()
{

//-------------------reception d ir------------------
  if (irrecv.decode(&results)) { // IR signal received?
    if (results.value == 2704) {
      receptionIr = 1;
    }
    else {
      receptionIr = 0;
    }
    irrecv.resume(); // receive the next value
  }
  unsigned long temps1 = millis();
  if ((temps1 - tempsActu1 >= intervalle1) and (receptionIr == 1)) {
    tempsActu1 = temps1;
    receptionIr = 0;
  }
//-----------comptage du temps--------------  
  delay(10);
  if(receptionIr == 1) 
   {
   c = millis();
   i = (c - a) / 1000;
   if(i > 99.99)
   {
      i=99;
   }
   if(i > 10 and i <= 99)
   { 
    nombrelap++;
    a = millis();
    //-------------récuperation valeur i pour chaque tour----------------
    for (byte f = 1; f <= 20; f++)
    {
      if (nombrelap == f)
      {
       lap[1][f - 1] = i;
      }
    }
    //---------moyenne et total--------------
    all = lap[1][0]+lap[1][1]+lap[1][2]+lap[1][3]+lap[1][4]+lap[1][5]+lap[1][6]+lap[1][7]+lap[1][8]+lap[1][9]+lap[1][10]+lap[1][11]+lap[1][12]+lap[1][13]+lap[1][14]+lap[1][15]+lap[1][16]+lap[1][17]+lap[1][18]+lap[1][19];
    moy=all/nombrelap; 

    //---------------minimum-----------------------------   
    if (lap[1][0] != 0 and lap[1][1] == 0)//***********************************
    {
      minimum = lap[1][0];//***************************************************
    }
    for (int f = 1; f <= 18; f++)
    {
      if (lap[1][f] != 0 and lap[1][f + 1] == 0)//******************************
      {
        minimum = min(minimum , lap[1][f]);//********************************
      }
    }
    if (lap[1][19] != 0)//******************************************************
    {
      minimum = min(minimum , lap[1][19]);//************************************
       
      // #define min(a,b) ((a)<(b)?(a):(b))
      }
    }
  }  
  //--------definition des boutons------------------
  unsigned long temps = millis();
  if (temps - tempsActu >= intervalle) {
    tempsActu = temps;
    if (digitalRead(boutonD) == LOW) {
      menu=menu+1;
      lcd.clear();
    } 
    if (digitalRead(boutonG) == LOW){
      menu=menu-1;
      lcd.clear(); 
    }
    if (digitalRead(boutonH) == LOW){
      util=util+1;
      lcd.clear(); 
    }
  }
  if(menu<=1){
    menu=1;
  }
  if(menu>=13){
    menu=13;
  }
  if(util>4){
    util=1;
  }
  if(util<=1){
    util=1;
  }
  //-------temps total------------------------
  alll = all*100;
  ms = alll % 100;
  s = (alll / 100) % 60;
  m = (alll / 100) / 60;
  //------------affichage lcd menu 1----------
  if(util == 1)
  {
  if(menu == 1){
    lcd.setCursor(0,0);
    lcd.print("Nb Tours:");
    lcd.setCursor(10,0);
    lcd.print(nombrelap);
    lcd.setCursor(0,1);
    lcd.print("Ttot:");
    lcd.setCursor(6,1);
    lcd.print(m);
    lcd.setCursor(8,1);
    lcd.print("'");
    lcd.setCursor(9,1);
    lcd.print(s);
    lcd.setCursor(11,1);
    lcd.print("''");
    lcd.setCursor(13,1);
    lcd.print(ms);
    
  }
  //------------affichage lcd menu 2----------
  if(menu == 2){
    lcd.setCursor(9,0);
    lcd.print(moy);
    lcd.setCursor(0,0);
    lcd.print("Moyenne:");
    lcd.setCursor(0,1);
    lcd.print("Meilleur T:");
    lcd.setCursor(11,1);
    lcd.print(minimum);

  }
  //-------affichage lcd tours---------------------
  if(menu == 4){
    lcd.setCursor(0,0);
    lcd.print("Tour 1:");
    lcd.setCursor(7,0);
    lcd.print(lap[1][0]);
    lcd.setCursor(0,1);
    lcd.print("Tour 2:");
    lcd.setCursor(7,1);
    lcd.print(lap[1][1]);
  }
  if(menu == 5){
    lcd.setCursor(0,0);
    lcd.print("Tour 3:");
    lcd.setCursor(7,0);
    lcd.print(lap[1][2]);
    lcd.setCursor(0,1);
    lcd.print("Tour 4:");
    lcd.setCursor(7,1);
    lcd.print(lap[1][3]);
  }
  if(menu == 6){
    lcd.setCursor(0,0);
    lcd.print("Tour 5:");
    lcd.setCursor(7,0);
    lcd.print(lap[1][4]);
    lcd.setCursor(0,1);
    lcd.print("Tour 6:");
    lcd.setCursor(7,1);
    lcd.print(lap[1][5]);
  }
  if(menu == 7){
    lcd.setCursor(0,0);
    lcd.print("Tour 7:");
    lcd.setCursor(7,0);
    lcd.print(lap[1][6]);
    lcd.setCursor(0,1);
    lcd.print("Tour 8:");
    lcd.setCursor(7,1);
    lcd.print(lap[1][7]);
  }
  if(menu == 8){
    lcd.setCursor(0,0);
    lcd.print("Tour 9:");
    lcd.setCursor(8,0);
    lcd.print(lap[1][8]);
    lcd.setCursor(0,1);
    lcd.print("Tour 10:");
    lcd.setCursor(8,1);
    lcd.print(lap[1][9]);
  }
  if(menu == 9){
    lcd.setCursor(0,0);
    lcd.print("Tour 11:");
    lcd.setCursor(8,0);
    lcd.print(lap[1][10]);
    lcd.setCursor(0,1);
    lcd.print("Tour 12:");
    lcd.setCursor(8,1);
    lcd.print(lap[1][11]);
  }
  if(menu == 10){
    lcd.setCursor(0,0);
    lcd.print("Tour 13:");
    lcd.setCursor(8,0);
    lcd.print(lap[1][12]);
    lcd.setCursor(0,1);
    lcd.print("Tour 14:");
    lcd.setCursor(8,1);
    lcd.print(lap[1][13]);
  }
  if(menu == 11){
    lcd.setCursor(0,0);
    lcd.print("Tour 15:");
    lcd.setCursor(8,0);
    lcd.print(lap[1][14]);
    lcd.setCursor(0,1);
    lcd.print("Tour 16:");
    lcd.setCursor(8,1);
    lcd.print(lap[1][15]);
  }
  if(menu == 12){
    lcd.setCursor(0,0);
    lcd.print("Tour 17:");
    lcd.setCursor(8,0);
    lcd.print(lap[1][16]);
    lcd.setCursor(0,1);
    lcd.print("Tour 18:");
    lcd.setCursor(8,1);
    lcd.print(lap[1][17]);
  }
  if(menu == 13){
    lcd.setCursor(0,0);
    lcd.print("Tour 19:");
    lcd.setCursor(8,0);
    lcd.print(lap[1][18]);
    lcd.setCursor(0,1);
    lcd.print("Tour 20:");
    lcd.setCursor(8,1);
    lcd.print(lap[1][19]);
  }
  }
  
  

  
  //---------reset-----------------
  if(digitalRead(boutonB) == 0){
    reboot();
  }
//--------------cut off-------------------------- /////////////////////// a finir
  //int resultBinary = analogRead(A0);
  //float resultVolts = resultBinary/1023.0*5.0;
  //float tension = resultVolts/10000*20000;


    
  
//Serial.println(util);
  

 

//---------------------------------------------FIN-------------------------------------------------------------------