Besoin d'aide condition+capteurs+compteur

Bonjour à tous,
je cherche a créer le programme suivant:
-2 capteur et 3 leds
la led 3 est toujours allumées
quand le capteur 1 est activé pendant un minimum de 2secondes et le capteur 2 non activé, les leds 1 et 3 s'allument pendant 3 secondes
et quand les 2 capteurs sont activés pendant un minimum toujours de 2 secondes, les leds 2 et 3 s'allument pendant 3 secondes.

Sans les 2 secondes, j'ai créé ce programme, sauf que la led 3 reste allumée tout le temps (ça c'est normal), mais les leds 2 et 3 clignote 3 secondes, chacune leur tour, et les capteurs n'agissent en rien dans le système.

const int capteur1 = 20; 
const int capteur2 = 21; 
const int led1 = 23; 
const int led2 = 24; 
const int led3 = 25; 

int etatcapteur1; 
int etatcapteur2; 
void setup () {
 
  pinMode (capteur1, INPUT);
  pinMode (capteur2, INPUT);
  pinMode (led1, OUTPUT);
  pinMode (led2, OUTPUT);
  pinMode (led3, OUTPUT);
  etatcapteur1 = LOW;
  etatcapteur2 = LOW;
  
}

void loop () {
  digitalWrite (led3, HIGH);  
  digitalWrite (led2, LOW);
  digitalWrite (led1, LOW);
  
  etatcapteur1 = digitalRead(capteur1);
  etatcapteur2 = digitalRead(capteur2);
    if(etatcapteur1 == HIGH) {
      digitalWrite (led1, HIGH);
      digitalWrite (led2, LOW);
      digitalWrite (led3, HIGH);
      delay(3000);
      digitalWrite (led1, LOW);
    }
      if(etatcapteur2 == HIGH) {
      digitalWrite (led3, HIGH);
      digitalWrite (led2, HIGH);
      delay(3000);
        digitalWrite (led3, LOW);
      digitalWrite (led2, LOW);
    }
    else {
      digitalWrite (led3, HIGH);   
  } 
}

et en rajoutant les 2 secondes, ça donne ça: mais toujours rien ne se passe

const int capteur1 = 20; 
const int capteur2 = 21; 

const int led1 = 23; 
const int led2 = 24; 
const int led3 = 25; 

long tempsdetec = 2000;
boolean variable = false;
boolean etatcapteur1; 
boolean etatcapteur2; 
unsigned long debutactif;

void setup () {
  
  pinMode (capteur1, INPUT);
  pinMode (capteur2, INPUT);
  pinMode (led1, OUTPUT);
  pinMode (led2, OUTPUT);
  pinMode (led3, OUTPUT);
  
}

void loop () {
  
  etatcapteur1 = digitalRead(capteur1);
  
  digitalWrite (led3, HIGH);  //indication que la machine est en marche
  digitalWrite (led2, LOW);
  digitalWrite (led1, LOW);
  
  if(etatcapteur1==HIGH) {
    debutactif = millis();
    variable = true;
  }
  etatcapteur1 = digitalRead(capteur1);
  etatcapteur2 = digitalRead(capteur2);
  
  if((variable == true) && (etatcapteur2 == HIGH)) {
   
    if((millis() >= tempsdetec) && (etatcapteur2 == LOW)) {
      digitalWrite (led1, HIGH);
      digitalWrite (led2, LOW);
      digitalWrite (led3, HIGH);
      delay(3000);
     
      digitalWrite (led1, LOW);
      
 
    }
    if((millis() >= tempsdetec)  && (etatcapteur2 == LOW)) {
      digitalWrite (led2, HIGH);
       digitalWrite (led3, HIGH);
      delay(3000);
      digitalWrite (led2, LOW);
      
    }
   
    
  }
}

Si quelqu'un pourrait m'aider pour trouver les erreurs (je suis débutant)
Merci d'avance, bonne soirée!
[/quote]

Un bon moyen de trouver les erreurs c'est de mettre des Serial.print() dans le code pour afficher le contenu des variables.

