md
Bouton-poussoir et DEL avec une seule broche entrée/sortie (ancienne version)
2019-10-08
<-Detecting Multiple Button Clicks in an Arduino Sketch Bouton-poussoir et DEL avec une seule broche entrée/sortie->

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.

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) pour gérer le voyant. Voici le fichier d'en-tête de la nouvelle bibliothèque.

Veuillez vérifier la plus récente version de ce billet et utiliser la dernière version de la bibliothèque mdButton. La bibliothèque décrite ci-dessous ne doit être utilisée que dans les cas où la routine isButtonPressed_ de la nouvelle bibliothèque ne fonctionne pas correctement.
#ifndef mdButtonLed_h #define mdButtonLed_h #include "Arduino.h" #define BUTTON_LED_ON 1 #define BUTTON_LED_OFF 0 #define DEFAULT_LED_START_STATE BUTTON_LED_ON #define DEFAULT_BUTTON_ACTIVE HIGH #define DEFAULT_DEBOUNCE_PRESS_TIME 15 #define DEFAULT_DEBOUNCE_RELEASE_TIME 30 #define DEFAULT_MULTI_CLICK_TIME 400 #define DEFAULT_HOLD_TIME 2000 #define DEFAULT_CHECK_INTERVAL 50 class mdButtonLed { public: mdButtonLed(uint8_t Pin, bool LedStartState = DEFAULT_LED_START_STATE, bool buttonActive = DEFAULT_BUTTON_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 buttonStatus(); // returns true if LED is on, false if LED is false bool ledStatus(void); void setLed(bool value); 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 long lastButtonCheck_; long eventTime_; enum buttonState_t { AWAIT_PRESS, DEBOUNCE_PRESS, AWAIT_RELEASE, DEBOUNCE_RELEASE, AWAIT_MULTI_PRESS } buttonState_; int clicks_; bool ledState_; bool isButtonPressed(void); }; #endif

Le constructeur contient un nouveau paramètre qui correspond à l'état de la DEL lors de la création de l'objet buttonLed. La fonction d'état du bouton est renommée buttonStatus() et une nouvelle fonction, appelée ledStatus, renvoie vrai (true) si le voyant est allumé et faux (false) sinon. La fonction setLed permet d'allumer ou d'éteindre la DEL indépendamment de l'état du bouton-poussoir. Il existe un nouveau paramètre de temps qui correspond à l'intervalle en millisecondes entre les tests successifs de l'état du bouton. Il peut être défini avec la fonction setCheckInterval. 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 Bouton-poussoir et DEL avec une seule broche entrée/sortie->