/* arduino moteur mp5
    03/01/2024
    Dominique Hudry
    Commande d'un moteur d'aiguillage MTB MP5    
    liens: https://micro-modele.fr/fr/moteurs-d-aiguillage/7701-moteur-lent-pour-aiguillages-avec-2-interrupteurs-auxilliaires.html
           https://wokwi.com/projects/386745621340258305
    Câblage du moteur en 3 fils :
      +8v sur COM
      une masse venant sur POZ1 et POZ2 par l'intermédiaire d'un ULN2003
    A la mise sous tension:
      le moteur est figé
      test des leds de position
    Un appui sur le BP:    
      inverse l'état des commandes pour changer la position du moteur 
      affiche la nouvelle position  
     
   Code compatible ATtiny85

*/
#include "simpleBouton.h"

// configuration
const byte BPcommande  = 4;
const byte CdeULN1 = 5;
const byte CdeULN2 = 7;
const byte LedVoieDirecte = 10;
const byte LedVoieDeviee = 8;
bool variableEtat = false;

simpleBouton bouton(BPcommande);

void setup() {
  pinMode(CdeULN1, OUTPUT); // on règle CdeULN1 en sortie
  pinMode(CdeULN2, OUTPUT); // on règle CdeULN2 en sortie
  pinMode(LedVoieDirecte, OUTPUT); // on règle LedVoieDirecte en sortie
  pinMode(LedVoieDeviee, OUTPUT); // on règle LedVoieDeviee en sortie
  digitalWrite(CdeULN1, LOW); // le moteur est figé
  digitalWrite(CdeULN2, LOW);
  test();
} // fin setup

void loop() {
  bouton.actualiser();
  if (bouton.vientDEtreEnfonce())  {
    variableEtat = !variableEtat;
    if (variableEtat)  {
      digitalWrite(LedVoieDeviee, LOW); // effacement de la position précédente
      digitalWrite(CdeULN1, HIGH);      // l'entrée1 de l'ULN est commandée
      digitalWrite(CdeULN2, LOW);
      clignote(LedVoieDirecte);
    } // fin if

    else  {
      digitalWrite(LedVoieDirecte, LOW); // effacement de la position précédente
      digitalWrite(CdeULN1, LOW);
      digitalWrite(CdeULN2, HIGH);       // l'entrée2 de l'ULN est commandée
      clignote(LedVoieDeviee);
    } // fin else
  } // fin if
} // fin loop

void test() {
  digitalWrite(LedVoieDirecte, HIGH);
  digitalWrite(LedVoieDeviee, HIGH);
  delay(200);
  digitalWrite(LedVoieDirecte, LOW);
  digitalWrite(LedVoieDeviee, LOW);
} // fin test

void clignote(byte Led) {
  for (byte i = 0; i < 4; i++) {
    delay(250);
    digitalWrite(Led, LOW);
    delay(250);
    digitalWrite(Led, HIGH);
  } // fin for
} // fin clignote