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!

26 comentários:

Unknown disse...

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.

FVML disse...

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.

jackass disse...

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

FVML disse...

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.

jackass disse...

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

jackass disse...

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?

FVML disse...

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.

FVML disse...

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

jackass disse...

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

FVML disse...

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.

jackass disse...

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);
}

jackass disse...

// 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;

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

FVML disse...

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.

jackass disse...

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ã)

jackass disse...

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?

ee disse...

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

ee disse...

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

ee disse...

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

ee disse...

When you post your article for esp-now please

FVML disse...

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

FVML disse...

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

Unknown disse...

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

Unknown disse...

Obrigado

Unknown disse...

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

FVML disse...

Olá!!!
Disponha.
Forte abraço.

cola disse...

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