// MAJ 22-08-2021 - Forum EspaceTrain - PHB22560
// Pour ATtiny85 - Horloge interne à 8MHz
// Alimentation en 5V pour ATtiny85 et servomoteur

#include <SoftwareServo.h>
SoftwareServo Servo_Moteur;

const int Commande = 0;         // BROCHE N° 5 DE L'ATtiny85
int Etat_Commande;

const int Potentiometre_Angle_Mini = A3;  // BROCHE N° 2 DE L'ATtiny85
int Valeur_Angle_Mini;

const int Potentiometre_Angle_Maxi = A2;  // BROCHE N° 3 DE L'ATtiny85
int Valeur_Angle_Maxi;

const int Potentiometre_Vitesse_Deplacement = A1;     // BROCHE N° 7 DE L'ATtiny85
int Valeur_Vitesse_Deplacement;
int val;

void setup()
{
  Servo_Moteur.attach(1); // BROCHE N° 6 DE L'ATtiny85 > PWM
  
  pinMode (Commande, INPUT);
  digitalWrite (Commande, LOW);
  Etat_Commande = digitalRead (Commande);
  
  pinMode (Potentiometre_Angle_Mini, INPUT);
  
  pinMode (Potentiometre_Angle_Maxi, INPUT);
  
  pinMode (Potentiometre_Vitesse_Deplacement, INPUT);
}

void loop()
{
//*****************************************************************************************
// PASSAGE DE ANGLE MAXI A ANGLE MINI (REGLABLES) AVEC APPLICATION DU CONTROLE DE VITESSE *
//*****************************************************************************************

  Valeur_Angle_Mini = analogRead (Potentiometre_Angle_Mini);
  Valeur_Angle_Mini = map (Valeur_Angle_Mini, 0, 1023, 5, 90);

  Valeur_Angle_Maxi = analogRead (Potentiometre_Angle_Maxi);
  Valeur_Angle_Maxi = map (Valeur_Angle_Maxi, 0, 1023, 91, 175);

  Valeur_Vitesse_Deplacement = analogRead (Potentiometre_Vitesse_Deplacement);
  Valeur_Vitesse_Deplacement = map (Valeur_Vitesse_Deplacement, 0, 1023, 1, 50);
  
  // Ligne ci-dessus : transformée de [0, 1023] en [0, 50].
  // Les valeurs 0 et 50 correspondent à 0ms et 50ms si utilisation de "delay" par la suite
  // Dans le cas de l'utilisation de "delayMicoseconds", plage possible peut varier entre 0 et 16383
  // 16383 (16383µs) est la valeur maxi qu'il est possible de mettre dans un "delayMicoseconds"

  val = Valeur_Angle_Maxi;
  do
    {
    Servo_Moteur.write (val);
    SoftwareServo::refresh();
    delay (Valeur_Vitesse_Deplacement);
    val = (val - 1) ;
    }
  while (val >= Valeur_Angle_Mini);

//******************************************************
// MAINTIEN A ANGLE MINI TANT QUE LA COMMANDE VAUT LOW *
//******************************************************

  while (Etat_Commande == LOW)
    { 
    val = analogRead (Potentiometre_Angle_Mini);
    val = map (val, 0, 1023, 5, 90);
    Servo_Moteur.write (val);
    SoftwareServo::refresh();
    Etat_Commande = digitalRead (Commande);
    }
    
//*****************************************************************************************
// PASSAGE DE ANGLE MINI A ANGLE MAXI (REGLABLES) AVEC APPLICATION DU CONTROLE DE VITESSE *
//*****************************************************************************************

  Valeur_Angle_Mini = analogRead (Potentiometre_Angle_Mini);
  Valeur_Angle_Mini = map (Valeur_Angle_Mini, 0, 1023, 5, 90);
  
  Valeur_Angle_Maxi = analogRead (Potentiometre_Angle_Maxi);
  Valeur_Angle_Maxi = map (Valeur_Angle_Maxi, 0, 1023, 91, 175);
  
  Valeur_Vitesse_Deplacement = analogRead (Potentiometre_Vitesse_Deplacement);
  Valeur_Vitesse_Deplacement = map (Valeur_Vitesse_Deplacement, 0, 1023, 1, 50);
  
  // Ligne ci-dessus : transformée de [0, 1023] en [0, 50].
  // Les valeurs 0 et 50 correspondent à 0ms et 50ms si utilisation de "delay" par la suite
  // Dans le cas de l'utilisation de "delayMicoseconds", plage possible peut varier entre 0 et 16383
  // 16383 (16383µs) est la valeur maxi qu'il est possible de mettre dans un "delayMicoseconds"
  
  val = Valeur_Angle_Mini;
  do
    {
    Servo_Moteur.write (val);
    SoftwareServo::refresh();
    delay (Valeur_Vitesse_Deplacement);
   
    val = (val + 1) ;
    }
  while (val <= Valeur_Angle_Maxi);
  
//*******************************************************      
// MAINTIEN A ANGLE MAXI TANT QUE LA COMMANDE VAUT HIGH *
//*******************************************************

  while (Etat_Commande == HIGH)
    { 
    val = analogRead (Potentiometre_Angle_Maxi);
    val = map (val, 0, 1023, 91, 175);
    Servo_Moteur.write (val);
    SoftwareServo::refresh();
    Etat_Commande = digitalRead (Commande);
    }
}
