/*attiny aiguillage KATO BP V3
  24/01/2024
  Dominique Hudry
  Commande d'un aiguillage KATO par un BP avec affichage de la voie sélectionnée.
  Le BP de commande peut être remplacé par tout capteur délivrant une masse lorsqu'il y a détection,
  au repos sa sortie doit être au niveau +5V.
  l'étage de puissance est un L293D,  La bobine de l'aiguillage KATO est branchée entre Output1 et Output2.
  
  Le changement de position se produit uniquement lors du front descendant de la sortie du capteur.
  A la mise sous tension le montage positionne l'aiguillage dans la position Directe.
  
  liens: https://wokwi.com/projects/387800596253418497
         https://wiki.mchobby.be/index.php?title=Pont-H_L293D
         https://forum.arduino.cc/t/partage-boutons-poussoirs/361656
         
  compatible avec ATtiny25
               Brochage Attiny85

                   =|1  U  8|= VCC
    CdeInput2 <--3 =|2     7|= 2--> LedVoieDeviee
    CdeInput1 <--4 =|3     6|= 1--> LedVoieDirecte
               GND =|4     5|= 0<-- BPcommande--GND

                 Brochage L293D

       +5V--Enable1 =|1  U 16|= +5V
  CdeInput1--Input1 =|2    15|= Input4
            Output1 =|3    14|= Output4
                GND =|4    13|= GND
                GND =|5    12|= GND
            Output2 =|6    11|= Output3
  CdeInput2--Input2 =|7    10|= Input3
  +V aiguilles--VS =|8     9|= Enable2--+5V

  La bobine de l'aiguillage KATO est  branchée entre Output1 et Output2

  input1  input2  action
   LOW     LOW    aucun changement
   HIGH    LOW    position Directe
   LOW     HIGH   position Déviée
   HIGH    HIGH   aucun changement


*/


#include "simpleBouton.h"

const byte BPcommande = 0;
const byte LedVoieDirecte = 1;
const byte LedVoieDeviee = 2;
const byte CdeInput1 = 4;
const byte CdeInput2 = 3;
bool variableEtat;
int dureeImpulsion = 20;

simpleBouton bouton(BPcommande);

void setup() {
  pinMode(CdeInput1, OUTPUT);
  pinMode(CdeInput2, OUTPUT);
  digitalWrite(CdeInput2, LOW);
  pinMode(LedVoieDirecte, OUTPUT);
  pinMode(LedVoieDeviee, OUTPUT);
  commandePositionDirecte();// commande de l'aiguillage en position Directe
  variableEtat = true;
} // fin setup

void loop() {
  bouton.actualiser();
  if (bouton.vientDEtreEnfonce())  {
    variableEtat = !variableEtat; // inversion de la variable
    if (variableEtat)  {
      commandePositionDirecte(); // commande de l'aiguillage en position Directe
    } // fin if
    else  {
      commandePositionDeviee(); // commande en position Déviée
    } // fin else
  } // fin if
} // fin loop

void commandePositionDirecte() {
  digitalWrite(LedVoieDeviee, LOW); // effacement de la position précédente
  digitalWrite(CdeInput1, HIGH);    // impulsion envoyée au L293D sur Input1
  delay(dureeImpulsion);
  digitalWrite(CdeInput1, LOW);
  digitalWrite(LedVoieDirecte, HIGH); // la nouvelle position de l'aiguillage est visualisée
}

void commandePositionDeviee() {
  digitalWrite(LedVoieDirecte, LOW); // effacement de la position précédente
  digitalWrite(CdeInput2, HIGH);     // impulsion envoyée au L293D sur Input2
  delay(dureeImpulsion);
  digitalWrite(CdeInput2, LOW);
  digitalWrite(LedVoieDeviee, HIGH); // la nouvelle position de l'aiguillage est visualisée
}
ATTINY8520PU