tu n'est pas du tout en train de detecter un temps minimum d'appui sur les capteurs:
tu lis les capteurs, t'attend 3 secondes + 3 autres secondes eventuelles, tu relis les capteurs...

utilise millis() et evite delay, genre (en vrac, y'a certainement beaucoup mieux a faire):

const int capteur1 = 20; 
const int capteur2 = 21; 
const int led1 = 23; 
const int led2 = 24; 
const int led3 = 25; 

int etatcapteur1; 
int etatcapteur2; 

unsigned long timeCapteur1 = 0;
unsigned long timeCapteur2 = 0;

void setup () {
 
  pinMode (capteur1, INPUT);
  pinMode (capteur2, INPUT);
  pinMode (led1, OUTPUT);
  pinMode (led2, OUTPUT);
  pinMode (led3, OUTPUT);
  etatcapteur1 = LOW;
  etatcapteur2 = LOW;
  
  
}

void loop () {
  digitalWrite (led3, HIGH);  
  digitalWrite (led2, LOW);
  digitalWrite (led1, LOW);
  
  etatcapteur1 = digitalRead(capteur1);
  etatcapteur2 = digitalRead(capteur2);

  if (etatcapteur1 == LOW){
    timeCapteur1 = millis();
  }
  
  if (etatcapteur2 == LOW){
    timeCapteur2 = millis();
  }
  
  if((millis()-timeCapteur1>2000)&&(etatcapteur2 == LOW)) {    
    digitalWrite (led1, HIGH);
    digitalWrite (led2, LOW);
    digitalWrite (led3, HIGH);
    delay(3000);
    digitalWrite (led1, LOW);
    while ((capteur1==HIGH)||(capteur2==HIGH)){  // etre sur de relacher les 2 boutons
      etatcapteur1 = digitalRead(capteur1);
      etatcapteur2 = digitalRead(capteur2);
    }
    timeCapteur1 = millis();
    timeCapteur2 = millis();
  }
  if((millis()-timeCapteur1>2000)&&(millis()-timeCapteur2>2000)) {    
    digitalWrite (led3, HIGH);
    digitalWrite (led2, HIGH);
    delay(3000);
    digitalWrite (led3, LOW);
    digitalWrite (led2, LOW);
    while ((capteur1==HIGH)||(capteur2==HIGH)){  // etre sur de relacher les 2 boutons
      etatcapteur1 = digitalRead(capteur1);
      etatcapteur2 = digitalRead(capteur2);
    }
    timeCapteur1 = millis();
    timeCapteur2 = millis();

  }

  digitalWrite (led3, HIGH);   

}

bonjour,
je ne sais pas si ton projet a avancé.
une petite précision sur millis().
millis() est un chronomètre qui démarre à la mise en route de l'arduino. et ne se remet à zéro que lorsque son compteur est plein, c'est à dire au bout de très longtemps (50 jours environ ). la doc sur millis() t'en dira plus
on ne peut guere l'utiliser directement, mais plutot par difference pour calculer une durée.
par exemple : en pseudo code, pour une tempo ( comme l'a employé jean-l ci-dessus)

tempo=0
instant_départ = millis() '
while tempo<2000 { ' on ne sort de la boucle qu'une fois la condition réalisée soit 2000 ms
tempo= millis()-instant_départ 'on calcule la durée écoulée par rapport à instant_départ
action1 ' on peut lire un capteur par exemple
action2 ' ou vérifier que le bouton est toujours appuyé ou tout autre chose
action n
}

si tu veux sortir plus tot de la boucle, tu peux mettre une condition qui force tempo à 2000 dans le cas présent

tempo=0
instant_départ = millis() '
while tempo<2000 { ' on ne sort de la boucle qu'une fois la condition réalisée soit 2000 ms
tempo= millis()-instant_départ 'on calcule la durée écoulée par rapport à instant_départ
action1 ' on peut lire un capteur par exemple
action2 ' ou vérifier que le bouton est toujours appuyé ou tout autre chose
si appui_bouton alors tempo =2000 ' l'appui sur bouton fait qu'on quitte la boucle prématurément
}

delay() fait exactement la même chose mais on ne peut absolument rien faire d'autre pendant ( comme lire un bouton).