Arduino webclient + php

Bom galera, esse é o meu primeiro post no forum mas venho acompanho a bastante tempo.

Bem eu estou tentando fazer um datalogger com o ethernet shield gravando num pc como servidor com o wamp server instalado.
Eu fiz um codigo php no dreamweaver para captar o dado enviado pelo arduino e depois esse codigo grava em um arquivo txt.

A principio percebo que a conexão está certa mas o dado que o arduino envia não vai pro php ou então o arduino não está enviando o dado.
E tambem comecei usando um txt pq é mais facil de se ver o resultado, depois penso em colocar os dados num banco mysql.

E ae galera me deem um help já estou ficando frustrado e achando que esse ethernet shield já nem me tem tanta utilidade mais assim.

Se incluísses algum código aqui no post, seria mais fácil perceber o que estava a correr mal...
Já experimentaste correr o php ligado por um ficheiro .html para ver se o código php está correcto?

Se o código .php estiver correcto, então o problema pode estar na maneira como o Arduino está a aceder ao servidor.

Estás a utilizar o protocolo HTTP correctamente para fazer o pedido ao servidor?
A maneira de fazer isto é, ligares-te ao servidor php e depois enviar uma mensagem deste género:

POST /test.php HTTP/1.1;
Host: O_Nome_do_teu_host
Content-Length: (tamanho da mensagem sem parêntesis) Content-Type: application/x-www-form-urlencoded
Connection: Close
dado1=teste&dado2=ethernet

Neste caso, o tamanho da mensagem seria 26.

Depois no ficheiro .php deves fazer isto

$dado1 = $_POST["dado1"];
$dado2 = $_POST["dado2"];

para passares os valores do arduino para o .php.

Podes utilizar o método get, mas não será tão seguro... eu como estou a utilizar um servidor externo, prefiro POST.

Depois convém ler o que o script php gerou, se é que gera algo, para ver o que se passou.

Existem exemplos disto na net também. :\

Se meteres o código aqui, certamente será mais fácil de ajudar.

Gabriel, abre um wireshark e ve se ta sendo enviado ou ñ.

Bubu, tanto get qto post vão em plain text, sem SSL a segurança eh a mesma.
O que muda eh quantidade de dados, 65k por post e ne me lembro mais qts chars por get....

Pode ser que este post te ajude:

Valeu a força gente, eu não postei o codigo pq estou no trabalho quando chegar em casa a noite eu posto o codigo que estou usando e aproveito e testo esse codigo que o bubu passou.

Quanto ao wireshark, como que eu uso isso nofxx?

valeu a força pessoal

Wireshark eh um dumper de pacotes. Coloque um filtro tcp , na porta q vc o servidor ta escutando e o arduino enviando.
Vc verá tudo q tá acontecendo.

Uma outra opção (a q uso aqui), somente essas linhas de Ruby:

module DuinServer
def receive_data(data)
puts "Recebi #{data}. Posso fazer o q eu quiser agora fácil..."
end
end

EM.run do
EM.start_server 'localhost', 5000, DuinServer
end

Isso liga um servidor tcp ruby na porta 5000, e imprime qql coisa q vc enviar do arduino.
Nao precisa de apache/nginx, server nenhum...
Nao tem q preocupar com header html e nada, soh dados.

Outra opção excelente eh a mesma coisa com node.js, quiser posto o codigo.
Tanto node qto ruby são alternativas pra lá de superiores à php.
Se vc ver como grava e le dados de qql banco com ruby entao, vc apaixona. Veja o "ActiveRecord".

O codigo que estou usando é este aqui

#include <SPI.h>

#include <Ethernet.h>


// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168, 254,8 };
byte server[] = { 192,168,254,4 };

// variaveis a serem usadas para gravação
int valor = 10;

// 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):
Client client(server, 80);

void setup() {
  // start the Ethernet connection:
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
  delay(500);
  Serial.print("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect()) {
    
    Serial.println("connected");
    delay(00);
    // Make a HTTP request:
    
  } 
  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:
  for (int i = 0; i < 3; i++){
    if (client.connected()) {
      client.print("GET http://localhost/index1.php?dado=");
      client.print(valor);
      client.print(" HTTP/1.1");
      client.println();
    }
  }
  Serial.println("disconnecting.");
  client.stop();
  for(;;)
  ; 
}

e o php

<?php
      $VALOR = $_GET['dado'];
      $novoarquivo = fopen("..\www\dados.txt", "w+");
      $quebra = chr(13).chr(10);              
    fwrite($novoarquivo, $VALOR.$quebra);
      fwrite($novoarquivo, "DONE!".$quebra);
      fclose($novoarquivo);
?>

acho estranho pq eu já vi um monte de codigos, faço tudo igual mas não dá certo.

