/*attiny aiguillage KATO BP V2
  07/03/2025
  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/424788394778888193
         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;
const int dureeImpulsion = 20;

simpleBouton bouton(BPcommande);
bool variableEtat = true;

void setup() {
  pinMode(CdeInput1, OUTPUT);
  pinMode(CdeInput2, OUTPUT);
  pinMode(LedVoieDirecte, OUTPUT);
  pinMode(LedVoieDeviee, OUTPUT);

  commandePosition(CdeInput1, LedVoieDirecte, LedVoieDeviee); // Commande de l'aiguillage en position Directe
}

void loop() {
  bouton.actualiser();
  if (bouton.vientDEtreEnfonce()) {
    variableEtat = !variableEtat; // Inversion de la variable
    if (variableEtat) {
      commandePosition(CdeInput1, LedVoieDirecte, LedVoieDeviee); // Commande de l'aiguillage en position Directe
    } else {
      commandePosition(CdeInput2, LedVoieDeviee, LedVoieDirecte); // Commande en position Déviée
    }
  }
}

void commandePosition(byte cdeInput, byte ledAllumee, byte ledEteinte) {
  digitalWrite(ledEteinte, LOW); // Effacement de la position précédente
  digitalWrite(cdeInput, HIGH);  // Impulsion envoyée au L293D
  delay(dureeImpulsion);
  digitalWrite(cdeInput, LOW);
  digitalWrite(ledAllumee, HIGH); // La nouvelle position de l'aiguillage est visualisée
}

ATTINY8520PU
tiny:PB5
tiny:PB3
tiny:PB4
tiny:GND
tiny:PB0
tiny:PB1
tiny:PB2
tiny:VCC
led1:A
led1:C
r1:1
r1:2
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
led2:A
led2:C
r2:1
r2:2
gnd3:GND
led3:A
led3:C
r3:1
r3:2
gnd1:GND
led4:A
led4:C
r4:1
r4:2