Controle remoto WiFi com ESP8266

Em projetos de robótica, automação ou mesmo de brinquedos, as vezes queremos controlá-los de forma remota, sem nenhum fio no caminho. Algumas alternativas envolvem radio controle, seja de frequências abaixo de 1GHz ou superiores, como no caso do WiFi.

Soluções prontas, de prateleira, costumam custar muito e são pouco customizáveis.

Neste projeto, vamos criar um controle remoto utilizando dois ESP8266, um como o cliente (controle remoto) e outro como o servidor (receptor), sem a necessidade de usar um roteador, já que a conexão ocorre diretamente entre os módulos.

O projeto vai demonstrar a criação do controle remoto, que pode ser customizado para diversas aplicações.

Diagrama

A figura abaixo ilustra o funcionamento do exemplo criado, onde um botão e um LED foram adicionados no controle. O botão controla o LED-A localmente, e simultaneamente envia um sinal via WebSocket para o servidor.

esp_remotecontrol

No servidor, temos o LED-B, que será controlado remotamente e o LED de status, que sinaliza quando o controle se conectar ao servidor.

Protocolo

Para facilitar o uso e a adaptação para outros fins, criei um simples protocolo para o envio dos comandos.

O protocolo tem um pacote de tamanho fixo, 5 bytes, e é composto pelos seguintes campos

  • byte 0: Cabeçalho fixo “0xaa”
  • byte 1: GPIO a ser controlada
  • byte 2: Modo de operação
  • byte 3: Valor a ser enviado
  • byte 4: Rodapé fixo “0x55”

Exemplo:

No código de exemplo, controlamos a GPIO5, utilizando o protocolo da seguinte forma:

  • byte 0: “0xaa”
  • byte 1: “0x05”
  • byte 2: “0x00”
  • byte 3: “0x01”
  • byte 4: “0x55”

O byte 1 corresponde ao GPIO5, o byte 2 corresponde a0 GPIO modo OUTPUT e o byte 3 é o valor HIGH para a GPIO.

Vale lembrar que para funcionar corretamente o protocolo, as GPIOs precisam ser configuradas no setup() antes.

Código

Abaixo seguem os códigos de exemplo do cliente e do servidor, desenvolvidos com o PlatformIO:

Servidor

Remoto

Projeto completo: Github – esp8266-remote-control

Configuração e Ambiente

O projeto foi feito utilizando o platformIO, que pode ser conferido pelo seguinte link.

Para o projeto funcionar corretamente na compilação, faz-se necessária a instalação de duas bibliotecas pelo platformIO, sendo elas:

WifiManager e WebSockets

Para instalar por linha de comando (CLI), entre com os seguintes comandos:

platformio lib install 567
platformio lib install 549

Demonstração

O projeto usa a biblioteca WiFiManager, que transforma o controle remoto em um AP para a configuração do servidor (receptor). Isso ajuda muito quando um único controle remoto pode ser utilizado em outros projetos.

Abaixo segue um vídeo para demonstrar o funcionamento.

 

Conclusão

Com o uso deste exemplo, fica possível criar projetos controlados remotamente (não pela Internet) com um baixo custo de investimento e com uma flexibilidade infinita.

O alcance do controle remoto pode ultrapassar facilmente os 100 metros em campo aberto, como demonstra esse video.

 

Happy Hacking!

