Librairie domotique: Les interrupteurs

Dans cet article nous allons nous concentrer sur la gestion des interrupteurs qui reste l’élément de contrôle incontournable et surement le plus important.

[adsGrandRectangleTexte]

Câblage

J’utilise le câblage ci-dessous pour relier mes interrupteurs. La masse de l’Arduino sur un des contacts de l’interrupteur et une pin de l’Arduino configurée en entrée sur l’autre. Sur l’Arduino, il faut configurer la résistance interne de pullup pour l’entrée utilisée.

Cablage Interrupteur sur Arduino

Résistance de pullup ?

Une résistance de pullup sert à relier l’entrée choisie au 5v quand l’interrupteur est relâché, ceci afin de ne pas laisser l’entrée dans un état “flottant”.

Notre entrée sera donc à l’état haut quand l’interrupteur est relâché et à l’état bas quand l’interrupteur est appuyé. On peut, si on préfère, faire l’inverse et utiliser une résistance de pulldown (cf le tutorial Arduino sur les bouttons) mais il faudra dans ce cas ajouter une résistance par interrupteur. L’avantage de la résistance de pullup est que l’arduino en possède une en interne et qu’elle est configurable logiciellement et par entrée. L’inconvénient est une augmentation de la consommation énergétique du circuit (de combien?).

Implémentation

Un interrupteur est un module qui possède une entrée. Nous allons lui ajouter quelques propriétés, principalement : le nombre d’appuis, le type d’appuis (court ou long) et le temps d’appuis.

class Switch : public Module
{
    protected:
        Input m_input;            // Entrée utilisée

        Timer m_PressTimer;       // Timer état maintenu appuyé
        Timer m_ReleaseTimer;     // Timer état relaché

        uint8_t m_iNbClic;        // nombre de pressions sur l'interrupteur
        bool m_bLongPress;        // appuis long en cours

    public:
        Switch();
        Switch(int, char*);
        ~Switch();

        void Init(int, char*);

        void Update();            // Mise à jour
        SwitchState GetState();   // Retourne l'etat courant de l'interrupteur
                                  // PRESS, LONGPRESS, RELEASE
        int GetLongPressTime();   // Retourne le temps(ms) depuis lequel
                                  // l'interrupteur est appuyé
        uint8_t GetNbClic();      // Retourne le nb de d'appuis sur l'interrupteur
 };

Exemple

Ci-dessous un exemple d’utilisation. La méthode GetState() permet de connaitre l’état de l’interrupteur et d’agir en conséquence (ici simple affichage sur la console série).

Ceci est un exemple simple et je vous invite à lire l’article sur l’association des modules. Vous verrez qu’on peut lier deux modules et les faire intéragir automatiquement sans demander manuellement l’état de l’interrupteur.

#include <ConnectingStuff.h>

// Definition d'un interrupteur sur l'io n°2
Switch interrupteur(2,"Salon");

void setup()
{
  Serial.begin(9600);
  Serial.println("Start...");
}

void loop()
{
  // lecture de l'état de l'io et mise à jour de l'interrupteur
  interrupteur.Update();

  // Récupération de l'état de l'interrupteur :
  // Appuis court, long ou relaché.
  InputState state = interrupteur.GetState();

  Serial.println(state);

  // Si appuis court, affichage du nombre d'appuis
  if(state == PRESS)
  {
    Serial.print("Nb Clic : ");
    Serial.println(interrupteur.GetNbClic());
  }
  // Si appuis long, affichage du temps d'appuis
  if(state == LONGPRESS)
  {
    Serial.print("LongPress Time : ");
    Serial.println(interrupteur.GetLongPressTime());
  }

  delay(10);
}

Vous pouvez télécharger la librairie ici. N’hésitez pas à me faire des retours.

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *