[Tutoriel] La bibliothèque OneButton

Dans un micro il est possible de mettre aussi bien des pull up que des pull down et les micros modernes ont les deux.

Si Atmel n’a prévu que des up et pas des down, c’est qu’Atmel avait bien compris que les utilisateurs préféraient relier les interupteurs à la masse.
C’est dans ce sens qu’il faut voir les choses.

Un interupteur dans le monde professionel est souvent dans un boitier métallique (Atmel/Microchip ne vit pas des achats des amateurs).

Il est toujours préférable de relier les pièces metalliques à la masse pour des raisons d’immunité aux bruits.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.

Bonjour à tous,
Petite mise à jour du tuto et de son exemple suite à cette discussion et à ce bug de la lib - corrigé mais qui apporte des modifications susceptibles de rendre le tuto obsolète sur certaines cartes.

En espérant ne pas avoir causé de tort en ne suivant pas de près la bibliothèque et ses mises à jour, et en remerciant @J-M-L pour l'information :+1:

back to the mon tuto mis à jour... :wink:

Cordialement,
Pandaroux007

2 Likes

Je supprime également le lien de téléchargement d'OneButton sur le forum, car évidement il n'est plus à jour maintenant et ça ne sert à rien de le mettre là puisqu'il est déjà sur GitHub...

6 posts were split to a new topic: Souci avec la bibliothèque OneButton

Bravo!!! bon j’ai plus qu’a tout récrire … mais le bon côté si mon croquis gagne en lisibilité et solidité pourquoi pas … bon il y a une notion de callback …

Si vous n’aimez pas les callbacks il existe d’autres moins une douzaine d’autres bibliothèques Button dans easyRun de @bricoleaul ou Toggle de @dlloyd ou EasyButton ou Bounce2, ...

Bravo !!! 50 lignes d’économiser mais surtout 2% sur la taille du croquis ce qui veut dire que je devrais réfléchir à optimiser à la fin du projet en choisissant le type de données eu égard à leur poids… mais pour en revenir sur cette bibliothèque c’est parfais (j’ai même implémenter une fonction supplémentaire sur le bouton). et le tuto est très clair, merci au contributeurs.

Content que ça fonctionne pour vous! Par curiosité, pouvez-vous poster le code ? Sinon pas de souci :slight_smile: Bonne journée!

bonjour,

pas de soucis voici le fichier .ino si je peux aider à mon niveau…

***   @Filename : SL_002_BLE_draft
***   @Brief    : 
***               
***   @Auteur   : Luan SALJA
***   @Date     : 
**/



//  -->   include libraries / librairies incluses

#include <Wire.h>
#include <FastLED.h>
#include <OneButton.h>
#include "custom.h"
#include "Graphics_GFX.h"
#include "Light_Sensor.h"
#include "Axis_Sensor.h"
#include "Bluetooth_BLE.h"



int code;
float lux = 0.0;
float threshold = 50.0;
boolean alarmEvent = false;
bool deviceConnected = false;
bool oldDeviceConnected = false;
BLEServer* pServer = NULL;
BLECharacteristic* pCharacteristic;
BLEDescriptor* pDescr;
BLE2902* pBLE2902;

CRGB leds[NUM_LEDS];

OneButton bouton(BUTTON_PIN);


//  -->   defines and constants / défintions et constantes

//  -->   global variables / variables globales

//  -->   user defined functions / fonctions définies par l'utilisateur
void debugSerialMessage() {
  Serial.printf("AutoMode = %d | Light = %d | Lux = %.2f | Fall Alarm = %d | Code = %d\n", HSState.autoMode, HSState.lightState, lux, fallC.fall, code);
}


void fonctionSimpleClick() {
  HSState.lightState = !HSState.lightState;
  HSState.autoMode = false;
  fallC.fall = false;
  code = 0;
  HSState.connected = true;
  debugSerialMessage();
}
void fonctionDoubleClick() {
  HSState.autoMode = !HSState.autoMode;
  debugSerialMessage();
}
void clickLong() {
  fallC.fall = true;
  HSState.connected = true;
  code = 17;
  debugSerialMessage();
}

