fbpixel
Etiquetas: , ,
0
(0)

Em alguns projetos, especialmente na domótica, é interessante poder controlar uma placa Arduino pela Internet. Isso é possível com um shield Ethernet.

O shield usado neste tutorial é o VMA04, da Velleman. Você também pode utilizar outro shield, com configuração, pinos e biblioteca diferentes.

Atenção: o Shield VMA04 também existe na versão em kit para soldar KA04. Verifique qual versão deseja comprar.

Pré-requisitos: Conhecimento de HTML/CSS

Material

  • Computador
  • Arduino UNO
  • Cabo USB para ligar o Arduino ao computador
  • Cabo Ethernet
  • Shield Ethernet VMA04

Obs: Escrever uma página web pode tomar muito espaço de memória para uma placa Arduino. Nós usamos o Ethernet Shield VMA04 e uma placa Arduino UNO, mas se achar que a sua página tomará muita memória, opte por um shield W5100.

Visão geral do Ethernet Shield VMA04

O Ethernet Shield VMA04 utiliza o Microchip ENC28J60. Ele usa:

  • os pinos 10 e 2 numa placa Arduino UNO.
  • para o conector ICSP: pinos 11, 12 e 13 numa placa Arduino UNO.

As ligações no caso de um shield são pré-definidas. Verifique a documentação técnica do componente para saber como utilizá-lo (VMA04 datasheet).

Configuração de rede

Para acessar a placa Arduino sem precisar conectá-la ao roteador de Internet, é necessário criar uma ponte entre a conexão WiFi e a conexão Ethernet no seu computador. Para isso, é preciso:

  • Conectar o shield VMA04 ao Arduino
  • Conectar o shield Ethernet ao computador (RJ45).
  • Abrir a Central de Rede e Compartilhamento.
  • Ir para “Alterar configurações da placa”.
  • Selecionar Ethernet(Arduino) e Wifi /(Internet source) e clicar com o botão direito do mouse.
  • Clicar em “Criar ponte”.

Exemplo de código para o Ethernet Shield VMA04

Para interagir com o Ethernet Shield VMA04, utilizamos a biblioteca UIPEthernet.h

  • Ethernet.begin() para iniciar uma conexão de rede.
  • server.begin() para inicializar um servidor.
  • EthernetClient client = server.available() para inicializar um cliente.
  • client.read() para ler dados do cliente.
  • client.print() para enviar dados para o cliente.

UIPEthernet.h

// Enter ip address http://192.168.1.179:80 in your browser
// Based on WMA04 ethernet shield
#include <UIPEthernet.h>
//Ethernet
byte mac[]={0x54, 0x34, 0x41, 0x30, 0x30, 0x31};
IPAddress ip(192, 168, 1, 179);
EthernetServer server(80);
void setup() {
 Serial.begin(57600);
 // start the Ethernet connection and the server:
 Ethernet.begin(mac, ip);
 server.begin();
 Serial.print("IP Address: ");
 Serial.println(Ethernet.localIP());
}
void loop() {
 // listen for incoming clients
 EthernetClient client = server.available();
 if (client){
   Serial.println("-> New Connection");
   // an http request ends with a blank line
   boolean currentLineIsBlank = true;
   while (client.connected()){
     if (client.available()){
       char c = client.read();
       // if you've gotten to the end of the line (received a newline        
       // character) and the line is blank, the http request has ended,
       // so you can send a reply
       if (c == '\n' && currentLineIsBlank){
         client.println("<html><title>Hello World!</title><body><h3>Hello World!</h3></body>");
         break;
       }
       if (c == '\n'){
         // you're starting a new line
         currentLineIsBlank = true;
       } else if (c != '\r'){
         // you've gotten a character on the current line
         currentLineIsBlank = false;
       }
     }
   }
   // give the web browser time to receive the data
   delay(10);
   // close the connection:
   client.stop();
   Serial.println("Disconnected\n");
 }
}

Ao digitar o endereço https://192.168.1.179, uma página com as palavras “Hello Word! ” irá aparecer.

Código para visualizar os dados provenientes da placa Arduino

Vamos criar uma função generatePage() para escrever a página HTML. Ela tomará como entrada o cliente que abre e fecha durante o loop infinito loop().

