domingo, 22 de setembro de 2019

Comunicação entre 2 ESPs8266 Ponto a Ponto - Peer-to-Peer - Sem Roteador

Comunicação entre 2 ESPs8266 Ponto a Ponto - Peer-to-Peer - Sem Roteador

Olá a Todos!!!

Baseado em um outro post que fizemos a comunicação direta Ponto a Ponto entre dois ESPs com a utilização de um roteador, que você também pode conferir nesse post do link abaixo:

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

O que faremos hoje, é fazer essa mesma comunicação, no entanto não iremos fazer a utilização de um Roteador para executar essa comunicação, um dos ESPs irá ser uma AP Access Point no modo STA Station, quer será o Servidor e receberá a conexão do Client, que se conectará ao Station e irá comandar a Carga "LED" do Servidor, e o Servidor irá também comandar a Carga do Client, ou seja ambos acionarão as cargas um do outro independente de qualquer conexão, será uma conexão direta, Ponto a Ponto, Peer to Peer,  entre os dois ESP.

Fig. 1 - Comunicação entre 2 ESPs8266 Ponto a Ponto - Peer-to-Peer - Sem Roteador

FUNCIONAMENTO

A princípio o funcionamento básico da comunicação entre os dois ESPs, criamos um ESP como um AP "Ponto de Acesso" no modo Station, que será o Servidor, e outro ESP como uma  STA "Estação"que será o nosso Client. Em seguida, eles estabelecerão uma comunicação direta pois o nosso AP, fornece um IP Fixo para o Client STA se conectar.
Utilizamos o LED e o Botão Flash embarcado no próprio NodeMCU, isso ajuda a realizarmos testes sem ter que fazer alguma conexão com dispositivos externos, utilizamos os parâmetros de definição para setarmos essas portas tanto do LED embarcado, chamado no código de LedBoard, quanto o botão Flash, chamado de BUTTON,  como podemos ver abaixo.
#define       LedBoard  2                    // WIFI Module LED
#define       BUTTON    0                    // NodeMCU Flash-Button

Logo após no Void Setup, definimos os Pinos com a função pinMode para o led com OUTPUT e o botão definimos com a função INPUT_PULLUP, isso faz com que o ESP8266 utilize o resistor de Pull Up interno do próprio Microcontrolador, como podemos visualizarmos no código abaixo.
  pinMode(LedBoard, OUTPUT);
  pinMode(BUTTON, INPUT_PULLUP);

Sendo assim, o Cliente envia um comando através da chave "Flash-Button" para o Servidor, e quando o Servidor receber esse comando através da própria conexão Wi-Fi que ele fornece, ele ligará a carga definida, "que utilizamos o LED embarcado 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 LED Embarcado, como definido no código.

Para 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:Instalando Biblioteca do Modulo ESP8266 na IDE Arduíno

Se você já instalou, vamos prosseguir...

Os Códigos

Logo abaixo temos os códigos tanto do Server, que é um AP - Access Point, e Station, quanto do outro ESP no modo STA - Station, ambos seguem os mesmos princípios,

Server_Comunic_ESP_P2P_No_Router

//==================================================================================//
// SERVER                                                                           //
// Communication Between 2 ESPs8266 Peer-to-Peer - No Router                        //
// Adapted by: Engineer Jemerson Marques, On: 21.09.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[] = "FVML";                        // SSID of your ESP Server
char pass[] = "fvml1234";                    // password of your ESP Server
WiFiServer server(80);

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

//------------------------------------------------------------------------------------
// Defining I/O Pins
//------------------------------------------------------------------------------------
#define       LedBoard  2                    // WIFI Module LED
#define       BUTTON    0                    // NodeMCU Flash-Button

