
/*  Didier Bellion  La Rochelle le 5 janvier 2023
 *  Ephemeride analogique prévu pour servo-moteurs
 *  limite de calcule: France métropolitaine
 *  Bray-Dunes (dep. du Nord) 51°4'18"N  2°31'42"E
 *  San Giuliano (dep. Haute Corse) 42°16'56" 9°33'36"E
 *  
 *  un cadran commun age, éclairement, phase
 *  une animation sphere lune tournante s'eclaire lorsque que le soleil est couché
 *  deux cadrans lever&couché du jour
 *  un cadran heure méridienne
 *  un cadran dans un repere cartesien de durée de jour
 *  saisi des données par 5 BP
 *  gestion d'un afficheur 4X20 en I2C
 *  
 * Merci a J.Remington pour sa methode cos phase de lune ultra légère
 * https://forum.arduino.cc/t/simple-lunar-clock/421406/30
 * Merci à Bricoleau pour sa routine épheméride
*/


//////les librairies/////////////////////////////////////////:
#include <EEPROM.h> // gestion de la memoire morte
#include <arduino-timer.h> //gestion des interruption surtout every
#include <Wire.h> // gestion de l'I2C
#include <LiquidCrystal_I2C.h>// gestion de l'afficheur en I2C
#include <ds3231.h> // attention librairie speciale qui simplifie beaucoup la mise à jour d'une horlorge temps réel
                    // par:Petre Rodan <2b4eda@subdimension.ro>
                     //on peut la trouver sur:  https://github.comarduino minuterie longue/rodan/ds3231
#include <math.h> // fonctions Bricoleau
#include <Stepper.h>// gestion de moteurs PàP


struct ts t; //déclaration variable dans les routines de mise a jours de l'horloge RTC par:Petre Rodan


// instruction de la bibliotech Stepper.h
const int stepspas = 2048;  // nombre de pas/tour pour les mot pàp. BYJ-48



// variable pour utile pour la mise à jour des dates et heures

int choix = 0;// navigation dans le nemu appel fonction
int an = 1961;
int moi= 9; 
int date = 14;
int jour= 5; // regle le jour de la semaine (1=Dimanche, 7=Samedi)
int heur = 10;
int minu = 10;
int seco = 1;
int latdeg,latmin,latsec;
int londeg,lonmin,lonsec;

  


float frac;/// c'est le retour de la valeur lunaire

//les 7 boutons

int pinBouton1 = A5; // Bouton poussoir 1 // bouton de reglage "moins"
int pinBouton2 = A6; // Bouton poussoir 2 // bouton de reglage "plus" /!\ inv de l'ordre pour facilté le tracé PCB
int pinBouton3 = A4; // Bouton poussoir 3// bouton de reglage "changement de menu"
int pinBouton4 = A3; // Bouton poussoir 4 // bouton de reglage "entrée dans le mode mofification"
int pinBouton5 = A2; // Bouton poussoir 5 
int pinBouton6 = A1; // Bouton poussoir 6 
int pinBouton7 = A0; // Bouton poussoir 7 // bouton de reglage "forcage de la mise a jour DE L'AFFICHAGE"


    
// initialisation des pin pour les moteurs
// attention à l'ordre des fil moteur qui sont inversé entre le fil N°3 et le N°4 Pb standard Chinois
// si tu change de moteur verifier le cablage du remplacent

Stepper mot_lever= Stepper(stepspas,44,40,42,38);
Stepper mot_midi = Stepper(stepspas, 36,32,34,30);
Stepper mot_coucher = Stepper(stepspas,28,24,26,22);
Stepper mot_duree = Stepper(stepspas, 23, 27, 25,29);
Stepper mot_lune = Stepper(stepspas, 31,35,33,37);

//////////////////////////////GESTION DES INDEX DE PORTEE GLOBAL
// indexlev c'est la valeur de l'heure de levée en minute il peut prendres les valeurs 5h du mat X 60 = 300 et 10 du mat x 60 = 600      
// indexmid c'est la valeur de l'heure de midi en minute il peut prendres les valeurs 11h X 60 = 660 et 14 x 60 = 840
// indexcou c'est la valeur de l'heure de couché en minute il peut prendres les valeurs 16h  X 60 = 960 et 21h x 60 = 1260
// le programe travail en Temps universelle. 
// Que ce soiten hivers ou en été la mise à jour de l'heure doit se faire en heure d'hiver càd TU+1
             
                        int indexlev; 
                        int indexmid; 
                        int indexcou;
                        int indexdur;
                        int indexlun;

                  int SH_indexlev; // position souhaité par le calcule de l'index levé SH = SouHait
                  int SH_indexmid; // position souhaité par le calcule de l'index midi
                  int SH_indexcou; // position souhaité par le calcule de l'index couché
                  int SH_indexdur; // position souhaité par le calcule de l'index durée
                  int SH_indexlun; // position souhaité par le calcule de l'index age de la lune



             
                  int PL_indexlev; // position souhaité par le calcule de l'index levé SH = SouHait
                  int PL_indexmid; // position souhaité par le calcule de l'index midi
                  int PL_indexcou; // position souhaité par le calcule de l'index couché
                  int PL_indexdur; // position souhaité par le calcule de l'index durée
                  int PL_indexlun; // position souhaité par le calcule de l'index age de la lune

                                      int calj; // variable porté global pour le calcule du Jour annuel
                                      int moidur;// variable porté global pour le calcule du Jour annuel
                                      int datedur;// variable porté global pour le calcule du Jour annuel

                  
                   
                    // variable pour gerer l'allumage de la lune                  
                    int som_Hplusmin;
                    int som_lev;
                    int som_cou;
                                
//variable pour recuperer les valeurs Lev mid cou a destination de l'affichage.
                    int H_lev;
                    int M_lev; 
                    int H_mid;
                    int M_mid;
                    int H_cou;
                    int M_cou; 


// variable heure d'été heure d'hivers//////////////:
                     int TU;


//variable cadencement
int cadT;
int cadD;
int Ttest;

              

// les fin de courses
int FdC_lev = 39; //fin de course levé
int FdC_mid = 41; //fin de course midi
int FdC_cou = 43; //fin de course couché
int FdC_dur = 45; //fin de course durée
int FdC_lun = 47; //fin de course lune
int FdC_hiv = 49; //switch heure été heure hiver







// c' est la definition et l'adresse I2C de l'afficheur 4 lignes
LiquidCrystal_I2C lcd(0x27, 20, 4);// adresse 0X27, 20 carartere  4 lignes 







 ///////////////// provisoir avant intergration Bricoleau
  void afficherTexte(char texte[])
  {
    ////Serial.print(texte);
  }

///////////////// provisoir avant intergration Bricoleau^^^


auto timer = timer_create_default();


///////////////////////////////////////////////////////////////
////////////DEBUT DU SETPUT///////////////////////////////////
///////////////////////////////////////////////////////////////
void setup() {


//définition des modes////////// on pourra viré ne sert qu'a la mise au point
                        
                        Serial.begin(9600);
                        while (!Serial) {;}   // attente du dem du port USB
//////////Demarrage de l'afficheur LCD
                        
        lcd.begin();// demmarage de l'ecran LCD


 // reglage des vitesses de moteur à 20 ça marche plus tenter 15 pour le moteur durée
        mot_lever.setSpeed(8);
        mot_midi.setSpeed(8);
        mot_coucher.setSpeed(8);
        mot_duree.setSpeed(15); // vitesse de la visse mere 15 ça passe maxi prevoir de faire un engrenage plus gros
        mot_lune.setSpeed(8);
  
  
  
  // recuperation de latitude longitude en EEprom attention a l'ecriture en Eprom /!\ Danger bien relire
            EEPROM.get(0,latdeg);
            EEPROM.get(4,latmin);
            EEPROM.get(8,latsec);
            EEPROM.get(12,londeg);
            EEPROM.get(16,lonmin);
            EEPROM.get(20,lonsec);


  // pin mode des boutons et des capteurs FdC
  pinMode(A3, INPUT);
  pinMode(A4, INPUT);
  pinMode(A5, INPUT);
  pinMode(A6, INPUT);

  pinMode(39, INPUT);
  pinMode(41, INPUT);
  pinMode(43, INPUT);
  pinMode(45, INPUT);
  pinMode(47, INPUT); 
  pinMode(49, INPUT);
  pinMode(51, INPUT);
  pinMode(53, INPUT);

  //pin mode des sorties

  pinMode (12, OUTPUT);
  digitalWrite (12,HIGH);// allume la lune par defaut
 
//////////////////////////////////////////////////////// RAZ unique pour le SETUP DEBUT
RAZmot();
RAZdur();
//////////////////////////////////////////////////////// RAZ unique pour le SETUP FIN

// mise à jour des variables de date et d'heure recuperer au setup
// pour ne pas perdre les valeurs antérieurs si rien n'est saisi par les BP

 heur = (t.hour);
 minu = (t.min);
 date = (t.mday);
 an   = (t.year);

delay(200);
}
/////////////////// <<< au dessus accolade fin de setup


//////////////////////////////////////////////////////////////////
///////////DEBUT DE LA BOUCLE (LOOP) /////////////////////////////
//////////////////////////////////////////////////////////////////
void loop() {


//sequence pour essai validé ou devalidé pour faire des essais précis sur une date
//testerEphemeride(3, 03, 2022, 30,-1, 8, 59, 46, 10, 00); // trame en dur , une iteration, longitude deg, min , sec latitude idem

testerEphemeride(t.mday,t.mon,t.year,1, londeg, lonmin, lonsec, latdeg, latmin, latsec);// 1 c'est le nombre de boucle à viré /!\ bon appel
///////// fin essai


//////////////////////////////////////////////////
DS3231_get(&t); // instruction pour l'horloge RTC
timer.tick();////// pour timer



float frac = (MoonPhase (t.year,t.mon,t.mday ));/// frac c'est l'éclairement en % c'est le retour de la fonction

 
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //// fonction de declanchement de d'evenement à partir de la DS3231 reel time clock 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* EXPLICATION DES EVENEMENTS DE MISE a JOUR
 * la mise a jour de l'affichage analogique du lever, du midi, du couché, et de l'age de la lune
 * est effectuer à Minuit et cinq minute soit 00X60+5 = 5
 * La variable >> "cadT":  c'est la somme de l'heure X 60 plus les minutes donc 
 * pour que la mise à jour se fasse tout les jour a 1 h du mat et 5 minute soit 1 heure x 60 + 5 min = 65 par exemple
 * ce qui donne la commande conditionelle :
 * if ( (cadT >= 65 )&&(cadT <66)){ void afficherHeureLEV(double d); RAZmot(); moteurlev (); moteurmid(); moteurcou();moteurlune();}
 * pour le chariot inferieur de durée du jour, un condition de date est ajouté:
 * CàD soit le 1er jour du mois le quatrieme le huitieme etc, etc, >>> 1 || 4 || 8 || 12 || 19 || 20 || 24 || 28 
 * les deux barre représente une condition booléenne "ou"  ||.  
 * un controle des secondes est placé pour réduire la fenetre de mise à jour (t.sec >= 5)&&(t.sec <= 7)

 */

// En provisoire se met à l'heure à 10h05 et la durée a 10h14 à modifier

if (digitalRead (pinBouton7) == LOW) {void afficherHeureLEV(double d);RAZmot();RAZdur (); moteurlev (); moteurmid(); moteurcou();moteurlune();moteurdur();}

if (( (cadT >= 605)&&(cadT <606))&& ((t.sec >= 5)&&(t.sec <= 7))){ 
void afficherHeureLEV(double d);RAZmot(); moteurlev (); moteurmid(); moteurcou();moteurlune();
}


if ( (datedur = 1 || 4 || 8 || 12 || 19 || 20 || 24 || 28 ) &&( (cadT >= 614)&&(cadT <615))&&((t.sec >= 5)&&(t.sec <= 7))) {

void afficherHeureLEV(double d); RAZdur();  moteurdur();

}


/// tmp pour test moteur a vire
  //void afficherHeureLEV(double d);RAZmot(); RAZdur(); moteurlev (); moteurmid(); moteurcou();moteurlune(); moteurdur();

              

//////////////////////////////////////////////////////////////////////   
////////////affichage recap des élements sur le LCD toujours à l'acceuil
//////////////////////////////////////////////////////////////////////

                   lcd.setCursor(0, 0);  
                
            lcd.print(t.mday);
            lcd.print("/");
            lcd.print(t.mon);
            lcd.print("/");
            lcd.print(t.year);
            
                  lcd.setCursor(11, 0); 
       
            lcd.print(t.hour);
            lcd.print("h");
            lcd.print(t.min);
            lcd.print("mn");
            lcd.print(t.sec);
            lcd.print("  ");
            
                  lcd.setCursor(0,1);
        
            lcd.print("ag:");
            lcd.setCursor(3, 1);
            lcd.print(frac);
      
                  lcd.setCursor(9,1);
                  
           lcd.print("J:");
           
                  lcd.setCursor(11, 1);
                  
           lcd.print(calj);
       
                 lcd.setCursor(0,2);
                   
           lcd.print("Lev:");
           lcd.print(H_lev);
           
                   lcd.setCursor(6,2 );
                   
           lcd.print("h");
           
                    lcd.setCursor(7,2 );
                    
           lcd.print(M_lev);
        
                    lcd.setCursor(10,2);
                    
           lcd.print("Mid:");
           lcd.print(H_mid);
           
                    lcd.setCursor(16,2 );
                    
           lcd.print("h");
           
                    lcd.setCursor(18,2 );
                    
           lcd.print(M_mid);
           
        
                    lcd.setCursor(0,3);
           lcd.print("Cou:");
           lcd.print(H_cou);
           
                    lcd.setCursor(6,3 );
                    
           lcd.print("h");
           
                    lcd.setCursor(7,3 );
                    
           lcd.print(M_cou);
           
                    lcd.setCursor(11,3 );
                    
           lcd.print("Heure:");
           

//ajoute plus 1h uniquement a l'affichage des aiguille analogique
//la mise à l'heure de l'horloge interne doit se faire à l'heure d'hivers Càd à TU +1 
     
     
          if (digitalRead (FdC_hiv) == 1) { lcd.setCursor(17,3 );lcd.print("ETE");(TU =0);}
          if (digitalRead (FdC_hiv) == 0) { lcd.setCursor(17,3 );lcd.print("HIV");(TU =1);} 
      
   
  


/*sequence de saisie de tous les element avec routine de limite
 * trés long
 *il commence par un switch*/


boolean etatBouton4 = digitalRead(pinBouton4);

     if (etatBouton4 == LOW){  
      choix = choix +1; 
      if (choix >=13) {choix = 1;}
      delay (100);
     }
                   
          switch (choix) {
                  case 1 :lcd.clear(); Anno(); break; //année A majuscule et fini par la lettre o pour la fonction et an pour la variable
                
                  case 2: lcd.clear(); Moino(); break;//mois 
                  
                  case 3: lcd.clear(); Dato(); break;// date
                  
                  case 4: lcd.clear(); Heuro(); break; // heure
                                
                  case 5: lcd.clear(); Minuto(); break;// minute
                  
                  case 6: lcd.clear(); Latdego(); break;// latitude D° attention posittive nord negative sud
                  
                  case 7: lcd.clear(); Latmino();break;// latitude minute
                  
                  case 8:lcd.clear(); Latseco(); break;// latitude seconde

                  case 9:lcd.clear(); Londego(); break; //Longitude D°  attention positive ouest negative est
                  
                  case 10:lcd.clear();Lonmino(); break; //longitude minute
                    
                  case 11:lcd.clear();Lonseco(); break; //longitude seconde
                    
                  case 12:lcd.clear();setDateTime();break;   // /!\ tres important switch sur la fonction qui ecrit les données sous forme de trame dans le DC3231 RTC 

                  default : {}
                
 
            
  //fin de cycle par defaut pas activé/break;
  
}

////////////////////////element de calcule pour le cadencement à virer juste pour la mise au point
/*
Serial.print( "cadanceTout = " );
Serial.println ( cadT );
Serial.print( "H = " );
Serial.println ( t.hour );
Serial.print( "min= " );
Serial.println ( t.min );
Serial.print( "CadT  " );
Serial.println (cadT );

*/

////////////////////>>>>cadT<<<< Variable utiliser pour le cadencement de mise à jour
cadT= (((t.hour)*60) +(t.min));


/////utile pour le calule du nombre de jour et du nombre de mois
           
              datedur = (t.mday);// affectation de la date
              moidur = (t.mon);// sert dans l'algo de deplacement du curseur durée du jour



//////////ALGO allumage de la lune///////////////////////////////////////////////////
/* par encadrement de valeur 
 * l'heure convertie en minutes dans la PERIODE NOCTURNE peut prendre la valeur maximum de 960 pour 16h 
 * en passant par zero pour minuit  puis remonter à 300 pour 5h du mat
 * la lune (pinout 12) est mise à HIGH au setup 
 * si la valeur Heure actuelle est sup à l'heure de lever(de 300 à 600 valeur cadrans 
 * ET ET  inf à l'heure de coucher de 960 à 1260, c'est que nous somme en JOUR
 * la valeur jour peut s'etandre aux maxi de 300 à 1260 (en reference au graduations du cadran)
 * l'algo force la sortie 12 a LOW pour eteindre la lune en JOUR
 */

 som_Hplusmin = ((t.hour)*60 +(t.min));
  if ((som_Hplusmin >= som_lev) && (som_Hplusmin <= som_cou)){digitalWrite (12,LOW);} //!\ la pin finale c'est la 12
  else analogWrite ( 12,20);//remplacer le 20 par une variable de 0 à 255 pour moduler le niveau d'eclairage de la lune 






//sortie serie pour la mise au point

Serial.print( "som_lev" );
Serial.println ( som_lev );
Serial.print( "som_cou" );
Serial.println ( som_cou );
Serial.print( "NOW en minute" );
Serial.println (som_Hplusmin );
Serial.print( "quel N° de Jour " );
Serial.println (datedur );
Serial.println (t.mday );



}
/////////////////////////////////////////////////////////////////////////////
//////////////////////////////FIN DE LA BOUCLE (LOOP)////////////////////////
/////////////////////////////////////////////////////////////////////////////


