Blocage des fonctions de programme pour une utilisation multiple

Bonjour à vous,

Je suis actuellement en train de réaliser un programme pour faire fonctionner deux Leds RGB dans un effet de feu couplé à une machine à fumée pour l'une des Leds.

Mon besoin est que:

  • Un bouton poussoir déclenche une séquence avec une led qui scintille et le module de fumée.
  • L'autre leds est sur un module amovible qui se déclenche lorsque le contact se fait (le programme peut tourner en continu sans problèmes ou se déclencher qu'au moment du contact.

Pour ce qui est du matériel, j'utilise :

  • Un arduino nano
  • Deux Leds RGB avec resistances (du kit led Elegoo)
  • Une machine à vapeur/fumée en alimentation 5V
  • Une alimentation externe 5V
  • Un bouton poussoir

Je compte me servir de l'alimentation pour alimenter l'arduino + la machine à fumée. J'ai procéder à des tests d'alimentation de la machine à fumée par l'arduino mais il ne doit pas délivrer assez de puissance pour le faire fonctionner.

Pour ce qui est du code, voici ce que j'ai réussi à faire jusqu'à présent :

// Déclarations des sorties PWM
int ledb1 = 2;
int ledb2 = 10;
int ledv1 = 3;
int ledv2 = 11;
int ledr1 = 4;
int ledr2 = 12;

void setup() {
  
     // En mode sortie
     pinMode(ledb1, OUTPUT);
     pinMode(ledv1, OUTPUT);
     pinMode(ledr1, OUTPUT);
     pinMode(ledb2, OUTPUT);
     pinMode(ledv2, OUTPUT);
     pinMode(ledr2, OUTPUT);
  
     
}

void loop() {
  
      analogWrite(ledb1, 0);
      analogWrite(ledv1, random(10,30));
      analogWrite(ledr1, 150);
      delay(random(30,80));
      
      analogWrite(ledb2, 0);
      analogWrite(ledv2, random(10,30));
      analogWrite(ledr2, 150);
      delay(random(30,80));
  
}

Le scintillement correspond parfaitement à ce que je recherche. Mais maintenant il faut que j'incorpore la tempo de 30s que je désire pour le module.. et c'est à ce moment que ça bloque.
En effet, de ce que j'ai pu lire/trouver, la fonction Delay bloque la lecture du reste du programme. Il faudrait que je passe sur une fonction mili? Mais je ne comprends pas trop bien comment l'utiliser..

Aussi, je m'interrogeais sur le déclenchement par BP. Devrais-je utiliser la fonction IF afin de détecter le déclenchement et ainsi lancer cette séquence en particulier ?

D'ailleurs, comment dois-je "étager" le programme ? Dois-je créer des sections et/ou séquence ou encore des fonctions ? Ceci afin que la détection du BP ne rentre pas en conflit avec la led qui peut tourner en boucle.
Si oui, avec quelle fonction ?

Tant de question de débutant... :upside_down_face:

Je vous remercie par avance pour tout éclairage que vous pourrez m'apporter et point de réflexion.

N'hesitez surtout pas s'il vous manque des éléments, j'ai essayer d'être le plus claire possible mais entre ce qui est clair dans ma tête et un/une inconnu(e) à mes souhaits, il peut y avoir un monde. :sweat_smile:
Et c'est mon 1er post.. :roll_eyes:

Ce genre de besoin se traite plus facilement avec un automate et il est plus facilement modifiable par la suite.
Voir ici un tuto fait par un membre du forum

en plus du conseil de @fdufnews, la fonction millis, te donne le nombre de milliseconde qui s'est écoulé depuis que tu as allumé ton microcontrôleur.
Tu peux donc grâce à ca mémoriser ce temps au lancement de ta tempo et comparer régulièrement ce que tu as mémoriser avec le temps courant, c'est à dire en appelant régulièrement à nouveau la fonction millis et comparer l'écart pour mesurer le temps passé.

Bonjour joris-l-animal

Que doit-il se faire pendant ces 30 secondes ou que doit se déclencher au bout de ces 30 secondes, dans ce cas, qu'est ce qui déclenche ces 30 secondes.
Pour exercice de temporisation non bloquante donc sans delay(), il y a l'exemple Blink Without Delay

A+
Cordialement
jpbbricole

