Arrêt d'urgence

Bonjour,
après avoir fait plusieurs recherches, je ne trouve pas de solution à mon problème. Je m'explique : je cherche une fonction qui permettrait, sur un seul bouton, de lancer le code, et si il y a un problème de pouvoir le stopper. Je ne peux pas mettre le pin RESET, et je ne vois pas comment intégrer le soft reset, void (*softReset) (void) = 0;

Voici le code que j'ai pour l'instant, qui fonctionne.

int ledV = 2; // déclaration des leds, relais et bouton
int ledJ = 3;
int ledRCom = 4;
int relais = 5;
int bouton = 6;
int etatBouton = digitalRead(bouton); // lecture du bouton
void setup() {
  pinMode(ledV, OUTPUT); //initialisation des leds, relais et bouton
  pinMode(ledJ, OUTPUT);
  pinMode(ledRCom, OUTPUT);
  pinMode(relais, OUTPUT); 
  pinMode(bouton, INPUT_PULLUP); 
  // put your setup code here, to run once:
  Serial.begin(9600);
  digitalWrite(ledRCom, HIGH); // on éteint et allume les leds quel'on veut, et on ferme le relais
  digitalWrite(relais, LOW);
  digitalWrite(ledJ, LOW);
  digitalWrite(ledV, LOW);
}

void loop() {

  Serial.println(etatBouton); // Lorsque bouton appuyé : exécuter le code
  if (etatBouton == 0)
  {
    digitalWrite(ledRCom, LOW); //Rouge OFF, Jaune HIGH
    digitalWrite(ledJ, HIGH);
    delay(5000);
    digitalWrite(ledV, HIGH);
    delay(200);
    digitalWrite(ledV, LOW);
    delay(6800);
    digitalWrite(ledV, HIGH); // on fait clignoter la verte à 10s
    delay(200);
    digitalWrite(ledV,LOW);
    delay(800);
    digitalWrite(ledV, HIGH); // on fait clignoter la leds verte a t-3.t-2 et t-1 s
    delay(200);
    digitalWrite(ledV,LOW);
    delay(800);
    digitalWrite(ledV, HIGH);
    delay(200);
    digitalWrite(ledV,LOW);
    delay(800);
    digitalWrite(ledV, HIGH); // on éteint la Jaune et on laisse allumé la verte, le relais est ouvert
    digitalWrite(ledJ, LOW);
    digitalWrite(relais, HIGH);
 
}

}

Merci beaucoup pour votre aide,
Zazu

Vous avez des delais HENAURMES dans loop qui rendent toute action sur le clavier inefficace .
Regardez donc dans blinkWithoutDelay -un exemple très simple, livré avec l'IDE- comment ne pas bloquer un loop avec des delays... ensuite, une fois que vous aurez compris cet exemple, ça sera trivial

Mais le code sera bourré de "if" si je fais cette méthode, je pensais plus à une fonction while mais je ne sais pas comment la mettre.

Vous faites une fonction qui gère chaque clignotement de LED (une par LED... c'est très lourd);
vous déclarez en static le temps écoulé depuis le dernier changement...
vous verrez, rien que ça rendra votre loop plus lisible (et vous n'aurez plus beaucoup de délais à gérer ... en les enlevant)

Sinon Enlevez la prise pour un arrêt d’urgence...

+1 (rien qu'à lire le titre)

En fait, je souhaite mettre le système dans une boite, et seul le bouton de démarrage/ arrêt d'urgence et 2 fils sortiront de cette boîte, l'alimentation de l'arduino serait enfermée.

Je suis désolé, mais je ne vois pas exactement comment faire...

void premierClignV ()
{
  static int previousMillis = 0;
  static int currentMillis = millis();
  if (currentMillis - previousMillis >= 5000)
  {
    digitalWrite(ledV, HIGH);
  }
}

Suis-je bien parti ou non?
De plus, devrais-je mettre un délai pour allumer puis éteindre la LED delay(200), ou bien une autre fonction de millis

static int previousMillis2 = 0;
static currentMillis2 = millis();
if (currentMillis2 - previousMillis2 >= 200)
{
digitalWrite(ledV, LOW);
}
void premierClignV (uint32_t time) {
  static int previousMillis = 0;
  static bool etatLED = LOW; // code à la volée: verifier si ça clignote

 int currentMillis = millis(); // n'a pas à être mis en static
  if (currentMillis - previousMillis >= time)
  {
    digitalWrite(ledV,etatLED  );//
   etatLED  = ! etatLED  ;
  }
}

vous fera changer l'état de la LEd verte si au moins time a été écoulé... (si vous l'appelez tout le temps dans loop,il va vous gérer le clignotement : gain d'une ligne)

dbrion06:

void premierClignV (uint32_t time) {

static int previousMillis = 0;
  static bool etatLED = LOW; // code à la volée: verifier si ça clignote

int currentMillis = millis(); // n'a pas à être mis en static
  if (currentMillis - previousMillis >= time)
  {
    digitalWrite(ledV,etatLED  );//
  etatLED  = ! etatLED  ;
  }
}




vous fera changer l'état de la LEd verte si au moins time a été écoulé... (si vous l'appelez tout le temps dans loop,il va vous gérer le clignotement : gain d'une ligne)

Vaut mieux quand même utiliser des unsigned long et penser à mettre à jour previousMillis :slight_smile:

Je n'étais pas assez dans arduino pour savoir que l'on pouvait mettre par exemple une variable qui changeait en fonction de la fonction, merci beaucoup pour cette aide, je vais le tester de ce pas.

Certes, JML.
Et il serait encore mieux que je ne code pas à la volée...

void premierClignV (uint32_t time) {
  static uint32_t previousMillis = 0;
  static bool etatLED = LOW; // code à la volée: verifier si ça clignote

 uint32_t currentMillis = millis(); // n'a pas à être mis en static
  if (currentMillis - previousMillis >= time)
  {
    digitalWrite(ledV,etatLED  );//
   etatLED  = ! etatLED  ;
previousMillis = currentMillis ; // une des modifs judicieuses de JML.
  } 
}

(le mieux est l'ennemi du bien, selon Pascal)

J-M-L:
Sinon Enlevez la prise pour un arrêt d’urgence...

Trop long pour un arrêt d'urgence.
Un billot, le câble d'alim dessus et une hache juste à coté.

Bonjour,

68tjs:
Un billot, le câble d'alim dessus et une hache juste à coté.

Il y a aussi la méthode dérivée de la haute tension.
Lorsqu'on intervient sur un câble HT (20 kV, 63 kV ou plus), il faut garantir la sécurité des intervenants.
Une des méthodes utilisées, consiste à tuer le câble. On enfonce une pièce métallique mise à la terre dans le câble pour mettre en court-circuit les 3 phases le tout avec un dispositif pyrotechnique. Bref, très rapide et surtout efficace.

Zazu51:
Mais le code sera bourré de "if" si je fais cette méthode, je pensais plus à une fonction while mais je ne sais pas comment la mettre.

Bonsoir,

Avez-vous envisagé d'utiliser les interruptions matérielles?

A+