Go Down

Topic: Arrêter un programme arduino (Read 639 times) previous topic - next topic

Ti-Matelot

Bonjour, y a-t'il une commande pour arrêter la loop à la fin d'un programme pour que tout arrête... genre exit();  ou autre chose
Merci
Yves Sabourin
Laval, Qc, Canada
Geocaching Alias: TopGun-50

ard_newbie

Je suppose que ce code arrête le uc : abort(); mais toutefois pas un watchdog.

dfgh

hello
pour stopper la loop, pour voir ce qui est affiché sur le moniteur par exemple,
tu mets

while (1);

exemple
Code: [Select]

void setup() {
  Serial.begin(9600);
}
void loop() {
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (5.0 / 1023.0);
  Serial.println(voltage);
  while(1);
}

ChPr

Si votre but n'est que de parcourir une seule fois la loop(), alors, n'y rentrez pas et placez toutes vos instructions dans le setup(). Sinon, faites un test sur ce qui motive votre choix d'arrêter et comme "dfgh" vous l'a dit, bouclez sur un while(1);

Cordialement.

Pierre
Pourquoi faire simple alors qu'il est si facile de faire compliqué !

Ti-Matelot

merci, je vais étudier l'avenue du while(1), le 1 veut-il dire une seule fois?

Et pourquoi pas le watchdog?
Yves Sabourin
Laval, Qc, Canada
Geocaching Alias: TopGun-50

jfs

#5
Jan 22, 2018, 07:02 pm Last Edit: Jan 22, 2018, 07:04 pm by jfs
la condition While continue tant qu'elle est juste.... 1 = true (vrai)
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

68tjs

#6
Jan 22, 2018, 07:09 pm Last Edit: Jan 22, 2018, 07:17 pm by 68tjs
Quote
merci, je vais étudier l'avenue du while(1), le 1 veut-il dire une seule fois?
Non la condition qui est entre les parenthèses du while est un booléen qui ne peux avoir comme valeur que VRAI ou FAUX.

Par convention et uniquement par convention les auteurs du C et C++ et sans doute aussi ceux d'autres langages) ont fixé la règle suivante :
- tout ce qui est égal à 0 est considéré comme FAUX
- tout ce qui est différent de 0 est considéré comme VRAI

Pour ton problème il me semble reconnaître une non compréhension logique comme celle que j'avais eu au début de mon aventure dans les micro-contrôleurs.

Pourquoi tu veux arrêter le programme ?
Si c'est juste pour l'arrêter tu coupes l'alimentation.

Par contre si c'est pour en bloquer le déroulement  dans certaines circonstances le bloquer définitivement n'est pas la bonne solution. Car alors il faudra appuyer sur le bouton reset pour le faire repartir.

La boucle infinie est absolument obligatoire (fonction loop() ).
Par contre en fonction de la valeur de certaines variables tu peux bloquer momentanément un programme
Exemple
Code: [Select]

while(controle == 0)
{
   // ne rien faire tant que la variable controle ne prend pas la valeur 1
}


Tant que controle sera égal à 0, la comparaison (controle == 0) est vraie donc le résultat de la comparaison vaut 1 et on reste coincé dans la boucle while.
Par contre si par une action extérieure la variable controle prend la valeur 1 ,   la comparaison (controle == 0) sera fausse puisque 1 n'est pas égal à 0 et le programme sortira de la boucle while.
Cela te permet de laisser le programme tourner et il peut repartir dès que la variable contrôle prendra la valeur 1.


Ti-Matelot

Merci 68tjs, effectivement, comme on dit , je suis entrain d'apprendre sur le tas, le pourquoi je veux arrêter le programme est que ce dernier est un jeu qui se déroule et lors de la réussite, ceci permet l'ouverture de l'accès d'une geocache, une fois cette opération faite ,la dernière ligne de code remercie le joueur et lui demande de retirer sa pile.

Donc si je n'arreête pas ce dernier , le jeu recommence à nouveau au début je mettais un delay, mais souvent ils sont plusieurs autour de la geocache, ils signent le carnet de visites, jasent et pendant ce temps le jeu recommencait et recommencait.

Avec le while (1), au moins le jeu ne recommence pas et la dernière ligne disant de retirer leur pile demeure affichée.
Yves Sabourin
Laval, Qc, Canada
Geocaching Alias: TopGun-50

68tjs

Donc tu acceptes que le seul moyen de reprendre le jeu est d'appuyer sur "reset".

L'autre solution étant un bouton poussoir qui déclenche une interruption et que cette interruption mette "controle" à 1

TTTTT

La fonction sleep_enable() pourrait être utile si vous voulez économiser la batterie (au cas que le joueur soit complètement saoul et qu'il oublie de l'enlever)..

https://playground.arduino.cc/Learning/ArduinoSleepCode

while(1) fait quand même travailler le cpu, qui loop constamment les pauvres électrons dans le vide.

biggil

L'autre solution étant un bouton poussoir qui déclenche une interruption et que cette interruption mette "controle" à 1
Ou plus simplement un bouton poussoir, en remplaçant while(1); par while ( digitalRead(MON_BOUTON) == HIGH);
Pour éviter de se frotter aux interruptions.

Go Up