Bonjour
Après avoir chercher à résoudre mon problème depuis plusieurs jours, je demande votre aide de spécialistes.
Je voudrais réaliser deux temporisations à la suite mais sans employer delay afin de ne pas bloquer mon programme pour d'autres tâches.
Ma demande:
Alimenter une fonction N°1 pendant un temps variable inférieur à 1 minute.
Ensuite alimenter une fonction N°2 pendant un temps aussi variable jusqu'à plusieurs minutes.
Très important, couper la fonction N°1 pendant que la fonction N° 2 tourne, sinon BOOMMM.
Et c'est ce que je n'arrive pas à faire.
J'ai essayé un peu tout, mais rien à faire.
Voici la base du programme des tempos, le reste du programme tourne bien avec delay, mais ce que je veux éviter.
unsigned long temps1;
unsigned long temps2;
boolean flag1;
boolean flag2;
int relais1 = 2;
int relais2 = 7;
int valtemps1=3000;
int valtemps2=6000;
int eclairage = A1;
int valeclairage = 0;
void setup() {
pinMode(relais1,OUTPUT);
temps1 = millis();
pinMode(relais2,OUTPUT);
temps2 = millis();
pinMode (eclairage, INPUT);
valeclairage = 200;
pinMode(13,OUTPUT);
}
void loop() {
if (analogRead(eclairage) >= valeclairage) {
if((millis()-temps1)>=valtemps1) {
digitalWrite(relais1,HIGH);
temps1 = millis();
}
if((millis()-temps2)>=valtemps2) {
digitalWrite(relais1,LOW);
digitalWrite(relais2,HIGH);
temps2=millis();
}
digitalWrite(13,HIGH); delay(50);digitalWrite(13,LOW);
}
else {digitalWrite(relais1,LOW);digitalWrite(relais2,LOW);}
}
Merci pour votre aide, je prends peut être le problème à l'envers.
Bonjour , dans le code je ne vois pas les fonctions 1 et 2 , et il n ' y a qu ' 1 seul delay (50) .
si tu veux faire tourner une fonction et pas l'autre en meme temps , cela reste assez simple , il suffit de mettre une condition non imbriquée alors que c' est le cas dans ton code .
Je ne comprends pas tres bien ce que tu cherche a faire , plus de precision sur ce que tu voudrais que ton code réalise serait bienvenue .
J'avais déjà essayé avec les fonctions case sans succès, et aussi regardé la machine à états qui me parait une usine à gaz.
Il doit bien y avoir une solution plus simple ? non ??
La solution plus simple c'est de mettre des delay, mais ça bloque complètement le programme qui ne peut faire autre chose.
Un automate n'est pas si compliqué si on analyse bien la chose.
Ca donne quelquechose comme ça:
int relais1 = 2;
int relais2 = 7;
int valtemps1 = 3000;
int valtemps2 = 6000;
int eclairage = A1;
int valeclairage = 0;
void setup() {
pinMode(relais1, OUTPUT);
pinMode(relais2, OUTPUT);
pinMode (eclairage, INPUT);
valeclairage = 200;
pinMode(13, OUTPUT);
}
enum ETAT {ETEINT, ETAT1, ETAT2};
ETAT etat = ETEINT;
void loop() {
static unsigned long temps;
if (analogRead(eclairage) >= valeclairage) {
if (etat == ETEINT)
{
digitalWrite(relais1, HIGH);
temps = millis();
etat = ETAT1;
}
}
else {
digitalWrite(relais1, LOW);
digitalWrite(relais2, LOW);
etat = ETEINT;
}
switch (etat)
{
case ETAT1:
if ((millis() - temps) >= valtemps1)
{
digitalWrite(relais1, LOW);
digitalWrite(relais2, HIGH);
temps = millis();
etat = ETAT2;
}
break;
case ETAT2:
if ((millis() - temps) >= valtemps2)
{
digitalWrite(relais1, LOW);
digitalWrite(relais2, LOW);
etat = ETEINT;
}
break;
}
}
Remarque: ton cahier des charges n'est pas très bien défini. Qu'est ce que le programme doit faire à l'échéance de la fonction 2 -> par défaut si la condition est toujours remplie, il repart dans la fonction 1
Ce n'est pas une usine à gaz. Indépendamment du coding, c'est la démarche normale pour définir le fonctionnement d'un système :
Quels sont les différents états possibles de mon système à un instant t ?
Quels sont les événements qui font passer mon système de l'état x à l'état y ?
Quelles sont les actions à effectuer lors d'un changement d'état x vers y ?
Si tu abordes le problème comme ça, cela t'obligera à te poser les bonnes questions
Derrière, ton code associé à chaque point ci-dessus sera
des variables globales avec des plages de valeur prédéfinies, permettant de qualifier l'état du système
une succesion de if, non imbriqués les uns dans les autres
le corps d'instructions associé à chaque if
Je note aussi au passage que tu souhaites faire clignotter la led 13 lorsque ton système est actif.
A elle seule, cette fonctionnalité est aussi un, à faire fonctionner en parallèle de ton système principal.
Sa mise en oeuvre est simple, et sera l'illustration parfaite du principe de faire "plusieurs choses à la fois".
Bonjour , l ' avantage de coder selon un systeme de machine etat n ' est pas en soi une " usine a gaz " , par contre il a clairement un gros avantage : permettre de ne traiter les differents etats separement et donc d ' eclaircir enormement le codage et a fortiori de moins faire de betises , car on ne traite les choses que par evenement separés , comme l' a dit @bricoleau .
Il y a d' ailleurs un tres bon tuto ecrit par @J-M-L sur le principe qui permet de voir nettement l ' avantage dont je parle ( sans compter le fait que cette façon de programmer permet d ' avoir un code evolutif et facilement modifiable et ou ameliorable dans le temps ) .
A mon sens, ce petit bout de code illustre bien le principe de programmation par états.
Il ne contient aucun delay.
Il est facilement isolable dans une fonction appelée une fois par loop
Il est quasiment indépendant : la seule interaction avec le reste du programme réside dans l'utilisation de la variable globale etat_systeme.
NB : les if peuvent être mis dans n'importe quel ordre, car ils sont évalués des (centaines de) milliers de fois par seconde.
Avec ce type de programmation, on peut gérer vraiment beaucoup de choses "en parallèle" avec une petite carte arduino.