Bonjour à vous,

Merci pour vos 1er retour rapides

Merci je vais me pencher sur le sujet ! :slight_smile:

D'accord, il faut que je vois cela car la matériel serait allumé/éteint assez régulièrement. De ce que j'ai pu lire et comprendre, le tout se reboot au bout de 50 jours si c'est allumé en continu. Mais dans mon cas ce n'est pas une donnée à prendre en compte car ça sera allumer que très temporairement (au maximum, un jour complet) donc négligeable. :slight_smile:

Alors quand je déclenche le BP1, pendant 30s doit s'allumer la led RGB scintillante 1 et le module de fumée. Le programme de la led 2 peut tourner en continu et on le voit que quand je pose le module avec la led2 et que le contact se fait (contact par aimant par exemple). La tempo ne doit impérativement que gérer le led1 avec le module de fumée. Le fait de gérer la led2 seule avec un BP2 est facultatif.
Je vais également regarder attentivement le lien que tu m'as donné! :slight_smile:

En fait, je pense savoir comment gérer électroniquement ces fonctions avec divers composant mais cela prend de la place, et je souhaiterai centraliser ces fonctions avec un seul module (arduino) et apprendre à programmer cela. Cela faciliterai grandement les choses de n'avoir à utiliser ces fonctions avec un seul petit module (pour des créations de plus petites tailles) avec une multitude de variation (gestions de différentes animations de leds, etc..)

Je vous tiens informé de mon avancée. Et si vous avez des idées / questions complémentaires, n'hésitez pas! :slight_smile:

Bonne journée

Le redémarrage n'a pas d'impact sur ton algorithme, ta temporisation se fait uniquement lorsque ton programme est en fonctionnement, si tu arrête ton système, la temporisation n'a plus lieu d'être.

Non il n'y aucun reboot au bout de 50 jours.
par contre la valeur du temps renvoyer par la fonction millis est limité à 50(4294967295 ms) jours et repars à 0 après ce laps de temps.

Oui, ce que j'entendais par reboot était en fait la remise à 0 de la valeur temps.. Il faut que je me familiarise avec le bon vocabulaire, j'y travail ! :grinning:

Je me posais une question, je suis en train de lire le/les tutos que l'on m'a conseillé, c'est très clair et enrichissant. Je m'interroge simplement sur l'application de la fonction random que j'utilise. C'est compatible avec ce type de machine état? (en effet, j'ai pas mal lu d'éléments faisant simplement aux fonctions simple HIGH ou LOW), mais sans random.

Merci :slight_smile:

Oui, cela ne pose aucun problème.

Bonjour,

Je vous remercie de votre aide pour m'aiguiller au mieux pour mon projet.
J'ai dû faire une petite pause et je reprend mon projet.

Alors ma grosse problématique est que je n'arrive pas à transposer mentalement la fonction millis() en remplacement de delay().. car delay() est intuitive, je veux cette fonction (random ou non) pendant tant de temps, simple, basique.

La fonction millis() est quand à elle basée sur une comparaison de temps selon le temps écoulé depuis le lancement et c'est la que je bloque. Vu que je dis à la Led "cette couleur est entre tel et tel intensité variable, pendant un temps entre tel et tel temps". Et ce pour toutes les couleurs de la led RVB.. Je n'arrive donc pas à transposer cette gymnastique sur la fonction millis() qui compare..

Pouvez-vous m'aiguiller sur ce sujet s'il vous plaît?

Je vous remercie :slight_smile:

C'est surement normal :slight_smile:
il n'y a pas une transposition directe, c'est à dire que tu n'utilises pas une fonction à la place de l'autre.
un delay, fait en gros le code suivant avec un wokwi:

while(t1 < t2) {
    t1 = millis();
  }

Donc il faut en règle général modifier la structure de ton programme, pour ne pas avoir à faire de boucle while, mais que la fonction loop soit appelée en boucle, mais fasse ce qu'elle a à faire sans jamais boucler son exécution.

C'est là que @J-M-L sors généralement sa phrases fétiche :slight_smile:

1 Like

C’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

:slight_smile:

Bonjour,

Je vais donc me repencher la dessus avec vos éclaircissements!

Merci et je vous tiendrais au courant, bien entendu ! :slight_smile: