Acendendo um LED via Internet com Arduino e o Ethernet Shield

Com o Ethernet Shield, é possível conectar o Arduino a uma rede ethernet e montar projetos que envolvam o envio ou recebimento de informações via rede ou internet. O dispositivo, juntamente com a biblioteca de controle, permite o projeto de aplicações para rede de forma fácil. Não é necessário se preocupar com os esquemas complicados de sinalização em redes ethernet já que todo o controle e conexão são feitos por rotinas da biblioteca. Após estabelecida a conexão, basta ler ou escrever dados através dela, de forma semelhante à uma conexão serial convencional.

Segue um exemplo de um projeto para a disponibilização de uma página web que permite ligar ou desligar uma porta digital do Arduino através da rede local ou da internet. Em uma aplicação prática, o projeto poderia ser utilizado para controlar uma lâmpada, servindo como uma boa aplicação “Hello World” de automação residencial com Arduino. Aqui, a ideia é se concentrar no projeto de software necessário para tal aplicação. Por isso, vamos considerar a ligação de um led à porta do Arduino e mostrar uma das formas mais caras de acender um led que podem ser propostas.

Neste projeto, foi utilizado o Ethernet Shield baseado no chip Wiznet W5100. Esse chip provê toda a pilha TCP/IP de forma transparente, facilitando o projeto, já que não é necessário se preocupar com os esquemas de sinalização e controles do TCP/IP. Vale lembrar que existem outros shields ethernet, mais simples e mais baratos, que utilizam chips que exigem que os controles e a sinalização TCP/IP sejam implementados no sketch Arduino.

A configuração de harware para este projeto é muito simples: basta conectar o Ethernet Shield ao Arduino e ligar um led em série com um resistor de 1KOhm entre o pino 6 do Shield e o terra (GND).

A ideia é acessar o endereço IP associado ao Arduino pelo navegador e receber uma página com um link para ligar o led e outro para desligá-lo. Para isso, foi utilizado o seguinte código:

#include <SPI.h>
#include <Ethernet.h>
  
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 235 };
     
EthernetServer server(80);
  
String readString;
int Pin = 6;
  
void setup(){
  
  pinMode(Pin, OUTPUT);
  Ethernet.begin(mac, ip);
  server.begin();
}
  
void loop(){
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
  
        if (readString.length() < 100) {
          readString += c;             
        }
 
        if (c == '\n') {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
           
          client.println("<HTML>");
          client.println("<BODY>");
          client.println("<H1>Acende LED</H1>");
          client.println("<hr />");
          client.println("<br />");
           
          client.println("<a href=\"/?ledon\">Ligar o led</a>");
          client.println("<a href=\"/?ledoff\">Desligar o led</a><br />");   
           
          client.println("</BODY>");
          client.println("</HTML>");
           
          delay(1);
          client.stop();
           
          if(readString.indexOf("?ledon") > 0)
          {
            digitalWrite(Pin, HIGH);
          }
          else {
            if(readString.indexOf("?ledoff") > 0)
            {
              digitalWrite(Pin, LOW);
            }
          }
          readString="";    
        }
      }
    }
  }
}

Para controlar o Ethernet Shield, é utilizada a biblioteca Ethernet. A comunicação entre o Arduino e o Shield é feita utilizando o protocolo SPI, daí a necessidade da importação da biblioteca SPI também. Vale lembrar que a comunicação via SPI se dá através dos pinos 10, 11, 12 e 13 no Arduino Uno, o que impossibilita a utilização destes pinos no projeto.

A configuração do servidor funcionando na porta 80 é feita pelas linhas

EthernetServer server(80);
Ethernet.begin(mac, ip);
server.begin();

sendo o endereço MAC e o endereço IP definidos pelos vetores mac e ip criados nas linhas 4 e 5.

Após a configuração inicial, o programa espera pela conexão de um cliente e, quando detectada, lê os caracteres enviados ao servidor relativos à requisição GET feita pelo cliente através do acesso pelo navegador.

Os caracteres são recebidos um a um e são guardados em sequência na variável readString. É utilizada uma condicional para limitar o número de caracteres recebidos em 100. A cada caractere recebido, é feito um teste para verificar se trata-se de um fim de linha (\n, um “ENTER”). Nesse caso, é enviada a resposta ao cliente, que é uma resposta bem sucedida à requisição (HTTP/1.1 200 OK), contendo uma página HTML com links para ligar e desligar o led.

Os links para ligar e desligar o led utilizam as query strings ?ledon e ?ledoff para que o servidor consiga identificar o comando vindo do cliente. Após a resposta à requisição, é feito um teste para verificar se o endereço requisitado pelo cliente possui uma destas query strings, através da verificação da variável readString pela presença das sequências ?ledon ou ?ledoff. A partir dessa informação, o led é ligado ou desligado e, por fim, a variável readString é reiniciada.

Desta forma, é possível controlar o led a partir de um ponto de acesso à rede local. Também é possível controlá-lo via internet, configurando o roteador para fazer um redirecionamento da porta 80 para o IP associado ao Arduino e acessando a página utilizando o IP público, fornecido pelo provedor de internet. No entanto, vale comentar que esta configuração não leva em conta a segurança, permitindo que qualquer um que possua o IP controle o led via internet.

Comentários

  1. Amigo como faço para habilitar mais portas ou seja colocar mas pinos para funcionar(ligar desligar) qual procedimento?

    1. Primeiramente é necessário configurar as portas que você quer usar na função “setup()” adicionando linhas como a 14.
      Depois disso, para acionar mais portas ao mesmo tempo (juntamente com a 6), basta adicionar linhas semelhantes às linhas 52 e 57.

      Se você quiser ter um controle individual de mais portas, você tem que adicionar um suporte à mais URLS, por exemplo “/?led1on”, “/?led1off” e “/?led2on”, “/?led2off”. Para isso, você deve criar blocos semelhantes ao bloco entre as linhas 50 e 59 para cada porta que quer controlar e adicionar links na área do HTML para essas URLS, como os links criados com a linhas 41 e 42.

      1. Ola! como faço apara monitorar um ip? por exemplo quero fazer um watchdog para quando perder comunicação com meu roteador ele reseta..como posso fazer? obrigado

        1. Não consegui entender muito bem o que você quer fazer mas você poderia monitorar um equipamento de forma simples utilizando um ping de tempos em tempos. Conte mais detalhes.

          []

          Renato.

          1. Boa tarde, watchdog que ele se refere, é que se perder conexão com servidor, se tem a possibilidade de dar um reset automatico no arduino?

          2. Há muitas formas de monitorar um dispositivo na rede. Não sei qual é a sua ideia mas, se estiver pensando em usar um computador para fazer o monitoramente, dê uma olhada no Zabbix, uma das soluções mais conhecidas para isso.

            [].

            Renato.

          3. Gostaria de monitorar usando o próprio Arduíno, para se caso algum dispositivo falha-se por exemplo eu poderia acionar um rele para reiniciá-lo.

      2. Olá!comprei um Ethernet Sheilla recentemente fiz apenas um teste remoto acionando led, mais agora os leds de status não piscam, de vez em quando que tds acendem inclusive os leds da porta de conexão à rede, já tentei reset pra normalizar mais sem sucesso será que você pode me ajudar?

        1. Olá estava tentando estabelecer uma conexão e tive o mesmo problema no fim era o IP que eu havia declarado que por fim estava sendo ocupado pelo meu notebook, tente mudar o IP declarado dentro do código e tente estabelecer um IP estático para seus dispositivos, evitando assim transtornos.

      3. Renato, bom dia!
        É possível transmitir informação via Ethernet, porém do celular para o Arduíno via Bluetooth?

      4. Olá, muito bom o seus artigos parabéns, tentei criar mais comando para mais portas individuais conforme sua instrução porem os comandos acionam sempre a mesma saída, como faço para ter mais “botoes” que acionem mais portas de maneira individual, obrigado.

  2. Boa noite,

    Prezado Renato,

    Estou iniciando no aprendizado com o Arduino, gostaria de acender uma lampada via internet, poderia enviar este projeto para estudo?

      1. Jaciane santos

        Estou iniciado no arduino não tenho ainda tanta habilidades.
        Preciso de uma aplicação usado o arduino, relé e etc.. pra desligar/ligar a tensão de uma tomada pra pode reiniciar uma suíte.
        Poderia me ajudar?

      2. Jaciane santos

        Boa noite.
        Estou iniciando no arduino e não tenho ainda tanta experiência.
        Preciso usa o arduino, relé e etc.. para uma aplicação web que me permita ligar/desligar a tensão de uma tomada para reiniciar um suíte.
        Poderia me ajudar?

        1. Quanto à interface web, uma solução é usar algo parecido com o que foi mostrado no post. Para ligar o relé, a maneira mais fácil é usar um shield. Dê uma procurada por “relé shield” que você deve achar várias opções.

          [],

          Renato.

  3. Boa Noite Renato.

    Parabéns pelo post e tempo dispensado para faze-lo ficou realmente muito bom.
    Estou com um projeto de controle de acesso com RFID pela internet e minha principal preocupação é exatamente o conflito que os pinos SPI vao ter, tanto do leitor MF522-AN quanto o Ethernet Shield, pois bem gostaria de saber se vc tem alguma sugestão de como resolver isso? Será que mudando o SS do Mifaire fica bom?
    Em segundo lugar vc poderia explicar melhor essa parte dos links no HTML sou bem cru nesta parte, a pagina terá uma configuração separada do arduino? Não será ele que gerará a pagina?

    Perdoe todas essas vidas, mas seu blog foi o que eu mais chegou perto da solução.

    Obrigado

    1. Não sei o que fazer quanto ao problema com o módulo de RFID usado junto com o Ethernet Shield mas encontrei uma discussão no fórum do Arduino sobre isso: http://forum.arduino.cc/index.php/topic,231461.0.html
      Pelo que vi, uma solução possível é utilizar o pino de chip select (CS) para habilitar o Ethernet Shield ou o módulo de RFID, um de cada vez, para utilizar os pinos de SPI do Arduino.

      Quanto aos links HTML, não sei muito bem qual é a sua dúvida mas vou tentar te contar como funciona de um modo geral.

      Quando você faz um acesso a um site utilizando um navegador, é estabelecida uma conexão TCP entre o seu computador e o servidor HTTP, tipicamente na porta 80. Apesar da conexão envolver uma série de sinalizações feitas por uma grande pilha de protocolos, dá para interpretar a conexão como uma conexão serial simples, em que seu computador envia comandos para esse servidor. Ao acessar um site com o navegador, ele manda “comandos” HTTP para o servidor através dessa conexão. Ao abrir uma página, geralmente o comando enviado é o “GET /”, para que o servidor envie a página HTML referente à raiz do site.

      Dá até para ver isso na prática usando o comando telnet para fazer uma conexão. Se você usa GNU/Linux, basta abrir um terminal e fazer a conexão TCP com

      telnet www.google.com 80

      Em seguida, você pode executar o comando

      GET /

      Você vai receber um HTML de retorno (que não é exatamente o que o navegador recebe por motivos que não são importantes no momento).

      O método client.read() da linha 24 vai lendo o comando executado pelo navegador, caractere por caractere, até encontrar um enter. Ao detectar o enter, retorna a página HTML com os links para acender ou apagar o led.

      Para saber se o usuário deseja acender ou apagar o led, um outro recurso é utilizado, as query strings. Conforme descrito nesta página da Wikipédia, as query strings são uma forma de passar dados adicionais para aplicações web através da URL. Por exemplo, na URL

      http://192.168.0.199/?ledon

      a query string é o trecho ?ledon. No programa usado neste projeto, são detectadas as query strings ?ledon e ?ledoff para acender ou apagar o led. Como as query strings apenas passam dados adicionais para a aplicação web, a requisição básica não é alterada, ou seja, ao acessar a aplicação com ou sem as query strings, será retornada a página HTML do mesmo jeito. Elas apenas mudam o comportamento quanto ao acendimento ou apagamento do led.

      Espero que tenha conseguido te ajudar.

      []

      Renato.

  4. Muito bom o projeto, porém o mesmo funciona somente na rede local certo?
    como faço para que meu amigo em outro estado do brasil consiga acessar essa página?

    1. A situação mais comum é conectar o Ethernet Shield em uma rede privada isolada por um roteador usando o serviço de NAT. Nesse caso, a página para controle do sistema ficará disponível apenas na rede local.

      Para tornar a página disponível publicamente, você precisa configurar o serviço de redirecionamento de portas (port forwarding) no seu roteador. Com esse serviço, você pode configurar o seu roteador para encaminhar todas as requisições com porta de destino 80 (http) vindas da rede pública para o endereço IP do Ethernet Shield. Dê uma olhada nesta página da Wikipédia para entender melhor do que se trata (ou na versão em inglês, bem mais completa).

      Vale notar duas coisas:
      – A maioria dos provedores bloqueia o acesso a partir da rede pública para a porta de destino 80, que é a porta padrão do serviço http. Uma possível solução é utilizar uma porta diferente, geralmente maior do que 1024. Para tanto, basta modificar o sketch do Arduino;
      – Apesar de funcionar, esse sistema não conta com nenhum recurso de segurança. Assim, qualquer um que acessar a página do Arduino através do seu endereço IP será capaz de controlar o seu sistema. Em uma aplicação prática, é essencial usar algum sistema de segurança para evitar acessos não permitidos.

      []

      Renato.

      1. Gostaria de entender melhor essa parte de acesso pela internet.
        Seu programa é muito bom funciona perfeitamente, mais tenho um projeto que é exatamente esse com mais lâmpadas, como viajo sempre e a casa fica sozinha gostaria de acionar lâmpadas por exemplo, durante a noite e apaga-las de manha pela internet, simulando pessoas em casa.
        Você pode me ajudar nessa parte?

        1. Quanto às lâmpadas, para controlá-las, você você vai precisar ligar relês nas saídas do Arduino e, para isso você vai precisar de uns componentes adicionais (um diodo, ao menos), pois a ligação direta pode causar danos ao Arduino. Pretendo escrever um post com um projeto mais completo, detalhando algumas formas de fazer essa ligação mas, enquanto não sai, você pode dar uma procurada na internet que você vai encontrar várias possíveis soluções.

          O problema desse projeto é a segurança do seu sistema. Do jeito que está, se você expor a porta HTTP do Arduino à internet, qualquer um vai poder controlar as suas lâmpadas. Para usar na prática, você vai precisar de alguma camada de segurança adicional. Uma solução simples de implementar é usar um servidor (ou um roteador) com o SSH instalado e fazer a conexão ao Arduino tunelada pelo SSH. Apesar de simples de implementar, é complicada para o usuário…

          Estou trabalhando em um projeto de um alarme conectado, que controla algumas lâmpadas também mas estou usando o Raspberry Pi. Tenho algumas ideias de como implementar um esquema de segurança mínimo mas ainda estou finalizando a placa para ligação dos sensores e lâmpadas. Quando tiver terminado, vou comentar aqui sobre o projeto.

          []

          Renato.

  5. Primeiramente Parabéns pelo seu Projeto, muito bem explicado, a tempos vinha procurando tutorial do Ethernet Shield e ainda não havia encontrado um tão explicativo e funcional assim.
    O grande problema que eu enfrente é devido a conexão ‘internet’ mesmo, já mudei a porta e fiz o redirecionamento corretamente, porém sem sucesso.
    Um amigo de outro bairro estava tentando acessar pelo IP externo e mesmo assim não foi. Pode me dizer algo mais que possa estar dando errado, já testei fora da minha rede, já mudei as portas para 1024. Pode me informar algo mais pra mim tentar?
    Obrigado!

    1. Eu testaria as partes do sistema separadamente:
      – Primeiro, de um computador na rede local, eu testaria o acesso à página do Arduino, na porta alternativa escolhida (1024, no seu caso);
      – Se o teste funcionar, significa que o problema está no redirecionamento de portas ou em algum bloqueio da porta escolhida. Para testar o redirecionamento de portas, eu colocaria algum serviço (um servidor web, por exemplo), rodando na rede local na mesma porta escolhida no projeto do Arduino e no mesmo endereço IP e tentaria o acesso externo.

      Um dos testes deve falhar e você será capaz de identificar onde está o problema. Quanto ao redirecionamento de portas, vale notar:
      – A porta 1024 ainda pode estar bloqueada pelo seu provedor. Tente usar uma porta mais alta como 8080 ou 8888, ou ainda mais alta, lembrando que o limite é 65535;
      – É possível manter o projeto do Arduino rodando na porta 80 da rede local e usar uma porta alta para acesso externo. Basta configurar o roteador para fazer o redirecionamento da forma adequada, da porta alta, escolhida, para a porta 80, no endereço IP do Arduino.

      [],

      Renato.

  6. Bom dia, Renato

    Muito bom o seu post e as suas respostas aos amigos acima. Aprendi muito mais em sua página que em dezenas do mesmo assunto. Só esperando meu arduino chegar para começar os testes.
    Sou técnico em eletrônica, tenho empresa de segurança eletrônica e curso Engenharia de Controle e Automação. Sou apaixonado pela área!

    Abraço!

  7. Olá, Você está de parabéns pelo tutorial.
    Mas, me tire uma duvida.

    Estou usando o WAMP server. Como faço pra ele reconhecer o LocalHost?

  8. Raimundo Cerqueira

    Boa tarde, Renato.

    Gostei muito do seu artigo. Parabéns pelo trabalho.

    Tenho uma lan-house com quatro videogames (consoles) e gostaria de utilizar um projeto Arduino (já tenho um Uno com W5100 e módulo 4 relés) para controlar quatro televisores ligados aos consoles através do programa de gerenciamento dos computadores.
    Já fiz alguns testes com sketches de controle de relés via ethernet, inclusive como o uso de um aplicativo android Touch OSC, mas não tenho ideia de como monitorar os comandos do programa que utilizo, o Nexcafé. Esse programa possui um administrador que envia comandos para as estações, com recursos de liberar (desbloquear), desligar, pausar, dentre outros.

    Obrigado pela atenção.

    Cerqueira

    1. Também não conheço esse programa mas você poderia ligar ou desligar as TVs usando um circuito para acionamento dos relés no lugar dos leds. O controle pode ser feito da mesma forma, através de uma requisição HTTP, que pode ser feita por um navegador. Talvez seja interessante você entrar em contato com o pessoal que desenvolve o Nexcafé, para ver se é possível integrar no programa uma forma de fazer a requisição HTTP.

      [],

      Renato.

    1. Os pinos 10, 11, 12 e 13 são utilizados para a comunicação entre o Arduino e o Ethernet Shield, que é feita utilizando o protocolo SPI, por isso você não consegue utilizá-los. Já os pinos 0 e 1 são usados para a comunicação serial (que é utilizada para a comunicação USB entre o Arduino e o computador). A princípio, acho que você pode usar os pinos 0 e 1 como saídas digitais desde que não esteja usando comunicação serial no seu programa, mas não tenho certeza disso. Mostre o seu programa: use o pastebin e poste o link nos comentários.

      [],

      Renato.

  9. Caro Renato,

    Parabéns pela publicação, sinceramente foi a mais simples objetiva que encontrei para resolver um problema complicado para quem não tem ainda informação suficiente, se a informação tivesse sido paga com certeza sairia satisfeito pela aquisição da mesma, obrigado porque sei que isso significa trabalho e você esta fazendo exatamente o que o pessoal que criou o projeto Arduíno se propôs, compatilhar informação de forma livre.

    Por outro lado gostaria de deixar postado que depois de ligar meu dispositivo na rede interna sem problemas, graças a sua explicação, exemplo, e todo material que você disponibilizou, veio como é de imaginar a vontade de acessar o mesmo via web, no meu caso como Live Tim e e um modem Sagemcom, optei por uma forma que me pareceu a mais simples de imediato,aplicar no meu modem a permissão de acesso via http://pt.dyn.com/products/. Obrigado uma vez mais, grande abraço!

  10. Ola, segui seu tutorial, porém não cria nenhuma pagina web quando digito o ip.
    Gostaria de saber se pode ser se estou digitando o ip errado ou alguma outra coisa.
    eu uso como ip o ipv4 encontrado cmd >> ipconfig >> ipv4

    obrigado.

  11. Parabéns pelo tutorial, um dos poucos que vi na internet que esteja bem explicado.

    Esse readString é limitado a 100 caracteres recebidos, essa variavel inclui apenas os codigos html contido no comando client.println?

    1. Na variável readString vão sendo concatenados um a um os caracteres recebidos na requisição HTTP feita pelo navegador. É o texto dessa requisição que é limitado em 100 caracteres (depois do centésimo caractere, os novos caracteres deixam de ser concatenados na variável readString). Quando é detectado um “enter” (\n) na requisição, é enviada a resposta chamando a função client.println() para cada linha da resposta.

  12. Tenho uma duvida, criei uma aplicação em C# que dispara o HTTPpost com o ip configurado no arduino mais a palavra ON e OFF no final, com intervalos de 5 segundos para q ele acenda e apague (preciso que seja dessa forma), ele fuciona algumas vezes, mas depois ele trava o arduino e ele se mantem ligado ou apagado, saberia pq? Obrigado, ajudou muito até aqui!

    1. Eu começaria testando duas coisas:

      1) Se as requisições do programa estão de fato sendo feitas. Para verificar isso, você pode usar uma ferramenta de captura de pacotes de rede como o TCPDump ou o Wireshark;

      2) Se não existe algum problema com o Arduino ou com o Ethernet Shield. O teste mais fácil de se fazer é trocar uma peça de cada vez e verificar o comportamento.

      Se o seu sistema voltar a funcionar após um reset do Arduino (e o led voltar a piscar com intervalo de 5 segundos), dá para garantir que o programa em C# está enviando as requisições. Assim, o problema pode estar no hardware (Arduino ou Ethernet Shield) ou pode ser algum detalhe de implementação do programa do Arduino para a sua aplicação (esse é o caso mais complicado de depurar).

      Mais uma observação: do jeito que está o programa do Arduino, ele está preparado para receber requisições do tipo GET. Precisaria pensar um pouco para entender o que aconteceria se as requisições feitas fossem do tipo POST. Como você disse que está disparando um HTTPpost, acho interessante verificar a requisição que está sendo feita de fato. Se for POST, vale alterar o programa em C# para fazer requisições GET.

      Não sei se consegui ajudar em alguma coisa. Depois conte aí os resultados desses testes.

      []

      Renato.

  13. Marcos Antonio

    Parabéns pelo tutorial, só fiquei com uma dúvida :
    O endereço MAC desses Shields são genéricos, ou seja, igual para todos os Shields ?
    Porque teóricamente cada Shield deveria ter seu endereço MAC !

    1. A ideia original do endereçamento MAC é realmente que cada dispositivo tenha um endereço único no universo. Só que já faz um tempo que isso não é respeitado na prática. O fato é que problemas devido a endereços MAC repetidos podem ocorrer apenas se os dispositivos estiverem na mesma rede. Se estiverem em redes distintas, separados por um roteador, não vai ocorrer problemas devido à endereços MAC repetidos.

      Os primeiros a desrespeitarem essa regra sobre a repetição de endereços MAC foram fabricantes pequenos que produziam dispositivos com o mesmo endereço, provavelmente para reduzir custos (há um bom tempo, um amigo me contou um caso sobre problemas de rede que eram causados por dois dispositivos com o mesmo endereço MAC). Só que agora isso é bem comum. Na verdade, a maioria das placas mãe tem uma interface de rede incorporada e permite a alteração do endereço MAC na configuração da BIOS. O mesmo acontece com os roteadores. Esse recurso existe pois algumas operadoras de internet vinculam o endereço MAC do dispositivo diretamente conectado à rede deles. O problema é que, devido a esse vínculo, se houver um problema nesse dispositivo que exija a troca do equipamento (roteador ou até mesmo um computador), seria necessário entrar em contato com a operadora para alterar o endereço MAC vinculado no sistema deles. Com esse recurso que permite especificar o endereço MAC, isso não é necessário. Dá para trocar o equipamento sem que a operadora perceba.

      Com o Ethernet Shield, a gente também especifica o endereço MAC pelo programa. Nesse exemplo, o endereço é especificado na variável MAC, na linha 4 do programa. Depois, a gente usa essa variável na linha 15, para “inicializar” o sistema de Ethernet.

      Não sei se essa configuração é obrigatória (talvez o Ethernet Shield tenha um endereço MAC padrão para o caso em que não se especifica um). Se você descobrir, deixe um comentário.

      []

      Renato.

  14. Renato,
    Você É DEMAIS. Você explica muito bem e com muita paciência.
    Li o código e todos os comentários antes de avançar. Quis começar um pouco mais avançado e decidi adicionar mais 1 LED. Segui as instruções conforme uma resposta tua do dia 26 de Abril de 2014 e funcionou logo a primeira amigo. Sem erros ao compilar ou nas teclas de ligar e desligar os LEDs. Detalhe: sou leigo. Estou começando agora.
    Por pessoas assim que aprendemos cada vez mais rápido.

    Um forte abraço.

    Leandro

  15. Valmir Sartori

    Primeiramente parabens pelo post ficou extremamente facil de entender, no entanto gostaria de usar via web (do jeito que postou) e tambem continuar usando o interruptor. como ficaria a sintaxe? visando que eu teria que usar uma das portas digitais como entrada né?

    1. Basta incluir uma lógica para mudar o estado do LED quando for acionado o interruptor. Para isso, você pode usar a função digitalRead (http://www.arduino.cc/en/Reference/DigitalRead) para ler o estado do interruptor. No livro “Primeiros passos com Arduino” (http://novatec.com.br/livros/primeiros-passos-arduino/) há vários exemplos de como utilizar entradas e saídas e dicas de como resolver alguns problemas como o debounce (http://www.arduino.cc/en/Tutorial/Debounce). Depois poste a sua solução nos comentários.

      [],

      Renato.

  16. Primeiramente, parabéns pelo post.
    Segundo, vc saberia me dizer se tem como fazer este mesmo proccesso utilizando 4 lampadas ligadas a um rele ?se sim, como ?
    Valeu.

    1. Basta replicar as linhas com a lógica do controle da saída do Arduino. Dê uma olhada no comentário http://br.renatocandido.org/2013/09/acendendo-um-led-via-internet-com-arduino-e-o-ethernet-shield/#comment-12289 (por algum motivo a numeração das linhas do código mudou mas basta adicionar 1 aos números das linhas mencionadas no comentário). Para ligar as lâmpadas, você de adicionar um circuito em cada saída do Arduino para acionar as bobinas dos relês.

      []

      Renato.

  17. Parabéns pelo código e paciência! Você desenvolve um ótimo trabalho.
    Eu segui todos os passos, mas quando tento dar um ping pra saber se o IP já está ativo, dá o erro “Host de destino inacessível”. Já troquei os cabos, o modem, a porta 80, mas nada faz funcionar. Você sabe como posso solucionar isso?

    Desde já, obrigada!

    1. Parece que você está com algum problema relacionado à sua configuração de rede. Acho que você pode começar observando se o Ethernet Shield e o computador que você está utilizando estão na mesma rede. Como você está ligando um ao outro ? Se for diretamente com um cabo, você vai precisar configurar a interface de rede do seu computador com um endereço IP, de modo que eles fiquem na mesma rede. Se você usou a configuração do post, você pode configurar o IP do computador para 192.168.1.10, com a máscara 255.255.255.0, por exemplo. Se você estiver com o computador ligado em uma rede com DHCP (que te fornece um endereço IP automaticamente), você vai precisar alterar o IP do Ethernet Shield para que ele fique na mesma rede fornecida pelo DHCP. Se não funcionar, conte mais detalhes da sua montagem.

      []

      Renato.

  18. Excelente postagem.
    A cinco dias vinha estudando artigos e exemplos para montar um circuito desses.
    Após ler a postagem em cerca de quinze minutos estou com quatro leds na protoboard comandados por uma pagina funcionando tanto pelo note como pelo celular, com comando individual e também comando para os quatro pinos ao mesmo tempo.
    Agora é só montar a placa com reles.

  19. Renato, muito respeito ao seu post, achei maravilhoso, implementei um led a mais denominando como bomba 1 e bomba 2 …….. apenas a bomba 1 não desliga. Passei 3 horas estudando o problema e nao consegui resolver. Terias uma luz para este pobre aprendiz aqui ? Cordiais abraços amigo.


    #include
    #include

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

    EthernetServer server(80);

    String readString;
    int Pin6 = 6;
    int Pin7 = 7;

    void setup() {

    pinMode(Pin6, OUTPUT);
    pinMode(Pin7, OUTPUT);
    Ethernet.begin(mac, ip);
    server.begin();
    }

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

    if (readString.length() < 100) { readString += c; } if (c == '\n') { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println(""); client.println(""); client.println("modulo rele pela web"); client.println(""); client.println(""); client.println(""); client.println(""); client.println("LIGAR - Bomba 1");
    client.println("");
    client.println("DESLIGAR - Bomba 1");

    client.println("");

    client.println("LIGAR - Bomba 2");
    client.println("");
    client.println("DESLIGAR - Bomba 2");

    client.println("");
    client.println("");

    delay(1);
    client.stop();

    if(readString.indexOf("?rele6on") > 0)
    {
    digitalWrite(Pin6, HIGH);
    }
    else {
    if(readString.indexOf("?rele6off") > 0)
    {
    digitalWrite(Pin6, LOW);
    }

    if(readString.indexOf("?rele7on") > 0)
    {
    digitalWrite(Pin7, HIGH);
    }
    else {
    if(readString.indexOf("?rele7off") > 0)
    {
    digitalWrite(Pin7, LOW);
    }
    }
    readString="";
    }
    }
    }
    }
    }
    }

    1. Oi Agnaldo,

      Primeiro vai uma dica quanto à inclusão de códigos em comentários e chats: use o gist ou o pastebin em vez de colocar o código no seu comentário. Fica mais fácil de visualizar as coisas. Como você mandou o código pelo comentário, varios caracteres foram trocados pelo wordpress. Tentei dar uma arrumada e coloquei no pastebin, no link http://pastebin.com/xmZBf9w5. Acho que o problema do seu programa está nas linhas 45-47 e 51-53. Os links não tem o parâmetro href, que serve para identificar qual o relê que deve ser ligado. Além disso, acho que o bloco if da linha 71 não precisa ficar dentro do else da linha 65 (acho que isso não faria diferença, mas é mais lógico ficar fora do else).

      Dê uma olhada aí e depois comente como você resolveu.

      [],

      Renato.

      1. Renato, não tenho palavras para agradecer seu post com o código e pelo seu retorno em tentar me ajudar, ontem a noite mandei minha duvida a voce pq após 5 horas tentando achar onde estava o erro eu consegui sanar o problema, meu erro foi que quando eu copiei a sintaxe para duplicar o Liga/Desliga ao final ficou faltando um colchete } na linha 59 ( pois são dois ) …apenas um colchete e faz uma diferença enorme, pois na hora de compilar ele o fazia normal e os HREF não estavam faltando, não sei pq quando colei a pagina da publicação “comeu-os” todos, desculpe por fazer desta forma pois não sabia desta etiqueta quando se posta cods hoje pela manhã alterei a pagina html de comando e habilitei 6 reles para ligar a um quadro de energia acionando algumas contatoras, ficou PERFEITO e todas contatoras trabalham muito felizes. Veja como ficou no celular o layout http://www.solarradio.com.br/transfer/rele.png Estou acionando pela WAN pois abri uma porta bem alta para acessar de fora. Lhe devo um almoço, um jantar, a sobremesa e o café amigo. Obrigado mesmo. Tenho um cliente meu precisando de um contador de peças que mostre o resultado na WEB tambem, caso tenha interesse neste projeto divido-o com voce ok, neste caso não seria favor e sim uma parceria ok, pois estou buscando alguem para gerar o codigo para mim. entre em contato gui2001@uol.com.br. Cordiais abraços e sucesso sempre a voce. Ps.: comecei a mexer com o arduino faz 2 dias, sou totalmente cru no assunto. 🙂

  20. Segui exatamente seu sketch e deu tudo certo ( tive que trocar o arduino de usb
    para outro com microusb (ou mini) mas…maravilha.
    Tenho roteador WRN240i e pendurado nele 2 PCs e um DVR Intelbras além de
    um repetidor (sem fio) todos funcionando perfeitamente.
    Usei a última conexão para ligar o ethernet shield que funcionou
    perfeitamente no PC e no celular (wi-fi) . Mas pela internet não consigo acessar o arduino.
    A porta do roteador é 8080 que não precisa ser digitada para acessá-lo.
    A porta (original) do arduino era 80 que não precisava ser digitada, mas mudei para 81 pela fama da 80 (complicada) e deu tudo certo porém precisa ser digitada. Tudo maravilha.
    Mas pela internet não consigo.
    Na configuração do roteador não alterei o DDNS por estar correto para o dvr.
    Considerando 81 como porta interna (arduino) na configuração do roteador tentei
    como porta externa 81, 1024, 2000, 8010 (não poderia dar certo por ser do dvr) e 8080 e nenhuma deu certo.
    Você pode me socorrer? ou me indicar literatura? Não entendo de portas.
    Obrigado
    Rodolfo

    1. Não sei se você já fez mas você precisa configurar um redirecionamento de portas no seu roteador. Procure por “port forwarding” ou “NAT” nas configurações do roteador.

      O que acontece é que seu roteador recebe apenas um IP público de seu provedor, na porta WAN e sua rede interna usa uma rede privada, com uma faixa de endereços IP que é usada em várias outras redes privadas. Para você se conectar ao seu Arduino via internet, você vai precisar usar esse endereço IP público (ou um DDNS, que é traduzido para esse IP público). Para que o roteador saiba o que fazer com a sua requisição, você precisa configurar ele para fazer o redirecionamento. Você pode, por exemplo, configurar o roteador para encaminhar todos os pacotes com porta de destino 8888 para o endereço IP do Arduino (da sua rede interna, privada), na porta 81. Se você tem um DVR acessível via internet, deve haver uma regra de redirecionamento de portas para ele em seu roteador.

      Assim, de um outro local na internet, você poderia acessar seu Arduino pelo endereço do seu DDNS, na porta 8888. Procure configurar a porta exposta à internet de modo que seja maior que 1024. Muitos provedores bloqueiam portas baixas, menores que 1024. Vale lembrar que essa configuração não implementa nenhum tipo de segurança de modo que qualquer um na internet poderia acessar seu Ethernet Shield. Em uma aplicação prática, é necessário incluir algum esquema para restringir o acesso.

      [],

      Renato.

      1. Parabéns, Renato pelo post!
        Simples e funcional, além de muito bem explicado!
        Ao amigo Agnaldo, que postou resposta dia 11 de junho, será que poderia incluir o código final aqui, da maneira que o Renato falou? Estou precisando acionar 4 relés através da web e o seu projeto me servirá bem.

        Renato, uma pergunta:
        Eu vou usar um arduino Mega com o Shield W5100 e o módulo relé de 4 saídas.
        Vou precisar alterar alguma coisa no código pelo fato de ser Mega e não Uno?
        Meu kit ainda não chegou, mas já estou vasculhando na net o código que vai me atender.
        Não tenho em mãos os dispositivos ainda e não tenho como testar seu código. Tenho uma dúvida: A página html gerada mostra um botão para ligar e desligar o led?
        Vi que o amigo Agnaldo postou uma foto do projeto dele que tem botões, mas não consigo enxergar onde esses botões foram inseridos no código.

        Vou tirar essas dúvidas prévias com vocês e aguardarei a chegada do meu kit pra poder conversar já com o projeto em andamento.

        Obrigado!

        1. Os links para ligar e desligar os leds são escritos pelas linhas


          client.println("Ligar o led");
          client.println("Desligar o led
          ");

          Em vez de usar links comuns, você pode usar imagens ou um layout no estilo de botões, mas a ideia é a mesma, mudando apenas o design.

          Quanto ao Arduino Mega, acho que você não vai ter problemas. O único detalhe é que o Ethernet Shield usa os pinos 10, 11, 12 e 13 para a comunicação com o Arduino via SPI. Por isso, você não vai conseguir usar essas saídas para acionar os relês. É necessário ver quais pinos o seu módulo de relês usa.

          [],

          Renato.

  21. Olá Renato,
    Parabéns mesmo, este post abriu minha mente eheheh.
    Mas, estou com uma dúvida. Como ficariam estes links (“/?ledon\”) se eu quisesse criar uma nova página, qualquer linguagem que fosse (PHP, Java, etc.)?
    Porque a minha idéia é controlar as portas do Arduino por outras páginas que não o ip do próprio Arduino, tudo isso para poder deixá-las com o visual melhor.
    Agradeço desde já.
    Abraço.

    1. Acho que a melhor solução nesse caso seria criar uma espécia de API no Arduino, para acender os leds. Há algum tempo, fiz um projeto com Arduino e Ethernet Shield criando uma API REST para o controle das portas. Pretendo escrever um post sobre esse projeto em breve.

      Entretanto, usando esse código simples mostrado acima, acho que não mudaria muita coisa no Arduino. O que você precisaria fazer é incluir links (ou botões) que permitam que sua página externa faça requisições HTTP ao Arduino, incluindo as query strings (/?ledon). É interessante que sua aplicação faça as requisições mas não exiba as respostas, mantendo o usuário na mesma página.

      []

      Renato

  22. Michell de Oiveira

    Bom dia!!
    Estou fazendo um projeto e gostaria de saber se poderia usar arduino uno com uma shield ethernet um leitor rfid para captura de nomes para agregar em um banco de dados e mostrar em uma pagina feita em java web?

    1. Claro que pode! Basta conectar o leitor RFID às portas do Arduino (como o MFRC522, usando a biblioteca https://github.com/miguelbalboa/rfid), ler o cartão, compor os dados a serem enviados via ethernet e enviá-los ao seu servidor usando, por exemplo, uma API REST. É um projeto bem mais complicado que o do exemplo mostrado na postagem mas com certeza pode ser realizado. Recomendo que comece resolvendo os problemas de forma isolada (leitura RFID e transmissão de informação para o servidor REST) e depois integre a solução. Depois conte nos comentários sobre os resultados do seu projeto.

      []

      Renato.

  23. Renato tudo bom, eu não consigo dar ping no endereço ip que eu coloco, esse o mesmo da faixa do meu roteador ex: 192.168.5.235 diz que o anfitrião de destino está inacessível . poderia me ajudar ?

    1. O problema pode ter várias causas diferentes. Para tentar identificar é necessário saber como está a sua rede. Você tem um roteador com um computador e o Ethernet Shield ligados nele? Quais os endereços IP e máscaras do computador, roteador e do Ethernet Shield? Do computador você consegue dar ping no roteador?

      [],

      Renato.

  24. Primeiramente parabéns pelo post ficou bem compreensível sua linha de raciocínio. Gostaria de saber se por acaso você teve o seguinte problema.
    Tenho uma automação residencial funcionando pela rede perfeitamente pela rede interna, PORÉM apos um tempo, caso eu pare de fazer os testes (uns 10 minutos) o” sistema” “trava” e não funciona mais o servidor web, alias não sei se “não funcionar” seria o correto, ele responde ao PING mas as funcionalidades de ligar e desligar, por exemplo, “travam” tipo não muda mais pra ON / OFF, somente caso eu reiniciar o Arduíno…ai funciona direitinho. Alguma dica ou conhecimento sobre que possa me ajudar ?

    Att Igor

    1. Não cheguei a testar esse exemplo por longos períodos de tempo. No entanto, dentro de 10 a 30 minutos não percebi nenhum tipo de travamento.

      Se o seu sistema ainda está respondendo ao ping, ele não está completamente travado. Talvez seu código tenha algum detalhe que esteja levando a esse comportamento mas eu também não descartaria a possibilidade de um defeito de hardware. Já testou o seu software com outro hardware ? Já testou o seu hardware com outro software ?

      Mande seu código nos comentários para que seja possível ter uma ideia melhor do que está acontecendo.

      [],

      Renato.

  25. Charlison Souza

    Parabéns, Renato pelo post!
    Estou usando um arduino Mega com o Shield W5100 porém quando carrego o código ele me gera a seguinte mensagem:
    avrdude: stk500v2_ReceiveMessage(): timeout (seis vezes)
    avrdude: stk500v2_getsync(): timeout communicating with programmer (uma vez)
    Quando trabalho somente com o mega, funciona normalmente.
    O que acha que pode esta ocorrendo?

  26. Danielle Cristinne

    Renato, fiz o teste de ping no roteador, funcionou
    também com o Arduino MEGA ADK e o Ethernet Shield WZ5100 ligado ao computador, funcionou também, mas se conecto o Arduino juntamente com o Internet Shield no roteador e executo o ping, a mensagem é: “Host de destino inacessível”.

    IP: 192.168.25.200 // ip atribuido ao Arduino
    Gateway:192.168.25.1 (router)
    Máscara de rede: 255.255.255.0

    Não sei mais o que fazer, os cabos estão ok, tudo funcionando, somente não consigo fazer o teste dentro da rede, aguardo uma ajuda.
    Grata

    1. Se o ping funciona quando você liga diretamente o Arduino no computador, o problema está na sua rede. Você está ligando o Arduino e o computador nas interfaces LAN do roteador? Qual é o IP que você está usando no computador?

      [],

      Renato.

  27. Olá Renato, td bem? Cara parabéns pelo post pois ajuda muita gente que está engatinhando a realizar procedimentos bastante interessantes e viáveis. Renato, me tire uma dúvida: neste seu programa de acionar led via internet, tem como trocar o link que aparece na interface por um botão na própria interface sem a ajuda de outro aplicativo? Tipo, já andei pesquisando a respeito e só encontro a solução se usar por exemplo o TouchOSC, mas tem outro caminho para aparecer um simples botão na interface? Tem alguma Tag que possa ser usada no html para esse fim? Abraço.

    1. Você pode usar um estilo diferente para seus links usando CSS, fazendo com que pareçam botões. Um exemplo desses estilos são os botões usados pelo Twitter Bootstrap (http://getbootstrap.com/css/#buttons). No entanto, acho que não vai ser possível usá-lo diretamente, porque deve ser muito grande para a memória do Arduino. Você pode escrever um CSS mínimo com base no Bootstrap só para mostrar os links como botões.

      [],

      Renato.

  28. marcus vinicius

    BOA NOITE RENATO..VOCE TERIA UM EXEMPLO DE CODIGO INCLUINDO DDNS FICTICIO PARA ACESSO PELA REDE EXTERNA.TENHO DDNS PROPRIO DE DVR.COMO COLOCAR ESSE ENDEREÇO NO CODIGO? SUBSTITUO O ENDEREÇO DE IP PELO DDNS,É ISSO?..O ACESSO LOCAL ESTA OPERANTE SEM PROBLEMA.DESDE JA MUITO OBRIGADO

    1. Oi Marcus,

      Para acessar a partir de uma rede externa, você não precisa modificar o código no Arduino. Se você já tem um endereço de DDNS com seu IP público atualizado, basta configurar seu gateway (geralmente é o seu roteador, fornecido pelo provedor) para fazer um encaminhamento de portas. No caso mais geral, você deve encaminhar a porta 80 (http) para o endereço IP interno do seu Ethernet Shield, na porta 80 (supondo que você está usando a porta 80 no Ethernet Shield).

      Entretanto existem 2 problemas em relação a esse sistema:

      1) Muitos provedores não permitem acesso através da porta 80 (em geral proibem acesso usando portas baixas, menores que 1024). Se for o seu caso, você pode contornar essa limitação usando outra porta, por exemplo, 8080 e encaminhado-a para a porta 80 do seu Ethernet Shield. Assim, você poderia acessar o seu sistema através endereço-ddns:8080;

      2) O maior problema é em relação à segurança. A partir do momento que você faz o encaminhamento de portas para o Arduino, qualquer um pode acessar o seu sistema. Além disso, é fácil para um cliente desconhecido fazer uma varredura e perceber que você tem uma porta http aberta. Na prática, você deve pensar em uma forma de autenticação segura para usar o seu sistema mas isso está um pouco além do que eu queria mostrar com esse post.

      [],

      Renato.

  29. boa noite amigo, sou iniciante com Arduino mas ja aprendi muito com vc, dês já lhe agradeço pela disposição em ajudar dividindo seu conhecimentos com todos nos.
    modifiquei seu código para minha precisão só que esta faltando um detalhe
    gostaria de ler entradas analógica e visualizar na pagina html que vc criou, como fosso isso
    esse e sketch modificado para o acionamento de tampadas

      1. Renato, exatamente desse projeto que estou precisando, uma chave no cliente acionando um relé no servidor. sou leigo no assunto, vc pode me dar algumas dicas.

      1. Boa tarde! É um projeto de automação de uma torre de internet, onde se um Acess Point parasse de transmitir sinal, o Arduino perceberá através de test de icmp,o qual o arduino irá desligar e religar os equipamentos da torre através de um relé e ainda o administrador da rede receberia uma msn do problema e pederia acessar via web o arduino e ver a tensão e a temperatura.
        Entao gostaria de unir alguns código para fazer essas funcionalidade e ainda fazer o código de mandar SMS funcionar (não consigo mandar sms), que segue no poster abaixo:
        http://pastebin.com/5RUs06RX

        1. Cara tem alguns rotiadores e tb antenas com essa função Watch Dog eu uso um rotiado que tem quando ele para de transmitir ele reniscia pra mim está funcionando !

  30. Olá Renato, uso o arduino com DRAGINO Yun shield , consigo acessar todos os relay via comando web browser do tipo http://192.168.0.107/arduino/digital/13/0 ou 1, porem gostaria de ter um html que possua botões para apagar ou acender, no shield ethernet consigo bom resultado, mas quando passa para o wifi, somente aparece o menu do dragino.quando digito o ip, agradeço se puder dar uma força ou quem puder me ajudar.

      1. DA PLACA W5100 A MESMA QUE ESTÃO UTILIZANDO NO SEU PROJETO MAS ESTE CÓDIGO QUE VOCE INDICOU ESTEJA FUNCIONANDO

  31. Oi Renato, meu nome é Fábio, em relação a esse comentário que vc fez:” configurando o roteador para fazer um redirecionamento da porta 80 para o IP associado ao Arduino “, vc teria algum tutorial para me indicar? estou com uma automação em mente para meu tcc, e precisando de ajuda.

  32. LUIZ CYPRIANO

    BOA TARDE SERIA POSSÍVEL EXPLICAR O QUE DEVE ALTERAR NO ROTEADOR PARA TER ACESSO A REDE EXTERNA – DESDE JÁ OBRIGADO – LUIZ

  33. Renato. Através desse exemplo eu consigo me comunicar com o arduino pelo meu site que está na internet? Pois preciso, por exemplo, acender um led de qualquer lugar, apenas entrando no meu site e apertando um botão. Isso é possivel?

    Desde ja grato.

    1. Sim, consegue. No entanto, você precisa ter um endereço IP fixo ou um endereço de DNS dinâmico. Além disso, se o seu Arduino estiver conectado a um provedor de internet comum (desses que oferecem serviços para residências), você vai precisar configurar o seu modem para fazer o encaminhamento das conexões. Dê uma olhada no comentário http://br.renatocandido.org/2013/09/acendendo-um-led-via-internet-com-arduino-e-o-ethernet-shield/#comment-13914

      Tendo essa configuração feita, basta você incluir um link para o endereço e porta do seu Arduino no seu site.

      []

      Renato.

  34. BOA NOITE DE NOVO ESTOU TENTANDO ABRIR UMA PORTA PARA ACESSO ESTERNO MAS NÃO ESTOU CONSEGUINDO SEGUNDO INFORMAÇÕES LIDA NA INTERNET É QUE OS PROVEDORES (VIVO) OU (NET) NÃO ESTÃO DEIXANDO ABRIR NENHUMA PORTA SE PUDER DAR UMA AJUDA EU AGRADECERIA AS PROGRAMAÇÃO NO MEU ROTEADOR JÁ REALIZEI SÓ QUE NÃO ABRE A PORTA DESEJADA QUE ESTOU PROGRAMANDO. DESDE JÁ AGRADEÇO.

    1. Eu já vi casos em que os provedores bloqueiam as portas baixas (1-1024). Tente redirecionar uma porta mais alta.

      No entanto, como já disse antes, esse redirecionamento vai te trazer problemas de segurança na sua rede. Para usar um sistema desse tipo na prática, é necessário usar uma solução mais segura (criptografia, vpn, etc).

      [],

      Renato.

      1. LUIZ CYPRIANO

        TAMBÉM NÃO FUNCIONOU TENTEI PORTAS 8000 7000 ETC ETC QUANTO A SEGURAÇÃO TUDO BEM É SÓ UM TESTE PARA OBSERVAR O FUNCIONAMENTO NÃO É NADA PROFISSIONAL QUE VAI FICAR ATIVADA POR MUITO TEMPO

        1. Você apenas precisa configurar um redirecionamento de portas. De fato, pode ser que seu provedor bloqueie várias portas para conexões vindas de fora mas geralmente as portas altas funcionam. Também pode ser que seu modem precise de alguma configuração adicional: tipo firewall ou outro detalhe de segurança. Faça uma pesquisa sobre redirecionamento de portas mencionando o modelo do seu modem, talvez você encontre algo relevante.

          BTW, novamente http://www.melhorweb.com.br/noticia/264-CAPS-LOCK-ou-CAIXA-ALTA–nao-precisa-gritar.htm

          [],

          Renato.

  35. PAULO FERNANDO CARVALHO SANTNAA

    Prezado Renato, parabéns pelo post, bastante explicativo. Porém tenho uma dúvida sobre a utilização de dois Ethernet Shields se comunicando entre si. Tenho um arduino que recebe uma mensagem via RF433 Mhz e preciso capturar essa mensagem e enviar via rede para outro arduino conectados na mesma rede.
    Voçe poderia me dar alguma dica de como enviar um comando de um arduino para outro via ethernet shield? Ou algum material que trate disso. Novamente parabéns pelas informações! Abraços!

    1. Oi Paulo,

      Em relação à recepção do dado, você deve usar o EthernetServer e o código do post pode servir de exemplo para você. Nesse caso, quando o servidor recebe uma requisição, analisa o comando recebido e acende ou apaga o led.

      Para enviar um dado usando o Ethernet Shield, você pode usar o EthernetClient (https://www.arduino.cc/en/Reference/EthernetClient). Você pode enviar a requisição ao EthernetServer usando o EthernetClient. Dê uma olhada no exemplo da página de documentação. Pretendo escrever um exemplo de uma aplicação como essa.

      [],

      Renato.

  36. Renato,

    Funcionou , porém só consigo acender e apagar o led enquanto o cabo usb do arduino está conectado. Quando tiro o cabo, não consigo acender mais. É o arduino Uno com uma placa ethernet acoplada em cima. Está alimentado por fonte externa 12v, 500ma. O que pode ser?

  37. Boa Noite, estou procurando mas não encontro nenhum tutorial de como controlar o arduino remotamente via android. Já consegui programar para controlar o arduino com app android via wifi. Estou usando o Arduino Uno + Modulo ESP8266-01. Você saberia dizer como posso controlar remotamente?

  38. Boa noite. Estou com uma duvida, quando ligo o cabo de rede no arduino e no notebook o led ja acende mas quando chamo o programa pelo navegador funciona normal. Quando ligo o arduino no roteador o led acende de depois de alguns segundo o led começa a piscar e mesmo usando o dyndns nao consigo acessar o arduino, saberia me dizer porque o led começa a piscar e não consigo acessar pelo roteador?

    1. Paulo, o Renato respondeu no inicio que alguns provedores bloqueiam a porta 80. Sugiro usar como porta externa a 8080 e redireciona pra 80 do seu arduino através do seu router na função ‘Port Forward’

  39. Renato, Li o artigo e alguns comentários interessantes. Gostaria de saber como vejo o “estado” de um led ou saide digital ou qualquer outra coisa no sentido On e Off antes de definitivamente mandar ligar ou desligar.

    1. Se você quiser ler o estado dos pinos via requisição HTTP, você vai ter que implementar algum esquema de resposta do Ethernet Shield para retornar o valor, por exemplo, via JSON.

      Há um tempo atrás, fiz um projeto (que na verdade foi a compilação de dois projetos já existentes) para possiblitar a leitura e a modificação do estado de pinos do Arduino usando requisições REST. Para a leitura, o Arduino responde com um JSON, contendo o valor dos pinos digitais ou analógicos. O código é bem mais complicado do que esse do post mas acho que vale a pena você dar uma olhada. Está disponível em https://github.com/renatocan/arduino_rest

      [],

      Renato.

  40. Bom dia Renato,
    Tenho o Arduino Uno e comprei recentemente o Shield Ethernet W5100, e o módulo de relés com 4 .
    Bem, meu projeto é controlar um microondas via android, sendo que o relé 1 vai acionar o número 1 do microondas, o relé 2 vai acionar o 3, o relé 3 vai acionar o zero e o quarto relé vai acionar o liga do microondas.
    Preciso de umas dicas para colocar meu projeto em funcionamento, já tirei a membrana do microondas e tenho os contatos 1,3,0 e liga.
    Aguardo contato, Rene.

    1. Oi Rene,

      Acho que há duas coisas principais que você vai ter que resolver:

      – Se você quer controlar o projeto via Android, você vai precisar escolher uma forma de comunicação entre o app Android e o Arduino. Uma ideia é fazer algo muito simples, como apresentado neste post, usando query-strings para identificar os comandos enviados pelo Android e, a partir disso, acionar os relés conforme você deseja (imagino que, com esse shield de relés, o acinonamento dos relés possa ser feito de forma idêntica ao acionamento dos leds neste exemplo);

      – Você tem que dar um jeito de ligar os relés no painel do microondas (não sei se você já resolveu isso). Essa é a parte mais complicada e vai depender do seu talento com hacking 🙂

      Você já definiu como vai fazer essas coisas?

      []’s

      Renato.

  41. ola gostaria de ligar um modulo rele de 8 canais e um modulo ponte H para controlar motor de passo via internet. Estou começando em arduino nao tenho muito conhecimento, vc poderia me ajudar

  42. Bom dia Renato, Desenvolvi uma programação para comandar vários dispositivos em minha casa enviando o comando ao Arduino via app OSC. A minha dificuldade é que os comandos enviados para os dispositivos ligados ao pinos 10 a 13 não foram aceitos, somente deu certo para os dispositivos ligados aos pinos 0 a 9, existe alguma diferença entre os pinos 0 a 9 e 10 a 13?

  43. Estou com um problema com o meu shield W5100.

    Estou usando com o arduino uno, O problema é que ao conectar o shield no roteador, nada acontece apenas a luz de energia fica ligada pois já está plugado ao arduino que esta sendo energizado pelo USB do meu pc.

    Testei o conectando ao meu notebook que esta utilizando a rede wifi e compartilhei com o w5100, e funcionou corretamente, mais quando conecto ao roteador nada acontece.

    Testei com um roteador Gothan gwr-100 e com um TP-LINK TL-WR747N. nenhum funciona!

    Oque pode ser?

    1. É difícil de identificar o problema sem olhar mais de perto 🙂

      Você está conectando na LAN do roteador? Que cabo você está usando, direto ou crossover?

      [],

      Renato.

  44. Olá Renato, primeiramente queria agradecer o Post que esclareceu muitas duvidas, porém restou uma, fiz uma automacao residencial com o Arduino uno e utilizei praticamente todas as portas digitais exceto as portas(10,11,12 e13) , tive até que utilizar um módulo i2c para o lcd com intuito de economizar portas digitais. Porém faltou acender apenas um LED e tento ligar ele na porta 8 a única restante,porem ela não funciona. Medi com multímetro e ela nao altera o estado ,a tensão fica sempre em 0,689 ao dar o comando. Sabe o pq isso pode estar acontecendo?
    Obrigado pela ajuda

  45. É possível controlar o Arduíno a partir de uma outra rede tendo acesso a todos os dados?
    P.E. ligar e desligar as luzes de um local não estando conectado na mesma rede que o arduino?

    1. Oi Pablo,

      Acho que seu código tem uns problemas em relação aos blocos dos ifs (as partes que começam com { e terminam com }). Dei uma olhada rápida e me parece que if(readString.indexOf("?ledon1") > 0) acabou ficando dentro do if(readString.indexOf("?ledoff") > 0).

      Outra coisa que pode dar problema são os nomes identificadores que você está usando. O indexOf está verificando se existe a substring usada para identificar o led dentro da string de requisição (readString). Usar “ledon” e “ledon1” não é uma boa ideia pois um contém o outro e isso vai acabar dando problema na lógica de identificação dos leds. Procure usar nomes que não contenham os outros, como led1on e led2on, por exemplo.

      [],

      Renato.

  46. Obrigado pelas dicas, mas ainda não consegui os dois botoes acende e apaga o mesmo led !
    poderia visualizar o post e comentar uma solição para a separação dos acionamentos dos leds separadamente ???

    segue meu script abaixo postado no pastbin

    http://pastebin.com/bUxnH42H

    OBS. Sou leigo na parte de Programação !

    Por isso estou apanhando com erros simples mas caso consiga desvendar o misterio de inserir mais um botão o restante é só seguir o a logica dos outros criados !

  47. Oi,
    eu fiz tudo que está no post e quando tento acessar o endereço, ele acusa que a página não pode ser exibida.
    Tanto quanto eu conecto o ethernet no roteador, quanto no notebook
    Você tem ideia do que posso fazer?

    1. O problema pode ter várias causas diferentes. Para tentar identificar é necessário saber como está a sua rede. Quais os endereços IP e máscaras do computador, roteador e do Ethernet Shield? Do computador você consegue dar ping no roteador?

      [],

      Renato.

    1. Sim, é possível. A diferença é que o módulo W5100 tem toda a pilha TCP implementada em hardware enquanto que, com o módulo ENC28J60, você vai precisar implementar grande parte da pilha TCP via software. Eu nunca usei o ENC28J60 mas vi que existe uma biblioteca que implementa a parte de controles TCP e permite usar o módulo praticamente da mesma forma que fizemos com a biblioteca nativa do Ethernet Shield. Ela está disponível em https://github.com/ntruchsess/arduino_uip. Dê uma pesquisada e você deve encontrar exemplos de implementação de aplicações desse tipo com essa biblioteca.

      [],

      Renato.

  48. Bom dia
    Fiz um projeto parecido com o seu, porém utilizo um servidor apache e PHP no linux no lugar do próprio arduino como servidor web, o meu problema é que sempre que o conjunto do arduino e o modulo ethernet ficam sem energia, o modulo ethernet perde as configurações, quando a energia volta eu não consigo mais pingar o IP do modulo, existe alguma maneira de salvar permanentemente essas configurações, mesmo sendo em cartão SD? Como faz isso?
    Obrigado.

    1. Oi Alex,
      Que configurações que você deseja salvar permanentemente? As configurações de rede (IP e endereço MAC) já são salvas permanentemente na memória de programa, se você estiver usando algo parecido com o exemplo. Como está estruturado seu projeto? O que está rodando em php no Linux e o que está rodando no Arduino?

      [],

      Renato.

  49. Quanto ao problema do Liga/Desliga parar de funcionar, por aqui acontece o mesmo…. Quando roda ICMPPing junto ao ethernet como webserver, para de funcionar o webserver. Acredito q seja algum tipo de incompatibilidade da biblioteca Ethernet.h com a ICMPPing.h…

  50. Ottoniel Matheus

    Cara, você me salvou…estava com muitas dificuldades, não achava um tutorial simples como esse…Acabava que eu não conseguia fazer o teste e ficava muito confuso. Mas você deu um fim a isso, MUITO OBRIGADO!

  51. Alexssandro Pedro da Silva

    Boa noite, Tenho 2 arduino com ethernet shield W5100, quero ligar um led no arduino mestre em uma porta digital de acordo com a leitura de um sensor que estará no arduino escravo na minha rede LAN.
    Qual seria o caminho para enviar pro mestre ligar o led?
    Obrigado.

    1. Se você quiser aproveitar o código da postagem para o Arduino mestre, você pode programar o Arduino escravo para mandar requisições HTTP para o mestre quando o sensor for ativado. Há um exemplo sobre como fazer isso em https://www.arduino.cc/en/Reference/EthernetClient. Você só vai precisar ajustar o endereço IP ao qual vai se conectar e a URL da requisição. No caso do código da postagem, é necessário fazer requisições para /?ledon e /?ledoff (GET /?ledon HTTP/1.0 e GET /?ledoff HTTP/1.0).

  52. Sidney Batista Meles

    Boa tarde renato, muito bom seu post!!!

    Gostaria de saber se tem alguma outra forma de “comunicação” entre a página e o arduino? atualmente, só da pra “mandar” fazer algo e “receber” alguma informação pela barra de endereço, porém a limitações nesse método. Gostaria de receber algumas informações sem ter q atualizar a página, tipo um contador de tempo, um censor de tensão, de temperatura, passar todas essas informações pela barra fica meio complicado. Tem alguma ideia do q fazer???

    1. Oi Sidney,

      Há diversas formas de obter e enviar informações para um Arduino usando a web. Acho que a abordagem usada nesse exemplo (usando o Arduino para servir uma página diretamente) é a mais simples. No entanto, você poderia usar algum dispositivo intermediário, para servir a página web pela rede e comunicar com o Arduino de outra forma, pela serial, por exemplo.

      Acho que esse exemplo simples realmente tem limitações mas o uso do navegador não é uma delas. Atualmente, o protocolo HTTP é muito usado para comunicação entre sistemas, não envolvendo necessariamente o uso do navegador. Dê uma olhada nas APIs das redes sociais, por exemplo. Você vai notar que a maioria usa o REST (https://en.wikipedia.org/wiki/Representational_state_transfer), que funciona com HTTP.

      Usando a mesma arquitetura desse exemplo, é possível enviar informações de uma variável armazenada no Arduino (um contador, por exemplo) e, para atualizar a página automaticamente, você poderia implementar um código javascript na resposta enviada pelo Arduino. Também é possível fazer o acionamento (por exemplo do led desse exemplo), fazendo uma requisição HTTP sem usar um navegador, usando o curl (https://curl.haxx.se/), por exemplo.

      []’s

      Renato.

  53. JEFFERSON PEREIRA DE ALMEIDA

    Parabéns amigo. Muito bom o seu post. Me ajudou muito em um projeto da faculdade. Consegui entender com clareza como funciona o ethernet shield e toda a programação .Fiz um projeto de automação residencial em meu tcc, porém estava com duvida em uma parte da programação, porém sua publicação esclareceu muita coisa , valeu. Show de bola !!!

Deixe um comentário de resposta para Charlison Souza

Clique aqui para cancelar a resposta.

XHTML: Você pode usar as tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>