// CLAVIER 2 BP DEBUGAGE_REV08.05
// Auteur : Djamel CHERGUI
// DNC e Solution
/* #######################################################################################
 18/01/2022 - 13:45
- Debogage de la section paramétrage au niveau de l'entrée des grandeurs numérique puis de 
 l'affichage de celles-ci sur le LCD
- Le Ø fils déclaré en nombre flottant, incrémentation/décrémention du Ø par palier de 0.05 mm
- Debogage en cours de la section selection programme
 19/01/2022 - 16:15
 - Sauvegarde de secours
 20/01/2022 - 9:23
 - Intégration du curseur clignotant pour le temps d'attente paramétrage
 21/01/2022 - 9:43
 -Debogage de la boucle paramétrage/select programme */
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int BP_HAUT = 8;
int BP_BAS = 7;
int Etat_BP_HAUT=LOW;
int Etat_BP_BAS=LOW;
int Etat_BP=LOW;
const int Tempo = 2000;
unsigned long Temps_Actuel;
unsigned long Temps_Precedent;
int nb_spire;
int vitesse;
float diam_fils;
int long_bobine;
int flag_select_prog;
int flag_sauve_parametre;
int mode_parametrage = LOW;
int mode_select_programme = LOW;
int mode_sauvegarde_programme = LOW;
int reglage_nb_spire = LOW;
int reglage_vitesse = LOW;
int reglage_diam_fils = LOW;
int reglage_long_bobine = LOW;
void setup() 
{
  Serial.begin(9600);
  pinMode(BP_HAUT, INPUT);
  pinMode(BP_BAS, INPUT);
  
  Temps_Actuel = millis();
 /*------------------------- Ecran d’accueil ---------------------*/
  lcd.init();
  lcd.clear();
  lcd.backlight();
  lcd.setCursor(1, 0);
  lcd.print("DNC.e.Solution");
  lcd.setCursor(0, 1);
  lcd.print("Winding Machine");
  delay(2500);
  lcd.clear();
}
  
