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!

terça-feira, 9 de julho de 2019

Comunicação e Controle entre Dois ESPs8266 Ponto a Ponto - Peer-to-Peer - Com Roteador

Comunicação e Controle entre Dois ESPs8266 Ponto a Ponto - Peer-to-Peer

Olá a Todos!

No post de hoje, iremos fazer um simples projeto mostrando como estabelecer uma comunicação direta entre  dois ESPs8266 Ponto a Ponto "peer-to-peer"com controle de carga “utilizando LEDs como exemplo”  e isto utilizando a própria rede Wi-Fi do seu roteador.

Nesse tipo de topologia, você pode conectar e controlar cada ESP independentes, e com baixa latência, com a funcionalidade de recuperação automática em caso de perda da conexão Wi-Fi ou desligamento de uma das placas conectadas.

FUNCIONAMENTO

A princípio descreveremos o funcionamento básico da comunicação entre os dois ESPs, criamos um ESP como um AP “Ponto de Acesso” que será o Servidor, e outro ESP como uma  STA “Estação” que será o nosso Cliente

Eles estabelecerão uma comunicação através da rede Wi-Fi. Cliente envia um comando através de uma chave “Switch, Push-button” para o Servidor, e quando o Servidor receber esse comando através da rede Wi-Fi, ele ligará a carga definida, “utilizamos o LED como exemplo”. 

Da mesma forma, o Servidor envia um comando para o Cliente, e quando o Cliente receber esse comando, ele ligará a carga definida no GPIO pré-definido.

Par podermos dar prosseguimento a esse projeto, pré-supomos que você já tenha instalado as bibliotecas na IDE do Arduíno, se não instalou, sugerimos a você que veja nosso outro Post:
Se você já instalou, proponho prosseguirmos…

COMPONENTES NECESSÁRIOS

Os seguintes componentes são necessários para construir este projeto:
  • 2 - NodeMCU (ESP8266-12E)
  • 2 - Chave tipo contato - (Micro-switch, Push-button, Micro Chave, Etc...)
  • 2 - LEDs
  • 2 - Protoboards (Se necessário, podes utilizar fios jumpers direto)
  • Fio jumpers, (macho-fêmea) para ligação das chaves e Leds
  • 2 Cabos Mini-USB - (Pode utilizar só um, grava 1 ESP de cada Vez)

ESQUEMÁTICO

Os esquemas para este projeto é bastante simples, só precisaremos conectar a Micro-Switch na porta GPIO D1, e o LED na porta GPIO D0, como sugerido na Figura 2

Tanto o AP - Access Point, quanto o STA - Station, dotam das mesmas conexões. Você pode mudar as portas utilizadas sem problemas, só não esqueça de editar o código e setar parâmetros conforme a porta que você colocou no código em seu ESP8266.
Figura 2 - Diagrama Esquemático - Comunicação e Controle Ponto a Ponto

Os Códigos

Logo abaixo temos os códigos tanto do AP - Access Point, quanto do STA - Station, ambos seguem os mesmos princípios,

AP - Access Point - "Ponto de Acesso"

Receiver_P2P_FVML

//==================================================================================//
// Adapted by: Engineer Jemerson Marques, On: 27.06.2019 - FVM Learning website     //
// Available at: 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 <SPI.h>
#include <ESP8266WiFi.h>    // The Basic Function Of The ESP NOD MCU

//------------------------------------------------------------------------------------
// WIFI Module Config
//------------------------------------------------------------------------------------
char ssid[] = "YourSSID";                  // SSID of your home WiFi
char pass[] = "YourPassword";              // password of your home WiFi

WiFiServer server(80);

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

//------------------------------------------------------------------------------------
// Defining I/O Pins
//------------------------------------------------------------------------------------
#define       LedBoard   2        // WIFI Module LED
#define       LED1      D0        // LED Receiver One
#define       SWITCH    D1        // Button

