md
Bouton-poussoir et DEL avec une seule broche entrée/sortie
2019-10-13
<-Detecting Multiple Button Clicks in an Arduino Sketch --

Le Sonoff SV possède un connecteur à 9 broches qui fournit des connexions à trois broches d'entrée/sortie du ESP8266, à la masse (x3) et à Vcc (3,3V) (x3). Par rapport à un Sonoff Basic, l’accès à trois broches GPIO est une grande amélioration, mais c’est moins que nécessaire pour un projet de ferme-porte de garage automatique. Une des broches GPIO doit donc jouer un double rôle: contrôler une diode électroluminescente (DEL) et lire un bouton-poussoir normalement ouvert.

Le bouton-poussoir sera utilisé pour désactiver ou activer la fermeture automatique de la porte de garage. La DEL rouge est allumée lorsque la fonction automatique est désactivée.

Voici comment j'ai connecté le bouton-poussoir, la DEL et une résistance de limitation de courant.

Le premier schéma en haut à gauche montre le circuit dans son état habituel. La broche d'entrée/sortie (E/S) est en mode de sortie et définie sur LOW (valeur binaire 0). Puisque la même tension de 0 volt est appliquée à l'anode et la cathode de la DEL, elle est éteinte. Dans le diagramme à droite, le voyant est allumé en réglant la broche de sortie sur HIGH (valeur binaire 1). Le commutateur étant normalement ouvert, il n’a aucun effet dans les deux cas. La broche E/S est réglée sur le mode d’entrée pour lire l’état du bouton-poussoir. Quand il n'est pas activé (ce qui sera presque toujours le cas), le voyant s’éteindra. Cependant, ce sera d'une durée très courte. De plus, le temps entre les vérifications est relativement long, de sorte que visuellement, il ne sera pas évident que le voyant s’éteigne lors de la vérification de l’état du bouton-poussoir. Dans les rares cas où le bouton-poussoir est activé, le voyant s'allume, mais cela devrait être considéré comme un retour visuel.

Dans la première version de ce billet, j'ai créé une nouvelle bibliothèque pour bouton poussoir qui traitait explicitement la DEL. C'était une erreur. Il est préférable de modifier la bibliothèque sans aucune référence à la DEL pouvant être connectée ou non à la même broche d'entrée/sortie que le bouton poussoir. L'ancien billet et la bibliothèque mdButtonLed sont toujours disponibles au cas où l'astuce utilisée ici pour lire l'état de la broche d'entrée ne fonctionnerait pas.

Il n’était pas difficile de modifier ma bibliothèque Arduino pour bouton-poussoir d’origine (Detecting Multiple Button Clicks in an Arduino Sketch en anglais) afin de laisser la broche d'entrée/sortie en mode sortie (OUTPUT) la plupart tu temps. Voici le fichier d'en-tête de la nouvelle bibliothèque.

#ifndef mdButton_h
#define mdButton_h

#include "Arduino.h"

#define DEFAULT_ACTIVE                  LOW
#define DEFAULT_DEBOUNCE_PRESS_TIME      15
#define DEFAULT_DEBOUNCE_RELEASE_TIME    30
#define DEFAULT_MULTI_CLICK_TIME        400  // if 0, does not check for multiple button clicks
#define DEFAULT_HOLD_TIME              2000  // minimum time of button press for mdButton.status() to return a -1 (long button press)
#define DEFAULT_CHECK_INTERVAL           50  // time between successive polling of the button pin 
                                             // all times in milliseconds

class mdButton
{
  public:
    mdButton(uint8_t pin, bool active = DEFAULT_ACTIVE); //constructor
  
    // Set attributes
    void setDebouncePressTime(uint16_t value);
    void setDebounceReleaseTime(uint16_t value);
    void setMultiClickTime(uint16_t value);
    void setHoldTime(uint16_t value);
    void setCheckInterval(uint16_t value);
 
    // status, number of clicks since last update
    // -1 = button held, 0 = button not pressed, 1, 2, ... number of times button pressed
    int status();
  
  private:
    uint8_t pin_;    
    bool active_;                   
    uint16_t debouncePressTime_   = DEFAULT_DEBOUNCE_PRESS_TIME; 
    uint16_t debounceReleaseTime_ = DEFAULT_DEBOUNCE_RELEASE_TIME;
    uint16_t multiClickTime_      = DEFAULT_MULTI_CLICK_TIME;  
    uint16_t holdTime_            = DEFAULT_HOLD_TIME;
    uint16_t checkInterval_       = DEFAULT_CHECK_INTERVAL;
  
    // State variables 
    unsigned long lastButtonCheck_;
    long eventTime_; 
    enum buttonState_t { AWAIT_PRESS, DEBOUNCE_PRESS, AWAIT_RELEASE, DEBOUNCE_RELEASE, AWAIT_MULTI_PRESS } buttonState_;
    int clicks_;

    bool isButtonPressed_(void);
};

#endif

Le seul changement dans l'interface publique de la classe mdButton est la nouvelle fonction setCheckInterval. Elle est utilisée pour définir le temps entre les vérifications successives de la broche d'entrée/sortie pour voir si le bouton a été enfoncé. Par défaut, cette valeur est égale à 50 millisecondes. La valeur ne devrait pas être trop diminuée. Si une DEL était connectée à la broche, sa luminosité serait considérablement réduite avec un intervalle de contrôle beaucoup plus bas, car la broche d'entrée/sortie serait en mode INPUT une proportion plus grande du temps. La bibliothèque peut également gérer des boutons-poussoirs normalement ouverts qui sont branchés sur la masse plutôt que la tension.

Lors d'une telle utilisation de la DEL et du bouton-poussoir, il est nécessaire d'activer la résistance de rappel sur la broche d'entrée lors de sa mise en mode d'entrée. Sinon, la valeur lue sera probablement 0, comme si le bouton était enfoncé.

Pour obtenir environ 1,8 volt avec un courant prudent de 15 milliampères sur la DEL, une résistance de 100 ohms doit être utilisée en série si la source d'alimentation est de 3,3 volts. Il existe de nombreux sites Web pour réaliser le calcul de la valeur de la résistance de limitation de courant dont ledcacl.com, ledcalculator.net. Si ces composants se trouvent au bout d’un long câble les reliant au Sonoff SV, il serait peut-être de mise de mesurer la tension d'alimentation au niveau de la DEL afin de prendre en compte la résistance du fil. Enfin, le schéma à droite me rappelle quelle broche est l’anode, ce que j’oublie toujours. La bibliothèque peut être téléchargée ici : mdButtonLed.zip.

<-Detecting Multiple Button Clicks in an Arduino Sketch --