//  -->   setup / setup
void setup() {
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  FastLED.setBrightness(128);
  leds[0] = CRGB::Red;
  FastLED.show();

  bouton.setup(3, INPUT_PULLUP, true);
  bouton.attachClick(fonctionSimpleClick);
  bouton.attachDoubleClick(fonctionDoubleClick);
  bouton.attachLongPressStop(clickLong);

  Serial.begin(115200);
  Wire.begin(I2C_SDA, I2C_SCL);  //(I2C_SDA, I2C_SCL) Bus I2C
  pinMode(LIGHT_PIN, OUTPUT);
  pinMode(WAKEUP_PIN, INPUT_PULLUP);
  esp_sleep_enable_ext0_wakeup((gpio_num_t)WAKEUP_PIN, RISING);
  pinMode(BUTTON_PIN, INPUT);
  //attachInterrupt(BUTTON_PIN, buttonAction, CHANGE);

  //Starting Sensors...
  lightSensorInit();
  mpuSensorReset();
  mpuSensorInit();
  mpuSensorSettings();

  //Checking Connectivity...
  BLEconnection();
  //Starting Display...

  //Initial Settings
  HSState.autoMode = false;
  HSState.lightState = false;
  HSState.buttonState = false;

  lux = lightSensorRead();
  debugSerialMessage();
}

//  -->   loop / loop
void loop() {

  //BLE
  if (!deviceConnected && oldDeviceConnected) {  // disconnecting
    delay(500);                                  // give the bluetooth stack the chance to get things ready
    BLEDevice::startAdvertising();               // pServer->startAdvertising();  // restart advertising
    Serial.println("start advertising");
    oldDeviceConnected = deviceConnected;
  }

  if (deviceConnected && !oldDeviceConnected) {  // connecting
    // do stuff here on connecting
    oldDeviceConnected = deviceConnected;
  }


  // Check Sensors...

  // Light Mode
  if (HSState.autoMode == true) {  // Auto ON
    leds[0] = CRGB::Red;
    FastLED.show();
    lux = lightSensorRead();
    if (lux < threshold) {
      HSState.lightState = true;
    } else if (lux > threshold) {
      HSState.lightState = false;
    }
  } else if (HSState.autoMode == false) {  // Auto OFF
    leds[0] = CRGB::Blue;
    FastLED.show();  // send Manual statements...
  }

  // Light State update
  if (HSState.lightState == true) {
    digitalWrite(LIGHT_PIN, HIGH);
    leds[0] = CRGB::Green;
    FastLED.show();  // Light ON
  } else if (HSState.lightState == false) {
    digitalWrite(LIGHT_PIN, LOW);
  }

  // MPU
  mpuRead();  // Readings

  bouton.tick();

if ((HSState.connected == true) || (fallC.fall == true)){
  sendSMSAlert(code);
}


  // Check Button...
  bouton.tick();
}

Bonjour!
Petite update du tuto pour virer deux trois trucs inutiles, j'étais plus jeune quand je l'ai écrit et même avec la relecture de @J-M-L j'avais tendance à ajouter des détails pour "montrer que je le savais", en attendant ça aidait probablement pas à la lisibilité :woozy_face:

J'espère qu'il sera plus clair comme ça :folded_hands:

D'ailleurs pour ceux qui se demande où je suis passé, je ne suis pas mort :wink: juste beaucoup plus occupé qu'avant et quelques problèmes en plus dans la vraie vie qui m'obligent à réduire beaucoup ma charge mentale (donc pas de réponses sur le forum) pour éviter de frapper dans mes murs... Ça passera mais bon je vais quand même essayer de faire une grosse relecture de la liste de tuto également.

Cordialement,
Pandaroux007

bon courage - faut affronter les soucis de la vie et y faire face en gérant les bonne priorités.
(frapper dans les murs ne fait généralement pas changer grand chose :grinning_face_with_smiling_eyes:)

Navré de lire ça, je te souhaite naturellement bon courage.
Et je me permet de te donner une sorte de conseille, d'avoir une activité qui te permet de gérer ton état de stress que ce soit du sport, de la méditation ou autre.
En espérant pouvoir te relire rapidement.

Merci Pandaroux pour ce tuto qui m’a aidé à incrémenter des seuils de température avec 4 boutons.

j’ai testé le code de Michel eesr dans les commentaires un peu plus haut, elle m’a aussi aidé à évoluer dans ma recherche.

