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.
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.