comment garder une fonction en PRINCIPALE

Bonjour

Tout d'abord je débute dans la programmation arduino du coup désolé si je n'emploi pas les bons termes

Alors ma question est un peu complexe: J'aimerais savoir comment faire, et si c'est possible, pour qu'a n'importe quel moment du programme si mon entrée 1 (dirons nous) est activé tout le programme s’arrête et exécute toute une procédure relative a l'entrée 1 et reste "bloqué" a la dernière étape jusqu’à ce qu'il y est un "réarmement"

Merci

Dans la boucle "loop()" du programme, vous écrivez :

Si entrée1 activée {
  faire ce qu'il y a à faire;
  tant que vrai {
    rien faire; // on attend le réarmement
  }
} sinon {
  faire autre chose; // la durée max de cette séquence et fonction de la période à laquelle vous voulez scruter l'entrée1.
}

Cordialement.

Pierre

Dans cette partie

  tant que vrai {
    rien faire; // on attend le réarmement
  }

à la place de rien faire, je mettrais plutôt un test sur la condition du réarmement qui fasse sortir de la boucle parce que sinon le programme va être complètement bloqué et il ne réagira plus à rien du tout.

Le réarmement (bouton reset ou reset soft) n'a t-il pas priorité sur tout ?

Cordialement.

Pierre

Tu vois que les solutions sont légions parce que ton sujet est trop flou.
Précise exactement ce que tu veux faire et tu obtiendra une réponse adaptée à ton besoin.

En particulier quel moyen compte tu utiliser pour débloquer le programme :
horloge ?
appuis sur un bouton ?
Coupure d'alimentation au compteur EDF ?
Bouton Reset ?
etc.............. etc.................

Merci a tous pour vos reponse déja

En faite j'aimerais que sa soit a n'importe quel moment si l'entrée 1 est activé faut que sa me coupe tout le programme et que sa me realise les actions en cas d'activation de cette entrée. Je pense avoir plus ou moins le reste du programme jusque quelques petits réglages mais rien de mechant.
Et une fois un rearmement fait par un bouton externe le programme repart de zero.

Et vous devez faire quoi exactement dans cette partie du code ? Suivant les cas vous pourriez utiliser une interruption matérielle, faire ce que vous avez à faire (ne nécessitant pas d'interruptions) et rebooter. Dans le setup c'est là que vous attendez alors que le bouton de ré-armement soit basculé comme il le faut

Mais en arriver là dénote généralement une mauvaise construction de la loop qui ne boucle pass assez vite pour tester bêtement l'appui sur le bouton plusieurs fois par secondes ce qui devrait être suffisant en regard du temps humain d'appui sur un bouton

JML

Dans cette partie du code je doit coupé des sorties juste et le programme doit resté en attente ou alors s'arrété completement dans l'attente d'un réarmement manuel

@tom vos posts sont ridicules

@gald
Votre microprocesseur est super rapide par rapport au temps humain donc quand vous dites à n'importe quel moment c'est sans doute dans la demi seconde par exemple - en 500ms votre arduino aura eu le temps d'exécuter des millions d'instructions (8 milllions de cycles d'horloge). Si votre boucle met 100ms pour tourner par exemple vous pourrez vérifier 10 fois par seconde l'appui du bouton.

Comme vous voulez simplement déclencher des relais dans votre fonction et rebooter une interruption matériel est envisageable dans ce cas - c'est pas très propre mais ça fait le job. Dans une interruption millis() delay() Serial.print etc ne fonctionneront pas donc c'est pour cela que je dis qu'une fois déclenché vos actions vous rebootez et c'est votre setup qui doit attendre le ré-armement (éventuellement vous écrivez en eeprom que vous rebootez sur urgence et en tenez compte dans le setup)

@ JML

Donc si je comprend bien j'ai juste a inclure cette partie en fonction IF et dans tout le cas avec la rapidité du programme sa déclenchera quand même et pas besoin de me prendre la téte et cherché compliqué ?!
Mais du coup pour le mettre en attente justement dans cette partie comment je peut faire ?!
Est ce que je le laisse en attente une fois les actions realisés ? qu'est ce que vous me conseillez ?

gald:
Mais du coup pour le mettre en attente justement dans cette partie comment je peut faire ?!
Est ce que je le laisse en attente une fois les actions realisés ? qu'est ce que vous me conseillez ?

Pour la mise en attente, une boucle while pourrait-elle faire l'affaire?

while (pas de réarmement)
{}

Oui vraiment si la loop() ne fait rien de bien compliqué (mesurez sa durée) alors vous mettez un test sur votre interrupteur d'alarme en début de loop() et pas besoin de rebooter

const byte pinAlarme = 2;
....

void setup()
{
   ...
   pinMode(pinAlarme, INPUT_PULLUP); // interrupteur câblé directement vers ground, HIGH quand inactif
   ...
}

void loop()
{
  // Test condition d'alarme 
  if (digitalRead(pinAlarme)==LOW) { // LOW = interrupteur activé
      // couper toute la ventilation et  fermer les persiennes
      ...

      // les commandes des relais (et attente de fermeture si vous avez un limit switch)
      // prendront un peu de temps, sans doute suffisant pour éviter tout rebond de l'interrupteur 
      // mais si on veut être sûr que les rebonds de l'interrupteur sont terminés 
      // on attend un peu avant de relire son état, 15ms suffisent pour la majorité ses interrupteurs
      // et ne sont pas significatifs/visibles au niveau expérience utilisateur
      delay(15); 

      // Attente active que l'interrupteur d'Alarme soit désactivé
      while (digitalRead(pinAlarme)==LOW) ; // on ne fait rien (LOW = interrupteur activé)

      // ici le bouton a été désactivé, éventuellement remettre le système en fonction
     ....


   } // fin de condition de test d'alarme 

  // ici le programme principal 
   ...
   ...
}

@J-M-L

Merci beaucoup pour ton aide et a tous les autres aussi merci pour votre aide
J’essais sa des demain

MERCI