Go Down

Topic: Prog eventielle avec millis (Read 148 times) previous topic - next topic

luckymaxou

Bonjour à tous,
je pense que je vais poser une question idiote, mais je suis débutant et je n'ai pas trouvé la réponse en cherchant,
voillà mon problème tout bête, je vais programmer mes volets roulants,
je veux que automatiquement à heure fixe ils montent, je vais donc faire une fonction et utiliser millis pour qu'ils montent pendant 10 secondes
jusque là pas de problème
ce qui me pose un problème c'est que pendant qu'ils sont en train de monter, si j'actionne un bouton, je veux qu'ils s'arrête, c'est à dire que je veux que la boucle millis s'interrompe immédiatement.
je pense que ma question est triviale et que c'est d'une simplicité déconcertante, mais je cale.
pouvez vous m'aider s'il vous plait
Merci
Cordialement
LuckyMaxou

-Standby

Bonsoir,

Tu peux utiliser l'instruction break; pour quitter une condition.

Exemple :

Quote
do {

monter les volets
 
if (bouton ==1) {
   break;
 }

while (millis - ancien millis < durée X);
The Mind is like a parachute it works best when opened.

infobarquee

#2
Oct 11, 2017, 09:26 pm Last Edit: Oct 11, 2017, 09:26 pm by infobarquee
bonjour,
tu prends ton heure, une boucle while, une lecture du bouton, si appuie, envoi sur une fonction.

Code: [Select]
while (millis() - heure < 10000){
   moteur(UP);
                if (digitalRead(bouton_stop) == HIGH){
               moteur(STOP);
                }
}
AUCUNE AIDE PAR MP

J-M-L

Ou alors vous le faites proprement et de manière évolutive avec une machine à états...
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

luckymaxou

Bonjour,
merci beaucoup pour vos réponses claires et documentées
les 2 solutions de "-Stanby" et de "Infobarquée" répondent parfaitement à ma question.
effectivement c'était tout simple
sujet clos pour moi
merci encore


J-M-L

Dans la première solution n'oubliez pas qu'il faut mettre à jour l'état du bouton bien sûr

Dans la seconde solution un break serait utile sans doute après le STOP sinon le moteur redémarrera immédiatement en remontant au début du while.

Dans les deux cas, votre programme ne peut rien faire d'autre. Si vous avez envie ensuite de gérer un double click sur le bouton, de rajouter d'autres boutons (histoire de faire monter plusieurs volets en même temps), ou d'écouter des commandes sur le port série, de mettre une interface web de gestion de vos volets,  ou quoi que ce soit d'autre ce type d'approche ne fonctionnera pas - et votre code deviendra vite très "spaghetti" --> c'est dans ce cas qu'une approche par machine à état, même si un peu plus lourde en code en premier abord, vous apportera une souplesse très appréciable (cf mon tuto programmation par machine à états éventuellement si vous voulez découvrir cette technique)
 
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

infobarquee

j'ai oublié le break effectivement ;)

sinon, en mélangeant un peut

Code: [Select]
while (millis() - heure < 10000 && valide == true){
   moteur(UP);
                if (digitalRead(bouton_stop) == HIGH){
               moteur(STOP);
               valide = false;
                }
}
AUCUNE AIDE PAR MP

luckymaxou

merci J-M-L,
j'étais justement allé voir votre tuto que j'ai trouvé par hasard et je venais sur mon post pour rajouter le lien pour que ca serve à d'autres
https://forum.arduino.cc/index.php?topic=470879.0

je ne connaissais pas le terme "machine à états", par contre je connais déjà les switch case (en "C").
je vais effectivement avoir plusieurs événements à gérer (la réception de l'ordre monte et baisse en 433Mhz et le déclenchement monte, stop, descend par le bouton poussoir)
Au niveau états, j'ai prévu enum {enHaut, descend, enBas, monte} etatCourant;

Go Up