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
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....
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.
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".
#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(;;)
;
}
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?
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.
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;
}
}
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
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...
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.