Allumer une led avec retardement

Bonjour a tous,

étant un nouveau possesseur d'un arduino, je m amuse a faire des petits projets mais la je bute sur un truc que je pense tout con.

allumer une led apres appui sur un bouton poussoir avec 6 secondes de retard par exemple.
je vous met mon programme, si vous pouvez m'aiguiller sur mes erreurs svp. ca fait 3 soirées que mon "cerveau" bug.

int boutonpouss = 2;
int etatbouton = 0;
int etatboutonav = 0;
int led1 = 3;
int led2 = 4;
int led4 = 5;
long interval = 6000;
unsigned long ancientemps = 0;

void setup() {
pinMode(boutonpouss, INPUT);
for (int pinNumber = 3; pinNumber<6; pinNumber++){
pinMode(pinNumber, OUTPUT);
digitalWrite(pinNumber,LOW);

}
}

void loop() {
if(digitalRead(boutonpouss) == HIGH){
ancientemps = millis();
etatboutonav = 1;}

if(etatboutonav = 1 && ancientemps + interval > 6000){
digitalWrite(led1,HIGH);}

}

Si j'ai bien compris, voici ce que ça devrait donner

// Allumage d'une led avec un retard de 6 secondes 

// Déclaration des variables
int boutonpouss = 2;
int etatbouton = 0;
int etatboutonav = 0;
int led1 = 3;	// On attribue le pin sur lequel on a branché l'anode de la led1  !!! IMPORTANT : On oublie pas de mettre une résistance !!!
int led2 = 4;	// On attribue le pin sur lequel on a branché l'anode de la led2  !!! IMPORTANT : On oublie pas de mettre une résistance !!!
int led3 = 5;	// On attribue le pin sur lequel on a branché l'anode de la led3  !!! IMPORTANT : On oublie pas de mettre une résistance !!!
int interval = 6000;   // Durée du retardement en ms
int ancientemps = 0;


// the setup routine runs once when you press reset:
void setup() {
  
  // On utilise le moniteur serie
  Serial.begin(9600);
  Serial.println("Demarrage");
  
  // initialisation des digital pin en OUTPUT ou INPUT
  pinMode(led1, OUTPUT);  			// declare led1 as OUTPUT
  pinMode(led2, OUTPUT);			// declare led2 as OUTPUT
  pinMode(led3, OUTPUT);			// declare led3 as OUTPUT
  pinMode(boutonpouss, INPUT);		// declare boutonpouss as input
}

// La routine loop
void loop() {
   
  if(digitalRead(boutonpouss) == HIGH) {
    Serial.println("Je viens d'appuyer sur le bouton");
  	
    ancientemps = 0;  // On demarre le chrono à 0
    
    Serial.println(ancientemps);
  	
    etatboutonav = 1; // On set l'etat du bouton
    
    Serial.println(etatboutonav);
  }
  
  // Vérfication si l'état du bouton == 1 alors on incrémente la variable ancientemps
  if (etatboutonav == 1) {
    ancientemps++ ;  // incrémentation de 0 à 60 à cause de la commande "delay(100);" en fin de loop
    
    Serial.println(ancientemps * 100);
    
    // Si ancientemps * 100 est plus grand ou égal à 6000 alors on allume la led et on repasse l'état du bouton à 0
    
    if ((ancientemps * 100) >= interval) {
  		digitalWrite(led1, HIGH);
    	
      	Serial.println("Led allumee");
      
      	etatboutonav = 0;
    }
  }
  
  // Suite du code selon ce que tu veux faire
  
  // On attend 100 ms avant de refaire un tour
  delay(100);
}

J'aurais juste rajouté au début du Void Loop
digitalWrite (Led1, LOW);
comme ça on recommence !

Avec millis() c'est plus simple et non bloquant

Tu peux aussi t'inspirer de ce code que j'ai tapé hier soir pour un nouveau projet qui est d'allumer une led lorsqu'un mouvement est détecté la nuit et qui s’éteint 6 secondes après la dernière détection de mouvement.

/* 

Ensemble Arduino + Pir + LDR + Leds 
By WMLogistic
Merci à Bricoleau et _pepe_ pour leurs conseils

*/

const int led = 12;      // On attribue le pin sur lequel on a branché l'anode de la led  !!! IMPORTANT : On oublie pas de mettre une résistance !!!
const int led2 = 2;
const int pir = A0;  	 // On attribue le pin sur lequel on a branché le PIRsignal
const int LightS = A1;
const unsigned long temporisation = 6000UL;  // On garde la led allumée pendant 6 secondes s'il n'y a plus de mouvements
boolean LedOn = false;           
int mouvement = 0;
int lum = 1000;
unsigned long chrono;
unsigned long temps;