void loop() 
{
Reset_parametrage(); // RAZ valeurs paramétrage
Etat_BP_HAUT=digitalRead(BP_HAUT);
Etat_BP_BAS=digitalRead(BP_BAS);
Etat_BP =(Etat_BP_HAUT||Etat_BP_BAS);//Touche quelconque activée
 /* ---------------Partie démarrage -----------------*/       
   
    while(Etat_BP==LOW)
     { 
      Menu_demarrage();
      mode_select_programme = HIGH;
        if (Etat_BP!=0)
        delay(200);     
        break;
     }
     
/* ---------------Partie paramétrage -----------------*/       
 
if (digitalRead(BP_HAUT)==HIGH && digitalRead(BP_BAS)==LOW) //oui pour paramétrage
  {  
        {
        delay(100);
        mode_parametrage = HIGH;
        lcd.clear();
        Invite_parametrage();
        delay(100);
        }
while(mode_parametrage==HIGH)
   { 
                         /*----------Paramétrage spire----------*/
                           
                                    /*Touche active*/
       { 
       Reset_parametrage(); // RAZ valeurs paramétrage
       reglage_nb_spire = HIGH;
       }        
     while(reglage_nb_spire==HIGH)
     {
     if((digitalRead(BP_HAUT)==HIGH)||(digitalRead(BP_BAS)==HIGH))  
        {   
         Gestion_parametrage_spire();
         lcd.blink();
         Affich_nb_spire();
        }
                                   /*Touche inactive*/
    else if((!digitalRead(BP_HAUT))&&(!digitalRead(BP_BAS))&&(nb_spire > 0)){
         Temps_Actuel=millis();
	    if((Temps_Actuel-Temps_Precedent > Tempo))
      {
        lcd.noBlink();
        Serial.println("Sortie réglage nb spire");
        reglage_nb_spire = LOW; 
         break;
      }   
     }   
    }                    
                         /*----------Paramétrage vitesse----------*/
                                    /*Touche active*/
     
     reglage_vitesse = HIGH; 
     
     while(reglage_vitesse==HIGH)
     {
     if((digitalRead(BP_HAUT)==HIGH)||(digitalRead(BP_BAS)==HIGH))    
        {
         Gestion_parametrage_vitesse();
         lcd.blink();
         Affich_vitesse();
        }
                                    /*Touche inactive*/
      else if((!digitalRead(BP_HAUT))&&(!digitalRead(BP_BAS))&&(vitesse>0)){
           Temps_Actuel=millis();
      if((Temps_Actuel-Temps_Precedent > Tempo))
      {
         lcd.noBlink();
         Serial.println("Sortie réglage vitesse");
         reglage_vitesse = LOW;
         break;
      }   
     }
    }   
                         /*----------Paramétrage Ø fils----------*/
                                    /*Touche active*/
     
     reglage_diam_fils = HIGH; 
     
     while(reglage_diam_fils==HIGH)
     {
     if ((digitalRead(BP_HAUT)==HIGH)||(digitalRead(BP_BAS)==HIGH))    
        {
         Gestion_diam_fils();
         lcd.blink();
         Affich_diam_fils();
        }
                                   /*Touche inactive*/
      else if((!digitalRead(BP_HAUT))&&(!digitalRead(BP_BAS))&&(diam_fils>0)){
           Temps_Actuel=millis();
      if((Temps_Actuel-Temps_Precedent > Tempo))
      {
         lcd.noBlink();
         Serial.println("Sortie réglage Ø fils");
         reglage_diam_fils = LOW;
         break;
      }   
     }
    }                          
                        /*----------Paramétrage longueur bobine----------*/
                                    /*Touche active*/
     
     reglage_long_bobine = HIGH; 
     
     while(reglage_long_bobine==HIGH)
     {
     if ((digitalRead(BP_HAUT)==HIGH)||(digitalRead(BP_BAS)==HIGH))    
        {
         Gestion_long_bobine();
         lcd.blink();
         Affich_long_bobine();
        }
                                    /*Touche inactive*/
      else if((!digitalRead(BP_HAUT))&&(!digitalRead(BP_BAS))&&(long_bobine>0)){
           Temps_Actuel=millis();
      if((Temps_Actuel-Temps_Precedent > Tempo))
      {
         lcd.noBlink();
         Serial.println("Sortie réglage Ø fils");
         reglage_long_bobine = LOW;
         break;
      }   
     }
    }                                                  
 delay(1000);
 mode_parametrage = LOW;
if (mode_parametrage!=HIGH) break;
            }
            
    mode_sauvegarde_programme = HIGH;
    flag_sauve_parametre=HIGH;
             
            
  }
  
/* -------------------- Section Sauvegarde paramétrage --------------*/
if ((digitalRead(BP_HAUT)==LOW && digitalRead(BP_BAS)==LOW) && (mode_sauvegarde_programme == HIGH)) //Menu pour sauvegarde paramétrage
   {
      {
       delay(500);
       lcd.clear();
      }
  while(mode_sauvegarde_programme == HIGH && flag_sauve_parametre==HIGH)
      {
              
        while((digitalRead(BP_HAUT)==LOW && digitalRead(BP_BAS)==LOW)&&(flag_sauve_parametre==HIGH))
          
            {
             Menu_de_sauvegarde_parametrage();
             
             if ((digitalRead(BP_HAUT)==HIGH && digitalRead(BP_BAS)==LOW)) // oui pour sauvegarde
                { 
                 lcd.clear();
                 Message_de_sauvegarde_parametrage();
                 delay(1500);
                 flag_sauve_parametre=!HIGH;
                 if(flag_sauve_parametre=!HIGH)
                 break;}                  
            }
              
             if ((digitalRead(BP_HAUT)==LOW && digitalRead(BP_BAS)==HIGH)) // non pour sauvegarde
            {
             lcd.clear();
             Message_pas_de_sauvegarde_parametrage();
             delay(1500);
             mode_sauvegarde_programme =!HIGH;
             
            }
         
         if(mode_sauvegarde_programme =!HIGH)
         break;   
      
      }
   }
/* ----------------------------------------------------------------- */
if ((digitalRead(BP_HAUT)==LOW && digitalRead(BP_BAS)==HIGH)) //non pour paramétrage
   {
     {
      delay(500);
      lcd.clear();
      Select_programme();
      flag_select_prog=HIGH;
      Serial.println("Sortie de select programme");              
     }
  while(mode_select_programme==HIGH)
       { 
         {
           Serial.println("Dans le while principal...");
           Serial.print("flag select prog: ");Serial.println(flag_select_prog);
           Serial.print("mode select programme: ");Serial.println(mode_select_programme);
         }
         while(flag_select_prog==HIGH)
           
        {
           if ((digitalRead(BP_HAUT)==HIGH && digitalRead(BP_BAS)==LOW)) // Selection d'un programme
         
           { 
           Serial.println("Selection d'un programme, entrée dans le menu");
           lcd.clear();
           Choix_programme();
           delay(3000);
       
           Serial.print("flag select prog: ");Serial.println(flag_select_prog);
           mode_select_programme=LOW;
           Serial.print("mode select programme: ");Serial.println(mode_select_programme);
           break;
           }
          else if ((digitalRead(BP_HAUT)==LOW && digitalRead(BP_BAS)==HIGH)) // Pas de selection de programme
         {
           Serial.println("Pas de selection de programme, retour au menu paramétrage");
           lcd.clear();
    
           Serial.print("flag select prog: ");Serial.println(flag_select_prog);
           mode_select_programme=LOW;
           Serial.print("mode select programme: ");Serial.println(mode_select_programme);
           break;
         }
        
      
        }
      if(mode_select_programme==LOW)
      Serial.println("Sortie du while principal...");
      break;}
    }  
 
}
          /*---------------- Routines d’affichage paramètres ----------------*/  
  void Affich_nb_spire()
  {
  lcd.setCursor(5, 0);
  lcd.print("   ");
  lcd.setCursor(5, 0);
  lcd.print(nb_spire);
  delay(150);
  }
  void Affich_vitesse()
  {
  lcd.setCursor(13, 0);
  lcd.print("   ");
  lcd.setCursor(13, 0);
  lcd.print(vitesse);
  delay(150);
  }
  void Affich_diam_fils()
  {
  lcd.setCursor(4, 1);
  lcd.print("    ");
  lcd.setCursor(4, 1);
  lcd.print(diam_fils);
  delay(150);
  }
  void Affich_long_bobine()
  {
  lcd.setCursor(12, 1);
  lcd.print("   ");
  lcd.setCursor(12, 1);
  lcd.print(long_bobine);
  delay(150);
  }
