FVM Learning

Nosso maior compromisso é compartilhar conhecimentos, somos simples, mas não simplórios, astuto, mas não pacóvio, nos posicionamos empenhados em mostrar o caminho para desmistificação do opróbrio em legítima defesa do conhecimento compartilhado. Eng. Jemerson Marques!

domingo, 11 de agosto de 2019

Comunicação entre 4 ESP8266 via Roteador Wi-Fi: Conexão Centralizada para IoT | Tutorial Completo

Comunicação entre 4 ESP8266 com central ESP com Roteador - fvml
Comunicação entre 4 ESP8266 com central ESP com Roteador

Como Utilizar 4 ou mais ESP8266 para Controlar uma Central ESP, e todos conectados a um Roteador Wi-Fi

No Post de hoje, iremos fazer a comunicação entre 4 ESP8266, sendo um deles a Central que receberá os comandos de cada ESP, identificará e ligará a carga correspondente a cada ESP, que no nosso caso, estamos utilizando LEDs para exemplificar, e todos conectado em seu Modem Roteador Wireless.

Por que usar uma Rede com Roteador Wi-Fi?

  • Baixo custo: Utiliza o roteador Wi-Fi existente, sem necessidade de infraestrutura adicional complexa.
  • Escalável: Adicione mais dispositivos ESP8266 à rede, limitado apenas pela capacidade do roteador.
  • Prático: Controle centralizado via roteador, facilitando a gestão de todos os dispositivos conectados.
  • Conexão confiável: Ideal para projetos IoT em ambientes onde o roteador oferece cobertura suficiente.
  • Simplicidade na configuração: Não há necessidade de configurar comunicação direta entre nós, tudo passa pelo roteador.

Material Necessário

  • 4x módulos ESP8266 (NodeMCU recomendado)
  • 1x cabos USB para programação
  • 4x Micro switches
  • 4x LEDs 
  • 4x Resistores: 220Ω (LEDs) e 10kΩ (pull-down para chaves) [[Nota Técnica]]
  • Fonte 5V (recomendado: carregador USB estável), Pode ser alimentado pelo USB do Computador
  • Protoboards e jumpers
  • Computador com Arduino IDE instalado

Preparação do Ambiente