void setup() {
  
  Serial.begin(9600);
  Serial.println("Demarrage");
  
  pinMode(led, OUTPUT); // On définit le pin "led" en sortie
  pinMode(led2, OUTPUT); // On définit le pin "led2" en sortie
  pinMode(pir, INPUT);  // On définit le pin "Pir" en entrée pour lire la valeur
  pinMode(LightS, INPUT);  // On définit le pin "LightS" en entrée pour lire la valeur

}

void loop() {

  lum = analogRead(LightS) ;
  temps = millis();
  //Serial.println(lum);
  
  //On vérifie s'il fait nuit
  if (lum <= 400) {
  	  
      digitalWrite(led2, HIGH);   // Si c'est le cas, on allume la led qui indique qu'il fait nuit
      
      // Maintenant qu'il fait nuit on peut vérifier s'il y a détection de mouvement
      mouvement = analogRead(pir) ;
      
      if (mouvement > 0) {
         
         digitalWrite(led, HIGH);   // On allume la led qui indique un mouvement
         LedOn = true ;             // On Set la variable temoin de led allumée à true
         
         chrono = temps; 	// On lance le chrono
         
         Serial.println("Il fait nuit et un mouvement est detecte");
         

      }
      // Maintenant on vérifie, s'il n'y a  plus de mouvement, le temps écoulé et l'état de la led pour l'éteindre si elle est allumée
      else if ((temps - chrono >= temporisation) && (LedOn == true)) {
        
        digitalWrite(led, LOW);   // On éteind la led de mouvement
        LedOn = false ;           // on set son état à false
        
        Serial.println("On eteind la led");
        
      }
      // Ici c'est juste une vérification visuelle du passage dans la condition qui est facultative
      else if (LedOn == true) { 
        Serial.println(".");
      }
  }
  // S'il fait jour on garde la led2 éteinte
  else {
      digitalWrite(led2, LOW);   // HIGH = Eteind
  }
  
  // on evite de surcharger notre petit arduino, une vérification par seconde est suffisante pour ce genre d'application.
  delay(1000);
}

Pour le montage c'est à ça que ça ressemble mon projet :

Bonjour

Ton programme risque de dysfonctionner (genre blocage total) au bout de 49 jours et des briquettes, quand millis() va atteindre la valeur 2^32 et revenir à zéro.

Il ne faut jamais prendre la valeur de millis() et lui ajouter une constante pour déterminer un instant dans le futur.
A la place, tous les tests de durée doivent être de la forme if (millis()-millis_depart >= duree)

En effet, cette forme de test est insensible à l'overflow de millis()

bricoleau:
Bonjour

Ton programme risque de dysfonctionner (genre blocage total) au bout de 49 jours et des briquettes, quand millis() va atteindre la valeur 2^32 et revenir à zéro.

Il ne faut jamais prendre la valeur de millis() et lui ajouter une constante pour déterminer un instant dans le futur.
A la place, tous les tests de durée doivent être de la forme if (millis()-millis_depart >= duree)

En effet, cette forme de test est insensible à l'overflow de millis()

ok j'en prend bonne note merci :slight_smile:
j'ai modifié mon code précédant en suivant vos conseils.

Salut a tous! et merci bcp d'avoir pris le temps de me répondre et de m'aider.
Grâce a vos explications j'ai réussi la première partie de mon programme:

mon programme sera un minuteur a led, avec les leds qui s'allume par tranches de 10min, avec un seul bouton poussoir pour démarrer la minuterie, l’arrêter, reset, démarrer ...

int boutonpouss = 2;
int etatbouton = 0;
int etatboutonav = 0;
int led1 = 3;
int led2 = 4;
int led4 = 5;
const unsigned long interval = 6000;
unsigned long ancientemps = 0;

void setup() {
pinMode(boutonpouss, INPUT);
for (int pinNumber = 3; pinNumber<6; pinNumber++){
pinMode(pinNumber, OUTPUT);
digitalWrite(pinNumber,LOW);

}
}

void loop() {
if(digitalRead(boutonpouss) == HIGH){
ancientemps = millis();
etatboutonav = 1;}

if ( (etatboutonav == 1) && (millis()-ancientemps >= interval) ){
digitalWrite(led1,HIGH);
etatboutonav = 0;
}

}