//j'explique la saisi des année en detail , le principe se reproduit pour toutes les variables

 



///////////saisie de l'année limite 00 99

void Anno(){
  
      lcd.setCursor(0, 0);  // sequence d'affichage
      lcd.print("modification annees");
      lcd.setCursor(0, 1);
       lcd.print("valeur: 00 a 99    ");
         lcd.setCursor(0, 2);
         lcd.print("val en mem:");  
             lcd.setCursor(11, 2); 
               lcd.print(t.year);  
                            

               

  boolean etatBouton1 = digitalRead(pinBouton1); // capture de BP
  boolean etatBouton2 = digitalRead(pinBouton2);
  boolean etatBouton3 = digitalRead(pinBouton3);
 
    if (etatBouton1 == LOW) //test si bouton 2 appuyé fonction "moins"
    {
    an = an - 1;                      // limiteur en moins
    if (an <  0) {an = 99;} 
          
            lcd.setCursor(0, 3);
            // modif local de l'affichage
             lcd.print(">>");
            lcd.print(an);
            lcd.print("     ");
            delay(100);
  }
  if (etatBouton2 == LOW)            //test si bouton 2 appuyé fonction "plus"
  {
    an = an + 1;                     //limiteur en plus
     if (an >99) {an = 0;} 
       
   
          lcd.setCursor(0, 3);   // modif local de l'affichage
           lcd.print(">>");
          lcd.print(an);
          lcd.print("     ");
          delay(100);
  } 

 if (etatBouton3 == LOW){       // boclage sur la fonction si BP 
      choix = choix +1;  // navigation descendante
      if (choix >12) {choix = 1;}  // parametre en fonction du nombre de "case" dans le switch
      delay (100);
     }



else Anno ();
}

///////////saisie du mois limite 1 12
void Moino(){
    
      lcd.setCursor(0, 0);
      lcd.print("modification mois   ");
      lcd.setCursor(0, 1);
       lcd.print("valeur: 1 a 12     ");
        lcd.setCursor(0, 2);
         lcd.print("val en mem:");  
             lcd.setCursor(11, 2); 
               lcd.print(t.mon);  
   
  boolean etatBouton1 = digitalRead(pinBouton1);
  boolean etatBouton2 = digitalRead(pinBouton2);
  boolean etatBouton3 = digitalRead(pinBouton3);
 
    if (etatBouton1 == LOW) //test si bouton 2 appuyé
    {
    moi = moi - 1;
    if (moi <  1) {moi = 12;} 
           
    
            lcd.setCursor(0, 3);
             lcd.print(">>");
            lcd.print(moi);
            lcd.print("       ");
            delay(100);
  }
  if (etatBouton2 == LOW) //test si bouton 2 appuyé
  {
    moi = moi + 1;
     if (moi >12) {moi = 1;} 
      
           lcd.setCursor(0, 3);
           lcd.print(">>");
          lcd.print(moi);
          lcd.print("       ");
          delay(100);
  } 

 if (etatBouton3 == LOW){  
      choix = choix +1; 
      if (choix >12) {choix = 1;}
      delay (100);
     }

else Moino ();
}


