Go Down
Pages: [1]

Topic: Interrompre un délai(Read 3972 times)Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O previous topic - next topic

ecolomatique

  • Guest
Bonjour à tous,

Je suis débutant sur l'arduino et je fais des petits programmes pour apprendre.
Je suis malheureusement tombé sur un problème que je n'arrive pas à résoudre (j'ai fais des recherches mais je n'ai pas trouvé de réponse...) :

j'aimerais pouvoir interrompre un délai lorsqu'un évènement se produit (ex : lorsque quelqu'un passe devant un capteur, attente de 30 minutes puis faire action A, mais si quelqu'un repasse devant le capteur avant la fin des 30 minutes, interrompre le délai (donc faire comme s'il n'avait jamais commencé et ne pas éxécuter l'action A).

En espérant avoir été assez clair,
Merci d'avance pour vos réponses.
Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O


Bonjour,

Il n'est pas possible d'interrompre un delay() par contre il est possible de faire un systéme comme celui de l'exemple "BlinkWithoutDelay" :
http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Meuble Pour FauteuilType De Et Chaise Coussins Longue D92WHEIDe cette manière on peut continuer à faire quelque chose pendant qu'une autre action est en attente.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Cired

  • GuestChaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O
#3
Nov 20, 2011, 01:35 pm

Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O

Bonjour à tous,

Je ne me souviens plus exactement du code du delay utilisé dans le coeur d'arduino mais normalement tu peux l'interrompre en utilisant une interruption en utilisant les fonctions attachInterrupt() et detachInterrupt()

Pour cela il faut connecter ton capteur sur une des deux broches d'interruptions disponible (pin 0 et 1 je crois).

Comme le dit Skywodd, tu peux aussi regarder du coté de "BlinkWithoutDelay".

Bon courage

Benvenuto

Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O
  • Guest
#4
Nov 20, 2011, 01:49 pm Last Edit: Nov 20, 2011, 01:58 pm by BenvenutoReason: 1
Pour développer la suggestion d'infobarquee, qui reste l'approche la plus simple :

Supposons que tu as
- une fonction detection() qui donne true quand le capteur détecte quelqu'un et Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O false sinon
- une fonction action() que tu veux déclencher

Code: [Select]

// ne rien faire tant que personne ne passe devant le capteur
while (!detection());

// quand quelqu'un est détecté, calculer la valeur qu'aura la fonction
// millis() dans 30 minutes et la stocker dans deadline
unsigned long deadline = millis() + (30 * 60 * 1000);

// si quelqu'un est détecté la boucle s'interrompt et ne fait rien
while (!detection()) {
// tant que personne n'est détecté, comparer la date actuelle
// à la valeur calculée au début pour les 30 minutes
if (millis() > deadline) {
// dès que les 30 minutes sont dépassées, lancer l'action..
action();
À Manger Et Métal Design Bois Chêne L190 Table 240 Extensible Marny 35ARj4L        // .. puis sortir de la boucle
break;
}
}


En mettant ça dans loop() tu devrais arriver au résultat souhaité.

Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O

ecolomatique

  • Guest
Merci à tous pour vos réponses rapide, je vais essayer avec ces solutions et je vous tiendrez au courant.

ecolomatique

  • Guest
Bonjour,
j'ai essayé la méthode que Benvenuto m'a proposé mais ça n'a pas marché : une fois que le programme commence à compter (" if (millis() > deadline) "), on ne l'arrête plus ! (si quelqu'un a déjà obtenu un résultat avec cette méthode, peut être pourrait t-il m'apporter des précisions ?)
Sinon, je me suis penché sur BlinkWithoutDelay mais je n'ai pas trop compris : quelqu'un qui s'y connait pourrait me l'expliquer en français s'il vous plait ? (car le site est en anglais).

Merci d'avance !
Canapé Convertible Coffre Places Et Angle Minty Clair 8 Panoramique Gauche Gris OkwZ8n0PNX

[email protected]

En fait millis() renvoi le temps écoulé depuis le lancement du programme, donc pour faire clignoter la LED il enregistre millis() dans une variable, et ensuite dans la boucle il la compare en continu avec la valeur de millis() actuelle. Quand la difference entre les deux est égale ou supérieure à l'intervalle de temps correspondant à la vitesse de clignotement souhaitée(imaginons que tu souhaites 1 clignotement par seconde, ça fait 500 millisecondes), il inverse l'état de la LED (si elle était allumé il l'éteint et vice versa).

Pour en revenir à ton problème, le plus simple est d'appliquer cette méthode :

Je pars du principe que ton capteur renvoi un TRUE quand quelqu'un passe.
Code: [Select]

void loop(){
Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0Oif(MesureCapteur()==TRUE) { // ces deux lignes de code permettent de lancer la première execution de l'action A qui va lancé la minuterie
ActionA();
long Depart=millis() // "heure" de depart
while(1){ // du coup on doit créer une nouvelle-boucle avec cette commande puisqu'on ne veut pas qu'elle se relance si quelqu'un passe devant
if(Depart-millis>1800000) ActionA(); si 30 minutes d'écoulées, alors action A
if(MesureCapteur()==TRUE) Depart=millis(); //remise à zero de la minuterie puisque si quelqu'un est passé avant les 30 minutes
}
   }
}
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O

Benvenuto

  • Guest

Bonjour,
j'ai essayé la méthode que Benvenuto m'a proposé mais ça n'a pas marché : une fois que le programme commence à compter (" if (millis() > deadline) "), on ne l'arrête plus ! (si quelqu'un a déjà obtenu un résultat avec cette méthode, peut être pourrait t-il m'apporter des précisions ?)
Sinon, je me suis penché sur BlinkWithoutDelay mais je n'ai pas trop compris : quelqu'un qui s'y connait pourrait me l'expliquer en français s'il vous plait ? (car le site est en anglais).

Merci d'avance !Gouverner L'imprévisible Anne L'imprévisible Gouverner Crémieux Gouverner Crémieux Anne Crémieux Claude L'imprévisible Claude pqSMUGzV



Hello,

J'ai fait une erreur bête dans le code que j'ai proposé.
Le (30 * 60 * 1000) est calculé comme un entier sur 16 bits, et les 1 800 000 millisecondes que contient une demi-heure deviennent 1 800 000 modulo 2^16 soit 30528. Donc il vaut mieux remplacer (30*60*1000) par 1800000 directement.

Je l'ai testé, ça marche, mais selon le type de données que te donne ton capteur tu risques d'avoir besoin de filtrer sa sortie pour éviter l'effet "rebond".

Si tu passes devant le capteur à l'instant t, le programme va lancer sa minuterie.
Mais supposons que tu sois toujours devant le capteur quand la minuterie est lancée (et c'est fort probable, elle se lance en quelques microsecondes vu la simplicité du code).
Le programme va te détecter, donc il va annuler la minuterie.
Mais au début de la boucle suivante, une fraction de seconde plus tard, il va te redétecter, donc il va relancer la minuterie.
Et ainsi de suite.


Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O

ecolomatique

  • Guest
Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O
#9
Nov 22, 2011, 10:37 pm Last Edit: Nov 23, 2011, 08:18 am by Jean-FrançoisReason: 1
J'ai tout essayé mais rien ne marche (je ne critique pas vos propositions, loin de moi cette idée : c'est juste que je suis débutant donc je doit surement faire plein d'erreurs dans mon programme...).
J'ai essayé la solution de [email protected], de Benvenutto et de Skywodd... sans résultats ! (ois le délai n'ai pas lancé, sois il est lancé mais il ne s'arrête plus).
Voici mon programme, dès fois que vous trouviez mon erreur (la version qui, lorsque le délai est lancé, il ne s'arréte plus) :
Code: [Select]

int lightpin = 0;
int lightpin2 = 1;
int lightpin3 = 2;
int nbrpers = 1;
int ampoule = 1;
boolean lit;
boolean fenetre;
boolean ordi;
boolean etatOrdi = 0;
unsigned long deadline;

void setup()

{
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(8,INPUT);
pinMode(3,INPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
}


void loop()

{
lit = digitalRead(smiley-cool;
fenetre = digitalRead(4);
ordi = digitalRead(3);
int lightlevel = analogRead(lightpin);
int lightlevel2 = analogRead(lightpin2);
Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0Oint lightlevel3 = analogRead(lightpin3);

if (ordi == 0)
// si quelqu'un appuie sur le bouton démarrer de l'ordinateur :
{
De BureauLa ChaiseFauteuil Redoute ChaiseFauteuil BureauLa ChaiseFauteuil De Redoute rCtBxshQd      etatOrdi = !etatOrdi;
delay(500);
// signaler le nouvel état de l'ordinateur.
}


if (lightlevel > 70)
// si quelqu'un rentre :
{
nbrpers++;
// signaler que quelqu'un est rentré ...
delay(3000);
// ... puis attendre 3 secondes.
}


if (lightlevel2 > 70)
// si quelqu'un sorti :
{
if (fenetre == 1)
// si la fenêtre est fermée,
{
digitalWrite(6, HIGH);Titre Hêtre Snack Large Afficher Pliable Tv Côté Le Sur Portable Détails Thé Picnic D'origine Lit Café Table D2E9IH
// allumer avertisseur vert ...
nbrpers--;
// ... signaler que quelqu'un est sorti ...
delay(3000);
// ... attendre 3 secondes ...
digitalWrite(6, LOW);
// ... puis éteindre avertisseur vert.
}
else
// si la fenêtre est ouverte
{
digitalWrite(5, HIGH);
// allumer avertisseur rouge ...
nbrpers--;
// ... signaler que quelqu'un est sorti ...
delay(3000);
// ... attendre 3 secondes ...
digitalWrite(5, LOW);
// ... puis éteindre avertisseur rouge.
}

}


if (lit == 0)
// si quelqu'un est dans le lit :
{
Meuble Monsieur Salon Salon Salon Meuble Meuble Salon Monsieur Meuble Meuble Salon Monsieur Monsieur IYf7b6gyv  if (ampoule == 1)
// si l'ampoule est allumée...


digitalWrite(12, HIGH);
delay(50);
digitalWrite(12, LOW);
delay(3000);
// ... éteindre l'ampoule ...
ampoule--;
// ... et signaler qu'elle est éteinte.
}

else
{
if (nbrpers > 0)
// si quelqu'un est dans la pièce :
{
if (lightlevel3 > 280 && ampoule == 0)
// s'il fait sombre et que l'ampoule est éteinte...
{
digitalWrite(13, HIGH);
delay(50);
digitalWrite(13, LOW);
// ... allumer l'ampoule ...
ampoule++;
// ... et signaler qu'elle est allumée.
}
else if (lightlevel3 < 280 && ampoule == 1)
// sinon, s'il fait clair et que l'ampoule est allumée...
{
digitalWrite(12, HIGH);
delay(50);Support 95 Seulement Svb Main 94 Table De € Courante Pliant Pour CedorxB
digitalWrite(12, LOW);
// ... éteindre l'ampoule ...
ampoule--;
// ... et signaler qu'elle est éteinte.
}

}



else
// si la pièce est vide :Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O
{
if (ampoule == 1)
// si la lumière est allumée
{
digitalWrite(12, HIGH);
delay(50);
digitalWrite(12, LOW);
// ... éteindre l'ampoule ...
ampoule--;
// ... et signaler qu'elle est éteinte.
}


if (etatOrdi == 1)
// si ordi allumé :
{
À Manger Salle Amovible EnfantsAjustement Chaise De Pour eYWHE29DI                   unsigned long deadline = millis() + (180000);
// mettre temps actuel + 30 min dans une variable.

while (nbrpers <= 0)
// tant que la pièce est vide,
{
if (millis() > deadline)
// patienter 30 min...
{
digitalWrite(7, HIGH);
delay(50);
digitalWrite(7, LOW);
// ... éteindre l'ordinateur ...
etatOrdi--;
// ... signaler qu'il est éteint ...
break;
// ... et sortir de la boucle "tant que"
}
}
}

}
}
}
Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O


Merci d'avance pour vos futur propositions et merci pour les efforts déjà fait pour m'aider.

Chaise 8544 RéglableTransatube LonguePliable Lfm2763 Et Lafuma fv6g7ybYEdit de Jean-François : merci de mettre le code entre les balises "code" ;)

osaka

  • Guest
#10 Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O
Nov 23, 2011, 06:57 pm Last Edit: Nov 24, 2011, 01:48 pm by osakaReason: 1
Bonjour,

Code: [Select]
while (nbrpers <= 0)
le changement d'état ce trouve en dehors de ta boucle donc le reste du code ne s'effectuera qu'après la rencontre du break 30 minutes plus tard ...
Ne pas oublier la fonction loop est une boucle infinie, chaque ligne du code se trouvant dedans sont effectuer l'une à la suite de l'autre indéfiniment,un peux comme si tu lisais une page d'un livre et qu'une fois fini tu recommence au début de ta page.
Maintenant si tu dis "lire une ligne de cette page indéfiniment pendant 30 minutes" be tu ne verras pas les autres lignes pendants ses 30 minutes et une fois revenu à cette ligne rebelote. Canapés Room 20 Beaux En DésirablesMy Ultra Canapé Velours 4Aj5LR

Code: [Select]

if (etatOrdi == 1)
     // si ordi allumé :
{
deadline = millis() + (180000);
// mettre temps actuel + 30 min dans une variable.

if (nbrpers == 0 && millis() > deadline)
// patienter 30 min...
{
digitalWrite(7, HIGH);
delay(50);
digitalWrite(7, LOW);
// ... éteindre l'ordinateur ...
etatOrdi=false;
deadline = 0;
}

}

deadline en global et sans doute le remettre à 0 si une personne à été détecté plus haut dans ton code parce que si tu t'absente pile à la fin des 30 min ...
vu que tu utilises des boolean utilise plutôt true (1) ou false (0) plutôt que ++ ou -- pour tes états.
Utilise putôt des byte (1 octet = valeur positive allant de 0 à 255) pour "lightpin, ..." plutôt que des int (2 octet)
Plusieurs delay(3000) dit toi bien que l'arduino sera totalement inactif pendants ses 3 seconde ...

ecolomatique

  • Guest
"Plusieurs delay(3000) dit toi bien que l'arduino sera totalement inactif pendants ses 3 seconde ..."

Je sais, mais c'est fait exprès (pour que lorsque je passe devant un capteur, l'autre soit désactive lorsque je passe devant).

Sinon, merci infiniment pour t'es conseils et pour la résolution de mon problème (que je n'est pas encore testé, mais je ne doute pas que cela va marcher).
J'aurais appris quelques trucs grâce à ce projet (heureusement car c'était le but) et vous y êtes pour pas mal en m'ayant donné des pistes.
Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0OMerci à tous, donc !

Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O

osaka

  • Guest
#12
Nov 24, 2011, 02:48 pm Last Edit: Nov 24, 2011, 02:53 pm by osakaReason: 1 Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O

"Plusieurs delay(3000) dit toi bien que l'arduino sera totalement inactif pendants ses 3 seconde ..."

Je sais, mais c'est fait exprès (pour que lorsque je passe devant un capteur, l'autre soit désactive lorsque je passe devant).


Tu trouveras surement une autre solution comme pour le delay de 30min.


mais je ne doute pas que cela va marcher


Comme je l'ai mis là ça ne marchera pas, si tu regardes bien à chaque tour de la boucle loop ,deadline sera remis à millis()+18000, il faut voir quel critère relance un "délais" de 30 min (1 nouvelle personne présente ?).
Une grosse erreur que beaucoup de débutant font c'est mettre des variables locale à une fonction, un if, un while ou autre et pensé qu'elles garderont leur valeurs précédente, hors en sortie de boucle (loop) elles n'existe plus et sont réinitialisé, enfin c'est surtout le code arduino qui est trompeur comme on ne vois pas la fonction loop comme une boucle (en réalité fonction qui se trouve dans une boucle).
Pour t'aider à mieux comprendre voilà la véritable forme du code arduino, fonction loop dans une boucle infinie "for (; ; )".
Code: [Select]

int main(void)
{
init();

setup();

for (;;)
loop();

return 0;
}



Ton code comme je le verrais globalement, sans connaître tes conditions évidement il doit sans doute être différent.
Code: [Select]

#define lightpin 0
#define lightpin2 1
#define lightpin3 2
int nbrpers = 1;
int ampoule = 1;
int lit;
boolean fenetre;
boolean ordi;
boolean etatOrdi = false;
unsigned long deadline;

void setup()

{
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(8,INPUT);
  pinMode(3,INPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  deadline = millis() + (180000);
}

void loop()
{
//lit = digitalRead(smiley-cool);
fenetre = digitalRead(4);
ordi = digitalRead(3);
int lightlevel = analogRead(lightpin);
int lightlevel2 = analogRead(lightpin2);
int lightlevel3 = analogRead(lightpin3);
Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O
if (ordi == 0)
// si quelqu'un appuie sur le bouton démarrer de l'ordinateur :
{
      etatOrdi = true;
      delay(500);
   // signaler le nouvel état de l'ordinateur.
}


if (lightlevel > 70)
// si quelqu'un rentre :
{
   nbrpers++;
   if(etatOrdi)
   {
     deadline = millis() + (180000);
   }
   // signaler que quelqu'un est rentré ...
   delay(3000);
   // ... puis attendre 3 secondes.
}


if (lightlevel2 > 70)Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O
// si quelqu'un sorti :
{
   if (fenetre == 1)
// si la fenêtre est fermée,
   {
     digitalWrite(6, HIGH);
     // allumer avertisseur vert ...
     nbrpers--;
     // ... signaler que quelqu'un est sorti ...
     delay(3000);
     // ... attendre 3 secondes ...
     digitalWrite(6, LOW);
     // ... puis éteindre avertisseur vert.
   }
   else
// si la fenêtre est ouverte
   {
     digitalWrite(5, HIGH);
     // allumer avertisseur rouge ...
     nbrpers--;
     // ... signaler que quelqu'un est sorti ...
     delay(3000);
     // ... attendre 3 secondes ...
     digitalWrite(5, LOW);
     // ... puis éteindre avertisseur rouge.
   }

}


if (lit == 0)
// si quelqu'un est dans le lit :
{
  if (ampoule)
  // si l'ampoule est allumée...


     digitalWrite(12, HIGH);
     delay(50);
     digitalWrite(12, LOW);
     delay(3000);
  // ... éteindre l'ampoule ...
     ampoule = false;
  // ... et signaler qu'elle est éteinte.
}

else
{
     if (nbrpers > 0)
     // si quelqu'un est dans la pièce :
     {
          if (lightlevel3 > 280 && !ampoule)
       // s'il fait sombre et que l'ampoule est éteinte...
          {
             digitalWrite(13, HIGH);
             delay(50);
Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O             digitalWrite(13, LOW);
        // ... allumer l'ampoule ...
             ampoule = true;
        // ... et signaler qu'elle est allumée.
          }
          else if (lightlevel3 < 280 && ampoule)
       // sinon, s'il fait clair et que l'ampoule est allumée...
          {
             digitalWrite(12, HIGH);
             delay(50);
             digitalWrite(12, LOW);
        // ... éteindre l'ampoule ...
             ampoule = false;
        // ... et signaler qu'elle est éteinte.
          }

     }
     else
     // si la pièce est vide :
     {
         if (ampoule)
         // si la lumière est allumée
         {
             digitalWrite(12, HIGH);
             delay(50);
             digitalWrite(12, LOW);
        // ... éteindre l'ampoule ...
             ampoule = false;
        // ... et signaler qu'elle est éteinte.
         }


         if (etatOrdi == 1)
      // si ordi allumé :
          {
              if (nbrpers == 0 && millis() > deadline)
              // patienter 30 min...
              {
                  digitalWrite(7, HIGH);
                  delay(50);
                  digitalWrite(7, LOW);
                  // ... éteindre l'ordinateur ...
                  etatOrdi = false;
                  // ... signaler qu'il est éteint ...Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O
              }
          }

     }
   }
  }


Donc plusieurs choses à retenir:
- voir la fonction loop comme une boucle infinie.
- variable globale au programme, leurs existence est persistante au programme.
- variable locale à un "bloc" comme une fonction, un if, while ,etc, persistera qu'a l'intérieure de ceux ci une fois sortie elle n'existe plus.
- les booléens false=0, true=1 (rem: en réalité il n'y a que 0=false, tout autre valeurs 1, 25, -56471, 4.57, 0.0001, ...,  seront considéré comme vraie.)
- 1byte = 1octet = valeurs de 0 à 255, int = 2octet = valeurs de -32768 à 32767 (si non signé "unsigned" donc pas de nombre négatif, valeurs de 0 à 65535) et voir également char, float, long, ...

Enfin tout ça viendra petit à petit.

Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O Go Up
Pages: [1]

Chaise Longue Kanqingqing Famille Home Tatami Appartement Petit Nnwv8m0O