37 Comments

  1. Marcelo

    Pedro, inicialmente parabéns pelas publicações, tenho acompanhado elas e cada vez me surpreendo mais com este módulo ESP8266.

    Tire uma dúvida de principiante, você cita neste artigo WebSocket, sei que não é a mesma coisa que Socket TCP !

    Pois tenho a necessidade em meu projeto de conectar vários módulos ESP operando em Socket TCP modo Client com a minha aplicação rodando em modo Server no Windows ! É possível ?

    Grato…

    Reply
    1. Giovane

      Boa tarde

      Você sabe pq aparece esse erro quando compilo

      C:\Users\User\Documents\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFiType.h:26:19: fatal error: queue.h: No such file or directory

      #include
      #include

      Todo o exemplo que tento compilar acontece isso. Tentei usar o Blynk do outro post, e outros códigos e sempre acontece esse erro

      Reply
      1. Paulo

        Giovane, verifica se a ide esta configurada para placa ESP

        Reply
  2. Paulo Eduardo

    Pedro,
    estou tentando compilar esses sketch, porem o servidor esta dando erro

    Servidor:37: error: ‘command_handle’ was not declared in this scope

    voce sabe o que pode estar acontecendo?

    Reply
    1. Pedro Minatel (Post author)

      Paulo, suponho que esteja utilizando Windows, certo? Mova a função command_handle inteira para acima do webSockerEvent e tente novamente.

      Reply
      1. Paulo Eduardo

        perfeito, era isso mesmo, valeu

        Reply
  3. Giovane

    Olá Paulo

    Não estava configurado, fiz o procedimento e mesmo assim contigo dando o erro
    #include e #include
    O que não tinha especificado antes é que o meu ESP é o outro modelo.

    Reply
  4. Paulo Eduardo

    Pedro,
    mais uma pergunta, como faço para enviar um disconect para o server, tentei webSocket.end, webSocket.disconnect, mas não compilou

    Reply
    1. Pedro Minatel (Post author)

      Paulo qual o erro de compilação?

      Fiz um teste e compilou com webSocket.disconnect();

      Reply
      1. Paulo

        Na verdade tinha esquecido de colocar o (),
        Uma vez mais obrigado pela atenção

        Reply
        1. Pedro Minatel (Post author)

          OK Paulo, obrigado!

          Reply
  5. Paulo Eduardo

    Pedro,
    mais uma pergunta.
    Vou usar essa estrutura em um cenário onde eu tenho vários clientes, dado um determinado evento o Servidor tem que enviar uma msg para um cliente especifico, achei o comando
    webSocket.sendTXT(num, “message here”);
    mas qdo substituo o num pelo ip do cliente que quero enviar a msg não funciona. Da a seguinte msg de erro
    WebSocketServer:40: error: too many decimal points in number

    Se eu uso o comando para mandar msg em broadcast funciona.
    webSocket.broadcastTXT(“message here”);

    voce pode me ajudar? ou me indicar algum lugar de consulta?
    obrigado

    Reply
    1. Pedro Minatel (Post author)

      Paulo, o primeiro argumento do sendTXT é a mensagem a ser enviada (ponteiro para a mensagem) e o segundo é o tamanho da mensagem.
      Nao irá dar certo fazer o que você está pensando, pelo menos desta forma.
      O socket precisa realizar o processo de conexão, que ocorre com o begin.

      Reply
      1. Paulo Eduardo

        tentei dessa forma, pq no exemplo da biblioteca ele tem um retorno de msg com esse comando
        webSocket.sendTXT(num, “message here”);, e ele apenas responde a quem enviou a msg, por isso estava tentando dessa forma. mas analisando melhor meu cenário, vou enviar em broadcast e endereçar em um campo do protocolo.
        Uma vez mais obrigado pela atenção.

        Reply
        1. Pedro Minatel (Post author)

          Obrigado!

          Reply
  6. Paulo

    Pedro,
    Meu projeto de comunicação entre os ESP esta todo baseado nesse seu tutorial. Muito bom.
    Consegui implementar a comunicação bidirecional e incluir outra variável na troca de informação.
    Porem agora estou pesquisando uma forma que o server consiga relacionar o ip do cliente com um nome.
    Tipo assim ele recebe a conexão do ip 192.168.4.2 e receba um hostname associar a esse ip
    Vc pode me indicar algum material de estudo ou me ajudar de alguma forma?

    Reply
  7. Manoel Ribas

    Bom dia Pedro,

    Estou querendo desenvolver o controle remeto, porém eu preciso fazer isso utilizando um arduino em conjunto com cada ESP8266, pois o meu ESP tem poucas saídas para a minha aplicação, qual seria a adaptação necessária no código?

    Obtigado,

    Reply
    1. Pedro Minatel (Post author)

      Manoel, boa noite!

      São muitas midanças necessárias. Você teria que enviar os comandos para o Arduino pela porta serial. No momento não tenho nenhum exemplo, mas poderia usar o Firmata no Arduino e enciar os comandos pelo ESP;

      Reply
      1. Manoel Ribas

        Entendi, estou desenvolvendo o sistema enviando os comando AT através do Arduino, porém ainda não consegui chegar la, por acaso você sabe me dizer a sequencia de comandos AT necessários para o servidos, e para o cliente?

        Obrigado.

        Reply
  8. Manoel Felipe Daher Ribas

    Eu gostaria de executar uma operação semelhante, porém usando a interface Arduino 1.6.9 e o Arduino Uno, ou seja, um ESP8266 (ESP01) para cada Arduino Uno. A ideia é fazer o acionamento de relés com o controle remóto, são três botões no controle e 9 relés sendo acionados com combinações. O programa para o acionamento de relés eu já tenho, e também fiz o acionamento dos mesmo através de um aplicativo de Android que eu criei, porém estou tendo dificuldade em criar o controle remoto, que sairia mais barato que um Tablet ou um Smartphone. Pode me dar uma dicas por favor?

    Obrigado desde já.

    Reply
  9. Cléber Werlang

    Olá.
    Queria saber porque da esse erro no Controle Remoto, fazendo com que ele não conecte-se com o Server.

    WM: Connection result:
    *WM: 4
    *WM: SET AP STA
    *WM:
    *WM: Configuring access point…
    *WM: MyRemoteControl
    *WM: AP IP address:
    *WM: 192.168.4.1
    *WM: HTTP server started

    Reply
    1. Hugo Leonardo

      Eetou com esse mesmo problema !

      Reply
  10. Alex Henrique

    Muito interessante. Obrigado. Gostaria de saber por qual metodo eu poderia criar algo assim utilizando a internet? Teria que implementar NO-IP ou algo assim? Abraços!

    Reply
    1. Pedro Minatel (Post author)

      Alex, com o No-IP dá, mas pode ser muito inseguro. O ideal é utilizar algum serviço de nuvem como o thingspeak, Tago.io ou Cayenne para fazer isso via um websocket pela Internet.

      Reply
  11. RONILDO CARVALHO DE FREITAS

    Pedro, muito bom material, consigo usar essa ideia e usar um para cada lampada controlado pelo “station” ?

    Reply
    1. Pedro Minatel (Post author)

      Ronildo, boa tarde.

      Se todos estiverem conectados no mesmo roteador, dá sim para controlar.

      Reply
      1. ronyfreytas

        Ok Pedro, tem algum material no blog à respeito do assunto?

        Reply
  12. FABIO ANTONIO

    Boa noite.
    ao colocar o programa e arquivos ele na compilacao da o seguinte erro:
    Arduino: 1.8.0 (Windows 10), Placa:”Generic ESP8266 Module, 80 MHz, 40MHz, DIO, 115200, 512K (64K SPIFFS), ck, Disabled, None”

    In file included from C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:29:0:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.h:27:7: error: redefinition of ‘class WiFiUDP’

    class WiFiUDP : public UDP {

    ^

    In file included from C:\Program Files (x86)\Arduino\libraries\WiFi\src\utility/wifi_drv.h:26:0,

    from C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:26:

    C:\Users\fabio\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi\src/WiFiUdp.h:32:7: error: previous definition of ‘class WiFiUDP’

    class WiFiUDP : public UDP, public SList {

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In constructor ‘WiFiUDP::WiFiUDP()’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:35:22: error: class ‘WiFiUDP’ does not have any field named ‘_sock’

    WiFiUDP::WiFiUDP() : _sock(NO_SOCKET_AVAIL) {}

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual uint8_t WiFiUDP::begin(uint16_t)’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:45:9: error: ‘_sock’ was not declared in this scope

    _sock = sock;

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:46:9: error: ‘_port’ was not declared in this scope

    _port = port;

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual int WiFiUDP::available()’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:56:7: error: ‘_sock’ was not declared in this scope

    if (_sock != NO_SOCKET_AVAIL)

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual void WiFiUDP::stop()’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:66:8: error: ‘_sock’ was not declared in this scope

    if (_sock == NO_SOCKET_AVAIL)

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:69:26: error: ‘_sock’ was not declared in this scope

    ServerDrv::stopClient(_sock);

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual int WiFiUDP::beginPacket(IPAddress, uint16_t)’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:88:7: error: ‘_sock’ was not declared in this scope

    if (_sock == NO_SOCKET_AVAIL)

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:90:7: error: ‘_sock’ was not declared in this scope

    if (_sock != NO_SOCKET_AVAIL)

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual int WiFiUDP::endPacket()’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:101:32: error: ‘_sock’ was not declared in this scope

    return ServerDrv::sendUdpData(_sock);

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual size_t WiFiUDP::write(const uint8_t*, size_t)’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:111:27: error: ‘_sock’ was not declared in this scope

    ServerDrv::insertDataBuf(_sock, buffer, size);

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual int WiFiUDP::read()’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:125:23: error: ‘_sock’ was not declared in this scope

    ServerDrv::getData(_sock, &b);

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual int WiFiUDP::read(unsigned char*, size_t)’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:137:31: error: ‘_sock’ was not declared in this scope

    if (!ServerDrv::getDataBuf(_sock, buffer, &size))

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual int WiFiUDP::peek()’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:152:22: error: ‘_sock’ was not declared in this scope

    ServerDrv::getData(_sock, &b, 1);

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual IPAddress WiFiUDP::remoteIP()’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:166:25: error: ‘_sock’ was not declared in this scope

    WiFiDrv::getRemoteData(_sock, _remoteIp, _remotePort);

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual uint16_t WiFiUDP::remotePort()’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:176:25: error: ‘_sock’ was not declared in this scope

    WiFiDrv::getRemoteData(_sock, _remoteIp, _remotePort);

    ^

    exit status 1
    Erro compilando para a placa Generic ESP8266 Module
    In file included from C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:29:0:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.h:27:7: error: redefinition of ‘class WiFiUDP’

    class WiFiUDP : public UDP {

    ^

    In file included from C:\Program Files (x86)\Arduino\libraries\WiFi\src\utility/wifi_drv.h:26:0,

    from C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:26:

    C:\Users\fabio\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi\src/WiFiUdp.h:32:7: error: previous definition of ‘class WiFiUDP’

    class WiFiUDP : public UDP, public SList {

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In constructor ‘WiFiUDP::WiFiUDP()’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:35:22: error: class ‘WiFiUDP’ does not have any field named ‘_sock’

    WiFiUDP::WiFiUDP() : _sock(NO_SOCKET_AVAIL) {}

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual uint8_t WiFiUDP::begin(uint16_t)’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:45:9: error: ‘_sock’ was not declared in this scope

    _sock = sock;

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:46:9: error: ‘_port’ was not declared in this scope

    _port = port;

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual int WiFiUDP::available()’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:56:7: error: ‘_sock’ was not declared in this scope

    if (_sock != NO_SOCKET_AVAIL)

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual void WiFiUDP::stop()’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:66:8: error: ‘_sock’ was not declared in this scope

    if (_sock == NO_SOCKET_AVAIL)

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:69:26: error: ‘_sock’ was not declared in this scope

    ServerDrv::stopClient(_sock);

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual int WiFiUDP::beginPacket(IPAddress, uint16_t)’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:88:7: error: ‘_sock’ was not declared in this scope

    if (_sock == NO_SOCKET_AVAIL)

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:90:7: error: ‘_sock’ was not declared in this scope

    if (_sock != NO_SOCKET_AVAIL)

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual int WiFiUDP::endPacket()’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:101:32: error: ‘_sock’ was not declared in this scope

    return ServerDrv::sendUdpData(_sock);

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual size_t WiFiUDP::write(const uint8_t*, size_t)’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:111:27: error: ‘_sock’ was not declared in this scope

    ServerDrv::insertDataBuf(_sock, buffer, size);

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual int WiFiUDP::read()’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:125:23: error: ‘_sock’ was not declared in this scope

    ServerDrv::getData(_sock, &b);

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual int WiFiUDP::read(unsigned char*, size_t)’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:137:31: error: ‘_sock’ was not declared in this scope

    if (!ServerDrv::getDataBuf(_sock, buffer, &size))

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual int WiFiUDP::peek()’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:152:22: error: ‘_sock’ was not declared in this scope

    ServerDrv::getData(_sock, &b, 1);

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual IPAddress WiFiUDP::remoteIP()’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:166:25: error: ‘_sock’ was not declared in this scope

    WiFiDrv::getRemoteData(_sock, _remoteIp, _remotePort);

    ^

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp: In member function ‘virtual uint16_t WiFiUDP::remotePort()’:

    C:\Program Files (x86)\Arduino\libraries\WiFi\src\WiFiUdp.cpp:176:25: error: ‘_sock’ was not declared in this scope

    WiFiDrv::getRemoteData(_sock, _remoteIp, _remotePort);

    ^

    exit status 1
    Erro compilando para a placa Generic ESP8266 Module

    Este relatório teria mais informações com
    “Mostrar a saida detalhada durante a compilação”
    opção pode ser ativada em “Arquivo -> Preferências”

    poderia ajudar com esta duvida, estou me aventurando nessa plataforma.

    grato pela gentileza bom ano novo

    Reply
  13. Eder VINI

    Pedro, parabéns pelo trabalho!

    Você tem experiência com aplicativos android? Queria fazer um app de controle remoto com o appinventor interagindo com o esp8266. Você poderia sugerir-me a melhor maneira de fazer isso (tenho mais dúvidas na parte do esp, na programação do recebimento de comandos do app). Consegui uma interação com app + o módulo bluetooth + arduíno, porém quero substituir o módulo bluetooth e arduíno pelo Esp8266.
    Tem um modelo simples deste tipo de aplicação para que eu possa estudá-lo?

    Obrigado, desde já!

    Reply
    1. Eder VINI

      OBS muito importante: gostaria de fazer isto com conexão de wifi, mas sem necessidade de conexão com rede de internet, como fez neste post

      Reply
  14. Tito Augusto

    Olá, Pedro Minatel!
    Meus parabéns pelo espirito de colaboração e compartilhamento de seus conhecimentos.
    Compilei os dois códigos acima, e não houve nenhum erro de compilação.
    Aos demais que se queixaram de erros, aqui vai uma dica: Verifiquem se a IDE está configurada para placa “Generic ESP8266 Module”
    Vá na aba tools/board, e selecione a placa acima.
    Valeu, Pedro Minatel!

    Reply
    1. Pedro Minatel (Post author)

      Valeu Tito Augusto!

      Reply
      1. Tito Augusto

        Olá, Pedro Minatel!
        Cara! Estou usando um nodeMCU-ESP12-E, como transmissor. E um ESP-01, como receptor.
        A conexão é estabelecida, mas as duas gpio do esp-01 ficam em estado HIGH e não mudam.
        As duas gpio que configurei no nodeMCU, uma para o botão e a outra para o led, não respondem.
        Seria possível este esquema com essas duas placas, nodeMCU + ESP-01?
        Ou só será possível com as mesmas placas que você usou?

        Reply
        1. Pedro Minatel (Post author)

          Tito, é possível usar placas diferentes nesse caso. Está utilizando a serial para algo, além de programar o ESP? Você poderia usar o RX t TX como GPIO comum.

          http://pedrominatel.com.br/pt/esp8266/utilizando-rx-e-tx-como-gpio-no-esp01/

          Reply
          1. Tito Augusto

            Olá, Pedro!
            Eu não estou usando os TX e RX, mas não entendo o porque os pinos não respondem.
            Veja abaixo, as modificações que fiz nos dois códigos. Eu mudei apenas as linhas referentes aos pinos de entrada e saída. Se você puder me dizer onde estou errando, agradeço.

            Este é o código do transmissor, com “nodeMCU ESP12-E”

            #include
            #include
            #include //https://github.com/tzapu/WiFiManager
            #include
            #include

            #define STATUS_PIN 13
            #define BTN 1
            #define LED 2

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

            E este é o código do receptor, com “ESP-01”

            #include
            #include
            #include

            WebSocketsServer webSocket = WebSocketsServer(81);

            const char *ssid = “RemoteControl”;
            const char *password = “remotecontrol”;

            #define STS_PIN 0
            #define LED_0 2

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

  15. FABIO ANTONIO

    Pedro, consegui descobrir o erro de meu post, porem poderia me ajudar com gentileza de uma peegunta?
    Como faço para enviar um comando de acender ou apagar o led e uma mensagem do servidor para um cliente? isso é possivel?

    Reply
    1. Pedro Minatel (Post author)

      Fábio, é possivel sim, de várias formas:

      Socket IO
      ThingSpeak Talkback
      Blynk
      Cayenne My Devices

      Basicamente você pode usar socket e criar um protocolo simples no meio. Alterar esse protocolo que eu criei seria um começo.

      Reply

Deixe seu comentário