Site icon AranaCorp

Piloter 8 relais avec un ESP32 et un registre à décalage

3.7
(3)

Dans cette série de tutoriels, nous allons voir comment piloter une multitude de relais avec un microcontrôleur NodeMCU32S et des registres à décalages 74HC595. Nous allons ensuite voir comment adresser chaque relais individuellement. Enfin, nous allons créer une interface Web pour piloter chaque relais par internet. Ce projet est une bonne base pour développer un système domotique pour chez vous.

Ce tutoriel peut être appliqué à n’importe quel microcontrôleur. Il faudra faire attention à modifier le schéma de connexion et le code pour qu’ils correspondent à votre usage.

Matériel

Principe

Pour piloter le module 8 relais, il faut réserver 8 sorties digitales du microcontrôleur. Afin d’économiser le nombre d’entrée/sortie du microcontrôleur, différent circuit intégrés peuvent être utilisé. Notamment, le registre à décalage (ou shift register). Le registre à décalage 74HC595 possède 8 sorties programmables, pouvant prendre comme valeur 0 ou 5V et ne nécessite que 3 entrées digitales. Cette solution est donc idéale pour nous permettre de piloter les relais et garder les sorties du microcontrôleur pour d’autres fonctionnalités.

Schéma

Pour piloter le registre à décalage, le NodeMCU se connecte de la manière suivante:

Les sorties du circuit intégré 74HC595 (Q0-Q7) sont directement connectés aux entrées du module 8 relais. Dans ce tutoriel, nous n’utilisons pas les broches Enable (OE) et Reset(MR).

Attention: Les sorties d’un microcontrôleur sont limités en courant. Pour piloter autant de relais, il est fortement conseillé d’utiliser une source extérieure de tension.

Code

Dans le code suivant, nous allons tout d’abord définir les fonctions de base pour gérer le registre à décalage. Puis, nous allons actionner les relais un par un en utilisant une boucle for.

//Constants
#define number_of_74hc595s 1
#define numOfRegisterPins number_of_74hc595s * 8
#define SER_Pin 25
#define RCLK_Pin 33
#define SRCLK_Pin 32

//Variables
boolean registers [numOfRegisterPins];


void setup() {
  //Init Serial USB
  Serial.begin(115200);
  Serial.println(F("Initialize System"));
  //Init register
  pinMode(SER_Pin, OUTPUT);
  pinMode(RCLK_Pin, OUTPUT);
  pinMode(SRCLK_Pin, OUTPUT);
  pinMode(OUT_Pin, INPUT);
  clearRegisters();
  writeRegisters();
  delay(500);
}
void loop() {
  writeGrpRelay();
}

void clearRegisters() { /* function clearRegisters */
  //// Clear registers variables
  for (int i = numOfRegisterPins - 1; i >=  0; i--) {
    registers[i] = HIGH;//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 writeGrpRelay() { /* function writeGrpRelay */
  for (int i = numOfRegisterPins - 1; i >=  0; i--) {
    Serial.print(F("Relay ")); Serial.print(i); Serial.println(F(" HIGH"));
    setRegisterPin(i, LOW);
    writeRegisters();
    delay(200);
    Serial.print(F("Relay ")); Serial.print(i); Serial.println(F(" LOW"));
    setRegisterPin(i, HIGH);
    writeRegisters();
    delay(500);

  }
}

Résultat

Une fois les composants branchés correctement et le code chargé dans le microcontrôleur, les relais devrait s’activer les uns à la suite de autres.

Bonus: Contrôler 16 relais avec deux registres à décalage

Schéma

Code

La beauté de ce code est que pour le faire fonctionner avec un second registre à décalage il suffit de modifier le paramètre:

#define number_of_74hc595s 2

Résultat

Prochaines étapes

Sources

How useful was this post?

Click on a star to rate it!

Average rating 3.7 / 5. Vote count: 3

No votes so far! Be the first to rate this post.

Quitter la version mobile