Shield Ethernet W5100 – Acionamento remoto de relés com HTML

Dando prosseguimento ao conteúdo relacionado à criação de Servidores Web utilizando o Arduino UNO juntamente com o Ethernet Shield W5100. Anteriormente, vimos quais eram os procedimentos básicos para criar um Servidor Webpara efetuar a leitura de valores provenientes de elementos ligados tanto às entradas analógicas quanto às digitais e também para realizar o acionamento das portas de saída digital. Neste tutorial você aprenderá como criar uma aplicação na qual será possível criar uma interface, que por sua vez, será apresentada no seu navegador de internet, para que seja possível realizar acionamento de relés.

É importante, para o pleno entendimento desse tutorial, que o leitor tenha lido todos os tutoriais anteriores:

[toc]

kit robotica educacional com Arduino ESP ou Microbit


Mãos à obra – Desenvolvendo o sistema de acionamento remoto de relés com HTML

Componentes necessários

Montando o projeto

Shield Ethernet W5100 - Sistema de acionamento remoto de relés com HTML
Hardware Utilizado.

Programando

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 25, 16);
EthernetServer server(80);

void setup() 
{
  Ethernet.begin(mac, ip);
  server.begin();
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  digitalWrite(2,HIGH);
  digitalWrite(3,HIGH);
  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);
}
void loop() 
{  
     String req_str;
     EthernetClient client = server. available();  
     if (client) 
     {
           req_str = "";
           boolean currentLineIsBlank = true;
           while (client.connected()) 
           {
                 if (client.available()) 
                 {
                       char c = client.read();    
                       req_str += c;    
                       if(c == '\n' && currentLineIsBlank) 
                       {
                             unsigned int posicao_inicial = req_str.indexOf("GET") + 4;
                             unsigned int posicao_final = req_str.indexOf("HTTP/") - 1;
                             String parametro = req_str.substring(posicao_inicial,posicao_final);
                             if(parametro != "/favicon.ico") 
                             {
                             client.println("HTTP/1.1 200 OK");
                             client.println("Content-Type: text/html");
                             client.println("Connection: close");
                             client.println();
                             client.println("<!DOCTYPE html>");
                             client.println("<html lang=\"pt-br\">");                
                                  client.println("<head>");
                                       client.println("<meta charset= \"UTF-8\"/>");
                                       client.println("<title>Acionamento de relés</title>"); 
                                 client.println("</head>");
                                 client.println("<body>");
                                      client.println("<h1>Sistema de acionamento de relés V.1</h1>");
                                      client.println("<hr/>");
                                      client.println("<h2>Portas digitais</h2>");
                                     // client.println("<p>Porta D2:</p>");
                                      client.println ("<form method=\"get\">");
                                      criarformulario (client, parametro);               
                                      client.println ("</form>");                             
                                client.println ("</body>");
                          client.println ("</html>");
                         }
                         break;
                  }
                  if (c == '\n') 
                  {
                         currentLineIsBlank = true;
                   }
                   else if (c != '\r') 
                   {
                         currentLineIsBlank = false; 
                                } 
              }
          }
        delay(1);
        client.stop();
     }
}      

void criarformulario(EthernetClient client_aux, String parametro_aux)
{


   for(int i = 0; i<2; i++)
   {
       client_aux.println("Porta D" + String(i)+ ":");
       client_aux.println("<input type=\"checkbox\"  name=\"D" + String(i) + "\"  value=\"1\" onclick=\"submit()\" disabled>PINO NÃO UTILIZADO (DESABILITADO)</br>");
   }   

for(int i = 2; i<6; i++)
   {
      
       client_aux.println("Porta D" + String(i)+ " (Relé " + String (i - 1) + ") :");
       if(parametro_aux.indexOf("D" + String(i)+ "=1") > -1)
       {
          client_aux.println("<input type=\"checkbox\"  name=\"D" + String(i) + "\"  value=\"1\" onclick=\"submit()\" checked> LIGADA</br>");
          digitalWrite(i,LOW);
       }
       else
       {
          client_aux.println("<input type=\"checkbox\"  name=\"D" + String(i) + "\"  value=\"1\" onclick=\"submit()\"> DESLIGADA</br>");
          digitalWrite(i,HIGH);
       }
   }   
   
   for(int i = 6; i<10; i++)
   {
       client_aux.println("Porta D" + String(i)+ ":");
       client_aux.println("<input type=\"checkbox\"  name=\"D" + String(i) + "\"  value=\"1\" onclick=\"submit()\" disabled>PINO NÃO UTILIZADO (DESABILITADO)</br>");
   }   
   

   for(int i = 10; i<14; i++)
   {
       client_aux.println("Porta D" + String(i)+ ":");
       client_aux.println("<input type=\"checkbox\"  name=\"D" + String(i) + "\"  value=\"1\" onclick=\"submit()\" disabled>EM USO PELO ETHERNET SHIELD W5100 (DESABILITADO)</br>");
   }
}

Colocando para funcionar

Shield Ethernet W5100 - Sistema de acionamento remoto de relés com HTML
Sistema de acionamento de relés com HTML

Entendendo a fundo

Software

Antes de começarmos com a explicação do código, gostaríamos de ressaltar que iremos apresentar apenas os detalhes dos tópicos não contemplados nos tutoriais anteriores, pois, desta maneira, será mais fácil focar nas partes referentes às atualizações feitas sobre o programa já existente, portanto, caso você tenha alguma dúvida sobre alguma parte do programa que não seja explicada neste momento, sugerimos que acesse o nossos materiais citados anteriormente.