/*------------ Routine de définition du nombre de spires -----------*/
  void Gestion_parametrage_spire()
{   
    {
    Temps_Actuel = millis();
    Temps_Precedent = Temps_Actuel;
    }
      
if ((digitalRead(BP_HAUT)==HIGH && digitalRead(BP_BAS)==LOW) && (nb_spire<500))
   {
    nb_spire++;
    Serial.println("spire ++");
   }              
if ((digitalRead(BP_BAS)==HIGH && digitalRead(BP_HAUT)==LOW) && (nb_spire>1))
   
   { 
    nb_spire--;
    Serial.println("spire --");        
   }          
}
/*---------- Routine de définition de la vitesse de bobinage --------*/
  void Gestion_parametrage_vitesse()
{   
    {
    Temps_Actuel = millis();
    Temps_Precedent = Temps_Actuel;
    }
if ((digitalRead(BP_HAUT)==HIGH && digitalRead(BP_BAS)==LOW) && (vitesse<200))
    {
     vitesse++;
     Serial.println("vitesse ++");
    }    
if ((digitalRead(BP_BAS)==HIGH && digitalRead(BP_HAUT)==LOW) && (vitesse>1)) 
    {
     vitesse--;
     Serial.println("vitesse --");
    }
}
/*----------------- Routine de définition du Ø fils -----------------*/
  void Gestion_diam_fils()
{
    {
    Temps_Actuel = millis();
    Temps_Precedent = Temps_Actuel;
    }
if ((digitalRead(BP_HAUT)==HIGH && digitalRead(BP_BAS)==LOW) && (diam_fils<1.95))
    {
     diam_fils=diam_fils+0.05;
     Serial.println("Ø fils ++");
    }    
if ((digitalRead(BP_BAS)==HIGH && digitalRead(BP_HAUT)==LOW) && (diam_fils>0.1))
    {
     diam_fils=diam_fils-0.05;
     Serial.println("Ø fils --");
    }
}
/*-------------- Routine de définition de la longueur de bobine ---------------*/
  void Gestion_long_bobine()
{
    {
    Temps_Actuel = millis();
    Temps_Precedent = Temps_Actuel;
    }
if ((digitalRead(BP_HAUT)==HIGH && digitalRead(BP_BAS)==LOW) && (long_bobine<200))
    {
     long_bobine++;
     Serial.println("long_bobine ++");
    }
     
if ((digitalRead(BP_BAS)==HIGH && digitalRead(BP_HAUT)==LOW) && (long_bobine>5))
    {
     long_bobine--;
     Serial.println("long_bobine --");
    }
}
/*----------------- Routine de Sauvegarde paramétrage ----------------*/
void Message_pas_de_sauvegarde_parametrage()
{
  lcd.setCursor(3, 0);
  lcd.print("Pas de memo");
  lcd.setCursor(3, 1);
  lcd.print("parametres");
  delay(10);
}
  void Message_de_sauvegarde_parametrage()
{
  lcd.setCursor(3, 0);
  lcd.print("Sauvegarde");
  lcd.setCursor(3, 1);
  lcd.print("parametres");
  delay(10);
}
 void Menu_de_sauvegarde_parametrage()
{
  lcd.setCursor(0, 0);
  lcd.print("  sauvegarde ?");
  lcd.setCursor(0, 1) ;
  lcd.print("<< oui    non >>");
  delay(10);
}
  void Invite_parametrage()
{
  lcd.setCursor(0, 0);
  lcd.print("TURN~");
  lcd.setCursor(5, 0);
  lcd.print(nb_spire) ;
  lcd.setCursor(9, 0);
  lcd.print("RPM~");
  lcd.setCursor(13, 0) ;
  lcd.print(vitesse) ;
  lcd.setCursor(0, 1);
  lcd.print("DIA~");
  lcd.setCursor(4, 1) ;
  lcd.print(diam_fils) ;
  lcd.setCursor(9, 1);
  lcd.print("LG~");
  lcd.setCursor(12, 1);
  lcd.print(long_bobine);
}  
/*---------------------- Routine du message d’accueil -------------------*/
  void Message_Accueil()
{  
  lcd.clear();
  lcd.setCursor(1, 0);
  lcd.print("DNC.e.Solution");
  lcd.setCursor(0, 1);
  lcd.print("Winding Machine");
}
/*---------------------- Routine du Menu de démarrage --------------------*/
  void Menu_demarrage()
{
  lcd.setCursor(0, 0);
  lcd.print(" parametrage ?");
  lcd.setCursor(0, 1) ;
  lcd.print("<< oui    non >>");
}
/*---------------------- Routine de sauvegarde en EEPROM -------------------*/
  void Sauvegarde_en_EEPROM()
{ 
  lcd.clear();
  lcd.setCursor(3, 0);
  lcd.print("Sauvegarde");
  lcd.setCursor(3, 1);
  lcd.print("en EEPROM");
  delay(2500);
  lcd.clear(); 
}
/*----------------- Routine du message de selection de programme  ----------------*/
void Select_programme()
{
  lcd.setCursor(0, 0);
  lcd.print(" select prog ?");
  lcd.setCursor(0, 1) ;
  lcd.print("<< oui    non >>");
}
  
/*-------------------------- Reset paramétrage ----------------------------*/
void Reset_parametrage()
{
 nb_spire = 0;
 vitesse = 0;
 diam_fils = 0;
 long_bobine = 0;
}
/*---------------------- Routine selectionner un programme --------------------*/
  void Choix_programme()
{
  lcd.setCursor(0, 0);
  lcd.print("P1~P10 :  ");
  lcd.setCursor(0, 1) ;
  lcd.print("<< ++      -- >>");
}