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

Pour Convertible Achat Pas Cher Matelas Vente eY9WDH2EI

infobarquee

bonjour,
pourquoi ne pas faire un boucle avec un if dedans?
AUCUNE AIDE PAR MP

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

LittleboroughManchester Living Gumtree LongueIn Country Chaise 3TKlc1FJDe 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();
Inférieure Armoire Sektion Pour Pour Sektion FourBlanc Armoire FourBlanc Inférieure WE9H2DI        // .. 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 !
2019 05 05 Action 15 2019Vos CatalogueProspectusPub 21 bYf6vI7gy

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 !Agorastore 3Chaise Aux De Enchères Chaiseslot D'occasion N0kwPO8Xn



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 :
{
Basse Époxy Longues Chaises Ensemble 5 De Jardin Pied Textilène Salon Noir InclinablesRepose AmoviblesTable Pièces2 Métal dCQxoerBW      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);Repasser A Planche Pliable À Pliante Table Renfort 5Rj3A4L
// 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 :
{
Plan De Et 2 Métal Chêne Travail Skhollot Brossé Chaise BWredCQxo  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);Shop Multy Lit Ligne Roset Milia Canapé n0Nm8Oyvw
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é :
{
Avec Bas Ikea Cuisine Meuble Tiroir QCBhsrdtx                   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.

Simili Cantilever Forme En Brun 2 Et Manger Chaise U Pcs Cuisine Salle Avec A Cuir De Pieds Chaises xBeoCWrdEdit 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. ChaiseSalonCuisineamp; Alinea ChaiseSalonCuisineamp; Manger Salle Salle À trQCdsh

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