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.
Você pode se interessar também!
- Controlando LEDs com dois ESP8266 utilizando Protocolo ESP-NOW
- Como Ler Valores Analógicos ADC Usando NodeMCU ESP8266 - IDE Arduíno!
- Como Hackear Circuito Módulo Relé para funcionar com ESP8266 & ESP32 com 3.3V
- Como utilizar o Botão Flash do NodeMCU ESP8266
- Piscando LEDs Independentes sem delay() utilizando Função millis()
- Alarme de Segurança com Sensor PIR e ESP8266 - Sensor de Movimento
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. O 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:
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!
Boa noite professor Jemerson
ResponderExcluirEu 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.
Olá!!!
ExcluirMuití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.
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
ResponderExcluirOlá @JACKASS
ExcluirVocê 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.
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
ExcluirOlá @JACKASS
ExcluirOk, vamos aguardar o seu resultado.
Abraços.
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.
ResponderExcluirmais 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?
Olá @JACKASS
Excluir1° - 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.
verifiquei isso, fixei o ip(192,168,0,105) e gateway(192,168,0,1)
ResponderExcluirE o Client, você colocou qual IP?
ExcluirTens 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.
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:
ResponderExcluirRECEIVER
//==================================================================================//
// 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);
}
// Libraries Needed For This Project
ResponderExcluir//------------------------------------------------------------------------------------
#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;
//====================================================================================
Olá @JACKASS
ExcluirColoque 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.
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ã)
Excluirolha 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?
ResponderExcluiri want a programm for Comunicação entre 3 ESPs8266 Ponto a Ponto - Peer-to-Peer - Sem Roteador please
ResponderExcluirHello Nilson !!!
ExcluirSee 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
You have subscribed to your page
ExcluirI 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
When you body your article for esp-now,please.
ResponderExcluirWe have our time a little tight, so we are preparing the article a little slower, but we will publish it soon.
ExcluirThank you for being with us.
My best regard
When you post your article for esp-now please
ResponderExcluirHi @EE
ExcluirWe 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
como faço para quando pressionar botao no server enviar para cliente especifico, pressionando outro vai para 2 cliente
ResponderExcluirOlá!!!
ExcluirExistem 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.
Obrigado
ResponderExcluirOlá!!!
ExcluirDisponha.
Forte abraço.
Hola ING Jemerson.
ResponderExcluirDe que manera puedo conectar los nodemcu8266 de diferentes lugares suponiendo que mi ip publica sea fija. Saludos desde México
Hello, can you add 4 buttons? How to write the code?
ResponderExcluir