///////////saisie de la date limite 1 31
void Dato(){
    
     lcd.setCursor(0, 0);
      lcd.print("modification date");
      lcd.setCursor(0, 1);
       lcd.print("valeur: 1 a 31     ");
        lcd.setCursor(0, 2);
         lcd.print("val en mem:");  
             lcd.setCursor(11, 2); 
               lcd.print(t.mday);  
    
  boolean etatBouton1 = digitalRead(pinBouton1);
  boolean etatBouton2 = digitalRead(pinBouton2);
  boolean etatBouton3 = digitalRead(pinBouton3);
 
    if (etatBouton1 == LOW) //test si bouton 2 appuyé
    {
    date = date - 1; 
    if (date <  1) {date = 31;} 
       
            lcd.setCursor(0, 3);
            lcd.print(date);
            lcd.print("       ");
            delay(100);
  }
  if (etatBouton2 == LOW) //test si bouton 2 appuyé
  {
    date = date + 1;
     if (date >31) {date = 1;} 
     
           lcd.setCursor(0, 3);
          lcd.print(date);
          lcd.print("       ");
          delay(100);
  } 

 if (etatBouton3 == LOW){  
      choix = choix +1; 
      if (choix >12) {choix = 1;}
      delay (100);
     }

else Dato ();
}






 ///////////saisie de l'heure limite  0 23 /!\ pas 24!!!!! 
void Heuro(){
    
      lcd.setCursor(0, 0);
      lcd.print("modification heure  ");
      lcd.setCursor(0, 1);
       lcd.print("valeur: 0 a 23     ");
               lcd.setCursor(0, 2);
            
         lcd.print("val en mem:");  
             lcd.setCursor(11, 2); 
               lcd.print(t.hour);  
  

  boolean etatBouton1 = digitalRead(pinBouton1);
  boolean etatBouton2 = digitalRead(pinBouton2);
  boolean etatBouton3 = digitalRead(pinBouton3);
 
    if (etatBouton1 == LOW) //test si bouton 2 appuyé
    {
   heur = heur - 1;
    if (heur <  0) {heur = 23;} 
           
            lcd.setCursor(0, 3);
            lcd.print(heur);
            lcd.print(" H  ");
            delay(100);
  }
  if (etatBouton2 == LOW) //test si bouton 2 appuyé
  {
   heur = heur + 1;
     if (heur >23) {heur = 0;} 
          lcd.setCursor(0, 3);
         
          lcd.print(heur);
          lcd.print(" H  ");
          delay(100);
  } 

 if (etatBouton3 == LOW){  
      choix = choix +1; 
      if (choix >12) {choix = 1;}
      delay (100);
     }

 
else Heuro ();
}

///////////saisie des minutes
void Minuto(){
      lcd.setCursor(0, 0);
      lcd.print("modification minutes");
      lcd.setCursor(0, 1);
       lcd.print("valeur: 0 a 59     ");
               lcd.setCursor(0, 2);
    lcd.print("val en mem:");  
             lcd.setCursor(11, 2); 
               lcd.print(t.min);  

  boolean etatBouton1 = digitalRead(pinBouton1);
  boolean etatBouton2 = digitalRead(pinBouton2);
  boolean etatBouton3 = digitalRead(pinBouton3);
 
    if (etatBouton1 == LOW) //test si bouton 2 appuyé
    {
   minu = minu - 1;
    if (minu <  0) {minu = 59;} 
           
            lcd.setCursor(0, 3);
            lcd.print(minu);
            lcd.print(" min  ");
            delay(100);
  }
  if (etatBouton2 == LOW) //test si bouton 2 appuyé
  {
    minu = minu + 1;
     if (minu >59) {minu = 0;} 
        
           lcd.setCursor(0,3);
          lcd.print(minu);
          lcd.print(" min  ");
          delay(100);
  } 

   if (etatBouton3 == LOW){  
      choix = choix +1; 
      if (choix >12) {choix = 1;}
      delay (100);
     }
else Minuto();
}

///////////COORDONNEES saisie des Degre de latitude/////////////////////


void Latdego(){
    lcd.setCursor(0, 0);
      lcd.print("latitude  deg   :   ");
      lcd.setCursor(0, 1);
       lcd.print("valeur: 40 a 52   ");
         lcd.setCursor(0, 2);
            lcd.print("val en mem:");  
             lcd.setCursor(11, 2); 
               lcd.print(latdeg); 
                  lcd.print ("  deg");   
                 

  boolean etatBouton1 = digitalRead(pinBouton1);
  boolean etatBouton2 = digitalRead(pinBouton2);
  boolean etatBouton3 = digitalRead(pinBouton3);
 
    if (etatBouton1 == LOW) //test si bouton 2 appuyé
    {
    latdeg = latdeg - 1;
    if (latdeg <  40) {latdeg = 40;} 
          
            lcd.setCursor(0, 3);
            lcd.print(latdeg);
            lcd.print("   deg ");
            delay(100);
  }
  if (etatBouton2 == LOW) //test si bouton 2 appuyé
  {
    latdeg = latdeg + 1;
     if (latdeg >52) {latdeg = 52;} 
       
   
          lcd.setCursor(0, 3);
          lcd.print(latdeg);
        lcd.print("   deg ");
          delay(100);


          
  } 


 if (etatBouton3 == LOW){  
      choix = choix +1; 
      if (choix >12) {choix = 1;}
      delay (100);
     }

else Latdego ();

}

 ///////////saisie des minute de latitude 

void Latmino(){
      lcd.setCursor(0, 0);
      lcd.print("latitude minute :   ");
      lcd.setCursor(0, 1);
       lcd.print("valeur: 0 a 60     ");
          lcd.setCursor(0, 2);
            lcd.print("val en mem:");  
             lcd.setCursor(11, 2); 
               lcd.print(latmin);   
               lcd.print (" min ");              
                 
                 

  boolean etatBouton1 = digitalRead(pinBouton1);
  boolean etatBouton2 = digitalRead(pinBouton2);
  boolean etatBouton3 = digitalRead(pinBouton3);
 
    if (etatBouton1 == LOW) //test si bouton 2 appuyé
    {
    latmin = latmin - 1;
    if (latmin <  0) {latmin = 60;} 
          
            lcd.setCursor(0, 3);
            lcd.print(latmin);
              lcd.print (" min ");  
            delay(100);
  }
  if (etatBouton2 == LOW) //test si bouton 2 appuyé
  {
    latmin = latmin + 1;
     if (latmin >60) {latmin = 0;} 
       
   
          lcd.setCursor(0, 3);
          lcd.print(latmin);
            lcd.print (" min ");  
          delay(100);
  } 

 if (etatBouton3 == LOW){  
      choix = choix +1; 
      if (choix >12) {choix = 1;}
      delay (100);
     }

else Latmino ();
}

