#include <Adafruit_NeoPixel.h>

int DataIn = 11; // défini DataIn (leds gauches) sur la pin 11
Adafruit_NeoPixel pixels(3, DataIn, NEO_GRB + NEO_KHZ800); // défini (nombre de led, entrée, type de led)
int DataIn2 = 10; // défini DataIn2 (leds droites) sur la pin 10
Adafruit_NeoPixel pixels2(3, DataIn2, NEO_GRB + NEO_KHZ800); // défini (nombre de led, entrée, type de led)
int DataIn3 = 8; // défini DataIn3 (leds centres) sur la pin 8
Adafruit_NeoPixel pixels3(3, DataIn3, NEO_GRB + NEO_KHZ800); // défini (nombre de led, entrée, type de led)
 

const int bouton_g = 4; // défini bouton gauche sur la pin 4
const int bouton_d = 5; // défini bouton droite sur la pin 5
const int bouton_c = 2; // défini bouton centre sur la pin 2 (attention laisser 2 ou 3 car ce sont les pin qui gèrent les interruptions)

int etat_bouton_g; // déclare l'état du bouton gauche
int etat_bouton_d; // déclare l'état du bouton droite
int etat_bouton_c; // déclare l'état du bouton centre

int g; // déclare la valeur g
int d; // déclare la valeur d

void setup() {

Serial.begin(9600); // Créé la liaison série en 9600 bps

  pixels.begin(); // initialise le ruban de led (gauche)
  pixels2.begin(); // initialise le ruban de led (droite)
  pixels3.begin(); // initialise le ruban de led (centre)
  
pinMode(bouton_g, INPUT_PULLUP); // défini bouton gauche comme sortie avec fonction résistance
pinMode(bouton_d, INPUT_PULLUP); // défini bouton droite comme sortie avec fonction résistance
pinMode(bouton_c, INPUT_PULLUP); // défini bouton centre comme sortie avec fonction résistance

attachInterrupt (digitalPinToInterrupt(bouton_c), bloc_annule, false); // Défini l'interruption sur le bouton centre, renvoie vers la fonction annule, si le bouton centre est appuyé
}
 
void loop() {
 
  pixels3.setPixelColor(0, pixels3.Color(255, 0, 0));  // défini la première led sur rouge sur le bandeau centre
  pixels3.setPixelColor(1, pixels3.Color(255, 0, 0));  // défini la deuxième led sur rouge sur le bandeau centre
  pixels3.setPixelColor(2, pixels3.Color(255, 0, 0));  // défini la troisième led sur rouge sur le bandeau centre
  pixels3.setPixelColor(3, pixels3.Color(255, 0, 0));  // défini la quatrième led sur rouge sur le bandeau centre
  pixels3.show(); // Montre l'état des LED précédentes
      pixels.clear(); // Efface les LED gauches
      pixels.show(); // Montre l'éat des LED gauches précédentes
      pixels2.clear(); // Efface les LED droites
      pixels2.show(); // Montre l'éat des LED droites précédentes
 
 bool etat_bouton_g = digitalRead(bouton_g); // Défini l'état du bouton gauche en vrai ou faux en lisant la broche bouton gauche
 bool etat_bouton_d = digitalRead(bouton_d); // Défini l'état du bouton droite en vrai ou faux en lisant la broche bouton droite
 bool etat_bouton_c = digitalRead(bouton_c); // Défini l'état du bouton centre en vrai ou faux en lisant la broche bouton centre

if (etat_bouton_g == false) { // si l'état du bouton est appuyé alors :
  g=0; // Définir g à 0
  cligno_g (); // aller à la fonction cligno_g
}
//
 if (etat_bouton_d == false) { // si l'état du bouton est appuyé alors :
  d=0; // Définir d à 0
  cligno_d (); // aller à la fonction cligno_d
  }
}

void bloc_annule() { // Fonction bloc_annule 
    g=20; // Définir g à 20 ce qui cloture la boucle cligno_g 
    d=20; // Définir d à 20 ce qui cloture la boucle cligno_d
  }
  
 void cligno_g () { // Fonction cligno_g
 while (g<=19) { // Tant que g <= 19 alors
      pixels.clear(); 
      pixels.show();
  pixels.setPixelColor(0, pixels.Color(255, 255, 255)); // défini la première led sur blanc sur le bandeau gauche et (255, 255, 255) défini les couleurs en jouant de 0 à 255
      pixels.show();
      delay (90);
  pixels.setPixelColor(1, pixels.Color(255, 255, 255));
       pixels.show();
       delay (90);
  pixels.setPixelColor(2, pixels.Color(255, 255, 255));
       pixels.show();
       delay (90);
       pixels.clear();
  pixels.show();
       delay (200);
  g++; // incrémente  la valeur de g à + 1 à chaque boucle
  }
  }

 void cligno_d () { // Fonction cligno_d
 while (d<=19) { // Tant que d <= 19 alors
  pixels2.clear();
      pixels2.show();
  pixels2.setPixelColor(0, pixels2.Color(255, 255, 255)); // défini la première led sur blanc sur le bandeau droit et (255, 255, 255) défini les couleurs en jouant de 0 à 255
    pixels2.show();
    delay (90);
  pixels2.setPixelColor(1, pixels2.Color(255, 255, 255));
    pixels2.show();
    delay (90);
  pixels2.setPixelColor(2, pixels2.Color(255, 255, 255));
    pixels2.show();
    delay (90);
    pixels2.clear();
  pixels2.show();
    delay (200);
  d++; // incrémente  la valeur de d à + 1 à chaque boucle
  }
  } 
  
  