Configuração da Arduino IDE

    • Configure a porta serial correta na IDE Arduino: Clique no menu "Ferramentas | Tools" logo abaixo, vá até o menu "Porta | Port", e escolha a porta em que está o seu ESP8266.

    Você pode se interessar também!

    🔌Montagem dos Hardwares na Protoboard

    Todos os Clientes são ligados da mesma forma, então quantos Clientes você colocar, só estará limitado pelo tipo de Roteador Wireless que você tiver, pois as conexões serão feitas através do roteador.

    A identificação de cada Cliente, é realizado alterando no código o nome de cada cliente: Cliente 01, Cliente 02, Client3 03, etc.

    🔧 Montagem do Módulo Cliente na Protoboard

    A montagem do módulo "Cliente" é bastante simples. O ESP cliente tem 1 LED e uma microchave tátil, tipo botão, ou Micro Switch:

    • LED 1 → Conectado à porta D0 (GPIO 16)

    • Micro Switch → Conectado à porta D1 (GPIO 5)

    Acompanhe o esquema de montagem na Figura 2 abaixo, para entender como cada conexão deve ser feita e evitar erros.

    Comunicação entre 4 ESP8266: Diagrama esquemático do Cliente - fvml
    Fig. 2 - Comunicação entre 4 ESP8266: Diagrama esquemático do Cliente

    Verifique as GPIO de entrada das Micro Switch, que deve seguir como no esquemático, um lado da chave ligado na porta que você programou, no nosso caso a porta é a D1 do ESP, e o outro a terra, ou GND do ESP.

    🔧 Montagem do Módulo Server na Protoboard

    A montagem do "Server" é simples. O ESP Server tem 4 LEDs:

    • LED 1 → Conectado à porta D0 (GPIO 16)

    • LED 2 → Conectado à porta D2 (GPIO 4)
    • LED 3 → Conectado à porta D3 (GPIO 0)
    • LED 4 → Conectado à porta D5 (GPIO 14)

    Os LEDs das portas GPIO D2, D3 e D5, recebem o comando e ativa cada porta de acordo com a solicitação de cada um dos três clientes, e a GPIO D0, identifica se algum cliente conectou, se houve conexão em algum cliente, ele acende e mantem-se ativado

    Acompanhe o esquema de montagem na Figura 3 abaixo, para entender como cada conexão deve ser feita e evitar erros.

    Comunicação entre 4 ESP8266: Diagrama esquemático do Servidor - fvml
    Fig. 03 - Comunicação entre 4 ESP8266: Diagrama esquemático do Servidor

    ⚠️Atenção com a Polaridade dos LEDs⚠️

    A polaridade invertida é um erro comum e impedirá que o LED funcione corretamente.

    • O terminal positivo (ânodo) do LED deve estar conectado ao pino GPIO especificado.
    • O terminal negativo (cátodo) deve estar conectado ao GND (terra) do ESP ou da protoboard.

    ✨ Resistores? Nem sempre são necessários!

    Se você já tem experiência com o ESP8266, deve ter notado que não estamos usando resistores externos. Isso acontece por dois motivos:
    • Para os botões (Micro Switch): Usamos o recurso de Pull-Up interno do ESP, que setamos na função Void setup(): pinMode(BUTTON, INPUT_PULLUP);
    • Para os LEDs: As portas GPIO operam com 3,3V, o que é compatível com a maioria dos LEDs comuns de 5mm, que funcionam entre 2,8V a 3,8V, dependendo da cor.

    Dica: Se for utilizar em projetos prontos, que os LEDs serão utilizados por longo período de tempo, não para testes, como o nosso, sempre utilize resistores adequado para isso.! Alguns LEDs podem exigir resistores dependendo do modelo. Você pode está escolhendo o LED ideal, e calculando seguindo nosso artigo completo: 

    ✅ Checklist Final Antes do Upload

    Antes de carregar o código nos seus ESPs, verifique:

    • Conexões dos pinos (GPIO) com os LEDs e botões.
    • Polarização correta dos LEDs.
    • Se a chave está conectada à porta D1 (GPIO 5)

    • Esquema de ligação igual ao referidos no Void Setup do código-fonte.

    💻 O Código do projeto usado na IDE Arduino

    Logo abaixo temos o código completo da Central e do Cliente, para você copiar. Sempre aconselhamos você baixar o arquivo .ino direto, pois dependendo do navegador, ele pode modificar as pontuações e as acentuações dando erro no código

    Por esse motivo deixamos no link abaixo os arquivos dispostos para você baixar, para você que deseja melhorar os conhecimentos, temos o vídeo no nosso canal, "Está no final da página" que explicamos linha a linha o código Cliente e do Server.

    Código Fonte do Servidor

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    75
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    96
    97
    98
    99
    90
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    //===========================================================================================// // SERVER // // Adapted by: Engineer Jemerson Marques, On July 29, 2019 - by Engineer Jemerson Marques // // Communication between 4 ESPs with ESP8266 central with Router // // The code was edited and adapted for this project. // // Available in FVM Learning website: https://www.fvml.com.br and on // // Youtube channel https://www.youtube.com/c/FVMLearning - I hope you have fun - Good luck // //-------------------------------------------------------------------------------------------// //-- Libraries Included -------------------------------------------------------------- #include <ESP8266WiFi.h> //------------------------------------------------------------------------------------ // Define I/O Pins #define LED0 2 // WIFI Module LED #define LED1 D0 // Indicate Connectivity With Client "For All" #define LED2 D2 // Connectivity With Cliente 01 #define LED3 D3 // Connectivity With Cliente 02 #define LED4 D5 // Connectivity With Cliente 03 #define MAXSC 4 // MAXIMUM NUMBER OF CLIENTS //------------------------------------------------------------------------------------ // WIFI Module Config //------------------------------------------------------------------------------------ char ssid[] = "FVML"; // SSID of your home WiFi char pass[] = "fvmlearning"; // password of your home WiFi String Message; // VARIABLE RECEIVE DATA FROM OTHER CLIENTS WiFiServer server(80); // THE SERVER AND THE PORT NUMBER WiFiClient Clients[MAXSC]; // THE SERVER CLIENTS (Devices) IPAddress ip(192, 168, 25, 240); // IP address of the server IPAddress gateway(192, 168, 25, 1); // gateway of your network IPAddress subnet(255, 255, 255, 0); // subnet mask of your network //==================================================================================== void setup() { // Setting The Serial Port Serial.begin(115200); // Computer Communication WiFi.config(ip, gateway, subnet); // forces to use the fix IP WiFi.begin(ssid, pass); // connects to the WiFi router while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); }
    Serial.println(""); Serial.println("Server Connected"); server.begin(); // Setting The Mode Of Pins pinMode(LED0, OUTPUT); // Setting LED0 Pin Mode Output WIFI OnBorard Led pinMode(LED1, OUTPUT); // Setting LED1 Pin Mode Output pinMode(LED2, OUTPUT); // Setting LED2 Pin Mode Output pinMode(LED3, OUTPUT); // Setting LED3 Pin Mode Output pinMode(LED4, OUTPUT); // Setting LED4 Pin Mode Output } //==================================================================================== void loop() { AvailableClients(); // Checking For Available Clients AvailableMessage(); // Checking For Available Client Messages } //==================================================================================== void Availableclient() { if (server.hasClient()) { // Read LED0 Switch To Low If High. if (digitalRead(LED0) == HIGH) digitalWrite(LED0, LOW); digitalWrite(LED1, HIGH); // Light Up LED1 for (uint8_t i = 0; i < MAXSC; i++) { if (!client[i] || !client[i].connected()) //find free/disconnected spot { if (client[i]) // Checks If Previously The Client Is Taken { client[i].stop(); } if (client[i] = server.available()) // Checks If client Connected To The Server { Serial.println("New Client: " + String(i + 1)); } continue; // Continue Scanning } } //no free/disconnected spot so reject WiFiClient client = server.available(); client.stop(); } else { digitalWrite(LED0, HIGH); // This LED Blinks If No client Where Available delay(250); digitalWrite(LED0, LOW); delay(250); } } //==================================================================================== void AvailableMessage() { for (uint8_t i = 0; i < MAXSC; i++) //check client for data { if (client[i] && client[i].connected() && client[i].available()) { while (client[i].available()) { Message = client[i].readStringUntil('\r'); client[i].flush(); Serial.println("Client No " + String(i + 1) + " - " + Message); ClientNumber(); } } } } // ================================================================================= void ClientNumber() { if (Message == "<Cliente 01-1>") { // Check client number, 01 = client 1, and after trace, status 1 = on, 0 = off digitalWrite(LED2, HIGH); } else if (Message == "<Cliente 01-0>") { digitalWrite(LED2, LOW); } if (Message == "<Cliente 02-1>") { digitalWrite(LED3, HIGH); } else if (Message == "<Cliente 02-0>") { digitalWrite(LED3, LOW); } if (Message == "<Cliente 03-1>") { digitalWrite(LED4, HIGH); } else if (Message == "<Cliente 03-0>") { digitalWrite(LED4, LOW); } } //======================================== www.fvml.com.br ================================================

    Código Fonte do Client

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    75
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    96
    97
    98
    99
    90
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115

    //===========================================================================================// // CLIENT // // Communication between 4 ESPs with ESP8266 central with Router // // Adapted by: Engineer Jemerson Marques, On July 29, 2019 - by Engineer Jemerson Marques // // The code was edited and adapted for this project. // // Available in FVM Learning website: https://www.fvml.com.br and on // // Youtube channel https://www.youtube.com/c/FVMLearning - I hope you have fun - Good luck // //-------------------------------------------------------------------------------------------// //------------------------------------------------------------------------------------ // Libraries Needed For This Project //------------------------------------------------------------------------------------ #include <ESP8266WiFi.h> // The Basic Function Of The ESP NOD MCU //------------------------------------------------------------------------------------ // Defining I/O Pins //------------------------------------------------------------------------------------ #define LED0 2 // WIFI Module LED #define LED1 D0 // Indicate Connectivity With Client #1 #define BUTTON D1 // Connectivity ReInitiate Button //------------------------------------------------------------------------------------ // WIFI Authentication Variables //------------------------------------------------------------------------------------ char ssid[] = "FVML"; // SSID of your home WiFi char pass[] = "fvmlearning"; // password of your home WiFi const String ClientID = "Cliente 01"; // Client Identification //------------------------------------------------------------------------------------ // WIFI Module Mode & IP //------------------------------------------------------------------------------------ IPAddress server(192, 168, 25, 240); // the fix IP address of the server WiFiClient client; //==================================================================================== void setup() { Serial.begin(115200); // Setting the Serial Port - Computer Communication pinMode(LED0, OUTPUT); // Setting the Mode of Pins WIFI OnBoard LED Light pinMode(LED1, OUTPUT); // Setting the Mode of LED1 output pinMode(BUTTON, INPUT_PULLUP); // Setting the Mode of Pins Button as Input PullUp digitalWrite(LED0, HIGH); // Setting WiFi LED Off WiFi.begin(ssid, pass); // connects to the WiFi router if (WiFi.status() == WL_CONNECTED) { WiFi.disconnect(); WiFi.mode(WIFI_OFF); delay(50); } CheckWiFiConnectivity(); // Checking For Connection digitalWrite(LED0, LOW); // Stop Blinking To Indicate Connected Serial.println("Client Device Connected"); Printing IP Address -------------------------------------------------- Serial.println("Connected To : " + String(WiFi.SSID())); Serial.println("Signal Strenght : " + String(WiFi.RSSI()) + " dBm"); Serial.print ("Server IP Address : "); Serial.println(client); Serial.print ("Server Port Num : "); Serial.print ("Device MC Address : "); // Printing MAC Address Serial.println(String(WiFi.macAddress())); Serial.print ("Device IP Address : "); // Printing IP Address Serial.println(WiFi.localIP()); ESPRequest(); // Conecting The Device As A Client } //==================================================================================== void loop() { ReadButton(); } //==================================================================================== void ReadButton() // Reading Button Function { int reading = digitalRead(BUTTON); if (reading == LOW) { int LEDState = !digitalRead(LED1); digitalWrite(LED1, LEDState); Serial.println ("<" + ClientID + "-" + LEDState + ">"); client.println ("<" + ClientID + "-" + LEDState + ">"); client.flush(); } delay(300); } //==================================================================================== void CheckWiFiConnectivity() { Serial.print("Connecting"); while (WiFi.status() != WL_CONNECTED) { digitalWrite(LED0, !HIGH); delay(250); digitalWrite(LED0, !LOW); delay(250); Serial.print("."); } } void ESPRequest() { client.stop(); // First Make Sure You Got Disconnected if (client.connect(server, 80)); // Connection to the server { Serial.println ("<" + ClientID + "- CONNECTED>"); client.println ("<" + ClientID + "- CONNECTED>"); //If Sucessfully Connected Send Connection Message client.flush(); } } //=================================== www.fvml.com.br ===============================================

    📥 Download dos Códigos

    Baixe os códigos prontos pelos links diretos abaixo:

    Link Direto Mega: Arquivos para baixar

    🧠 Atenção: Depois de baixar os códigos, lembre-se, cada ESP cliente deve ter um identificador único, altere no seu código do Cliente essa parte:

    • ESP 01: Const String  ClientType  = "Cliente 01";
    • ESP 02: Const String  ClientType = "Cliente 02";

    • E assim por diante...

    Altere o número no código para refletir corretamente o cliente correspondente.

    🎥 Acompanhe o Tutorial em Vídeo

    Você pode acompanhar esse passo a passo completo, e com o código explicado com detalhes, assistindo ao vídeo no nosso canal do YouTube.

    👉 Acesse o Canal FVMLearning

    E por hoje é só, espero que tenham gostado!

    Agradecemos por visitar o nosso blog e esperamos tê-lo(a) novamente por aqui em breve. Não deixe de conferir nossos outros conteúdos sobre tecnologia e assuntos variados. 


    Se inscreva no nosso BlogClique Aqui — FVM Learning!


    Nos ajude a divulgar nosso trabalho, compartilha nas redes sociais, Facebook, Instagram, nos grupos de WhatsAppuma simples atitude sua, faz com que cresçamos juntos e melhoremos o nosso trabalho!

    Forte abraço.
    Deus vos Abençoe!
    Shalom!

    3 comentários:

    1. Opa Jemerson, o código aqui na página está com alguns erros, o nome do avaliableclient das funções tá diferente, da uma atualizada quando der, verifiquei no vídeo e tá com esse pequeno erro

      ResponderExcluir
      Respostas
      1. Olá!
        Não consegui identificar algum erro, se puder ser mais claro, agradeçeremos!
        Obrigado por estar conosco!!!
        Lhes convido a se inscrever também em nosso canal no YouTube, isso nos ajuda bastante a darmos prosseguimento ao nosso trabalho, e não lhes custa nada, não é? https://www.youtube.com/channel/UCnaAKKkyhX7LY2ZYIff-qug
        Forte abraço.

        Excluir
    2. Boa noite muito bom. Mas só uma dúvida os ipês dos clientes e do servidor são iguais ou cada um tem que ter um IP?

      ResponderExcluir