Advertisement
pleasedontcode

"LED Sequencer" rev_01

Dec 8th, 2024
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /********* Pleasedontcode.com **********
  2.  
  3.     Pleasedontcode thanks you for automatic code generation! Enjoy your code!
  4.  
  5.     - Terms and Conditions:
  6.     You have a non-exclusive, revocable, worldwide, royalty-free license
  7.     for personal and commercial use. Attribution is optional; modifications
  8.     are allowed, but you're responsible for code maintenance. We're not
  9.     liable for any loss or damage. For full terms,
  10.     please visit pleasedontcode.com/termsandconditions.
  11.  
  12.     - Project: "LED Sequencer"
  13.     - Source Code NOT compiled for: Arduino Nano
  14.     - Source Code created on: 2024-12-08 21:29:13
  15.  
  16. ********* Pleasedontcode.com **********/
  17.  
  18. /****** SYSTEM REQUIREMENTS *****/
  19. /****** SYSTEM REQUIREMENT 1 *****/
  20.     /* Add a multiplexer */
  21. /****** END SYSTEM REQUIREMENTS *****/
  22.  
  23. /* START CODE */
  24.  
  25. /****** DEFINITION OF LIBRARIES *****/
  26. #include "Multiplexer.h"  // Include the multiplexer library
  27.  
  28. /****** FUNCTION PROTOTYPES *****/
  29. void setup(void);
  30. void loop(void);
  31.  
  32. // Définition des broches de contrôle S0, S1, S2, S3
  33. const int S0 = 6;  // S0 connecté à la broche D6
  34. const int S1 = 5;  // S1 connecté à la broche D5
  35. const int S2 = 4;  // S2 connecté à la broche D4
  36. const int S3 = 3;  // S3 connecté à la broche D3
  37. const int SIG = A0; // SIG connecté à la broche A0 (pour lire la sortie du multiplexeur)
  38.  
  39. // Définition des broches des boutons, des LEDs, et des boutons de contrôle du séquenceur
  40. const int buttonPins[] = {0, 1, 2, 3, 4, 5, 6, 7}; // PIN du multiplexeur
  41. const int ledPins[] = {8, 9, 10, 11, 12, 13, 14, 15}; // PIN du multiplexeur
  42. const int sequencerButtonPin = 9;     // Bouton pour démarrer/arrêter le séquenceur
  43. const int directionButtonPin = 10;     // Bouton pour changer le sens du séquenceur
  44. const int potPin = A1;                 // Potentiomètre pour ajuster la vitesse
  45.  
  46. // Variables pour stocker l'indice du dernier bouton pressé, du séquenceur, et du sens de défilement
  47. int lastButtonPressed = -1;
  48. int currentLed = 0;
  49. bool forwardDirection = true;          // true = avant, false = arrière
  50.  
  51. // Variables de délai pour le séquenceur
  52. unsigned long sequenceDelay = 500;     // Initialisé à 500 ms pour 120 BPM
  53. unsigned long previousMillis = 0;
  54.  
  55. // État du séquenceur (true = activé, false = désactivé)
  56. bool sequencerActive = false;
  57. bool lastSequencerButtonState = HIGH;  // État précédent du bouton de séquenceur
  58. bool lastDirectionButtonState = HIGH;  // État précédent du bouton de direction
  59. bool sequencerWasActive = false;       // Indique si le séquenceur était actif avant l'appui d'un bouton
  60.  
  61. // Instantiate the multiplexer object
  62. Multiplexer mux(S0, S1, S2, S3, SIG);
  63.  
  64. void setup(void) {
  65.   // put your setup code here, to run once:
  66.  
  67.   // Initialisation des broches des LEDs en sortie et des boutons en entrée
  68.   for (int i = 0; i < 8; i++) {
  69.     pinMode(ledPins[i], OUTPUT);
  70.     pinMode(buttonPins[i], INPUT);  // Entrée sans pull-up
  71.   }
  72.   pinMode(sequencerButtonPin, INPUT_PULLUP);  // Bouton de démarrage/arrêt en pull-up
  73.   pinMode(directionButtonPin, INPUT_PULLUP);  // Bouton de changement de sens en pull-up
  74. }
  75.  
  76. void loop(void) {
  77.   // put your main code here, to run repeatedly:
  78.  
  79.   bool buttonPressed = false;
  80.  
  81.   // Lecture de la valeur du potentiomètre pour ajuster la vitesse du séquenceur
  82.   int potValue = analogRead(potPin);
  83.   sequenceDelay = map(potValue, 0, 1023, 100, 1000);  // Convertit la plage (0-1023) en délai (100-1000 ms)
  84.  
  85.   // Vérifie l'état du bouton de démarrage/arrêt du séquenceur
  86.   bool sequencerButtonState = digitalRead(sequencerButtonPin);
  87.   if (sequencerButtonState == LOW && lastSequencerButtonState == HIGH) {
  88.     sequencerActive = !sequencerActive;  // Bascule l'état du séquenceur
  89.     lastButtonPressed = -1;              // Réinitialise l'état des LEDs
  90.   }
  91.   lastSequencerButtonState = sequencerButtonState;
  92.  
  93.   // Vérifie l'état du bouton de changement de direction
  94.   bool directionButtonState = digitalRead(directionButtonPin);
  95.   if (directionButtonState == LOW && lastDirectionButtonState == HIGH) {
  96.     forwardDirection = !forwardDirection;  // Inverse le sens du séquenceur
  97.   }
  98.   lastDirectionButtonState = directionButtonState;
  99.  
  100.   // Vérifie si un des boutons A0-A3 est pressé
  101.   for (int i = 0; i < 8; i++) {
  102.     if (digitalRead(buttonPins[i]) == HIGH) {  // Si le bouton est pressé
  103.       lastButtonPressed = i;                   // Mémorise le bouton pressé
  104.       buttonPressed = true;                    // Indique qu'un bouton a été pressé
  105.       if (sequencerActive) {
  106.         sequencerWasActive = true;             // Mémorise que le séquenceur était actif
  107.         sequencerActive = false;               // Arrête temporairement le séquenceur
  108.       }
  109.     }
  110.   }
  111.  
  112.   if (buttonPressed) {
  113.     // Allume uniquement la LED du dernier bouton pressé
  114.     for (int i = 0; i < 8; i++) {
  115.       if (i == lastButtonPressed) {
  116.         digitalWrite(ledPins[i], HIGH);
  117.       } else {
  118.         digitalWrite(ledPins[i], LOW);
  119.       }
  120.     }
  121.   } else if (sequencerWasActive) {
  122.     // Si le séquenceur était actif avant l'appui du bouton, réactive le séquenceur après le relâchement
  123.     sequencerActive = true;
  124.     sequencerWasActive = false;  // Réinitialise l'indicateur
  125.   }
  126.  
  127.   // Exécution de la séquence si le séquenceur est activé
  128.   if (sequencerActive) {
  129.     unsigned long currentMillis = millis();
  130.     if (currentMillis - previousMillis >= sequenceDelay) {
  131.       previousMillis = currentMillis;
  132.  
  133.       // Éteint toutes les LEDs
  134.       for (int i = 0; i < 8; i++) {
  135.         digitalWrite(ledPins[i], LOW);
  136.       }
  137.  
  138.       // Allume la LED actuelle dans le séquenceur
  139.       digitalWrite(ledPins[currentLed], HIGH);
  140.  
  141.       // Passe à la LED suivante ou précédente en fonction du sens
  142.       if (forwardDirection) {
  143.         currentLed = (currentLed + 1) % 8;  // Avance
  144.       } else {
  145.         currentLed = (currentLed - 1 + 8) % 8;  // Recule avec boucle de 0 à 3
  146.       }
  147.     }
  148.   } else if (!buttonPressed) {
  149.     // Si le séquenceur est désactivé et aucun bouton n'est pressé, éteindre toutes les LEDs
  150.     for (int i = 0; i < 8; i++) {
  151.       digitalWrite(ledPins[i], LOW);
  152.     }
  153.   }
  154. }
  155.  
  156. /* END CODE */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement