/*attiny double monostable non redéclenchable 
  27/11/2024
  Dominique Hudry
  lien: https://wokwi.com/projects/415706945891665921

             ATtiny85

           =|1  U  8|= VCC
  BP2 -->3 =|2     7|= 2
  BP1 -->4 =|3     6|= 1--> Sortie2
       GND =|4     5|= 0--> Sortie1



*/

const byte PinBP1 = 4; // branchement du BP1
const byte PinBP2 = 3; // branchement du BP2
const byte Sortie1 =  0; // branchement de la Led1
const byte Sortie2 =  1; // branchement de la Led2
const int Temporisation = 1000; // durée de l'allumage de la Led
bool etatBP1;// BP relaché: HIGH  BP appuyé: LOW
bool etatBP2;// BP relaché: HIGH  BP appuyé: LOW
bool precedentEtatBP1 = HIGH;
bool precedentEtatBP2 = HIGH;
bool validation1;
bool validation2;
unsigned long TempsDernierChangement1 = 0; // variable pour mémoriser le temps écoulé depuis le dernier changement de la LED
unsigned long TempsDernierChangement2 = 0;
unsigned long  TempsActuel1;
unsigned long  TempsActuel2;
const int interval = 500;

void setup() {
  pinMode(PinBP1, INPUT_PULLUP);
  pinMode(PinBP2, INPUT_PULLUP);
  pinMode(Sortie1, OUTPUT);
  pinMode(Sortie2, OUTPUT);
  digitalWrite(Sortie1, LOW);
  digitalWrite(Sortie2, LOW);
} // fin setup

void loop() {
  etatBP1 = digitalRead (PinBP1); // lecture de l'état du BP1
  delay(50); // pour anti rebond
  if (etatBP1 == HIGH ) {
    validation1 = true;
    }  
  
  if (etatBP1 == LOW && validation1 == true) { // conditions pour un déclenchement
    digitalWrite(Sortie1, HIGH); // la Led1 s'allume durant une durée déterminée
    TempsActuel1 = millis(); // stocke la valeur actuelle de la fonction millis()
    if (TempsActuel1 - TempsDernierChangement1 > interval) {
      TempsDernierChangement1 = TempsActuel1;   // mémorise la valeur de la fonction millis()
      digitalWrite(Sortie1, LOW);
      validation1 = false; // les redéclenchements sont bloqués
    }
  }

  etatBP2 = digitalRead (PinBP2); // lecture de l'état du BP2
  delay(50); // pour anti rebond
  if (etatBP2 == HIGH ) {
    validation2 = true;
  }
  
  if (etatBP2 == LOW && validation2 == true) { // conditions pour un déclenchement
    digitalWrite(Sortie2, HIGH); // la Led2 s'allume durant une durée déterminée
    TempsActuel2 = millis(); // stocke la valeur actuelle de la fonction millis()
    if (TempsActuel2 - TempsDernierChangement2 > interval) {
      TempsDernierChangement2 = TempsActuel2;   // mémorise la valeur de la fonction millis()
      digitalWrite(Sortie2, LOW);
      validation2 = false; // les redéclenchements sont bloqués
    }
  }
} // fin loop
ATTINY8520PU