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

Eclairage d'atelier avec classe dérivée

Problème posé

Vu sur un forum:

Je veux piloter 8 relais statiques avec 8 boutons poussoirs via une carte Arduino Mega. Les boutons poussoirs sont pourvus d'une LED. Lorsque j’appuie sur un bouton et que je le relâche, le relais correspondant se ferme, et la LED du bouton s’allume. Lorsque je refait une pression sur le même bouton, le relais s'ouvre et la LED du bouton s’éteint. Un neuvième bouton poussoir sert à éteindre d'une seule pression tous les relais qui ont été allumés.

Simulation

Nous allons voir comment réaliser:

Je veux piloter N leds avec N boutons poussoirs via une carte Uno, Nano ou Mega. Lorsque j’appuie sur un bouton et que je le relâche, la LED correspondante au bouton s’allume. Lorsque je refait une pression sur le même bouton, la LED correspondante s’éteint. Un dernier bouton poussoir sert à éteindre d'une seule pression toutes les leds qui ont été allumées.

Si on définit de façon statique les boutons comme c'est fait dans la page Eclairage d'atelier, on a une définition complète d'un bouton + led qui était:

const uint8_t PIN_BUTTON_0 = A0; // Bouton câblé entre GND et A0
const uint8_t PIN_LED_0 = 3; // Led câblée entre 3 et GND

void allume0(void)
{
  digitalWrite(PIN_LED_0, HIGH);
}
void eteint0(void)
{
  digitalWrite(PIN_LED_0, LOW);
}
MTcheckButton Bouton0(PIN_BUTTON_0, allume0, eteint0);

Pour N boutons, il faudra répéter ce code N fois. Pour alléger le code, on peut définir un objet Zone correspondant à une Zone d'éclairage comprenant le bouton et la led. Les Zones étant définies lors de l'exécution, on peut utiliser un tableau de Zone et des boucles pour la mise en place.

Programme complet recommandé

Ce programme se fait complètement sous interruption, et libère loop qui peut être utilisé pour faire autre chose.

// Ce programme gère N lumières.

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


// Les différentes zones
class Zone: public MTcheckButton
{
  public:
    MonBouton (uint8_t pin, String p_nom, byte valeur) // Nouveau constructeur
      :MTcheckButton(pinBouton), led(pinLed)
      {
        pinMode(pinLed, OUTPUT);
      };
    virtual void onSelect(void); // Fonction à surcharger qui informe la sélection
    virtual void onUnselect(void); // Fonction à surcharger qui informe la désélection
 private:
    uint8_t led; // Broche de la led correspondant au bouton
};

void Zone::onSelect(void) // allume la led
{
  digitalWrite(led, HIGH);
}
	
void Zone::void onUnselect(void) // Eteint la led
{
  digitalWrite(led, LOW);
}


// Le bouton qui éteint tout
void eteintTout(void)
{
  for (byte i = 0; i < N; i++) Zones[i].unselect();
}
MTbutton BoutonEteintTout(PIN_BUTTON_ETEINT, eteintTout);


void setup()
{
  for (byte i = 0; i < N; i++) Zones[i](PREMIER_BOUTON + i, PREMIERE_LED + i);
}

void loop(){}