void generatePage(EthernetClient client){
 if(x==0){
 //output HTML data header
 client.println(F("HTTP/1.1 200 OK"));
 client.println(F("Content-Type: text/html"));
 client.println();
 }else{
 //header
 client.print(F("<html><head><title>Arduino</title>"));
 //meta-refresh page every x seconds
 client.print(F("<meta http-equiv='refresh' content='1'>"));
 client.print(F("</head><body bgcolor='black'><br>"));        
 client.print(F("<h1 style='color:green;'>Arduino data</h1>"));
 client.println("<p style='color:white;'>");
 client.print(F("<br><br>Arduino analog input data :<br>"));
 client.print(F("<br>Page refresh number: "));
 client.print(x); //current refresh count
 client.print("<br><br>");
          
 //output analog input pin
 
 for(int i=0;i<6;i++){
   client.print("<b>Input A");
   client.print(i);
   client.print(" : </b>");
   client.print(analogRead(14+i)); //A0=14, A1=15 ,etc.
   client.print("<br>");
 }
 client.println("</p>");
 client.println(F("<br></body></html>")); 
 }  
 x=x+1;   
}

O truque na função generatePage é adicionar uma meta tag para que a página recarregue automaticamente [meta http-equiv=”refresh” content=”1″]

Este é o código completo:

// Enter ip address http://192.168.1.179:80 in your browser
// Based on WMA04 ethernet shield
#include <UIPEthernet.h>
//Ethernet
byte mac[]={0x54, 0x34, 0x41, 0x30, 0x30, 0x31};
IPAddress ip(192, 168, 1, 179);
EthernetServer server(80); //server port
//Page
unsigned long int x=0; //set refresh counter to 0
String readString;
//////////////////////
void setup(){
 Serial.begin(9600);
 Ethernet.begin(mac, ip);
 server.begin();
 Serial.println("System initialized");
 Serial.print("IP Address: ");
 Serial.println(Ethernet.localIP());
}
void loop(){
 EthernetClient client = server.available();
 if (client) {
   while (client.connected()) {
     if (client.available()) {
       char c = client.read();
        if (readString.length() < 100) {
         readString += c;
        }
       //check if HTTP request has ended
       if (c == '\n') {
         //check get atring received
         Serial.println(readString);
         generatePage(client);
         delay(1);
         //stopping client
         client.stop();
         //clearing string for next read
         readString="";
       }
     }
   }
 }
}
void generatePage(EthernetClient client){
 if(x==0){
 //output HTML data header
 client.println(F("HTTP/1.1 200 OK"));
 client.println(F("Content-Type: text/html"));
 client.println();
 }else{
 //header
 client.print(F("<html><head><title>Arduino</title>"));
 //meta-refresh page every x seconds
 client.print(F("<meta http-equiv='refresh' content='1'>"));
 client.print(F("</head><body bgcolor='black'><br>"));        
 client.print(F("<h1 style='color:green;'>Arduino data</h1>"));
 client.println("<p style='color:white;'>");
 client.print(F("<br><br>Arduino analog input data :<br>"));
 client.print(F("<br>Page refresh number: "));
 client.print(x); //current refresh count
 client.print("<br><br>");
          
 //output analog input pin
 
 for(int i=0;i<6;i++){
   client.print("<b>Input A");
   client.print(i);
   client.print(" : </b>");
   client.print(analogRead(14+i)); //A0=14, A1=15 ,etc.
   client.print("<br>");
 }
 client.println("</p>");
 client.println(F("<br></body></html>")); 
 }  
 x=x+1;   
}

Ao digitar o endereço IP do seu Arduino, será exibida uma página com os valores de entrada analógicos atualizados automaticamente.

Código para enviar dados da página web para o Arduino

Veremos agora como controlar as saídas do Arduino a partir da página web. Isso pode ser muito prático para ativar relés para acender luzes, por exemplo.

A ideia aqui é criar botões para cada saída e enviar um comando string (“/?On+pin number”) para o Arduino.

      client.print(F("<input type=button value=ON onmousedown=location.href='/?On4;'>"));
     client.print(F("<input type=button value=OFF onmousedown=location.href='/?Off4;'>"));

Estes comandos são depois recuperados pelo Arduino na variável readString. Notamos bem a quantidade de pinos e o comando On/Off associado.

  if (readString.indexOf("4") > 0)
 {
   if (readString.indexOf("?On") > 0) {
     digitalWrite(4, HIGH);
     Serial.println("LED 4 On");
   }
   if (readString.indexOf("?Off") > 0) {
     digitalWrite(4, LOW);
     Serial.println("LED 4 Off");
   }
 }

Este é o código completo com as três saídas digitais disponíveis:

