MTobjets: Exemple 8
Gestion par événements pour UNO, Nano, Mega

Trois clignotants

Problème posé

Vu sur un forum:

Je veux sur une sortie avoir trois boutons qui commandent trois leds clignotantes.

Pour un seul bouton, c'est décrit dans les exemples d'utilisation du PWM soft:

// Ce programme fait clignoter une led avec un bouton marche arrêt

#include <MTobjects.h> // V1.0.4 Voir http://arduino.dansetrad.fr/MTobjects

const uint8_t PIN_BUTTON = A0; // Bouton câblé entre GND et A0


// 5 flashs rapides
MTsoftPWM Clignotant(LED_BUILTIN, impulsions_de 500000 micro_secondes, periodes_de 1000000 micro_secondes, on_commence_par LOW, MT_INFINI, PAS_D_ACTION, MT_OFF);


// Fonctionnement global avec un bouton M/A
void allume(void) // Démarre les flashs
  Clignotant.start();
}

void eteint(void) // Arrête les flashs
{
  Clignotant.stop();
  digitalWrite(LED_BUILTIN, LOW); // On ne sait pas quand on l'arrête
}

MTcheckButton Bouton(A0, allume, eteint);


void setup(){}

void loop(){}

Pour trois boutons, il suffit de copier le code trois fois! Maintenant si l'on veut que les clignotements soient synchrones, il suffit quand on allume une des leds de réinitialiser les autres si elles étaient en marche:

// Voir https://forum.arduino.cc/t/faire-clignoter-3-led-avec-3-boutons-poussoirs/1124797

#include "MTobjects.h" // V1.0.4 Voir http://arduino.dansetrad.fr/MTobjects

const byte LED_1 = 2;
const byte LED_2 = 3;
const byte LED_3 = 4;
const byte BOUTON_1 = A0;
const byte BOUTON_2 = A1;
const byte BOUTON_3 = A2;


MTsoftPWM Clignotant1(LED_1, impulsions_de 500000 micro_secondes, periodes_de 1000000 micro_secondes, on_commence_par LOW, MT_INFINI, PAS_D_ACTION, MT_OFF);
MTsoftPWM Clignotant2(LED_2, impulsions_de 500000 micro_secondes, periodes_de 1000000 micro_secondes, on_commence_par LOW, MT_INFINI, PAS_D_ACTION, MT_OFF);
MTsoftPWM Clignotant3(LED_3, impulsions_de 500000 micro_secondes, periodes_de 1000000 micro_secondes, on_commence_par LOW, MT_INFINI, PAS_D_ACTION, MT_OFF);


void allume1(void)
{
  Clignotant1.start();
  if (Clignotant2.getActive()) Clignotant2.start();
  if (Clignotant3.getActive()) Clignotant3.start();
}
void allume2(void)
{
  Clignotant2.start();
  if (Clignotant1.getActive()) Clignotant1.start();
  if (Clignotant3.getActive()) Clignotant3.start();
}
void allume3(void)
{
  Clignotant3.start();
  if (Clignotant1.getActive()) Clignotant1.start();
  if (Clignotant2.getActive()) Clignotant2.start();
}

void eteint1(void)
{
  Clignotant1.stop();
  digitalWrite(LED_1, LOW); // On ne sait pas quand on l'arrête
}
void eteint2(void)
{
  Clignotant2.stop();
  digitalWrite(LED_2, LOW); // On ne sait pas quand on l'arrête
}
void eteint3(void)
{
  Clignotant3.stop();
  digitalWrite(LED_3, LOW); // On ne sait pas quand on l'arrête
}


MTcheckButton Bouton1(BOUTON_1, allume1, eteint1);
MTcheckButton Bouton2(BOUTON_2, allume2, eteint2);
MTcheckButton Bouton3(BOUTON_3, allume3, eteint3);


void setup(){}

void loop(){}