Como conectar seu Arduino UNO/Nano à internet usando o módulo Ethernet W5100

Tempo de leitura: 7 minutes

A maioria dos dispositivos IoT conectados hoje estão conectados à Internet por meio de uma conexão wi-fi. Embora uma conexão Wi-Fi permita o acesso remoto à Internet, ela tem suas próprias limitações. Por exemplo, na maioria das aplicações industriais para um dispositivo estacionário, a Ethernet geralmente é escolhida em vez da conexão Wi-Fi simplesmente porque é mais confiável e segura. Além disso, como a Ethernet é uma conexão com fio, ela oferece melhor velocidade e menor latência. Já trabalhamos em muitos projetos de IoT, a maioria dos quais foi construída em torno de ESP8266, ESP32 ou Raspberry Pi. Como sabemos, esses dispositivos têm um modem Wi-Fi embutido que permite que você se conecte à internet. Mas se você está trabalhando com uma humilde placa Arduino UNO ou Nano e deseja conectar seu Arduino à Internet, então você tem duas opções populares. Uma opção é usar um ESP8266 com Arduino e a segunda opção é conectar um módulo Ethernet com Arduino.

Neste projeto, vamos usar a última opção para controlar um LED pela Internet fazendo a interface do Arduino com o módulo Ethernet W5100. O módulo Ethernet é usado para estabelecer a comunicação entre o computador e o Arduino em uma LAN ou rede com fio. Este artigo foi escrito presumindo que o leitor tenha um conhecimento básico de rede de computadores, o que inclui o conhecimento de como conectar computadores ao hub/roteador com cabos RJ45, endereços IP e MAC, etc.

 

Módulo Ethernet W5100

Estamos usando o módulo Ethernet W5100. É um módulo habilitado para internet com um único chip e recursos completos para estabelecer uma conexão com a internet. Em termos simples, este módulo permite que a placa Arduino se conecte à Internet. Ao utilizar este módulo, podemos completar a ligação à internet sem o suporte de um Sistema Operacional. Ele também oferece suporte a protocolos TCP/IP com fio como TCP, PPPoE, Ethernet, UDP, ICMP, IPv4, etc. Ele oferece suporte aos modos de operação full-duplex e half-duplex. Ele suporta conexões ADSL e até quatro conexões de soquete simultâneas.

O módulo Ethernet também usa a biblioteca Arduino Ethernet para escrever esboços que se conectam à Internet usando este módulo. Ele se encaixa em todas as versões do Arduino como UNO, NANO, mega 1280, mega 2560 e outros. O funcionamento e a funcionalidade do módulo Ethernet W5100 são muito semelhantes aos de um escudo Ethernet Arduino, o que significa que você pode fazer tudo o que quiser com um escudo Ethernet Arduino. Como vantagem, custa metade do preço de um shield.

 

Diagrama de circuito para conectar o módulo Ethernet Arduino W5100

O circuito consiste em Arduino Nano e Módulo Ethernet W5100 (este projeto também seria possível com Ethernet Arduino Shield e Arduino UNO). A conexão entre os módulos Arduino e Ethernet é feita conforme mostrado no diagrama de circuito.

  • Conecte os pinos 5V e GND do Arduino Nano aos pinos +5 e G do Módulo Ethernet, respectivamente (essas conexões fornecem energia para o Módulo Ethernet).
  • Conecte os pinos 9, 10, 11,12 e 13 do Arduino a R, SS, MO, MI, CK do módulo Ethernet respectivamente (estes fazem a comunicação entre Arduino e Ethernet sobre SPI).

 

Código Arduino para obter dados do Módulo Ethernet W5100

O arquivo de cabeçalho SPI é incluído para usar os protocolos de comunicação com o módulo Ethernet.

#include <SPI.h>

O arquivo de cabeçalho Ethernet tem a biblioteca para rodar webclient/webserver sobre Ethernet.

#include <Ethernet.h>

O endereço físico Mac é definido para o módulo Ethernet.

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

O número 192.168.0.12 é o endereço IP. Onde “0” depende do host (gateway padrão) da rede à qual você está conectado, verifique isso executando ipconfig no prompt de comando.