void Latseco(){
  lcd.setCursor(0, 0);
      lcd.print("latitude seconde :  ");
      lcd.setCursor(0, 1);
       lcd.print("valeur: 0 a 60     ");
          lcd.setCursor(0, 2);
            lcd.print("val en mem:");  
             lcd.setCursor(11, 2); 
               lcd.print(latsec);                  
                   lcd.print ("  sec  ");   
                 

  boolean etatBouton1 = digitalRead(pinBouton1);
  boolean etatBouton2 = digitalRead(pinBouton2);
  boolean etatBouton3 = digitalRead(pinBouton3);
 
    if (etatBouton1 == LOW) //test si bouton 2 appuyé
    {
    latsec = latsec - 1;
    if (latsec <  0) {latsec = 60;} 
          
            lcd.setCursor(0, 3);
            lcd.print(latsec);
         lcd.print (" sec");  
            delay(100);
  }
  if (etatBouton2 == LOW) //test si bouton 2 appuyé
  {
    latsec = latsec + 1;
     if (latsec >60) {latsec = 0;} 
       
   
          lcd.setCursor(0, 3);
          lcd.print(latsec);
             lcd.print (" sec ");  
          delay(100);
  } 

 if (etatBouton3 == LOW){  
      choix = choix +1; 
      if (choix >12) {choix = 1;}
      delay (100);
     }

else Latseco ();
  
}

///////////saisie des longitudes D° mm sec

void Londego(){
  
      lcd.setCursor(0, 0);
      lcd.print("longitude  deg   :  ");
      lcd.setCursor(0, 1);
       lcd.print("valeur: -6 a +10 ");
        lcd.setCursor(0, 2);
            lcd.print("val en mem:");  
             lcd.setCursor(11, 2); 
               lcd.print(londeg);                 
                    lcd.print ("  deg");  
                 

  boolean etatBouton1 = digitalRead(pinBouton1);
  boolean etatBouton2 = digitalRead(pinBouton2);
  boolean etatBouton3 = digitalRead(pinBouton3);
 
    if (etatBouton1 == LOW) //test si bouton 2 appuyé
    {
    londeg = londeg - 1;
    if (londeg <  -6) {londeg = -6;} 
          
            lcd.setCursor(0, 3);
            lcd.print(londeg);
          lcd.print("  deg ");
            delay(100);
  }
  if (etatBouton2 == LOW) //test si bouton 2 appuyé
  {
    londeg = londeg + 1;
     if (londeg >10) {londeg = 10;} 
       
   
          lcd.setCursor(0, 3);
          lcd.print(londeg);
         lcd.print("  deg ");
          delay(100);
  } 

 if (etatBouton3 == LOW){  
      choix = choix +1; 
      if (choix >12) {choix = 1;}
      delay (100);
     }

else Londego ();
}


void Lonmino(){

  lcd.setCursor(0, 0);
      lcd.print("longitude minutes : ");
      lcd.setCursor(0, 1);
       lcd.print("valeur: 0 a 60     ");
           lcd.setCursor(0, 2);
            lcd.print("val en mem:");  
             lcd.setCursor(11, 2); 
               lcd.print(lonmin);                 
                    lcd.print ("  min ");  
                 

  boolean etatBouton1 = digitalRead(pinBouton1);
  boolean etatBouton2 = digitalRead(pinBouton2);
  boolean etatBouton3 = digitalRead(pinBouton3);
 
    if (etatBouton1 == LOW) //test si bouton 2 appuyé
    {
    lonmin = lonmin - 1;
    if (lonmin <  0) {lonmin = 60;} 
          
            lcd.setCursor(0, 3);
            lcd.print(lonmin);
            lcd.print("   min ");
            delay(100);
  }
  if (etatBouton2 == LOW) //test si bouton 2 appuyé
  {
    lonmin = lonmin + 1;
     if (lonmin >60) {lonmin = 0;} 
       
   
          lcd.setCursor(0, 3);
          lcd.print(lonmin);
           lcd.print("   min ");
          delay(100);
  } 

 if (etatBouton3 == LOW){  
      choix = choix +1; 
      if (choix >12) {choix = 1;}
      delay (100);
     }

else Lonmino ();

}

void Lonseco(){
  lcd.setCursor(0, 0);
      lcd.print("longitude seconde : ");
      lcd.setCursor(0, 1);
       lcd.print("valeur: 0 a 60     ");
          lcd.setCursor(0, 2);
            lcd.print("val en mem:");  
             lcd.setCursor(11, 2); 
               lcd.print(lonsec);                  
                    lcd.print ("  sec  ");  
                 

  boolean etatBouton1 = digitalRead(pinBouton1);
  boolean etatBouton2 = digitalRead(pinBouton2);
  boolean etatBouton3 = digitalRead(pinBouton3);
 
    if (etatBouton1 == LOW) //test si bouton 2 appuyé
    {
    lonsec = lonsec - 1;
    if (lonsec <  0) {lonsec = 60;} 
          
            lcd.setCursor(0, 3);
            lcd.print(lonsec);
            lcd.print("   sec ");
            delay(100);
  }
  if (etatBouton2 == LOW) //test si bouton 2 appuyé
  {
    lonsec = lonsec + 1;
     if (lonsec >60) {lonsec = 0;} 
       
   
          lcd.setCursor(0, 3);
          lcd.print(lonsec);
           lcd.print("   sec ");
          delay(100);
  } 

 if (etatBouton3 == LOW){  
      choix = choix +1; 
      if (choix >13) {choix = 1;}
      delay (200);
     }

else Lonseco ();
  
}





// ecriture sur la DS3231 la RTC 

void setDateTime(){
 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
delay(100);
 lcd.setCursor(5, 0);
  lcd.print("Ephemeride");
 
  lcd.setCursor(0, 1);
  lcd.print("Memorisation donnees");
delay(500);

  // DS3231_init(DS3231_INTCN);
 
  t.hour=heur; // données pour mettre à l'heure l'horloge
  t.min=minu;
  t.sec=0;
  t.mday=date;
  t.mon=moi;
  t.year=(an+2000);//  je rajoute 2000 car la variable semble codé sur deux chiffres
delay(200);
  
  DS3231_set(t); // mise à l'heure de l'horloge

delay(500);
//serie d'ecriture en EEprom
 while (!Serial) {;}   // wait for serial port to connect. Needed for native USB port only
 
            EEPROM.put(0,latdeg);
            EEPROM.put(4,latmin);
            EEPROM.put(8,latsec);
            EEPROM.put(12,londeg);
            EEPROM.put(16,lonmin);
            EEPROM.put(20,lonsec);




delay(1000);
lcd.clear();
 lcd.setCursor(5, 0);
  lcd.print("Ephemeride");
  lcd.setCursor(0, 1);
  lcd.print("La date & l heures");
 
  lcd.setCursor(0, 2);
  lcd.print("sont memorisees");

  

delay(1000);
lcd.clear();
 lcd.setCursor(5, 1);
  lcd.print("coord. GEO");
   lcd.setCursor(5, 2);
  lcd.print("mise en mem");
  
  delay(500);
lcd.clear();
  

 lcd.setCursor(0,0 );    
     lcd.print("Lat:DEG/MIN/SEC");
   
      lcd.setCursor(4,1 );
        lcd.print(latdeg);
        
        lcd.setCursor(8,1 );  
       lcd.print(latmin);
       
        lcd.setCursor(12,1 );
        lcd.print(latsec);

  lcd.setCursor(0,2 );
      lcd.print("Long:DEG/MIN/SEC ");
     
      lcd.setCursor(5,3 );
        lcd.print(londeg);
        
        lcd.setCursor(9,3 );
        lcd.print(lonmin);
        lcd.setCursor(13,3 );
   lcd.print(lonsec);

  delay(1000);
lcd.clear();
     

  boolean etatBouton1 = HIGH;// bouton de reglage "moins"
  boolean etatBouton2 = HIGH;// bouton de reglage "plus"
  boolean etatBouton3 =  HIGH;// bouton de reglage "changement de menu"
  boolean etatBouton4 =  HIGH;// bouton de reglage "entrée dans le mode mofification"
   boolean etatBouton5 =  HIGH;// bouton de reglage "forcage de la mise a jour DE L'AFFICHAGE"
choix = 0;

 
}


