premier programme clignotant moto

Bonjour,

je viens d’écrire mon premier programme avec arduino (ci dessous) c'est juste pour faire un programme test mais j'aimerai avoir une réaction des boutons poussoirs beaucoup plus rapide pourriez vous m'indiquer la démarche a suivre

le principe du programme : j'appuie sur le bp gauche je fais clignoter une led et un relais indéfiniment j appuie de nouveau sur le même bp le clignotement s’arrête idem pour le clignotant droit

si j'appuie sur les BP droit et Gauche j'ai le warning

seulement il faut que j'appuie un long moment pour que cela réagisse

//clignotant moto

int timer1 = 500;
int ledG = 44; // voyant clignotant Gauche
int ledD = 43; // voyant clignotant Droit
int relD = 52; // relais pour clignotant gauche
int relG = 47; // relais pour clignotant droite
int bpG = 34; // bouton pour clignotant gauche
int bpD = 35; // bouton pour clignotant droit
long time = 0;        
long attente = 200;

 int varBG =  0;  // variable pour definir valeur du bit bouton gauche
 int varBD= 0;   // variable pour definir valeur du bit bouton droit
 int lecturebpD;
 int lecturebpG;

 void setup () {
   
   pinMode (ledG, OUTPUT) ;
   pinMode (ledD, OUTPUT) ;
   pinMode (relG, OUTPUT) ;
   pinMode (relD, OUTPUT) ;
   pinMode (bpG, INPUT);
   pinMode (bpD, INPUT) ;
 }

 void loop(){
   
   lecturebpG= digitalRead (bpG);
   lecturebpD= digitalRead (bpD);
    if (varBD==0 && varBG== 0 &&lecturebpD == 1 && lecturebpG == 1 && millis() - time > attente) {
     varBD= 1;
     varBG= 1;
   time = millis();   
   }
   if (varBG==0 && lecturebpG == 1 && millis() - time > attente ){
     varBG = 1;
     varBD =0;
   time = millis();       
   }
    if (varBD==0 && lecturebpD == 1 && millis() - time > attente) {
     varBD= 1;
     varBG= 0;
   time = millis();   
   }
   if (varBG==1  && lecturebpG == 1 && millis() - time > attente ){
    varBG= 0;
    varBD= 0;
    time = millis();
    
   }
   
    if (varBD== 1 && lecturebpD == 1 && millis() - time > attente ){
     varBD = 0;
     varBG= 0;
     time = millis();
          
   }
   
   
    digitalWrite (relG, !varBG);
    digitalWrite (ledG, varBG);
    digitalWrite (relD, !varBD);
     digitalWrite (ledD, varBD);
      delay(800);
    digitalWrite (relG, 1);
    digitalWrite (ledG, 0);
    digitalWrite (ledD, 0);
    digitalWrite (relD, 1);
      delay(800);
     
  
 }

Edit de Jean-François : merci de mettre le code entre les balises avec le bouton #

Hello! C'est normal car la fonction delay() met ton programme en pause. Avec ton code tu peux dans le pire des cas te retrouver avec une attente de 1,6 sec avant que l'appui soit lu ! Je te conseille de t'inspirer du sketch "BlinkWithoutDelay" que tu trouveras dans les exemples de l'IDE Arduino. Juste pour info le code posté sur le forum doit être mis entre balises (bouton #). V (salut motard).

Bonjour,

Le probléme vient du delay(800) x2 qui fait “perdre” les appuis sur les boutons pendant le temps d’attente.

La solution serait de remplacer :

digitalWrite (relG, !varBG);
digitalWrite (ledG, varBG);
digitalWrite (relD, !varBD);
digitalWrite (ledD, varBD);
delay(800);
digitalWrite (relG, 1);
digitalWrite (ledG, 0);
digitalWrite (ledD, 0);
digitalWrite (relD, 1);
delay(800);

par :

digitalWrite (relG, !varBG);
digitalWrite (ledG, varBG);
digitalWrite (relD, !varBD);
digitalWrite (ledD, varBD);
for(int i = 0; i < 800; i++)  {
  if(digitalRead(bpG) || digitalRead(bpD))
    return;
  delay(1);
}
digitalWrite (relG, 1);
digitalWrite (ledG, 0);
digitalWrite (ledD, 0);
digitalWrite (relD, 1);
for(int i = 0; i < 800; i++)  {
  if(digitalRead(bpG) || digitalRead(bpD))
    return;
  delay(1);
}

De manière à quitter la fonction loop() rapidement (max 1ms) après l’appui sur un bouton pour recommencer le traitement.

bonjour, merci beaucoup pour la réponse