Comunicação entre 3 ESP8266 - ESP01

O ESP8266 é um microcontrolador do fabricante chinês Espressif que inclui capacidade de comunicação por Wi-Fi.
Hilquias
Novato
Mensagens: 1
Registrado em: 27/Jul/2018, 17:18

Comunicação entre 3 ESP8266 - ESP01

Mensagem por Hilquias » 27/Jul/2018, 17:22

Boa tarde.
Já pesquisei sobre comunicação entre 3 ou mais ESP01 mas ainda não consegui compreender como funciona e nem mesmo consegui um exemplo de código que eu consiga compreender. Alguém poderia me ajudar?

lipemh
Experiente
Mensagens: 39
Registrado em: 19/Jul/2018, 12:00

Re: Comunicação entre 3 ESP8266 - ESP01

Mensagem por lipemh » 27/Jul/2018, 20:17

Você pode criar um ESP e deixa-lo como server e criar 2 ou mais clientes.

Código do server:

Código: Selecionar todos

#include <WebSocketsServer.h>
#include <ESP8266mDNS.h>
#include <Hash.h>
 
WebSocketsServer webSocket = WebSocketsServer(81);
 
const char *ssid = "RemoteControl";
const char *password = "remotecontrol";
 
#define STS_PIN 4
#define LED_0  5
 
void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght) {
 
  switch(type) {
    case WStype_DISCONNECTED:
    Serial.printf("[%u] Disconnected!\n", num);
    digitalWrite(STS_PIN, LOW);
    break;
    case WStype_CONNECTED:
    {
      IPAddress ip = webSocket.remoteIP(num);
      Serial.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload);
      digitalWrite(STS_PIN, HIGH);
      webSocket.sendTXT(num, "Connected");
    }
    break;
    case WStype_TEXT:
    Serial.printf("header: %d\n", payload[0]);
    Serial.printf("gpio: %d\n", payload[1]);
    Serial.printf("mode: %d\n", payload[2]);
    Serial.printf("state: %d\n", payload[3]);
    Serial.printf("footer: %d\n", payload[4]);
    command_handle(payload);
    break;
    case WStype_BIN:
    Serial.printf("[%u] get binary lenght: %u\n", num, lenght);
    hexdump(payload, lenght);
    break;
  }
}
 
void command_handle(uint8_t *payload) {
 
  if((payload[0]==0xaa) && (payload[4]==0x55)){
 
    switch (payload[2]) {
      case 0x00:
        digitalWrite(payload[1], payload[3]);
      break;
      case 0x01:
        //PWM
      break;
      default:
      break;
    }
  } else {
    Serial.printf("Invalid command");
  }
}
 
void setup() {
 
  Serial.begin(115200);
 
  pinMode(STS_PIN, OUTPUT);
  pinMode(LED_0, OUTPUT);
  digitalWrite(STS_PIN, LOW);
  digitalWrite(LED_0, LOW);
 
  WiFi.softAP(ssid, password);
 
  webSocket.begin();
  webSocket.onEvent(webSocketEvent);
}
 
void loop() {
  webSocket.loop();
}
Código do Client:

Código: Selecionar todos


#include <ESP8266WiFi.h>          //https://github.com/esp8266/Arduino
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>         //https://github.com/tzapu/WiFiManager
#include <WebSocketsClient.h>
#include <Hash.h>

#define STATUS_PIN 13
#define BTN 12
#define LED 4

WebSocketsClient webSocket;

uint8_t btn_state = 0;
uint8_t btn_last = 0;
uint8_t *socket_payload;

void webSocketEvent(WStype_t type, uint8_t * payload, size_t lenght) {


    switch(type) {
        case WStype_DISCONNECTED:
            Serial.printf("[WSc] Disconnected!\n");
            break;
        case WStype_CONNECTED:
            {
                Serial.printf("[WSc] Connected to url: %s\n",  payload);
				webSocket.sendTXT("Connected");
            }
            break;
        case WStype_TEXT:
            Serial.printf("[WSc] get text: %s\n", payload);
            break;
        case WStype_BIN:
            Serial.printf("[WSc] get binary lenght: %u\n", lenght);
            hexdump(payload, lenght);
            break;
    }
}

uint8_t * build_payload(uint8_t *payload, uint8_t gpio, uint8_t mode, uint8_t state){
  payload[0] = 0xaa;
  payload[1] = gpio;
  payload[2] = mode;
  payload[3] = state;
  payload[4] = 0x55;
  return payload;
}

void setup() {

  Serial.begin(115200);

  pinMode(LED, OUTPUT);
  pinMode(BTN, INPUT);
  digitalWrite(LED, LOW);

  pinMode(STATUS_PIN, OUTPUT);
  digitalWrite(STATUS_PIN, LOW);

  socket_payload = (uint8_t*) calloc(5, sizeof(uint8_t));

  WiFiManager wifiManager;
  wifiManager.autoConnect("MyRemoteControl");
  //wifiManager.resetSettings();

  Serial.println("Connected to the remote control server!");
  digitalWrite(STATUS_PIN, HIGH);

  webSocket.begin("192.168.4.1", 81);
  webSocket.onEvent(webSocketEvent);
}

void read_button(void) {
  btn_state = digitalRead(BTN);

  if(btn_state != btn_last){
    if(btn_state == HIGH){
      digitalWrite(LED, HIGH);
      btn_last = HIGH;
      Serial.printf("High\n");
      webSocket.sendTXT(build_payload(socket_payload, 5, 0, 1),5);
    } else {
      digitalWrite(LED, LOW);
      btn_last = LOW;
      Serial.printf("Low\n");
      webSocket.sendTXT(build_payload(socket_payload, 5, 0, 0),5);
    }
  }
}

void loop() {
  webSocket.loop();
  read_button();
}


clessera
Novato
Mensagens: 2
Registrado em: 31/Mar/2019, 13:38

Re: Comunicação entre 3 ESP8266 - ESP01

Mensagem por clessera » 31/Mar/2019, 13:46

Posso controlar esses dois ESP pelo Telegram ou outro App ?
E 10 ESP é possivel receber informações deles num unico App ?

Responder