byte ip[] = { 192, 168, 0, 12 }; 
byte gateway[] = { 192, 168, 0, 12 }; 
byte subnet[] = { 255, 255, 255, 0 };

Apenas para referência, este gateway padrão de uma rede diferente é mostrado abaixo.

Isso cria um servidor local na porta 80 que pode ser acessado posteriormente pelos clientes.

EthernetServer server(80);

Isso lê a resposta do cliente quando o usuário acessa o servidor web.

String readString;

A função de configuração inicializa o pino do LED para saída e inicializa o módulo Ethernet com os parâmetros fornecidos (endereço Mac, endereço IP, gateway, máscara de sub-rede) e, finalmente, o servidor é iniciado pela função “server.begin()”

int ledPin = 2;
void setup(){
      pinMode(ledPin, OUTPUT); 
      Ethernet.begin(mac, ip, gateway, subnet);
      server.begin(); 
}

Na função de loop, criamos uma conexão de cliente e verificamos se alguém está tentando acessar o endereço IP atribuído por meio de um navegador.

void loop(){
    EthernetClient client = server.available();
    if (client) {
        while (client.connected()) {
              if (client.available()) {

Se conectado, continue verificando se o cliente está enviando alguma mensagem de volta ao servidor

char c = client.read();

Em seguida, leia a resposta HTTP caractere por caractere e armazene os caracteres na variável readString definida pelo usuário.

if (readString.length() < 100) {
   readString += c;
}

Se a solicitação HTTP foi encerrada – 0x0D é Carriage Return \n ASCII

if (c == 0x0D) {

Assim que recebermos uma resposta OK, começamos a exibir a página da web, e abaixo está o código HTML.

client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("<HTML>");
client.println("<HEAD>");
client.println("<TITLE> ARDUINO ETHERNET</TITLE>");
client.println("</HEAD>");
client.println("<BODY>");
client.println("<hr>");
client.println("<H1 style=\"color:green;text-align:center\">ARDUINO ETHERNET LED CONTROL</H1>");
client.println("<hr>");
client.println("<br>");

Quando o usuário clica no hiperlink LIGAR LED, ele/ela é redirecionado para a URL \?LEDON, que acende ainda mais o LED.

client.println("<H2 style=\"text-align:center\"><a href=\"/?LEDON\"\">Ligar LED</a><br></H2>");

Semelhante ao código acima, isso redireciona o usuário para a URL “DESLIGAR LED”.

client.println("<H2 style=\"text-align:center\"><a href=\"/?LEDOFF\"\">Turn Off LED</a><br></H2>");

Parte restante do código HTML-

client.println("<br>");
client.println("</BODY>");
client.println("</HTML>");
delay(10);
client.stop();

Controle o pino do Arduino para ligar e desligar o LED dependendo da URL para a qual os usuários são redirecionados.

if(readString.indexOf("?LEDON") > -1) 
{
   digitalWrite(ledPin, HIGH);
} else {
  if(readString.indexOf("?LEDOFF") > -1)
  {
      digitalWrite(ledPin, LOW);
  }
}

limpar string para a próxima leitura

                   readString="";
                }
            }
        }
    }
}

 

Conectando o Arduino ao PC ou porta Ethernet do roteador

Para conectar os dois (PC e Arduino) juntos, precisamos de um cabo adequado (cabo cruzado CAT-6) se a porta Ethernet do PC não tiver sensor de direção automática. Caso o seu PC suporte detecção direta automática, basta conectar um cabo comum que vem com o roteador.

 

Neste cabo especial TX+/TX- e RX+/RX- são trocados.

Em qualquer caso, se você não tem uma porta Ethernet em seu PC ou não quer comprar um cabo especial, você pode seguir nosso método para conectar o módulo Ethernet a uma porta de rede LAN do roteador.

 

LED piscando na Internet usando o módulo Ethernet no Arduino

