Etiquetas: , ,

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

arduino-ethernet-shield-vma04 Conectar o Arduino à Internet com um 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.

arduino-ethernet-write-data Conectar o Arduino à Internet com um Ethernet Shield VMA04

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.

arduino-ethernet-data-reading Conectar o Arduino à Internet com um Ethernet Shield VMA04

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

arduino-ethernet-send-data Conectar o Arduino à Internet com um Ethernet Shield VMA04

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