//====================================================================================
void setup() {
  Serial.begin(115200);                   // only for debug
  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);
  }
  server.begin();                         // starts the server
  Serial.println("Connected to wifi");
  Serial.print("Status: ");   Serial.println(WiFi.status());        // some parameters from the network
  Serial.print("IP: ");       Serial.println(WiFi.localIP());
  Serial.print("Subnet: ");   Serial.println(WiFi.subnetMask());
  Serial.print("Gateway: ");  Serial.println(WiFi.gatewayIP());
  Serial.print("SSID: ");     Serial.println(WiFi.SSID());
  Serial.print("Signal: ");   Serial.println(WiFi.RSSI());
  Serial.print("Networks: "); Serial.println(WiFi.scanNetworks());

  pinMode(LedBoard, OUTPUT);
  pinMode(LED1, OUTPUT);
  pinMode(SWITCH, INPUT_PULLUP);
  digitalWrite(LED1, LOW);
}

void loop() {
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  digitalWrite(LedBoard, HIGH);
  String request = client.readStringUntil('\r');
  client.flush();

  if (request == "I am Transmitter") {
    digitalWrite(LedBoard, LOW);
    digitalWrite(LED1, !digitalRead(LED1));
    Serial.print("Data Received: "); Serial.println(request);
    delay(200);
    digitalWrite(LedBoard, HIGH);
  }

  int reading = digitalRead(SWITCH);
  if (reading == LOW) {
    digitalWrite(LedBoard, LOW);
    client.print("I am Receiver\r");
    delay(200);
    digitalWrite(LedBoard, LOW);
  }
  client.println("Receiver\r");      // sends the answer to the client
  digitalWrite(LedBoard, HIGH);
  delay(100);
}

STA - Station - "Estação" - Cliente ESP8266

Transmmiter_P2P_FVML

//==================================================================================//
// Adapted by: Engineer Jemerson Marques, On: 27.06.2019 - FVM Learning website     //
// Available at: 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 <SPI.h>
#include <ESP8266WiFi.h>    // The Basic Function Of The ESP NODEMCU

//------------------------------------------------------------------------------------
// Defining I/O Pins
//------------------------------------------------------------------------------------
#define       LedBoard     2        // WIFI Module LED
#define       LED1        D0        // LED1
#define       BUTTON_1    D1        // Button 1

//------------------------------------------------------------------------------------
// WIFI Authentication Variables
//------------------------------------------------------------------------------------
char ssid[] = "YourSSID";                   // SSID of your home WiFi
char pass[] = "YourPassword";               // password of your home WiFi

//------------------------------------------------------------------------------------
// WIFI Module Mode & IP
//------------------------------------------------------------------------------------
IPAddress server(192,168,25,240);           // the fix IP address of the server
WiFiClient client;

//====================================================================================
void setup() {
  pinMode(LedBoard, OUTPUT);                // Initiate the Onboard Led Output
  Serial.begin(115200);                     // only for debug
  WiFi.begin(ssid, pass);                   // connects to the WiFi router
  while (WiFi.status() != WL_CONNECTED) {
    digitalWrite(LedBoard, LOW);
    Serial.print(".");
    delay(500);
  }
  Serial.println("Connected to wifi");
  Serial.print("Status: "); Serial.println(WiFi.status());    // Network parameters
  Serial.print("IP: ");     Serial.println(WiFi.localIP());
  Serial.print("Subnet: "); Serial.println(WiFi.subnetMask());
  Serial.print("Gateway: "); Serial.println(WiFi.gatewayIP());
  Serial.print("SSID: "); Serial.println(WiFi.SSID());
  Serial.print("Signal: "); Serial.println(WiFi.RSSI());
  
  pinMode(LedBoard, OUTPUT);        // Initiate the Onboard Led Output
  pinMode(LED1, OUTPUT);
  pinMode(BUTTON_1, INPUT_PULLUP);  // Initiate the ESP Pin: INPUT_PULLUP - Its mean that you no need put resistor
  digitalWrite(LED1, LOW);
}
//====================================================================================
void loop() {
 
  ContinuousConnection();
}

//====================================================================================

 void ContinuousConnection(){
  client.connect(server, 80);                       // Connection to the server
  digitalWrite(LedBoard,HIGH);
  ReadButton();                                     // Read Button from Transmitter
 }
//====================================================================================

void ReadButton() {
  int reading = digitalRead(BUTTON_1);
  if (reading == LOW) {
    digitalWrite(LedBoard, LOW);                     // to show the communication only (inverted logic)
    client.print("I am Transmitter\r");
    delay(200);
    digitalWrite(LedBoard,HIGH);                     // to show the communication only (inverted logic)
  }else{
   ClientContinue(); 
  } 
}

