SHIELD - LENDO URL

Prezados, antes de colocar este post andei pesquisando no fórum, porém não encontrei um tópico que me ajudasse realmente. A situação é a seguinte: Estou desenvolvendo um projeto para a faculdade, nesse primeiro momento preciso enviar uma informação do sistema WEB para o arduino. O sistema que estou desenvolvendo é em Grails, como posso pegar uma informação? através da URL com?

Percei que o arduino quando acesso o sistema ele faz o papel de navegador, ler os dados HTML. Porém preciso passar para o arduino uma informação, tipo 0 ou 1.

Desde já agradeço.

Emerson Alencar

Se fores à pasta de exemplos do Arduino tens um exemplo para colocá-lo como cliente (ou seja como um browser) e um exemplo de como colocá-lo como servidor (acedes ao Arduino através do teu browser no computador).

Concordo que a pesquisa do fórum é má... mas uma pesquisa na net devolve resultados suficientes sobre como fazê-lo. Olha aqui:

http://bildr.org/2011/06/arduino-ethernet-pin-control/

Não percebi o que era o Grails... ou o que é a linguagem de programacão groovy e assumo que JVM seja Java Virtual Machine. Nesse campo, infelizmente, não te consigo ajudar.

Experimenta estes exemplos que meti em cima e vê se já serve para o que pretendes. Experimenta primeiro com um browser e/out tenta aceder a um servidor externo e depois interliga com o tal Grails.
Se tiveres mais dúvidas, coloca aqui.

Prezado bubulindo, muito obrigado pela resposta. A minha situação é a seguinte, no exemplo 2 que você me sugeriu, o próprio arduino é a página que tem os valores a serem passados. Porém eu preciso que o servidor seja um outro computador, um outro endereço.

Atenciosamente,

Emerson Alencar

Então, precisas de usar o exemple WebClient.

Tem lá tudo o que necessitas para ligares o arduino a um servidor.

É isso mesmo, preciso me conectar a um servidor. O problema é que eu preciso pegar uma informação desse servidor, tipo "On" ou "Off", para ligar ou desligar o LED.

Os exemplos que vejo a página HTML está no próprio Arduino, mas eu quero que o arduino acesse uma URL e pegue essa informação. Entende? Não sei como fazer isso.

Se calhar o meu

bubulindo:
o exemplo WebClient.

é diferente do teu... no meu caso, eu ligo-me a um dos servidores do google, peco para fazer uma pesquisa por Arduino e devolvo os resultados para o ecrã.

Se não tens o exemplo, fica aqui:

/*
  Web client
 
 This sketch connects to a website (http://www.google.com)
 using an Arduino Wiznet Ethernet shield. 
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 
 created 18 Dec 2009
 modified 9 Apr 2012
 by David A. Mellis
 
 */

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

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(173,194,33,104); // Google

// Initialize the Ethernet client library
// with the IP address and port of the server 
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;

void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for(;;)
      ;
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /search?q=arduino HTTP/1.0");
    client.println();
  } 
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop()
{
  // if there are incoming bytes available 
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    for(;;)
      ;
  }
}

Agora, se trocares o servidor pelo que estás a usar agora... e a página pela página que pretendes acessar... consegues algum resultado. Depois apenas tens de ler e fazer parsing da string.

Estás a ver o que eu estou a dizer?

Tenho duas dúvidas:

  1. Meu arduino não está numa rede com DHCP, como faço para colocar um IP estático nele?

  2. Após ler a página como colocar a informação dentro de uma variável?

1: Ethernet - Arduino Reference

2: Que é que a página vai enviar? Já fizeste string parsing nalguma linguagem?

Prezado bubulindo,

Pronto Já coloquei o IP Fixo no arduino e estou conseguindo pingar nele.

Poderia me dá um exemplo de como fazer string parsing??

Emerson Alencar

Hmmm...

Estou a ver que programação não é o teu forte, então em vez de fazer um exemplo à sorte que em nada te irá ajudar, que tal se meteres aqui o que a página web vai devolver para o Arduino fazer string parsing e eu coloco um código que o faça para experimentares?

Prezado Bubulindo,

Na verdade sou estudante, e estudo programação a pouco tempo, alguns termos ainda não novos para mim.

Bom estou anexando uma tela. Tem um botão ligar e outro desligar. Quero quando apertar o ligar ele envie ao arduino uma informação tipo: "ON" e o Arduino recebendo essa informação ele irá ligar o led. Para ligar o led, essa parte eu sei fazer, o problema é como pegar esse ON e colocar em uma variável. Não estou fazendo o sistema em PHP, estou fazendo em GRAIL (groovy=java).

Porém todos os exemplos que vejo, a página em HTML está dentro do arduino, mas o que eu quero é que um site externo possa passar essa informação ao arduino.

Já consegui que o arduino leia a minha url, só que a palavra "ON" aparece lida pelo arduino, mas como armazena-la numa variável??

Desde já muito obrigado!

O Arduino vai aceder a um servidor... e esse servidor vai enviar algo para o Arduino.

Isto pode ser simulado com um browser e é isto que eu queria ver. Texto...

Já tens essa parte a funcionar?

SIm...

O arduino já consegue ler .. como um Browser ....

Já tenho isso ..

Este é meu código do Arduino que ler minha página:
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0x00, 0xAB, 0xCB, 0xCD, 0xDE, 0x02 };
IPAddress ip(189,80,213,213);
//IPAddress server(173,194,70,103);
IPAddress server(189,80,213,210);
EthernetClient client;

void connect(){
if (client.connect(server, 80)) {
Serial.print("Make a HTTP request ... ");

//client.println("GET /search?q=arduino HTTP/1.0");
client.println("GET /projeto/ControleLed/receberEstadoAtual/");

//client.println("HOST: 189.80.213.210");
client.println();

Serial.println("okk");

}
else {
// kf you didn't get a connection to the server:
Serial.println("connection failed");
}

}

void setup() {
Serial.begin(9600);

Serial.print("Setup LAN ... ");
// give the Ethernet shield a second to initialize:
delay(1000);
Ethernet.begin(mac, ip);
Serial.println("oks");
delay(1000);

connect();

}

void loop(){

if (client.available()) {
char c = client.read();
Serial.print(c);

}

// if the server's disconnected, stop the client:
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();

delay(3000);

connect();
}

}

E o que é que aparece no serial monitor quando corres este código?

Então, quando eu executo esse código no serial monitor aparece o conteúdo html que eu quero, porém esse conteúdo eu quero colocar dentro de uma variável.

Na minha página, eu faço um if onde a página me retorna 1 ou 0, esse valor aparece no serial monitor,aparece na página (html), porém eu gostaria de colocar esse valor dentro de uma variável.

Como faço??