/* 
    Créé par utpeca
    https://wokwi.com/projects/367702639294732289

    Ce shetch Wokwi montre comment commander un 74HC595 avec un ESP32 et 
    seulement 3 fils. 

    Une mise en pratique de ce montage sur le site Locoduino
    https://www.locoduino.org/spip.php?article338
*/

/*--------------------------------------------------------------------------
 * GESTION DU 74HC595 
---------------------------------------------------------------------------*/
const    byte verrou     = 2;     // 74HC595 : ST_CP (latch)
const    byte donnee     = 5;     // 74HC595 : DS (data)
const    byte horloge    = 4;     // 74HC595 : SH_CP (clock) 
         uint8_t  u_Alim = 0b00000000;             // Data pour le 74HC595
const    uint8_t  z_Msk  = 0b10000000;             // Masque

/*********************************************************************/
void AlimenteSection(String nomKod, char etaSek, int no_Rel) 
/*********************************************************************/
{
  uint8_t  z_Msk1  = z_Msk >> no_Rel;
  uint8_t  w_Alim;
  if (nomKod.indexOf("RAZ") < 0)
  { 
    w_Alim = u_Alim | z_Msk1;
//  w_Alim = z_Msk1;       // remplacer la ligne précédente par celle-ci
                           // pour modifier l'affichage sur le bargraph
  }
  else
  { 
    w_Alim = 0b00000000;
  }

  // Envoi données relais au 74HC595
  //===================================================================
  u_Alim = w_Alim;
  digitalWrite(verrou, LOW);                  // mettre le verrou
  shiftOut(donnee, horloge, LSBFIRST, u_Alim);
  digitalWrite(verrou, HIGH);                 // oter le verrou
}

/*********************************************************************/
void setup() 
/*********************************************************************/
{
  // put your setup code here, to run once:
  Serial.begin(115200);

  // Préparation du 74HC595 
  //------------------------------------------------------------------
  pinMode(horloge, OUTPUT);
  pinMode(verrou,  OUTPUT);
  pinMode(donnee,  OUTPUT);
}

/*********************************************************************/
void loop() 
/*********************************************************************/
{
   for (int i = 0; i < 8; i++)
   {
      AlimenteSection("C001", '1', i);
      delay(500);

   }
  delay(500);
  AlimenteSection("RAZ_", '0', 0);
  delay(500);
}
74HC595