– Definindo os pré-requisitos para o funcionamento do código

Inicialmente, devemos incluir duas bibliotecas no código para que o mesmo pudesse funcionar corretamente. A biblioteca SPI.h, responsável pela comunicação dos módulos do shield com o Arduino UNO utilizando o protocolo SPI e a biblioteca Ethernet.h que atua possibilitando a conexão do conjunto, em um primeiro momento, com uma rede local.

Após a inclusão das bibliotecas citadas, devemos definir um endereço MAC (lembre-se que este pode ser qualquer um, desde que seja único em sua rede local) e um endereço IP (este deve ser um endereço válido  e disponível dentro da sua rede local). Além disso, devemos criar o objeto que será responsável por representar o Servidor Web no código (aqui, chamamos este de server) e relacioná-lo com a porta 80.

client.println("<!DOCTYPE html>");

Como sabemos, entre as tags <head> e </head>, fazemos algumas configurações pertinentes ao funcionamento da página que estamos desenvolvendo. As configurações citadas, correspondem à determinação do conjunto de caracteres que deverá ser utilizado pelo navegador (para apresentar caracteres acentuados) e à inclusão de um título na aba da página do navegador.

client.println("<head>");
  client.println("<meta charset= \"UTF-8\"/>");
  client.println("<title>Acionamento de relés</title>"); 
client.println("</head>");

No corpo da página, começamos escrevendo alguns títulos utilizando as tags de cabeçalho <h1> e <h2>.

client.println("<body>");
  client.println("<h1>Sistema de acionamento de relés V.1</h1>");
  client.println("<hr/>");
  client.println("<h2>Portas digitais</h2>"); 
  . 
  .
  .

Em seguida, adicionamos o formulário e explicitamos que o método que será utilizado para o envio de dados na requisição feita pelo navegador será o GET. Entre as tags <form> e </form>, criamos uma função chamada criarformulario(), a qual, será responsável por criar a interface de comandos na página do navegador.

client.println ("<form method=\"get\">");
  criarformulario (client, parametro);               
client.println ("</form>");

Por último, veja o código responsável pela criação da interface de comando, na íntegra.

– Função de criação do formulário

Como dissemos anteriormente, a função criarformulario() será a responsável pela criação da interface de comando que utilizaremos. Esta função é dividida em três blocos, de modo que, o primeiro deles é responsável por criar os checkboxes referentes às portas digitais 0 e 1. Repare que na instrução de criação dos checkboxes (cujo funcionamento já foi apresentado em nossos tutoriais) existe a palavra disabled, a qual, irá fazer com que o checkbox não seja clicável (justamente por não estarmos utilizando estes pinos).

 for(int i = 0; i<2; i++)
 {
     client_aux.println("Porta D" + String(i)+ ":");
     client_aux.println("<input type=\"checkbox\"  name=\"D" + String(i) + "\"  value=\"1\" onclick=\"submit()\" disabled>PINO NÃO UTILIZADO (DESABILITADO)</br>");
 }

O segundo bloco diz respeito à criação dos checkboxes de acionamento dos 4 relés existentes no módulo utilizado. Repare que a estrutura utilizada é a mesma que a anterior, no entanto, utilizamos a função indexOf() para descobrirmos se existe algum elemento do tipo “/?D_=1 (parâmetro da requisição quando algum checkbox é selecionado). Em caso afirmativo, o checkbox é criado e marcado, em caso negativo, ele é apenas criado, porém sem estar selecionado. Consequentemente, também acionamos o relé (com nível lógico 0) ou não (com nível lógico 1), através da função digitalWrite().

for(int i = 2; i<6; i++)
   {
      
       client_aux.println("Porta D" + String(i)+ " (Relé " + String (i - 1) + ") :");
       if(parametro_aux.indexOf("D" + String(i)+ "=1") > -1)
       {
          client_aux.println("<input type=\"checkbox\"  name=\"D" + String(i) + "\"  value=\"1\" onclick=\"submit()\" checked> LIGADA</br>");
          digitalWrite(i,LOW);
       }
       else
       {
          client_aux.println("<input type=\"checkbox\"  name=\"D" + String(i) + "\"  value=\"1\" onclick=\"submit()\"> DESLIGADA</br>");
          digitalWrite(i,HIGH);
       }
   }

O terceiro e o quarto bloco são semelhantes ao primeiro, no entanto, na quarta estrutura de repetição for, apenas alteramos o texto para sinalizar que os pinos 10 a 13 estão sendo utilizados pelo Shield Ethernet W5100.

for(int i = 6; i<10; i++)
   {
       client_aux.println("Porta D" + String(i)+ ":");
       client_aux.println("<input type=\"checkbox\"  name=\"D" + String(i) + "\"  value=\"1\" onclick=\"submit()\" disabled>PINO NÃO UTILIZADO (DESABILITADO)</br>");
   }   
   

   for(int i = 10; i<14; i++)
   {
       client_aux.println("Porta D" + String(i)+ ":");
       client_aux.println("<input type=\"checkbox\"  name=\"D" + String(i) + "\"  value=\"1\" onclick=\"submit()\" disabled>EM USO PELO ETHERNET SHIELD W5100 (DESABILITADO)</br>");
   }
}

Considerações finais

Neste tutorial, demonstramos como você pode fazer para criar um sistema de acionamento de relés para ser utilizado através de um navegador de internet. Para isto, utilizamos um Arduino UNO em conjunto com um Ethernet Shield W5100. Esta foi a quarta parte de uma série de artigos sobre a criação de Servidores Web, portanto, esperamos que continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.

Privacy Preference Center