Effectivement, son code n’est pas fonctionnel, mais dans le principe, c’était bon. J’ai passé un peu de temps dessus et j’ai pensé aux débutants (comme moi) qui s’intéressent au forum. Le code ci-dessous semble mieux fonctionner pour ces deux boutons :

#include <OneButton.h> // inclure la librairie OneButton.h

const byte pinBP = 10; // pin du bouton (D10)
const byte pinBP2 = 11;//pin du bouton 2 en D11
const byte pinLedVerte = 9; // pin de la LED verte - correspondant au clique simple
const byte pinLedRouge = 8; // pin de la LED rouge - correspondant au double clique
const byte pinLedBleue = 7; // pin de la LED bleue - correspondant au clique long

OneButton bouton(pinBP); // créer une instance (objet) bouton sur la pin du bouton (D10)
OneButton bouton1(pinBP2); //créer une autre instance (objet) bouton sur la pin du bouton (D11)

void simpleClick() {
  // dans cette fonction, donc le clique simple, c'est la LED verte qui fonctionne
  static bool ledVerteAllumee = false; // on définit la variable état de la LED et sa valeur initiale (0 car false = faux)
  ledVerteAllumee =! ledVerteAllumee; // on inverse l'état de la variable de l'état de la LED
  digitalWrite(pinLedVerte, ledVerteAllumee ? HIGH : LOW);
  ///////////////////// On éteint les autres LEDs /////////////////////////////////
  digitalWrite(pinLedRouge, LOW);
  digitalWrite(pinLedBleue, LOW);
}
void doubleClick() {
  // dans cette fonction, donc le clique double, c'est la LED rouge qui fonctionne
  static bool etatLedRouge = 0; // on définit la variable état de la LED
  etatLedRouge =! etatLedRouge; // on inverse l'état de la variable de l'état de la LED
  digitalWrite(pinLedRouge, etatLedRouge ? HIGH : LOW); // on rentre cette variable comme paramètre pour la LED
  ///////////////////// On éteint les autres LEDs /////////////////////////////////
  digitalWrite(pinLedVerte, LOW);
  digitalWrite(pinLedBleue, LOW);
}

void clickLong() {
  // dans cette fonction, donc le clique long, c'est la LED bleue qui fonctionne
  static bool ledBleueAllumee = false; // on définit la variable état de la LED et sa valeur initiale
  ledBleueAllumee =! ledBleueAllumee; // on inverse l'état de la variable de l'état de la LED
  digitalWrite(pinLedBleue, ledBleueAllumee ? HIGH : LOW); // on utilise cette variable comme paramètre pour la LED
  ///////////////////// On éteint les autres LEDs /////////////////////////////////
  digitalWrite(pinLedVerte, LOW);
  digitalWrite(pinLedRouge, LOW);
}
void ClickBP2(){                           // ci-dessous, on écrit ce que l'on veut.
   static bool ledVerteAllumee = false; 
  ledVerteAllumee =! ledVerteAllumee; 
  digitalWrite(pinLedVerte, ledVerteAllumee ? HIGH : LOW);
  digitalWrite(pinLedRouge, LOW);
  digitalWrite(pinLedBleue, LOW);
}

void setup() {
  bouton.attachClick(simpleClick); // fonction appelée en cas de click
  bouton.attachDoubleClick(doubleClick); // fonction appelée en cas de double click
  bouton.attachLongPressStop(clickLong); // fonction appelée au moment ou le BP est relâché après un appui long
bouton1.attachClick(simpleClick); //fonction appelée en cas de click sur le second bouton
bouton1.attachLongPressStop(ClickBP2); //fonction appelée en cas de click sur le second bouton relie a la meme procedure, preferable en utilisation si pas de besoin specifique
}

void loop() {
  bouton.tick(); // on lit en permanence le bouton connecté à la pin D10
  bouton1.tick();
}

Attention à l'usage de variables static dans les fonctions.

vous avez deux variables ledVerteAllumee indépendantes et vous changez d'ailleurs la couleur de la led verte dans d'autres fonctions sans mettre à jour la variable.

Si vous voulez maintenir l'état des leds correctement, soit vous faites des variables globales, soit vous avez une fonction que vous appelez pour allumer et éteindre ou inverser l'état d'une led et c'est elle qui maintient l'état.