const int dataPin = 2;   // DS
const int clockPin = 3;  // SH_CP
const int latchPin = 4;  // ST_CP

void setup() {
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
}

void loop() {
  // Gauche à droite
  for (int i = 0; i < 8; i++) {
    sendData(1 << i); 
    delay(150);      
    
    // Éteindre toutes les LEDs
    sendData(0); 
    delay(10);    
  }

  // Droite à gauche
  for (int i = 6; i >= 0; i--) {
    sendData(1 << i); 
    delay(150);    
    
    // Éteindre toutes les LEDs
    sendData(0); 
    delay(10);      
  }
}

void sendData(byte data) {
  // Latch en bas pour préparer l'envoi des données
  digitalWrite(latchPin, LOW);
  
  for (int i = 7; i >= 0; i--) {
    // Extraction chaque bit en utilisant un masque
    byte bitValue = (data >> i) & 1;
    
    // Mettre la broche de données à la valeur du bit
    digitalWrite(dataPin, bitValue);
    
    // Impulsion d'horloge pour enregistrer le bit
    digitalWrite(clockPin, HIGH);
    delayMicroseconds(1);
    digitalWrite(clockPin, LOW);
    delayMicroseconds(1);
  }
  
  // Mettre le latch en haut pour transférer les données aux sorties
  digitalWrite(latchPin, HIGH);
}
74HC595