Depois de fazer as conexões acima, conecte-se ao roteador usando seu PC ou telefone celular. Em seguida, abra qualquer navegador da web e vá para este URL “http://192.168.0.12” (no seu caso, digite seu endereço IP Ethernet que você configurou no código). Agora, você pode controlar o LED por meio da página da web. Quando o usuário clica em “Ligar LED” na página da web, o LED acende no circuito. Quando “DESLIGAR LED” é clicado, o LED é DESLIGADO no circuito. Este comando é executado usando a conexão com fio do módulo Ethernet. A página do servidor web é mostrada na figura abaixo.

Espero que você tenha gostado do projeto e aprendido a usar o módulo Ethernet W5100 com Arduino para enviar e receber dados pela internet. Se você tiver alguma dúvida, deixe-as na seção de comentários abaixo ou use nosso fórum de Eletrônicos.

Código

#include <SPI.h> //protocolo para se comunicar com o módulo ethernet
#include <Ethernet.h> //biblioteca para executar cliente/servidor web sobre ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //endereço mac físico definido para o módulo ethernet
/*o número 0 no endereço IP depende do host da rede à qual você está conectado, verifique isso executando ipconfig no prompt de comando*/
byte ip[] = { 192, 168, 0, 12 }; // Endereço IP na LAN - precisa mudar de acordo com o seu endereço de rede
byte gateway[] = { 192, 168, 0, 12 }; // acesso à internet via roteador
byte subnet[] = { 255, 255, 255, 0 }; //máscara de sub-rede
EthernetServer server(80); //porta onde o servidor pode ser acessado
String readString; // para ler a resposta do usuário / cliente
int ledPin = 2; // Led está conectado ao pino 2
void setup(){
    pinMode(ledPin, OUTPUT); //pino selecionado para controlar
    //start Ethernet
    Ethernet.begin(mac, ip, gateway, subnet); //inicializar ethernet
    server.begin(); //inicie o servidor
}
void loop(){
    // Crie uma conexão de cliente
    EthernetClient client = server.available();
    // verifique se alguém tentou acessar o endereço IP atribuído em um navegador
    if (client) {
        // se conectado, continue verificando se o cliente está enviando alguma mensagem de volta ao servidor
        while (client.connected()) {
            if (client.available()) {
                char c = client.read();             
                // ler solicitação HTTP caractere por caractere
                if (readString.length() < 100) {
                    // armazena caracteres em string
                    readString += c;
                }
                //se a solicitação HTTP foi encerrada - 0x0D é Carriage Return \n ASCII
                if (c == 0x0D) {
                    //exibir a página da web
                    client.println("HTTP/1.1 200 OK"); //enviar nova página
                    client.println("Content-Type: text/html");
                    client.println();
                    client.println("<HTML>");
                    client.println("<HEAD>");
                    client.println("<TITLE> ARDUINO ETHERNET</TITLE>");
                    client.println("</HEAD>");
                    client.println("<BODY>");
                    client.println("<hr>");
                    client.println("<H1 style=\"color:green;text-align:center\">ARDUINO ETHERNET LED CONTROL</H1>");
                    client.println("<hr>");
                    client.println("<br>");
                    //criando um link para redirecionar o usuário para ligar a luz
                    client.println("<H2 style=\"text-align:center\"><a href=\"/?LEDON\"\">Ligar o LED</a><br></H2>");
                    //criando um link para redirecionar o usuário para desligar a luz
                    client.println("<H2 style=\"text-align:center\"><a href=\"/?LEDOFF\"\">Desligue o LED</a><br></H2>");
                    client.println("<br>");
                    client.println("</BODY>");
                    client.println("</HTML>");
                    delay(10);
                    // parando o cliente
                    client.stop();
                    // controlar pin Arduino com URL
                    if(readString.indexOf("?LEDON") > -1) // verifica o LEDON
                    {
                        digitalWrite(ledPin, HIGH); // definir o pino alto
                    }
                    else{
                        if(readString.indexOf("?LEDOFF") > -1) // verifica se há LEDOFF
                        {
                            digitalWrite(ledPin, LOW); // definir o pino baixo
                        }
                    }
                    // limpar string para a próxima leitura
                    readString="";

                }

            }
        }
    }
}