//====================================================================================
void ClientContinue(){
  client.println("Transmmiter");                      // sends the message to the server
  String answer = client.readStringUntil('\r');       // receives the answer from the sever
  client.flush();
  
  if (answer == "I am Receiver") {                    // compares if the response of the receiver is equal to 'SWITCH'
    digitalWrite(LED1, !digitalRead(LED1));           // if it changes the status of the LED
    digitalWrite(LedBoard, LOW);
    Serial.println("Data Received: " + answer);
    delay(200);                                       // client will trigger the communication 200 milliseconds
    digitalWrite(LedBoard, HIGH);
  }
}
//====================================================================================

ARQUIVOS PARA BAIXAR:

Você também pode baixar os arquivos (.ino)  e o diagrama esquemático no link abaixo:
Link Direto: Arquivos para baixar.

Você pode também ver esse vídeo com detalhes de montagem e explanação do código em nosso canal



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

Qualquer dúvida, digita nos comentários que logos estaremos respondendo.
Se inscreva no nosso Blog! Clique aqui — FVM Learning!

Forte abraço.

Deus vos Abençoe!
Shalom!

28 comentários:

  1. Boa noite professor Jemerson
    Eu tive numa palesta sua e no seu slide eu peguei o endereço do seu site, fico muito feliz por o sr. dividir seu precioso conhecimento.
    Ficou show esse projeto, funcionou perfeitamente aqui no meu dois ESP8266, obrigado, e quando tiver outra palestra sobre Automação, divulga no site, eu e o Ricardo que foi aluno seu também quer ir.
    Obrigado mais uma vez.

    ResponderExcluir
    Respostas
    1. Olá!!!
      Muitíssimo obrigado, fico feliz que tenha gostado.
      Dependendo da instituição que for, "se eles permitem pessoas externa irem", eu postarei aqui sim, será um grande prazer.
      Obrigado por nos visitar, se inscreva também em nosso canal do YouTube.
      Forte abraço, "Não sei seu nome, pois está como Anônimo".
      Fica com Deus.

      Excluir
  2. boa tarde Jemerson, segui o tutorial, so troquei uma das placas por uma WIMO R1, mas nao consegui realizar a comunicação entre as placas, verificquei ligações e codigo, não sei o que pode ter dado errado

    ResponderExcluir
    Respostas
    1. Olá @JACKASS
      Você copiou o código do navegador, ou fez o download do link?
      Aconselhamos a baixar, é um link direto sem propagandas.
      E se baixou, tenta dar mais detalhes do que ha de errado, para que possamos lhe ajudar.
      Nos dê o Feedback.
      Forte Abraço.

      Excluir
    2. Boa noite Jemerson, obrigado pela agilidade na resposta, estou baixando os arquivos e testando novamente, assim que verificar TUDO, dou uma resposta. Obrigado novamente pela ajuda

      Excluir
    3. Olá @JACKASS
      Ok, vamos aguardar o seu resultado.
      Abraços.

      Excluir
  3. vamos la, rs, baixei os códigos e as únicas mudanças que fiz nos arquivos foram: SSID, PASSWORD, IP e GATEWAY( abri o ipconfig para verificar a faixa de ip que estou conectado). fiz a montagem idêntica a sua mas não consegui chegar no resultado final e comunicar os ESPs.
    mais um detalhe, como não tenho duas placas node mcu, estou usando uma placa node mcu e uma wemo R1D1( verifiquei o pullup e fica na porta D4). Alguma sugestão ou dica para eu tentar?

    ResponderExcluir
    Respostas
    1. Olá @JACKASS
      1° - No IP -
      IPAddress gateway(192, 168, 25, 1); <-- Esse endereço de IP, é o da sua rede, você precisa mudar para o seu IP: EX.: Se seu IP for diferente desse: 192.168.11.1

      IPAddress ip(192, 168, 25, 240); <-- Esse IP é do Servidor, você só muda se o seu 3° octeto for diferente, no exemplo do seu IP: 192.168.11.1
      Você coloca o IP do Servidor: 192.168.11.240 --> Esse será o endereço que o outro ESP se conectará.
      Verifica isso.
      Se tiver dúvida, diga-nos qual o endereço de seu IP. "Da sua rede, do seu computador"

      Abraços.
      Qualquer dúvida, não exite em perguntar.

      Excluir
  4. verifiquei isso, fixei o ip(192,168,0,105) e gateway(192,168,0,1)

    ResponderExcluir
    Respostas
    1. E o Client, você colocou qual IP?
      Tens que colocar o IP Fixo, não o do gateway.
      No seu caso o cliente tem que se conectar com 192.168.0.105 -> que é o IP do Server.

      Se foi feito dessa maneira...

      2° Verifica no serial monitor se eles se conectaram, se sim.
      3° Verifique se ha resposta no Serial Monitor, quando você pressiona o botão de ambos, para saber se estão configurados corretamente.

      Veja isso, pois podemos já está próximo de solucionar o seu problema.
      Abraços, nos dê o feedback.

      Excluir
  5. Bom dia, tudo bem? este é o IP do server, no serial monitor consigo ver apenas dos dados da conexão, não estou vendo as respostas. Vou tentar postar os códigos:
    RECEIVER
    //==================================================================================//
    // Adapted by: Engineer Jemerson Marques, On: 27.06.2019 - FVM Learning website //
    // Available at: 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
    #include // The Basic Function Of The ESP NOD MCU

    //------------------------------------------------------------------------------------
    // WIFI Module Config
    //------------------------------------------------------------------------------------
    char ssid[] = "Tico Teco"; // SSID of your home WiFi
    char pass[] = "PeDrAo_123456_SoUzA"; // password of your home WiFi
    WiFiServer server(80);

    IPAddress ip(192, 168, 0, 105); // IP address of the server
    IPAddress gateway(192, 168, 0, 1); // gateway of your network
    IPAddress subnet(255, 255, 255, 0); // subnet mask of your network

    //------------------------------------------------------------------------------------
    // Defining I/O Pins
    //------------------------------------------------------------------------------------
    #define LedBoard 2 // WIFI Module LED
    #define LED1 D0 // LED Receiver One
    #define SWITCH D1 // Button

    //====================================================================================
    void setup() {
    Serial.begin(115200); // only for debug
    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);
    }
    server.begin(); // starts the server
    Serial.println("Connected to wifi");
    Serial.print("Status: "); Serial.println(WiFi.status()); // some parameters from the network
    Serial.print("IP: "); Serial.println(WiFi.localIP());
    Serial.print("Subnet: "); Serial.println(WiFi.subnetMask());
    Serial.print("Gateway: "); Serial.println(WiFi.gatewayIP());
    Serial.print("SSID: "); Serial.println(WiFi.SSID());
    Serial.print("Signal: "); Serial.println(WiFi.RSSI());
    Serial.print("Networks: "); Serial.println(WiFi.scanNetworks());

    pinMode(LedBoard, OUTPUT);
    pinMode(LED1, OUTPUT);
    pinMode(SWITCH, INPUT_PULLUP);
    digitalWrite(LED1, LOW);
    }

    void loop() {
    WiFiClient client = server.available();
    if (!client) {
    return;
    }
    digitalWrite(LedBoard, HIGH);
    String request = client.readStringUntil('\r');
    client.flush();

    if (request == "I am Transmitter") {
    digitalWrite(LedBoard, LOW);
    digitalWrite(LED1, !digitalRead(LED1));
    Serial.print("Data Received: "); Serial.println(request);
    delay(200);
    digitalWrite(LedBoard, HIGH);
    }

    int reading = digitalRead(SWITCH);
    if (reading == LOW) {
    digitalWrite(LedBoard, LOW);
    client.print("I am Receiver\r");
    delay(200);
    digitalWrite(LedBoard, LOW);
    }
    client.println("Receiver\r"); // sends the answer to the client
    digitalWrite(LedBoard, HIGH);
    delay(100);
    }

    ResponderExcluir
  6. // Libraries Needed For This Project
    //------------------------------------------------------------------------------------
    #include
    #include // The Basic Function Of The ESP NODEMCU

    //------------------------------------------------------------------------------------
    // Defining I/O Pins
    //------------------------------------------------------------------------------------
    #define LedBoard 2 // WIFI Module LED
    #define LED1 D0 // LED1
    #define BUTTON_1 D4 // Button 1

    //------------------------------------------------------------------------------------
    // WIFI Authentication Variables
    //------------------------------------------------------------------------------------
    char ssid[] = "Tico Teco"; // SSID of your home WiFi
    char pass[] = "PeDrAo_123456_SoUzA"; // password of your home WiFi

    //------------------------------------------------------------------------------------
    // WIFI Module Mode & IP
    //------------------------------------------------------------------------------------
    IPAddress server(192,168,0,105); // the fix IP address of the server
    WiFiClient client;

    //====================================================================================

    ResponderExcluir
    Respostas
    1. Olá @JACKASS
      Coloque o código do Receiver todo para analisarmos juntos.
      Você mudou a porta do Transmitter "segundo você disse, porque usa o Wemos" para D4.
      Coloca um Serial.println("Botão pressionado"); dentro do if do digitalRead(SWITCH); para saber se o botão está realmente funcionando, e faz isso com todas as etapas para verificar no serial monitor onde é que está o erro.
      Abraços.

      Excluir
    2. Bom dia @Jemerson, vou fazer este teste. Não coloquei o resto do código porque não mudei nada. para não ficar ruim para o pessoal que acompanha, me responde no whats, assim fica mais facil rs ( 35 9 88874660 - Jonatã)

      Excluir
  7. olha eu de novo aqui, ainda não consegui fazer a comunicação entre as duas placas, fiz o que sugeriu( "Coloca um Serial.println("Botão pressionado"); dentro do if do digitalRead(SWITCH) "), mas não obtive sucesso, ao ligar o serial monitor aparece a mensagem direto como se o botao estivesse pressionado, e no código do transmissor, ao apertar o botao nada acontece. tentei colocar os dois códigos aqui, mas aparece uma mensagem dizendo que é muito grande. alguma ideia ou sugestao para eu fazer?

    ResponderExcluir
  8. i want a programm for Comunicação entre 3 ESPs8266 Ponto a Ponto - Peer-to-Peer - Sem Roteador please

    ResponderExcluir
    Respostas
    1. Hello Nilson !!!
      See this address of our Youtube channel:
      https://www.youtube.com/watch?v=sgtZGApmvOc

      Enjoy and subscribe too, not to miss any news, and this helps us a lot to continue our work, and costs nothing. :)

      Best Regards

      Excluir
    2. You have subscribed to your page
      I want to help with the work is Control smart street lighting using 3 nodemcu ESP8266 and 3 LEDs and 3 sensor PIR
      1- When movement is at PIR1;LED1 HIGH and send message by nodemcu ESP8266 (1)to nodemcu ESP8266(2) for LED2 HIGH.
      2- When movement is at PIR2;LED2 HIGH and send message by nodemcu ESP8266 (2)to nodemcu ESP8266(1) for LED1 LOW and send message by nodemcu ESP8266 (2) to nodemcu ESP8266(3) for LED3 HIGH .
      3- When movement is at PIR3;LED3 HIGH and send message by nodemcu ESP8266 (3)to nodemcu ESP8266(2) for LED2 LOW , if not movement at PIR3 LED3 LOW

      Excluir
  9. When you body your article for esp-now,please.

    ResponderExcluir
    Respostas
    1. We have our time a little tight, so we are preparing the article a little slower, but we will publish it soon.
      Thank you for being with us.
      My best regard

      Excluir
  10. When you post your article for esp-now please

    ResponderExcluir
    Respostas
    1. Hi @EE
      We have our time a little tight, so we are preparing the article a little slower, but we will publish it soon.
      Thank you for being with us.
      My best regard

      Excluir
  11. como faço para quando pressionar botao no server enviar para cliente especifico, pressionando outro vai para 2 cliente

    ResponderExcluir
    Respostas
    1. Olá!!!
      Existem várias maneiras de se fazer isso, mas para facilitar podes estar utilizando o protocolo ESP-NOW, que facilmente você pode adicionar cada controle a um ESP, segue o link que elaboramos explicando cada passo do código ESP-NOW e como exemplo fizemos um controle com botão que envia e acende o LED do outro ESP, da uma conferida:
      https://www.fvml.com.br/2020/01/o-que-e-esp-now-e-como-funciona-codigo.html
      Aproveita e se inscreve em nosso canal do youtube também.
      Forte abraço.

      Excluir
  12. Hola ING Jemerson.
    De que manera puedo conectar los nodemcu8266 de diferentes lugares suponiendo que mi ip publica sea fija. Saludos desde México

    ResponderExcluir
  13. Hello, can you add 4 buttons? How to write the code?

    ResponderExcluir