// Sketch "Animation  modélisme naval" pour Arduino UNO ou Nano avec radio rc et moteur pas à pas 28BYJ-48 + driver ULN2003
// Alimentation du drver moteur: 5v dcc
// Ce sketch fonctionne à la façon d'un GRAFCET avec des etapes x0 a x4
// manche au milieu, le moteur est à l'arret
//manche en haut, le moteur fait 1 tour dans un sens
// manche en bas, le moteur fait 1 tour en sens inverse
// mettre le manche au milieu au démarrage

#include <Stepper.h>
#define STEPS 100 


int signal= 2;      // signal radio sur pin D2
int val1;           // variable pour stocker la valeur signal
int mini = 1000;  // 
int maxi = 2000;  //

int E1;             //étape 1 initiale
int E2;             //étape 2
int E3;             //étape3





Stepper Mon_moteur(STEPS,8, 10, 9, 11);

void setup()
{
   Serial.begin(9600);         // le Serial.begin sert pour l'affichage dans le moniteur série et pourra etre supprimé après débuggage
  
   pinMode(signal, INPUT);    // Signal entrée
   pinMode(8, OUTPUT);        // vers driver ULN2003 IN1
   pinMode(9, OUTPUT);       // vers driver ULN2003 IN2
   pinMode(10, OUTPUT);        // vers driver ULN2003 IN3
   pinMode(11, OUTPUT);       // vers driver ULN2003 IN4

   E1= HIGH;             //étape 1 ACTIVE 
   E2= LOW; 
   E3= LOW; 
   
   
  
}

void sens0()                           // sous programme (fonction) moteur a l'arret si manche au milieu
{
       
        digitalWrite(8,LOW);           //pour eviter que le moteur chauffe à l'arret, attention plus de maintien du couple
        digitalWrite(9,LOW);
        digitalWrite(10,LOW);
        digitalWrite(11,LOW); 
        delay (1000);                  // Ce delay doit etre gardé, mais peu etre ajusté. 
        
}
void sens1()                           // sous programme (fonction) moteur sens arriere pour 1 tour si manche en bas
{
        Mon_moteur.setSpeed(100);     // réglage de la vitesse (max: 300)
        Mon_moteur.step(-8192);        // 2048 pour 1 tour (Une rotation complète avec 2048 pas), à ajuster selon déplacement souhaité       
        delay (1000);                 // Ce delay doit etre gardé pour que le moteur ai le temps d'ffectuer sa rotation mais peu etre ajusté.               
        
}


 
      
        
void loop()
{
    
      val1 = pulseIn(signal, HIGH);       // stock la valeur du signal dans val1  
      val1 = map(val1, mini, maxi, 1000, 2000);
      val1 = constrain(val1, 1000, 2000);       // pour contraindre la valeur du signal entre 1000 et 2000
                         // ce delay peu etre augmenté pour un affichage plus lent dans le moniteur série et supprimé après débuggage programme
  
  if ((E1 == HIGH) &&  (val1 > 1400) && (val1 < 1600))   // radio en route, manche au milieu
  {
    E2=HIGH;                            //On active l'etape 2
    sens0();                            // appel au sous programme (fonction) : sens0()
    E1=LOW;                             //On desactive l'etape 1
         
      
      }
   if ((E2== HIGH) && (E1 == LOW) && (val1 > 900) && (val1 < 1100) )
  {
    
    E3=HIGH;                            //On active l'etape 3
    sens1();                            // appel au sous programme (fonction) : sens2()
    E2=LOW;                             //On desactive l'etape 2
    
  }  
   if ((E3 == HIGH) && (E2 == LOW) && (val1 > 1400) && (val1 < 1600))
  {
    
    E1=HIGH;                            //On active l'etape 1
    sens0();                            // appel au sous programme (fonction) : sens0()
    E3=LOW;                             //On desactive l'etape 3
    
     
  }
  
  
      
    }