// Enter ip address http://192.168.1.179:80 in your browser
// Based on WMA04 ethernet shield
#include <UIPEthernet.h>
//Ethernet
byte mac[] = {0x54, 0x34, 0x41, 0x30, 0x30, 0x31};
IPAddress ip(192, 168, 1, 179);
EthernetServer server(80); //server port
//Page
unsigned long int x = 0; //set refresh counter to 0
String readString;
//
int digPin[3] = {4, 7, 8};
int anaPin[4] = {3, 5, 6, 9};
//////////////////////
void setup() {
 Serial.begin(9600);
 Ethernet.begin(mac, ip);
 server.begin();
 Serial.println("System initialized");
 Serial.print("IP Address: ");
 Serial.println(Ethernet.localIP());
}
void loop() {
 EthernetClient client = server.available();
 if (client) {
   while (client.connected()) {
     if (client.available()) {
       char c = client.read();
       if (readString.length() < 100) {
         readString += c;
       }
       //check if HTTP request has ended
       if (c == '\n') {
         //check get atring received
         Serial.println(readString);
         processCommand();
         generatePage(client);
         delay(1);
         //stopping client
         client.stop();
         //clearing string for next read
         readString = "";
       }
     }
   }
 }
}
void processCommand() {
 if (readString.indexOf("4") > 0)
 {
   if (readString.indexOf("?On") > 0) {
     digitalWrite(4, HIGH);
     Serial.println("LED 4 On");
   }
   if (readString.indexOf("?Off") > 0) {
     digitalWrite(4, LOW);
     Serial.println("LED 4 Off");
   }
 }
 if (readString.indexOf("7") > 0)
 {
   if (readString.indexOf("?On") > 0) {
     digitalWrite(7, HIGH);
     Serial.println("LED 7 On");
   }
   if (readString.indexOf("?Off") > 0)
   {
     digitalWrite(7, LOW);
     Serial.println("LED 7 Off");
   }
 }
 if (readString.indexOf("8") > 0)
 {
   if (readString.indexOf("?On") > 0) {
     digitalWrite(8, HIGH);
     Serial.println("LED 8 On");
   }
   if (readString.indexOf("?Off") > 0) {
     digitalWrite(8, LOW);
     Serial.println("LED 8 Off");
   }
 }
}
void generatePage(EthernetClient client) {
 if (x == 0) {
   //output HTML data header
   client.println(F("HTTP/1.1 200 OK"));
   client.println(F("Content-Type: text/html"));
   client.println();
 } else {
   //header
   client.print(F("<html><head><title>Arduino</title>"));
   //meta-refresh page every x seconds
   client.print(F("<meta http-equiv='refresh' content='2'>"));
   client.print(F("</head><body bgcolor='black'><br>"));
   client.print(F("<h1 style='color:green;'>Arduino Inputs</h1>"));
   client.println("<p style='color:white;'>");
   client.print(F("<br><br>Arduino analog input data :<br>"));
   client.print(F("<br>Page refresh number: "));
   client.print(x); //current refresh count
   client.print("<br><br>");
   //output analog input pin
   for (int i = 0; i < 6; i++) {
     client.print("<b>Input A");
     client.print(i);
     client.print(" : </b>");
     client.print(analogRead(14 + i)); //A0=14, A1=15 ,etc.
     client.print(F("<br>"));
   }
   client.print(F("</p><br>"));
   client.print(F("<h1 style='color:green;'>Arduino Outputs</h1>"));
   client.print(F("<p style='color:white;'>"));
   //digital output
   client.print(F("<br><br>Arduino digital outputs :<br><br>"));
   for (int j = 0; j < 3; j++) {
     client.print(F("<b>Digital output "));
     client.print(digPin[j]);
     client.print(" : </b>");
     client.print(F("<input type=button value=ON onmousedown=location.href='/?On4;'>"));
     client.print(F("<input type=button value=ON onmousedown=location.href='/?On"));
     client.print(digPin[j]);
     client.print(F(";'>"));
     client.print(F("<input type=button value=OFF onmousedown=location.href='/?Off"));
     client.print(digPin[j]);
     client.print(F(";'>"));
     client.print(F("<br>"));
   }
   client.print(F("</p><br>"));
   //file end
   client.print(F("<br></body></html>"));
 }
 x = x + 1;
}

Teste e combine estes exemplos para obter as funcionalidades que deseja. Se tiver algum problema para usar o seu shield Ethernet com o microcontrolador Arduino, sinta-se à vontade para nos deixar um comentário ou mandar uma mensagem.

Aplicação

  • Controlar o seu projeto Arduino via Internet

Referências

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?