///////////saisie des latitudes D° mm sec


/////////////////////////////////////////////////////////////////////////////
//fonction de calcule phase Lune pas touche dite cos a partir du calcule des jours julien
/////////////////////////////////////////////////////////////////////////////

float MoonPhase(int nYear, int nMonth, int nDay){ // calculate the current phase of the moon
  float age, phase, frac, days_since;
  long YY, MM, K1, K2, K3, JD;
  YY = nYear - floor((12 - nMonth) / 10);
  MM = nMonth + 9;
  if (MM >= 12)
  {
    MM = MM - 12;
  }
  K1 = floor(365.25 * (YY + 4712));
  K2 = floor(30.6 * MM + 0.5);
  K3 = floor(floor((YY / 100) + 49) * 0.75) - 38;
  JD = K1 + K2 + nDay + 59;  //Julian day
  if (JD > 2299160) //1582, Gregorian calendar
  {
    JD = JD - K3;
  }

  // Serial.print(" JD jour julien : ");  //Julian Day, checked OK
 // Serial.print(JD);
  // Serial.print(" ");

  days_since = JD - 2451550L; //since noon on Jan. 6, 2000 (new moon @18:00)
  phase = (days_since - 0.25) / 29.53059; //0.25 = correct for 6 pm that day
  phase -= floor(phase);  //phase in cycle
  age = phase * 29.53059;

  // calculate fraction full
  frac = (1.0 - cos(phase * 2 * PI)) * 0.5;

   //Serial.print("Moon Age ");
 //  Serial.print(age);

  return age; //phase or age or frac, as desired
}



/////////////////////////////
/////fonction deplacer en bas
///////////////////////////

/*la fonction testerEphemeride contient la fonction calculer
 * pour l'instant je n'arrive pas à regrouper ces deux fonction imbriquées
 * je me base donc sur tester ephemeride pour produire les Trois valeur en minutes 
 * qui vont me servir à gerer les servomoteurs hlever heure meridiene hcouché 
 * 
 */
void testerEphemeride(int jour, int mois, int annee, int nbjours,
                      int longitude_ouest_degres, int longitude_ouest_minutes, int longitude_ouest_secondes,
                      int latitude_nord_degres, int latitude_nord_minutes, int latitude_nord_secondes)
{
  
  void calculerEphemeride(int jour, int mois, int annee, double longitude_ouest, double latitude_nord, double *lever, double *meridien, double *coucher);
  
  double longitude_ouest, latitude_nord;
  double lever, meridien, coucher;

 
  afficherTexte("\nCalcul ephemeride au lieu ");
  afficherCoordonnee(longitude_ouest_degres, longitude_ouest_minutes, longitude_ouest_secondes, 'W');
  afficherTexte(" - ");
  afficherCoordonnee(latitude_nord_degres, latitude_nord_minutes, latitude_nord_secondes, 'N');
  afficherTexte("\n\nDate            Lever         Meridien      Coucher\n");

  longitude_ouest = calculerCoordonneeDecimale(longitude_ouest_degres, longitude_ouest_minutes, longitude_ouest_secondes);
  latitude_nord = calculerCoordonneeDecimale(latitude_nord_degres, latitude_nord_minutes, latitude_nord_secondes);

/////////////    
calculerEphemeride(jour, mois, annee, longitude_ouest, latitude_nord, &lever, &meridien, &coucher);
    afficherDate(jour, mois, annee);
    afficherTexte(" ");

//je recrer 3 fonction specifique


    afficherHeureLEV(lever);
    afficherTexte(" ");
    afficherHeureMED(meridien);
    afficherTexte(" ");
    afficherHeureCOU(coucher);
    afficherTexte("\n");





  

}



void calculerCentreEtVariation(double longitude_ouest, double sinlat, double coslat, double d, double *centre, double *variation)
{
  //constantes précalculées par le compilateur
  const double M_2PI = 2.0 * M_PI;
  const double degres = 180.0 / M_PI;
  const double radians = M_PI / 180.0;
  const double radians2 = M_PI / 90.0;
  const double m0 = 357.5291;
  const double m1 = 0.98560028;
  const double l0 = 280.4665;
  const double l1 = 0.98564736;
  const double c0 = 0.01671;
  const double c1 = degres * (2.0*c0 - c0*c0*c0/4.0);
  const double c2 = degres * c0*c0 * 5.0 / 4.0;
  const double c3 = degres * c0*c0*c0 * 13.0 / 12.0;
  const double r1 = 0.207447644182976; // = tan(23.43929 / 180.0 * M_PI / 2.0)
  const double r2 = r1*r1;
  const double d0 = 0.397777138139599; // = sin(23.43929 / 180.0 * M_PI)
  const double o0 = -0.0106463073113138; // = sin(-36.6 / 60.0 * M_PI / 180.0)

  double M,C,L,R,dec,omega,x;

  //deux ou trois petites formules de calcul
  M = radians * fmod(m0 + m1 * d, 360.0);
  C = c1*sin(M) + c2*sin(2.0*M) + c3*sin(3.0*M);
  L = fmod(l0 + l1 * d + C, 360.0);
  x = radians2 * L;
  R = -degres * atan((r2*sin(x))/(1+r2*cos(x)));
  *centre = (C + R + longitude_ouest)/360.0;

  dec = asin(d0*sin(radians*L));
  omega = (o0 - sin(dec)*sinlat)/(cos(dec)*coslat);
  if ((omega > -1.0) && (omega < 1.0))
    *variation = acos(omega) / M_2PI;
  else
    *variation = 0.0;
}

