banner

IOT Poderosa com NodeJS ESP32



Hoje quero te apresentar um exemplo de WebSocket utilizando ESP32 e NodeJS. Neste caso, o Node no lado do servidor, uma das melhores opções de linguagem para isso, acredito eu. Vou, portanto, te mostrar a instalação e configuração do NodeJS, através de um exemplo bem simples.






RECURSOS USADOS

  • ESP32
  • Led
  • Resistor 330 ohm
  • Protoboard
  • Jumpers
  • Computador WebSocket Server






INSTALAÇÃO DO NODE

Primeiro é necessário que o Node esteja instalado na sua máquina.
Baixe a versão compatível com o seu sistema operacional.


Após o download finalizar execute o instalador.
É recomendado desativar o antivírus (caso exista) para evitar problemas na instalação.


Siga a instalação padrão...



Variáveis de Ambiente

Para que o sistema reconheça o comando node é necessário adicionar o local onde o node foi instalado às variáveis de ambiente do sistema.
Clique com o botão direito em Computador e selecione Propriedades



Vá em Configurações avançadas do sistema


Vá em Variáveis de Ambiente


Em Variáveis do sistema, procure por Path e clique em Editar


Clique em Novo
Digite: C:\Program Files\nodejs (ou o local onde o node está instalado)
Clique em OK
E, por fim, reinicie a máquina






INICIANDO SERVIDOR

Abra o prompt de comando dentro da pasta onde está o código NodeEchoWebSocket e execute:
1. npm install
2. node websocket.js


Conceda a permissão de acesso do Firewall


Pronto, uma mensagem será exibida informando a porta em que o servidor está utilizando.







MONTAGEM







CÓDIGO

Bibliotecas necessárias

WebSocket Client ESP32


Fluxograma ESP32




Código ESP32

Declarações e Variáveis

#include <ArduinoWebsockets.h>

const char* ssid = "NOME_REDE"; // Nome da rede
const char* password = "SENHA_REDE"; // Senha da rede
const char* websockets_server_host = "192.168.3.144"; // IP do servidor websocket
const int websockets_server_port = 8080; // Porta de conexão do servidor

// Utilizamos o namespace de websocket para podermos utilizar a classe WebsocketsClient
using namespace websockets;

// Objeto websocket client
WebsocketsClient client;

// Led
const int led = 23;


Setup


void setup() 
{
    // Iniciamos a serial com velocidade de 115200
    Serial.begin(115200);

    // Definimos o pino como saída
    pinMode(led, OUTPUT);

    // Conectamos o wifi
    WiFi.begin(ssid, password);

    // Enquanto não conectar printamos um "."
    while(WiFi.status() != WL_CONNECTED)
    {
        Serial.print(".");
        delay(1000);
    }

    // Exibimos "WiFi Conectado"
    Serial.println("Connected to Wifi, Connecting to server.");




    // Tentamos conectar com o websockets server
    bool connected = client.connect(websockets_server_host, websockets_server_port, "/");

    // Se foi possível conectar
    if(connected) 
    {
        // Exibimos mensagem de sucesso
        Serial.println("Connected!");
        // Enviamos uma msg "Hello Server" para o servidor
        client.send("Hello Server");
    }   // Se não foi possível conectar
    else 
    {
        // Exibimos mensagem de falha
        Serial.println("Not Connected!");
        return;
    }
    
    // Iniciamos o callback onde as mesagens serão recebidas
    client.onMessage([&](WebsocketsMessage message)
    {        
        // Exibimos a mensagem recebida na serial
        Serial.print("Got Message: ");
        Serial.println(message.data());

        // Ligamos/Desligamos o led de acordo com o comando
        if(message.data().equalsIgnoreCase("ON"))
            digitalWrite(led, HIGH);
        else
        if(message.data().equalsIgnoreCase("OFF"))
            digitalWrite(led, LOW);
    });
}



Loop



void loop() 
{
    //  De tempo em tempo, o websockets client checa por novas mensagens recebidas
    if(client.available()) 
        client.poll();
        
    delay(300);
}



Código Node

Fluxograma Node



Declarações e variáveis


var WebSocketServer = require('websocket').server;
var http = require('http');

//Porta que o server irá escutar
const port = 8080;

//Cria o server
var server = http.createServer();


server.listen e wsServer


//Server irá escutar na porta definida em 'port'
server.listen(port, () => {
    //Server está pronto
    console.log(`Server está executando na porta ${port}`);
});

//Cria o WebSocket server
wsServer = new WebSocketServer({
  httpServer: server
});


wsServer.on


//Chamado quando um client deseja conectar
wsServer.on('request', (request) => {
    //Estado do led: false para desligado e true para ligado
    let state = false;

    //Aceita a conexão do client
    let client = request.accept(null, request.origin);

    //Chamado quando o client envia uma mensagem
    client.on('message', (message) => {
        //Se é uma mensagem string utf8
        if (message.type === 'utf8') {
            //Mostra no console a mensagem
            console.log(message.utf8Data);
        }
    });


Envios para os clients e evento de conexão fechada


    //Cria uma função que será executada a cada 1 segundo (1000 millis) para enviar o estado do led
    let interval = setInterval(() => {
        //Envia para o client "ON" ou "OFF" dependendo do estado atual da variável state
        client.sendUTF(state? "ON" : "OFF");
        //Inverte o estado
        state = !state;
    }, 1000);//Tempo entre chamadas => 1000 millis = 1 segundo 

    //Chamado quando a conexão com o client é fechada
    client.on('close', () => {
        console.log("Conexão fechada");
        //Remove o intervalo de envio de estado
        clearInterval(interval);
    });
});





FAÇA O DOWNLOAD DOS ARQUIVOS

PDF

INO





4 comentários:

  1. Gracias por las explicaciones excelentes

    ResponderExcluir
  2. Cadê a pasta onde está o código NodeEchoWebSocket?

    ResponderExcluir
  3. Fernando, me tornei membro no seu canal do Youtube, parabéns pela sua paciência e didática, eu preciso de uma recomendação por onde posso começar nos seus vídeos para desenvolver um sistema de controle distribuído usando Mesh com ESP32, preciso criar um banco de dados confiável, rápido para trocar informações com essa rede ESP32(Mesh), pretendo utilizar vários ESP32 no formato IOs Digital e Analógico e guardar essas informações no banco de dados e através de um ESP32(Master) programar a lógica e comandar/ler os ESP32 (slaves), preciso que seja rápido por que pretendo acionar dispositivos em função das variáveis recebidas, a ideia é toda informação estar alocada em uma matriz em um banco de dados e um ESP32 gerenciar essa atualização de dados, que podem ser acessados por outros dispositivos, inclusive para um painel supervisório, onde possa mostrar online todas as variáveis e poder enviar setpoints e comandos através do supervisório. Bom, não sei se fui claro, sou da área de automação, e seria algo parecido com SDCD com acionaamento wireless. Grato! Aguardo seu retorno, duque.julio@gmail.com.

    ResponderExcluir

Tecnologia do Blogger.