delay() pas pour tous le monde ???

Bonsoir,

je suis confronté à un problème avec mon code.

dans ma boucle j'ai plusieurs fonctions :

la premiere permet d'allumer/eteindre une led si les conditions sont reunis

la deuxieme est un bouton poussoir qui me permet de forcer l'allumage/extinction de la led

tous fonctionne parfaitement sauf que j'ai besoin d’insérer dans ma première fonction un delay ( qui forcement s'applique à l'ensemble de la boucle) .

Et donc lorsque j'appuie sur mon bouton, il faut attendre le temps du delay pour que la demande soit prise en compte.

Avez vous une idée de code à mettre en place pour prioriser mon bouton poussoir, ou de l'exclure du delay sans le sortir du void loop() ?

merci de votre aide

Roxor45:
Bonsoir,

je suis confronté à un problème avec mon code.

dans ma boucle j'ai plusieurs fonctions :

la premiere permet d'allumer/eteindre une led si les conditions sont reunis

la deuxieme est un bouton poussoir qui me permet de forcer l'allumage/extinction de la led

tous fonctionne parfaitement sauf que j'ai besoin d’insérer dans ma première fonction un delay ( qui forcement s'applique à l'ensemble de la boucle) .

Et donc lorsque j'appuie sur mon bouton, il faut attendre le temps du delay pour que la demande soit prise en compte.

Avez vous une idée de code à mettre en place pour prioriser mon bouton poussoir, ou de l'exclure du delay sans le sortir du void loop() ?

merci de votre aide

bonsoir
delay() est une fonction bloquante
voir du coté de milli(s)
et l'exemple blinkwithoutdelay dans les exemples 02.digital

Et voici atteinte la limite de delay()

Cette fonction mets en pause tout ton programme et donc ne répond plus de rien pendant le delay... Imagine que tu aies mis par erreur un delay(300000), pendant 5min, il se passera strictement rien (sauf appui sur reset bien sur)

La fonction millis() peut être ta solution, cette fonction "observe" le temps écoulé depuis l'allumage de ta board plutot que de la mettre en pause pendant x milliseconde

sinon mettre en place une interruption dans ton programme.

EDIT: Artouste plus rapide

Bonsoir,
Je vois deux solutions. Elles sont toutes les deux intéressantes à mettre en place je trouve :).

Dans ce cas, millis() est plus appropriée mais j'aime bien aussi la première solution.

Une utilisation comme ceci peut se faire :

unsigned long timeOfProgramm = 0;
long getElapsedTimeDuringOneLoop()
{
    return (millis() - timeOfProgramm);
}
void resetElapsedTimeDuringOneLoop()
{
    timeOfProgramm = millis();
}

Avec un appel de ce genre :

// ne pas oublier la fonction reset :)
while(getElapsedTimeDuringOneLoop()>TIME_TO_WAIT) 
    {
         // code utile 
    }

EDIT : Artouste et jambe plus rapide ( mais j'ai été plus complet na ! )

renaudyes, ton code aura le même effet que la fonction delay().

+1 Tu reproduis delay() ...

Utilisation de millis() : [Tutorial] Les interruptions temporelles avec Arduino | B@ttoMicro - Microcontrôleurs et compagnie !

guix:
renaudyes, ton code aura le même effet que la fonction delay().

Hum, je trouve pas pourtant. Maintenant je dis pas que je me suis pas trompé. Je ne l’ai pas essayée.

while(getElapsedTimeDuringOneLoop()>TIME_TO_WAIT) // ici c'est biensur < ou > en fct de ton envie
    {
         // ajout du/des codes nécessaire
         If(buttonPressed())
          {
              action(); // genre allumer/éteindre une led
              break; // on sort du while
          }
         // ajout du/des codes nécessaire

    }

Du moment que tu utilises un while() tu es bloquant.

+1 B@tto

Enlèves ton while et mets un if

C'est pourquoi j'avais mis un break :slight_smile:

Oui, mais ton break est dans ton if.... tant que ton bouton n'est pas appuyé..... ça bloque :smiley:

Ha oui autant pour moi, j'ai confondu ce post et un autre projet en même temps. Je pensais qu'il devait y avoir un temps d'allumage/extinction entre deux leds.

En effet, vu sous cet angle, mon code ne change pas grand chose.

Slt
moi j'utilise la fonction milli() pour réaliser mes temporisations sans bloquer le code

int tempo1=0; // mémorisation de la tempo1

void setup() { 
  pinMode(13, OUTPUT);
}

void loop()
{
  int time=millis(); // lecture du temps
  
 // toute les secondes on allume ou on étein la led verte en 13
  if (time>tempo1+1000) { tempo1=time; //compare et reset la tempo toute les 1000 millisecondes
     digitalWrite(13, !digitalRead(13)); // inverse l'état de sortie de la led
     }
}