void calculerEphemeride(int jour, int mois, int annee, double longitude_ouest, double latitude_nord, double *lever, double *meridien, double *coucher)
{
  int nbjours;
  const double radians = M_PI / 180.0;
  double d, x, sinlat, coslat;

  //calcul nb jours écoulés depuis le 01/01/2000
  if (annee > 2000) annee -= 2000;
  nbjours = (annee*365) + ((annee+3)>>2) + jour - 1;
  switch (mois)
  {
    case  2 : nbjours +=  31; break;
    case  3 : nbjours +=  59; break;
    case  4 : nbjours +=  90; break;
    case  5 : nbjours += 120; break;
    case  6 : nbjours += 151; break;
    case  7 : nbjours += 181; break;
    case  8 : nbjours += 212; break;
    case  9 : nbjours += 243; break;
    case 10 : nbjours += 273; break;
    case 11 : nbjours += 304; break;
    case 12 : nbjours += 334; break;
  }
  if ((mois > 2) && (annee&3 == 0)) nbjours++;
  d = nbjours;

  //calcul initial meridien & lever & coucher
  x = radians * latitude_nord;
  sinlat = sin(x);
  coslat = cos(x);
  calculerCentreEtVariation(longitude_ouest, sinlat, coslat, d + longitude_ouest/360.0, meridien, &x);
  *lever = *meridien - x;
  *coucher = *meridien + x;

  //seconde itération pour une meilleure précision de calcul du lever
  calculerCentreEtVariation(longitude_ouest, sinlat, coslat, d + *lever, lever, &x);
  *lever = *lever - x;

  //seconde itération pour une meilleure précision de calcul du coucher
  calculerCentreEtVariation(longitude_ouest, sinlat, coslat, d + *coucher, coucher, &x);
  *coucher = *coucher + x;
}


void afficherDate(int jour, int mois, int annee)
{
  char texte[20];
  sprintf(texte, "%02d/%02d/%04d", jour, mois, annee);
  afficherTexte(texte);
}

void afficherCoordonnee(int degre, int minute, int seconde, char c)
{
  char texte[20];
  if (degre < 0)
  {
    degre = -degre;
    if (c == 'W') c = 'E';
    if (c == 'N') c = 'S';
  }
  sprintf(texte,"%dd%d'%d''%c", degre, minute, seconde, c);
  afficherTexte(texte);
}




double calculerCoordonneeDecimale(int degre, int minute, int seconde)
{
  if (degre > 0)
  {
    return (double) degre + minute / 60.0 + seconde / 3600.0;
  }
  else
  {
    return (double) degre - minute / 60.0 - seconde / 3600.0;
  }
}

void avancerDate(int *jour, int *mois, int *annee)
{
  (*jour)++;
  if ((*jour>31)
  || ((*jour==31) && (*mois==2 || *mois==4 || *mois==6 || *mois==9 || *mois==11))
  || ((*jour==30) && (*mois==2))
  || ((*jour==29) && (*mois==2) && (((*annee)&3) != 0)))
  {
    *jour = 1;
    (*mois)++;
    if (*mois > 12)
    {
      *mois = 1;
      (*annee)++;
    }
  }
}

void afficherHeureLEV(double d)
{
  int h,m,s;
  char texte[20];

  d = d + 0.5;

  if (d < 0.0)
  {
   
    d = d + 1.0;
  }
  else
  {
    if (d > 1.0)
    {
    
      d = d - 1.0;
    }
    else
    {
   
    }
  }

  h = d * 24.0;
  d = d - (double) h / 24.0;
  m = d * 1440.0;
  d = d - (double) m / 1440.0;
  s = d * 86400.0 + 0.5;

  sprintf(texte,"%02d:%02d:%02d",h,m,s);
  afficherTexte(texte);


////////////////////////////////////////////////////////////////////////////////////////
h = h + TU;//////Trés important: gestion du TU soit TU = +1 en hiver soit TU = +2 en été
//////////////////////////////////////////////////////////////////////////////////////
indexlev = h*60 +m;

som_lev = h*60+m;

H_lev = h;
M_lev = m;
  
}

void afficherHeureMED(double d)
{
  int h,m,s;
  char texte[20];

  d = d + 0.5;

  if (d < 0.0)
  {
   
    d = d + 1.0;
  }
  else
  {
    if (d > 1.0)
    {
    
      d = d - 1.0;
    }
    else
    {
   
    }
  }

  h = d * 24.0;
  d = d - (double) h / 24.0;
  m = d * 1440.0;
  d = d - (double) m / 1440.0;
  s = d * 86400.0 + 0.5;

  sprintf(texte,"%02d:%02d:%02d",h,m,s);
  afficherTexte(texte);





//Serial.print("H lev=");  
//Serial.print(h);
//Serial.print(" : ");  
//Serial.println(m);

////////////////////////////////////////////////////////////////////////////////////////
h = h + TU;//////Trés important: gestion du TU soit TU = +1 en hiver soit TU = +2 en été
//////////////////////////////////////////////////////////////////////////////////////


indexmid = h*60 +m;

H_mid=h;
M_mid=m; 

  
}


void afficherHeureCOU(double d)
{
  int h,m,s;
  char texte[20];

  d = d + 0.5;

  if (d < 0.0)
  {
   
    d = d + 1.0;
  }
  else
  {
    if (d > 1.0)
    {
    
      d = d - 1.0;
    }
    else
    {
   
    }
  }

  h = d * 24.0;
  d = d - (double) h / 24.0;
  m = d * 1440.0;
  d = d - (double) m / 1440.0;
  s = d * 86400.0 + 0.5;

  sprintf(texte,"%02d:%02d:%02d",h,m,s);
  afficherTexte(texte);





//Serial.print("H lev =");  
//Serial.println(h);
//Serial.print(" : ");  
//Serial.println(m);

////////////////////////////////////////////////////////////////////////////////////////
h = h + TU;//////Trés important: gestion du TU soit TU = +1 en hiver soit TU = +2 en été
//////////////////////////////////////////////////////////////////////////////////////


///////////////// met à jour la variable de porté general et la convertie en minute

indexcou = h*60 +m;

som_cou = h*60+m;

H_cou=h;
M_cou=m; 
  
}

/////////////////////////////////////////////////////////////////////////////
////////////////GESTION DES MOTEURS//////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////


void moteurlune()
{

 
  float age = MoonPhase (t.year,t.mon,t.mday );/// j'utilise la fonction age

  //Serial.print(" Age de la lune  ");
   //Serial.print(age);


indexlun = (age);
if(indexlun < 0){indexlun = 0;}
  
SH_indexlun = map ( indexlun,1,29,0,4096); // 4096 c'est la valeur d'un tour complet de l'index

 //Serial.print(" SH_indexlune  ");
   //Serial.print(SH_indexlun);

   mot_lune.step(-SH_indexlun);

//while (SH_indexlun > PL_indexlun) {PL_indexlun = ++PL_indexlun; mot_lune.step(-1);}    //!\ step(1) limite d'amplitude de motlev  1024+1
//while (SH_indexlun< PL_indexlun ) {PL_indexlun = --PL_indexlun;mot_lune.step(1);}// avec contrôle capteur fdc

  digitalWrite(31,LOW);digitalWrite(33,LOW);digitalWrite(35,LOW);digitalWrite(37,LOW);
  }



void moteurlev()  ///!\ les FdC doivent etre à 0 pour l'arrêt, le moteur va dans le sens anti horaire (-1) les autre horaire (1) 


