Advertisement
DuboisP

ESP32_WS2812B_Button

Jan 5th, 2025 (edited)
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | Source Code | 0 0
  1. /*********
  2.  
  3.    title  :    demo
  4.                ESP32_WS2812B_Button
  5.  
  6.    target :    ESP32 Wroom
  7.                leds WS2812b
  8.                buttons * 1
  9.  
  10.    author :    Patrick Dubois
  11.    
  12.    licence:    public domain  
  13.            
  14. *********/
  15.  
  16. // Import required libraries
  17. // if the library is global   use <>
  18. // if the library is local    use ""
  19.  
  20. // ajouter les librairies pour les WS2812b
  21.  
  22. // créer objet ruban de leds
  23.  
  24. #define buttonPin       12       // GPIO 12
  25. #define baudrateSerial  38400    // vitesse communication Arduino - PC  
  26.  
  27. volatile bool bFirstRun = false,
  28.                bLedOn = false,
  29.                bStatus = false;    
  30.  
  31. void IRAM_ATTR onButtonEvent() { // le code doit être le plus court possible dans une interruption. on se contente de changer des variables.
  32.    if (!bFirstRun) {
  33.       bFirstRun = true;          // on vient de lancer le programme, on n'est ni allumé ni éteint :-)
  34.    }
  35.    // bFirstRun = false ? true : true;  // version alternative avec opérateur ternaire
  36.    bLedOn = !bLedOn;             // on inverse l'état. si éteint, on allume. si allumé, on éteint
  37. }
  38.  
  39. void setup() {
  40.    Serial.begin(baudrateSerial);
  41.    // initialiser si besoin objet ruban de leds
  42.  
  43.    pinMode(buttonPin, INPUT_PULLDOWN);
  44.    attachInterrupt(digitalPinToInterrupt(buttonPin), onButtonEvent, FALLING);    // gestion du bouton par interruption
  45. }
  46.  
  47. void LightOnTheLeds() {
  48.    // on allume, faire boucle allumage
  49.    bStatus = HIGH;                  // ou true
  50. }
  51.  
  52. void LightOffTheLeds() {
  53.    // on éteint, faire boucle extinction
  54.    bStatus = LOW;                   // ou false
  55. }
  56.  
  57. void loop() {
  58.    if (bFirstRun){                  // on a appuyé au moins une fois sur le bouton, la boucle est activée
  59.       detachInterrupt(digitalPinToInterrupt(buttonPin));        // désactivation de l'interruption pour éviter l'empilement
  60.       if (bLedOn && !bStatus) {     // si on a demandé l'allumage et que c'est éteint
  61.          LightOnTheLeds();          // si c'est déjà allumé, inutile d'appeler la fonction              
  62.       }
  63.       if (!bLedOn && bStatus) {     // si on a demandé l'extinction et que c'est allumé    
  64.          LightOffTheLeds();         // si c'est déjà éteint, inutile d'appeler la fonction                
  65.       }
  66.       attachInterrupt(digitalPinToInterrupt(buttonPin), onButtonEvent, FALLING);    // on réactive
  67.    }
  68. }
  69.  
  70.  
  71.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement