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
- NodeMCU 32S
- Prancheta
- Cabo de ligação
- Módulo de 8 relés
- 74hc595 registo de deslocação
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
- GND Terra do circuito integrado
- Pino de alimentação Vdc. Normalmente ligado a 5V
- SH_CP ou RCLK ligado ao pino 33
- ST_CP ou SRCLK ligado ao pino 32
- DS ou SER ligado ao pino 25
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).
- OE Habilitação de saída, ativo BAIXO. Pino ligado a GND para ativar as saídas.
- MR Rearme principal, ativo em BAIXO. Pino de reinicialização. Ligado a 5V
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