{


SH_indexlev = map ( indexlev, 270,630,0,1024);///// calibration de l'amplitude des afficheurs 270 c'est l'heure mini de lever en minute sur l'afficheur soit 4hx60 + 30 minute
                                              /////630 c'est l'heure mini de lever en minute sur l'afficheur soit 4hx60 + 30 minute
if (SH_indexlev > 1024) {SH_indexlev = 1024;}



                  //ci-dessous version simple qui doit marché je met le mot à zero puis je fais le nbr de pas point barre?
                    while  (digitalRead (FdC_lev) == 1){ mot_lever.step(-1);} // init lever dans le sens horaire
                     mot_lever.step(SH_indexlev);    



digitalWrite(38,LOW);digitalWrite(40,LOW);digitalWrite(42,LOW);digitalWrite(44,LOW);
 
  }
void moteurmid(){
// pour ne pas gener le passage de la barre de recopie je suis obligé de la placer en bas.
//  je vais donc chercher la limite haute de l'heure soit 14h X 60 et je me deplace en décrementant
// soit dans le sens (1) anti horaire dans cette orientation du moteur PàP

SH_indexmid = map ( indexmid, 690,870,-590,0);///// 690 c'est l'heure mini de lever en minute sur l'afficheur soit 11hx60 + 30minute

if (SH_indexmid < -590) {SH_indexmid = -590;}


//ci-dessous version simple qui doit marché je met le mot à zero puis je fais le nbr de pas point barre?
while  (digitalRead (FdC_mid) == 1){ mot_midi.step(1);} // init lever dans le sens horaire normalement 1 
                                    mot_midi.step(SH_indexmid); 
                                  
                                       
digitalWrite(30,LOW);digitalWrite(32,LOW);digitalWrite(34,LOW);digitalWrite(36,LOW);//eteint les enroulements
}



void moteurcou()
{

SH_indexcou = map ( indexcou,1350,990,-1024,0);///// 1350 c'est l'heure mini de lever en minute sur l'afficheur soit 5hx60 + minute

if (SH_indexcou < -1024) {SH_indexcou= -1024;}


//ci-dessous version simple qui doit marché je met le mot à zero puis je fais le nbr de pas point barre?
while  (digitalRead (FdC_cou) == 1){ mot_coucher.step(1);} // init lever dans le sens horaire
                                     mot_coucher.step(SH_indexcou);   

digitalWrite(22,LOW);digitalWrite(24,LOW);digitalWrite(26,LOW);digitalWrite(28,LOW);
}           

                     
void moteurdur()
{

 switch (moidur) {
                  case 1 : calj = datedur; break; 
                
                  case 2:  calj = datedur +31; break;
                  
                  case 3: calj = datedur +59; break;
                  
                  case 4: calj = datedur +90; break; 
                                
                  case 5:  calj = datedur +120; break;
                  
                  case 6: calj = datedur +151; break;
                  
                  case 7: calj = datedur +181; break;
                  
                  case 8: calj = datedur +212; break;

                  case 9: calj = datedur +243;break;
                  
                  case 10:calj = datedur +273; break;
                    
                  case 11:calj = datedur +304; break; 
                    
                  case 12:calj = datedur +334; break; 


// serail de mise au point a effacer
//Serial.print ( "*****************************************calj  ");
//Serial.print (calj);//////////////////Nbr de 1 à 365
 }

if (calj <= 181){ SH_indexdur = map ( calj,1,181,0,24000);}//24000 pour 120mm

if (calj >= 181){ SH_indexdur = map ( calj,182,365,24000,0);}//24000 pour 120mm


//ci-dessous version simple qui doit marché je met le mot à zero puis je fais le nbr de pas point barre?
                  
//mot_duree.step(-SH_indexdur);  /// deplacement vers la >>>droite en negatif step( moins un)  

///ci-dessous version compliqué inspiré du barometre 

while ((SH_indexdur > PL_indexdur) && (PL_indexdur < 24000)) {PL_indexdur = ++PL_indexdur; mot_duree.step(-1);}    //!\ step(1) limite d'amplitude de motlev  1024+1
while ((SH_indexdur < PL_indexdur) && (digitalRead (FdC_dur) == 1)) {PL_indexdur = --PL_indexdur; mot_duree.step(1);}// avec contrôle capteur fdc

digitalWrite(23,LOW);digitalWrite(25,LOW);digitalWrite(27,LOW);digitalWrite(29,LOW);

}


/////////////////////////////////////////////////////////////////////////////
//////////// RAZ MOTEUR et AFFICHAGE////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////


  void RAZmot () { // attention au RAZ des index
// Pour les moteur lev, mid et cou je ne fais pas de RAZ de l'index dans la mesure ou pour leurs mise à jour, je repasse par le FdC l'action est tres rapide
// pour le moteur Lun je fais un mouvement 

   while  (digitalRead (FdC_lev) == 1){ mot_lever.step(-1);} // init lever dans le sens horaire
 if (digitalRead (FdC_lev) == 0) {digitalWrite(38,LOW);digitalWrite(40,LOW);digitalWrite(42,LOW);digitalWrite(44,LOW);}

 while (digitalRead (FdC_mid) == 1){ mot_midi.step(1); } // init midi dans le sens anti horaire
 if (digitalRead (FdC_mid) == 0) {digitalWrite(30,LOW);digitalWrite(32,LOW);digitalWrite(34,LOW);digitalWrite(36,LOW);}

   while (digitalRead (FdC_cou) == 1){ mot_coucher.step(1); }// init couché dans le sens anti horaire
if (digitalRead (FdC_cou) == 0) {digitalWrite(22,LOW);digitalWrite(24,LOW);digitalWrite(26,LOW);digitalWrite(28,LOW);}

// ci-desous >>> pour le moteur Lun:
//si je suis sur l'aimant (FdC_lun == 0) c'est a dire détecté: je fais un mouvement
// de la valeur de la zone de detection dans le sens (-1) anti horaire  


// sortir l'aimantde devant le capteur je tourne de - 800 pas ( la lune tourne à l'envers du sens conventionel)  ce 
// qui correspond à l'ecart angulaire de la zone du capteur

if ((digitalRead (FdC_lun)) ==0) {mot_lune.step(-800);} 

//si je nz suis pas devant le catpeur: je tourne dans le sens conventionnel +1 jusqu'au calage

while ((digitalRead (FdC_lun)) ==1 ) {mot_lune.step(1); indexlun = 0;} // arret sur detection FdC_lun à 0

// j'arrete les enroulement pour pas chauffé 

if (digitalRead (FdC_lun) == 0) {digitalWrite(31,LOW);digitalWrite(33,LOW);digitalWrite(35,LOW);digitalWrite(37,LOW);}// eteint les enroulements

}



void RAZdur (){

// RAZ du mot durée du jour dans le sens 1 vers le capteur

while (digitalRead (FdC_dur) == 1){ mot_duree.step(1); } // init durée dans le sens anti horaire
if (digitalRead (FdC_dur) == 0) {
  PL_indexdur = 0;
  digitalWrite(23,LOW);digitalWrite(25,LOW);digitalWrite(27,LOW);digitalWrite(29,LOW);}

}

 
///FIN///FIN///FIN///FIN///FIN///FIN///FIN///FIN///FIN///FIN///FIN DU PROG

  
