[Résolu] Problème d'allumage d'une led avec capteur ultrason

Alors voilà j'aimerais allumer une led (pour l'instant que je remplacerais plus tard par un bandeau led) lorsque je passe ma main à moins de 40 cm devant le capteur et que lorsque je l'enlève, que la led puisse rester allumé 30 sec et qu'elle s'éteigne par la suite. Si jamais je repasse ma main avant la fin des 30 sec, je voudrais que le delay recommence son décompte à partir de 30 sec quand je la re-enlève.
Voici le programme que j'ai fait, la led s'allume directement mais ne s'éteint pas.

int LedGreen = 13;
int CapteurUltrasonTrig = 12;       
int CapteurUltrasonEcho = 11;       


int trig = 12;
int echo = 11;
long lecture_echo;
long cm;
int led = 0;

void setup(){
     pinMode(LedGreen, OUTPUT);
     pinMode(CapteurUltrasonTrig, OUTPUT);
     pinMode(CapteurUltrasonEcho, INPUT);
       pinMode(trig, OUTPUT);
  digitalWrite(trig, LOW);
  pinMode(echo, INPUT);
  Serial.begin(9600);
}

 
void loop(){
  
     digitalWrite(CapteurUltrasonTrig, HIGH);
     delayMicroseconds(10);
     digitalWrite(CapteurUltrasonTrig, LOW);
     int pulseLength = pulseIn(CapteurUltrasonEcho, HIGH);
     int width = pulseLength/58; //d'après la datasheet, permet de convertir en cm
     led = digitalRead(LedGreen);
      
 if (LedGreen == HIGH && width > 40){


        delay(4000);
    
          digitalWrite(LedGreen, LOW);    
      }    
      
     if (width < 40){
      
          digitalWrite(LedGreen, HIGH);    
      }

       
}

selon ton prg, ta led s'allume bien pour une durée (delay(4000)) de 4 secondes.
pour avoir 30 secondes, tu mettras 30000 dans delay ( delay(30000) )

le problème c'est que pendant un delay, le micro attends que le temps soit passé.

il ne peut donc pas voir si tu repasse la main dans le detecteur.

il faut que tu utilises la fonction millis().

elle n'est pas bloquante comme la fonction delai.

le micro va continuer à effectuer la loop.

il verra donc si tu repasses la main devant le détecteur et à chaque tour de boucle il regardera si le temps que tu auras demandé est dépassé ou pas.

exemple
si (capteur actionné)
{unsigned long debut =millis();
lampe allumée
}
sinon
{si (millis()-debut > 30000)
{lampe eteinte;}
}

Très bien merci, comment pourrais-je l'intégrer à mon programme ?

comme je te l'ai indiqué

int LedGreen = 13;
int CapteurUltrasonTrig = 12;       
int CapteurUltrasonEcho = 11;       
unsigned long debut=0;

int trig = 12;
int echo = 11;
long lecture_echo;
long cm;
int led = 0;

void setup(){
     pinMode(LedGreen, OUTPUT);
     pinMode(CapteurUltrasonTrig, OUTPUT);
     pinMode(CapteurUltrasonEcho, INPUT);
     pinMode(trig, OUTPUT);
     digitalWrite(trig, LOW);
     pinMode(echo, INPUT);
     Serial.begin(9600);
}

 
void loop()
{
     digitalWrite(CapteurUltrasonTrig, HIGH);
     delayMicroseconds(10);
     digitalWrite(CapteurUltrasonTrig, LOW);
     int pulseLength = pulseIn(CapteurUltrasonEcho, HIGH);
     int width = pulseLength/58; //d'après la datasheet, permet de convertir en cm
     //led = digitalRead(LedGreen);
      
 if (width > 40)
      {
        debut=millis();
        digitalWrite(LedGreen, HIGH);//allumer    
      }    
 else
 {
    if ((millis()-debut)>30000)
    {
       digitalWrite(LedGreen, LOW);//eteindre   
    }
 }
}

Merci beaucoup, tout fonctionne à merveille ! :wink: