Site icon AranaCorp

Controle 8 relés com um ESP32 e um registo de deslocamento

Nesta série de tutoriais, veremos como controlar uma grande quantidade de relés utilizando um microcontrolador NodeMCU32S e registos de deslocamento 74HC595. Em seguida, veremos como endereçar cada relé individualmente. Finalmente, criaremos uma interface Web para controlar cada relé através da Internet. Este projeto é uma boa base para desenvolver um sistema de domótica para a sua casa.

Este tutorial pode ser aplicado a qualquer microcontrolador. Terá de ter o cuidado de modificar o diagrama de ligação e o código para se adequar à sua utilização.

Hardware

Princípio

Para acionar o módulo de 8 relés, é necessário reservar 8 saídas digitais no microcontrolador. Para economizar no número de entradas

Diagrama

Para acionar o registo de deslocação, o NodeMCU é ligado da seguinte forma

As saídas do circuito integrado 74HC595 (Q0-Q7) são ligadas diretamente às entradas do módulo de 8 relés. Neste tutorial, não utilizamos os pinos Enable (OE) e 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.

Código

No código seguinte, começamos por definir as funções básicas para gerir o registo de deslocações. Depois, activamos os relés um a um utilizando um ciclo 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);

  }
}

Resultados

Depois de os componentes terem sido ligados corretamente e o código carregado no microcontrolador, os relés devem ativar-se um após o outro.

Bónus: Controlo de 16 relés com dois registos de deslocamento

Diagrama

Código

A vantagem deste código é que, para o fazer funcionar com um segundo registo de deslocação, basta alterar o parâmetro:

#define number_of_74hc595s 2

Resultados

Próximas etapas

Fontes

Exit mobile version