//====================================================================================
void setup() {
  Serial.begin(115200);                      // Only for debug
  
  WiFi.mode(WIFI_AP_STA);                    // Need both to serve the webpage and take commands via tcp

  WiFi.softAPConfig(ip, gateway, subnet);
  WiFi.softAP(ssid, pass);                   // Access point password and identification
  delay(500);
  Serial.print("AP IP address: ");
  Serial.println(ip);
  server.begin();                            // Starts the server

//------------------------------------------------------------------------------------
// Serial Network parameters - Only for debug
//------------------------------------------------------------------------------------  
  Serial.println("ESP Server Initialized - FVML");
  Serial.print("IP: ");       Serial.println(WiFi.softAPIP());
  Serial.print("SSID: ");     Serial.println(WiFi.SSID());
  Serial.print("Signal: ");   Serial.println(WiFi.RSSI());

  pinMode(LedBoard, OUTPUT);                // Initiate the Onboard Led Output
  pinMode(BUTTON, INPUT_PULLUP);            // Initiate the ESP Pin: INPUT_PULLUP - Its mean that you no need put a resistor
  digitalWrite(LedBoard, HIGH);             // Initiate the Onboard Led Off
}

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

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

  int reading = digitalRead(BUTTON);
  if (reading == LOW) {
    client.print("I am Receiver\r");
    delay(200);
  }
  client.println("Receiver\r");      // sends the answer to the client
  delay(100);
}
//============================================== www.fvml.com.br =============================================================

Client_Comunic_ESP_P2P_No_Router

//==================================================================================//
// CLIENT                                                                           //
// Communication Between 2 ESPs8266 Peer-to-Peer - No Router                        //
// Adapted by: Engineer Jemerson Marques, On: 21.09.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       BUTTON     0                           // NodeMCU Button

//------------------------------------------------------------------------------------
// WIFI Authentication Variables
//------------------------------------------------------------------------------------
char ssid[] = "FVML";                                 // SSID of your ESP Server
char pass[] = "fvml1234";                             // password of your ESP SEVER
  
//------------------------------------------------------------------------------------
// WIFI Module Mode & IP
//------------------------------------------------------------------------------------
IPAddress server(192,168,10,40);                      // the fix IP address of the server
WiFiClient client;

//====================================================================================
void setup() {
  pinMode(LedBoard, OUTPUT);                           // Initiate the Onboard Led Output
  pinMode(BUTTON, INPUT_PULLUP);                       // Initiate the ESP Pin: INPUT_PULLUP - Its mean that you no need put a resistor
  digitalWrite(LedBoard, HIGH);                        // Initiate the Onboard Led Off
 
  Serial.begin(115200);                                // only for debug
  Serial.println("");
  Serial.print("Awaiting connection: ");
  WiFi.begin(ssid, pass);                              // connects to the WiFi router
  while (WiFi.status() != WL_CONNECTED) {
  Serial.print(".");
  digitalWrite(LedBoard, LOW);
  delay(250);
  digitalWrite(LedBoard, HIGH);
  delay(250);
  }
  digitalWrite(LedBoard, HIGH);
  
//------------------------------------------------------------------------------------
// Network parameters - Only for debug
//------------------------------------------------------------------------------------
  Serial.println("");
  Serial.println("ESP Client Connected - FVML");
  Serial.print("IP: ");       Serial.println(WiFi.softAPIP());
  Serial.print("SSID: ");     Serial.println(WiFi.SSID());
  Serial.print("Signal: ");   Serial.println(WiFi.RSSI());
}
//====================================================================================
void loop() {
 
  ContinuousConnection();
}
//====================================================================================

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

void ReadButton() {
  int reading = digitalRead(BUTTON);                   // Read the Button State
  if (reading == LOW) {                                // If the button pressed
    client.print("I am Transmitter\r");                // Send messege "I am Transmitter" To Server
    delay(200);
   }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 'I am Receiver'
    digitalWrite(LedBoard, !digitalRead(LedBoard));   // if it changes the status of the LED
    Serial.println("Data Received: " + answer);
    delay(200);                                       // client will trigger the communication 200 milliseconds
  }
}
//============================================== www.fvml.com.br =============================================================

ARQUIVOS PARA BAIXAR:

Você também pode baixar os arquivos .ino do código de programa no link abaixo:
Link Direto: Arquivos para baixar


Você também pode assistir esse tutorial passo a passo no nosso canal do youtube




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

Qualquer dúvida, digita nos comentários que logos estaremos respondendo.

Se inscreva no nosso Blog!!! Click aqui - FVM Learning!!!

Forte abraço.

Deus vos Abençoe

Shalom


Nenhum comentário:

Postar um comentário