Clignotant neopixel pour vélo

Bonjour, je suis sur un projet dont le but est d’ajouter à mon vélo des clignotants qui peuvent également faire éclairage, etc. Je veut faire en sort que lorsque j’appuie sur les interrupteurs des deux clignotants en même temps cela fasse un effet warning. J’ai déja essayer de faire le bout de programme correspondant mais quand je met en pratique il clignote d’abord a gauche puis a droite puis les deux, ce qui est logique par rapport a mon porgramme mais je n’ai pas trouver de solution pour palier a cela
Voici mon code

Clignotant_v_lo.ino (7.47 KB)

Bonjour bosse sur un projet dont le but est d’équiper mon vélo de 4 strip neopixel WS2812 GRB deux devant, deux derrières qui tourne sous Arduino Nano pour faire des phares, des clignotants, etc. Mon code fonctionne correctement, je veut ajouter une fonctionnalité qui lorsque j’appuie sur l’interrupteur de gauche et de droite en même temps je voulais que cela fasse un effet warning. Mais en testant il fait d’abord clignoter a gauche puis a droite puis les deux en même temps ce qui est logique car lorsque j’ai relu mon code. Je met le code en attaché car il fait plus de 9000 character.

Clignotant_v_lo.ino (10.2 KB)

Doublon avec le post https://forum.arduino.cc/index.php?topic=685157.0

Tu n'as pas forcément choisi un projet simple. Je pense que le mieux est de l'écrire sous forme d'une machine d'états. J-M-L a écrit un tutoriel sur le sujet, qui se trouve dans la section des tutos : va le lire, il t'expliquera les bases.

Si tu as 2 boutons, tu peux créer une variable contenant l'état des 2 boutons. Si on suppose qu'ils sont en INPUT_PULLUP (renvoie 0 si appuyé), tu peux faire

etatDroite = digitalRead(boutonDroit);
etatGauche = digitalRead(boutonGauche);
etatBoutons = (1-etatDroite) + 2*(1-etatGauche);

Comme ça, si le bouton droit est appuyé seul elle contient 1, si le bouton gauche est appuyé seul elle contient 2, si les 2 sont appuyés elle contient 3 et si rien n'est appuyé elle contient 0.
C'est plus facile pour savoir ce qu'il faut allumer.

La machine d'états sert à faire clignoter sans utiliser de delay, car cette fonction est bloquante et peut te faire louper un appui sur un bouton. Tu as 3 états :

  • Pas clignotant : tout est éteint et reste éteint
  • Allumé : un ou deux clignotants sont allumés. Pour savoir le ou lesquels, il suffit de lire la variable etatBoutons
  • Eteint : ça clignote, mais on est dans la phase où les clignos sont éteints.
    Peut-être que le premier et le dernier sont identiques, il faut y réfléchir.

Ensuite il faut gérer le temps. Il te faut un chrono qui suit les durées d'allumage et d'extinction. Là, il faut que tu lises un tuto sur l'utilisation de la fonction millis() pour gérer le temps.
En gros, lorsque tu passes de l'état 1 à l'état 2 (c'est à dire lorsque tu vois qu'un bouton est appuyé), tu initialises une variable chrono (définie en global comme un unsigned long) avec millis
chrono = millis();et tu allumes les leds.
Puis, dans l'état 2, tu vérifies que le temps d'allumage n'est pas dépassé : s'il est dépassé, tu passes à l'état 3

if (millis() - chrono > duree) etat = 3;
chrono = millis();

Au passage dans l'état 3, tu éteints tout et dans l'état 3 tu vérifies de même que la durée n'est pas dépassée. Si elle est dépassée, tu allumes selon la variable etatBoutons, tu initialises le chrono et tu passes dans l'état 2.

Il faut que tu définisses comment tu arrêtes le clignotement, c'est à dire comment tu reviens à l'état 1. Par exemple, si le cligno droit est en fonction, tu appuies sur le bouton droit une seconde fois pour l'arrêter ? Si les deux clignotent fonctionnent, comment arrêtes-tu tout ?

Quand ceci est décidé, ça te permet de savoir comment passer d'un état à un autre, autre que par le suivi des durées de clignotement.