nofxx - achei interessante esse ruby, o codigo simples e interessante, mas como ficaria o codigo no arduino para acessar o codigo do ruby. Eu vou estudar sobre essa linguagem, principalmente essa parte mesmo de banco de dados. Onde tem bons tutoriais nessa area para essa linguagem?

bruno - na verdade cara eu queria um acesso como o bubu postou e não por serial. Eu estou usando o ethernet shield e queria usar o arduino como web client.

Rapaz o ruby já tá rodando aqui no pc, eu não conhecia esse tipo linguagem não, tive até dificuldades de visualizar como seriam os codigos e tudo mais.
Eu já sou formado em programação mas não conhecia esse tipo não, eu estou acostumado a programar no codeblocks, devcpp esses que tem uma interface. Mas vou me acostumar pq achei muito interessante.

Vou começar a estudar essa parte de manipular o db pelo ruby, depois eu acho que a comunicação com o arduino é mais simples do que com servidor e http.

valeu a dica ae nofxx, é mt bom que agora eu agrego mais conhecimento. E quem sabe eu me aprofunde mais nessa linguagem.
E como que fica o arquivo .pde do arduino?

Os IPs estão correctos?

Estás a utilizar um servidor caseiro, né?

Experimenta colocar um echo "ok"; no php e depois de teres feito o request no Arduino, vê se existe uma resposta do script php e envia a resposta por porta série.

Que é isto?

delay(00);

E para que fazes 3 pedidos?

for (int i = 0; i < 3; i++)

O meu code é pra lib do WiServer (wifi), ñ usei ethernet ainda. Teu shield eh Wiznet?
Esse code seu funciona tb, nao eh mais necessário print GET, HTTP.. enfim headers.
O protocolo é todo seu.

E adicionando às perguntas do bubu:
Pq conectar no setup?
Vc deveria conectar em cada request...e desconectar depois.
Eh melhor trabalhar com tcp sem que o socket fique conectado:
Handshake -> request -> response -> fecha conexão.
Faz isso toda hora, nao rola handshake no setup e ficar enviando no loop!
Ai seria um 'websocket', stream... ou seja, ñ fecha.
Pra isso melhor usando node/erlang/eventmachine no ruby...

Como eu faco p/ 5 em 5 segundos:

void loop() {
  if (millis() >= updateTime) {
    post_stuff.submit(); // aqui q envia o post
    updateTime += 5000; 
  }
}

Vamos lá

quanto ao delay(00) foi um erro que eu não havia reparado. E o for é pq eu estava fazeno somente um teste, então queria que escrevesse no txt 3 vezes. E os ips estão certinhos.

Agora quanto ao shield é o wiznet sim, é um shield que comprei da dfrobot.
Essa questão da conexão no setup eu não tinha pensado nisso. Eu vou mudar ela pro loop mesmo.
Agora eu achei o ruby interessante, vou tentar aprender mais sobre ele e fazer a conexão por ele.

E uma outra pergunta, eu vejo sempre esses logs pelo ethernet shield a galera usando um tempo de 5 em 5 seg, 10 em 10 seg, etc. Para o meu uso isso seria muito lento e eu não tinha parado para pensar nisso. Será que um log pelo ethernet shield me daria uma taxa de amostragem grande o suficiente, tipo uns 10 a 20 amostras por segundo.
Já está a caminho um datalogger shield da adafruit ele deve me servir melhor, mas mesmo assim vou ver se uso o ethernet shield para descarregar os dados

tipo uns 10 a 20 amostras por segundo.

Provavelmente queres uma ligação UDP... mas isso envolve muito mais do lado do servidor.

Realmente, em udp vc necessita de mto menos pacotes, logo dá pra trabalhar numa frequencia maior.

Mas tcp mantendo o socket aberto pode ser uma opcão tb.
Do lado do server é mamão com eventmachine ou node.js.
Agora do lado do arduino tem q ver se ele mantem o socket aberto, roda tudo e consegue voltar no loop imprimindo mais...

Depois conta p/ gente se funcionou ! =D

Valeu pessoal, agora tenho bastante informações, final de semana vai ser bom ;D

Agora qto ao udp eu fico pensando na integridade dos dados, eu acho que ele não dá a confiabilidade do tcp, mas vou fazer testes, pq nesse caso eu preciso de uma taxa de amostragem boa.

Qd conseguir algum progresso eu posto aqui

atualizando ... 12:50

nofxx - consegui fazer o arduino se comunicar com o ruby e enviar dados, coisa que eu não tinha conseguido com php. Agora me animei é um pequeno progresso mas já foi suficiente pra me fazer animar.

agora é estudar essa parte udp e tentar aplicar ao que estou precisando. Depois eu passo ao mysql.

valeu