Faire tourner deux boucles a vitesses differentes

Salut à tous,

Voila mon projet est un petit séquenceur de 6 leds et 7 boutons
Six des boutons correspondent respectivement au Led (CàD que si j'appuie sur le bouton la Led s'allume et s’éteindra que si je reappuie sur le bouton).
Lorsque je lance le programme le "sequenceur" demarre (les leds font un chenillard de gauche a droite)

Mon souci est que quand j'augmente les delay de ma fin de loop ( ce qui correspond au tempo) mes boutons ne reponde plsu aussi bien que quand les delay est plus petit du fait que les infos soit traites entre chaque allumage de led du chenillard

Est il possible de faire tourner deux boucles simultanément mais pas a la même vitesse pour que je puisse augmenter le delay de fin de loop sans perdre en precision sur les botons??

Voici le programme

// Mini Midi Drum sequencer //

int LedPin [6] = {3, 4, 5, 6, 7, 8};  //Pin ou sont connecter les leds
int BoutonPin [7] = {9, 10, 11, 12, 13, 14, 15}; //Pin ou sont connecter les boutons

int BoutonState[7] = {0}; //etat de chaques boutons 0=FAUX 1=VRAI
int BoutonPressed[7] = {0};
int BoutonBounce[7] = {0};

int Step = -1; // compteur de la sequence
boolean LedState[6] = {0}; // etat des 6 leds 0=eteint 1=allumer
int count = {0}; // variable qui compte le nombre de fois qu'on a appuyer sur le bouton
int i =0; //compteur de synchro

void setup(){
  
  for (int i =0; i <6; i++){
    pinMode(LedPin[i], OUTPUT); //initialise les sortis
    digitalWrite(LedPin[i], LOW);
  }
  for (int i =0; i <7; i++){
    pinMode(BoutonPin[i], INPUT); // intialise les entrees
    
  }
}


void loop(){
 
  Step++;
   if (Step > 5){
     Step = 0;
   }
 
 

  for ( i =0; i <6; i++){
    BoutonPressed[i] = digitalRead(BoutonPin[i]);
    delay(1);
    BoutonBounce[i] = digitalRead(BoutonPin[i]);
      if (BoutonBounce[i] = BoutonPressed[i]){
         if (BoutonPressed[i] != BoutonState[i]){
           if (BoutonPressed[i]){
            count++;
             if (count==1){
             LedState[i] =1;
             }
             if (count >1){
             count = 0;
             LedState[i]=0;
             }
           }  
         }
      }
   BoutonState[i] = BoutonPressed[i];   
  } 

  
  SetLeds((Step+3), (i+3));
   delay (30);
}

void SetLeds (int StepLed, int LedBouton)
{
  for (int j =0; j <6; j++){
    digitalWrite(LedPin[j], LOW);
  }
  for (int x =0; x <6; x++){
    LedBouton = LedPin[x];
    if (LedState[x] == true){
      digitalWrite(LedBouton, HIGH);
    }
    if (LedState[x] == false){
      digitalWrite(LedBouton, LOW);
    }
  }
  digitalWrite(StepLed, HIGH);
}

Utilise la fonction millis() à la place de delay().

Tu procède comme ça :

http://www.siteduzero.com/tutoriel-3-14136-maitrisez-le-temps.html

Merci pour ta reponse
j'ai utilise la fonction millis et ça marche

J'ai un peu modifier le programme pour utilise le PORTD en binaire
Et j'aimerai pouvoir stocker dans une variable les different octet que j'ai en entre puis les afficher suivant le compteur incrementer par la Pin 15.
J'ai donc cree un array pour stocker mes octet d'entree mais je n'arrice pas a les afficher
En fait dans la derniere ligne de mon programme je voudrai que CurretPattern prenne la valeur de Pattern[compte]

pourriez vous m'aidez??
voici le code

// Mini Midi Drum sequencer //

int LedPin [6] = {2, 3, 4, 5, 6, 7};  //Pin ou sont connecter les leds
int BoutonPin [7] = {9, 10, 11, 12, 13, 14, 15}; //Pin ou sont connecter les boutons
int LedBinaire[6] ={4, 8, 16, 32, 64, 128};  //Valeur de chaque led en bianire
byte Pattern [16] = {0};
byte CurrentPattern = 0;



int BoutonState[7] = {0}; //etat de chaques boutons 0=FAUX 1=VRAI
int BoutonPressed[7] = {0};
int BoutonBounce[7] = {0};

int Step = -1; // compteur de la sequence
boolean LedState[6] = {0}; // etat des 6 leds 0=eteint 1=allumer
int count[7] = {0}; // variable qui compte le nombre de fois qu'on a appuyer sur le bouton
unsigned long Currenttime = 0;
unsigned long Pasttime = 0;
int bpm =0;
int compte = 0; // compte le nombre de fois qu'on appuie sur menu


void setup(){
  
  for (int i =0; i <6; i++){
    pinMode(LedPin[i], OUTPUT); //initialise les sortis
    digitalWrite(LedPin[i], LOW);
  }
  for (int i =0; i <7; i++){
    pinMode(BoutonPin[i], INPUT); // intialise les entrees   
  }
}

void loop(){ 
   
 // Fonction pour le BPM
 
  Currenttime = millis();
  if (Currenttime - Pasttime >= bpm){
    Pasttime = Currenttime;
    bpm = 300;
      Step++;
      if (Step >5){
        Step =0;
      }
      
   }
   
  // Savoir quels boutons est appuyer
  
  for (int i =0; i <6; i++){
    BoutonPressed[i] = digitalRead(BoutonPin[i]);
    delay(10);
    BoutonBounce[i] = digitalRead(BoutonPin[i]);
      if (BoutonBounce[i] = BoutonPressed[i]){
         if (BoutonPressed[i] != BoutonState[i]){
           if (BoutonPressed[i]){
            count[i]++;
             if (count[i]==1){
             CurrentPattern = CurrentPattern + LedBinaire[i];
             LedState[i] =1;         
             }
             if (count[i] >1){
             count[i] = 0;
             CurrentPattern = CurrentPattern - LedBinaire[i];
             LedState[i]=0;            
             }
           }  
         }
       }
                  
    BoutonState[i] = BoutonPressed[i];   
   } 
   if (compte = 1){
   Pattern[1] = CurrentPattern;
   }
   if (compte = 0){
     Pattern[0] = CurrentPattern;
   }
   
   // Set le bouton menu choix de pattern
  BoutonPressed[7] = digitalRead(15);
    delay(50);
    BoutonBounce[7] = digitalRead(15);
      if (BoutonBounce[7] = BoutonPressed[7]){
         if (BoutonPressed[7] != BoutonState[7]){
           if (BoutonPressed[7], HIGH){
             compte++;         
               if (compte >1){
                 compte =0;
               }
               
           }
         }
      }
   BoutonState[7] = BoutonPressed[7];
      
   
   
 
   //Metter les Leds dans l'etat souhaite
   
 PORTD = CurrentPattern| LedBinaire[Step];
}