Site icon AranaCorp

Gérer boutons et LEDs avec un registre à décalage

Dans ce projet, nous allons utiliser des boutons lumineux et gérer boutons et LEDs grâce au registre à décalage. Pour cela nous allons utiliser un module que nous avons développé, le module AC SR Breakout Board. Ce module est une carte d’extension compatible avec différents microcontrôleurs composée de deux registres à décalages et de broches facilitant la connexions de composants.

Matériel

Principe

Le module AC SR Breakout Board est constitué de deux registres à décalages que nous allons utiliser pour gérer un groupes de LEDs et un groupe de boutons. Les sorties du premier registre à décalage seront reliées aux boutons tandis que celles du second seront reliées aux LEDs. Il est possible de monter plusieurs modules en série afin d’augmenter le nombre d’entrée sortie.

Schéma de câblage

N.B.: Par soucis de lisibilité, nous n’avons représenté qu’une seule LED et un seul bouton sur le schéma de câblage.

Code

Nous avons vu dans de précédents tutoriels, comment utiliser les registres à décalage:

Nous allons combiner ces deux codes, pour allumer la LED correspondant au bouton pressé. Ceci est particulièrement utile lorsqu’on travaille avec des bouton lumineux. Dans ce projet, nous allons utiliser les boutons lumineux comme des interrupteurs pour allumer et éteindre leurs propres LEDs.

/ Constants
#define number_of_74hc595s 2
#define numOfRegisterPins number_of_74hc595s * 8
#define SER_Pin 2
#define RCLK_Pin 3
#define SRCLK_Pin 4

//Parameters
const int grpBtnPin = A0;

//Variables
boolean registers[numOfRegisterPins];
boolean grpBtnState[numOfRegisterPins];
boolean grpLedState[numOfRegisterPins];

boolean oldGrpBtnState[numOfRegisterPins];
int grpBtnVal[numOfRegisterPins];

void setup() {
  //Init Serial USB
  Serial.begin(9600);
  Serial.println(F("Initialize System"));
  //Init register
  pinMode(SER_Pin, OUTPUT);
  pinMode(RCLK_Pin, OUTPUT);
  pinMode(SRCLK_Pin, OUTPUT);
  pinMode(grpBtnPin, INPUT_PULLUP);
}

void loop() {
  readGrpBtn();
}

void clearRegisters() { /* function clearRegisters */
  //// Clear registers variables
  for (int i = numOfRegisterPins - 1; i >=  0; i--) {
    registers[i] = LOW;
  }
}

void writeRegisters() { /* function writeRegisters */
  //// Write register after being set
  digitalWrite(RCLK_Pin, LOW);
  for (int i = numOfRegisterPins - 1; i >=  0; i--) {
    digitalWrite(SRCLK_Pin, LOW); int val = registers[i];
    digitalWrite(SER_Pin, val);
    digitalWrite(SRCLK_Pin, HIGH);
  }
  digitalWrite(RCLK_Pin, HIGH);
}

void setRegisterPin(int index, int value) { /* function setRegisterPin */
  ////Set register variable to HIGH or LOW
  registers[index] = value;
}

void readGrpBtn() { /* function readGrpBtn */
  //// Read each btn
  for (int i = numOfRegisterPins - 1; i >=  0; i--) {
    if (i < 16 && i >= 8) {
      grpBtnState[i] = false;
      setRegisterPin(i, HIGH);
      writeRegisters();
      delay(20);
      grpBtnVal[i] = analogRead(grpBtnPin);
      setRegisterPin(i, LOW);
      writeRegisters();
      Serial.println(grpBtnVal[i]);
      if (grpBtnVal[i] > 500) {
        grpBtnState[i] = true;
        if (oldGrpBtnState[i] != grpBtnState[i]) {
          grpLedState[i - 8] = !grpLedState[i - 8];
          Serial.print(F("Btn "));
          Serial.print(i);
          Serial.print(F(" detected -> State =  "));
          Serial.println(grpBtnVal[i]);
        }
      }

    } else { // i<8 && i>=0
      Serial.print("Set LED"); Serial.print(i); Serial.print(" to "); Serial.println(grpLedState[i]);
      setRegisterPin(i, grpLedState[i]);
      writeRegisters();
    }
  }
}

Résultat

On peut voir sur le moniteur série, après avoir appuyé sur quelques boutons que les états des LEDs correspondantes ont changé.

N’hésitez pas à nous laisser un commentaire pour nous donner votre avis, vos retours et pistes d’améliorations pour ce tutoriel.

Application

Sources

Quitter la version mobile