[RESOLVIDO ufa...] Problema ao ler página web com Ethernet Shield
salve pessoal,
estou quebrando cabeça, e realmente não sei onde posso estar errando.
tenho um arduino mega 2560 com um ethernet shield. nele eu uso com sucesso o servidor web, em que com o no ip consigo me conectar no arduino e enviar alguns comenados.
porém agora preciso fazer o arduino ler uma página web de tempos em tempos, porém o arduino consegue se conectar, mas não retorna nenhuma leitura da página. abaixo os trechos de código que são relevantes ao caso. o método que efetua leitura é o notificaip.
o problema está neste trecho de código. ambas instruções clientip.connected() e clientip.available() sempre retornam falso, independente tempo que espero (já coloquei o numt com 10000).
while((!clientip.connected() || !clientip.available()) && numt<100) {
serial.print(f("espera dados"));
serial.println(numt);
delay(1);
numt++;
}
while (clientip.connected() || clientip.available()) {
c = clientip.read();
serial.print(c);
}
será que alguém consegue me ajudar?
estou quebrando cabeça, e realmente não sei onde posso estar errando.
tenho um arduino mega 2560 com um ethernet shield. nele eu uso com sucesso o servidor web, em que com o no ip consigo me conectar no arduino e enviar alguns comenados.
porém agora preciso fazer o arduino ler uma página web de tempos em tempos, porém o arduino consegue se conectar, mas não retorna nenhuma leitura da página. abaixo os trechos de código que são relevantes ao caso. o método que efetua leitura é o notificaip.
o problema está neste trecho de código. ambas instruções clientip.connected() e clientip.available() sempre retornam falso, independente tempo que espero (já coloquei o numt com 10000).
while((!clientip.connected() || !clientip.available()) && numt<100) {
serial.print(f("espera dados"));
serial.println(numt);
delay(1);
numt++;
}
while (clientip.connected() || clientip.available()) {
c = clientip.read();
serial.print(c);
}
será que alguém consegue me ajudar?
code: [select]
//freememory
#include <memoryfree.h>
//incluir modulos ethernet
#include <spi.h>
#include <ethernet.h>
//incluir modulo sd
#include <sd.h>
//sensor temperatura
#include <dht.h>
// size of buffer used capture http requests
#define req_buf_sz 20
//variaveis ethernet
byte mac[] = {
0xde, 0xad, 0xbe, 0xef, 0xfe, 0xed };
ipaddress ip(192,168,0,177);
byte subnet[] = {
255, 255, 255, 0 };
byte gateway[] = {
192, 168, 0, 1 };
ethernetserver server(80);
char http_req[req_buf_sz] = {0}; // buffered http request stored null terminated string
char req_index = 0; // index http_req buffer
ethernetclient clientip;
unsigned long horanotip;
//variaveis sd
//## declacao dos pinos inicio
//pinos sensor temperatura e humidade
const int pintemp = a8;
//pino sd
const int pinsd = 4;
//pin leds
const int pinledamarelo = 6;
const int pinledverde = 7;
//pinos dos reles
const int pinrele1=22;
//pino buzzer
const int pinbuz=30;
//## declacao dos pinos fim
//##declaracao dos estados dos reles
int strele1=0;
unsigned long horaacionarele;
//led de aviso funcionamento
int stledamarelo=0;
unsigned long horaledamarelo;
//declara sensor de temperatura
dht dht(pintemp, dht11);
int valtemperatura=0;
int valtempmax=0;
int valtempmin=50;
int valhumidade=0;
int valhummax=0;
int valhummin=100;
unsigned long horaleituratemp;
void setup() {
serial.begin(9600);
serial.println(f("iniciando dispositivo"));
iniciapinos();
digitalwrite(pinledverde, high);
//apito inicial
tone(pinbuz,1500);
delay(700);
notone(pinbuz);
digitalwrite(pinledverde, low);
digitalwrite(pinledamarelo, high);
//inicia variaveis de controle de intervalo de tempo
horaacionarele=millis()-500;
horaleituratemp = 0;
horaledamarelo=millis()-100;
horanotip=millis();
serial.println(f("iniciar ethernet"));
iniciaethernet();
digitalwrite(pinledamarelo, high);
serial.println(f("iniciar cartao sd"));
if (!iniciasd()) {
serial.println(f("erro: sd nao inicializado"));
tone(pinbuz,600);
delay(1000);
notone(pinbuz);
return;
} else {
digitalwrite(pinledamarelo, low);
}
serial.println(f("iniciar valores max min"));
iniciavaloresmaxmin();
serial.println(f("iniciar sensor de temperatura"));
dht.begin();
lersensorhumidadetemperatura();
digitalwrite(pinledamarelo, low);
serial.println(f("notificar ip"));
notificaip();
serial.println(f("dispositivo inicializado"));
serial.print(f("memoria disponivel inicio: "));
serial.println(freememory());
}
void loop() {
loopethernet(); //controle requisições servidor web
lersensorhumidadetemperatura();
//notificar ip
if (comparatempo(horanotip)>=15000) {
notificaip();
}
serial.print(f("memoria: "));
serial.println(freememory());
}
//notificar alteracao de ip ao servidor
void notificaip() {
if (clientip.connect("http://minhacasa.bonino.com.br",80)) {
serial.println(f("not ip"));
clientip.println("get /com/notip.ashx http/1.0");
clientip.println("host: minhacasa.bonino.com.br");
clientip.println();
char c;
int numt=0;
//esperar dados servidor
//o problema começa aqui. ambas instruções clientip.connected() e clientip.available() sempre retornam falso, independente tempo que espero (já coloquei o numt com 10000).
while((!clientip.connected() || !clientip.available()) && numt<100) {
serial.print(f("espera dados"));
serial.println(numt);
delay(1);
numt++;
}
while (clientip.connected() || clientip.available()) {
c = clientip.read();
serial.print(c);
}
serial.println(f("fim"));
serial.println(f("desconectando"));
clientip.stop();
} else {
serial.println(f("erro not ip"));
}
horanotip=millis();
}
acho que descobri o problema. creio não ser possível usar o ethernet shield como servidor e cliente ao mesmo tempo.
quando inicio o ethernet da forma abaixo, o cliente não conecta.
ethernet.begin(mac, ip, gateway, subnet);
agora, se mudo chamada método, o cliente funciona, mas o server para de funcionar:
ethernet.begin(mac);
outro detalhe, para tornar conexão estável, tive que aumentar o timeout client.connec(server,80). (http://forum.arduino.cc/index.php/topic,49401.0.html)
incluindo os trechos abaixo no código:
#include <utility/w5100.h>
e logo após o ethernet.begin:
w5100.setretransmissiontime(0x2710);
w5100.setretransmissioncount(5);
alguém tem alguma luz sobre como fazer o ethernet shield funcionar como cliente e servidor simultaneamente?
abraços,
ricardo
quando inicio o ethernet da forma abaixo, o cliente não conecta.
ethernet.begin(mac, ip, gateway, subnet);
agora, se mudo chamada método, o cliente funciona, mas o server para de funcionar:
ethernet.begin(mac);
outro detalhe, para tornar conexão estável, tive que aumentar o timeout client.connec(server,80). (http://forum.arduino.cc/index.php/topic,49401.0.html)
incluindo os trechos abaixo no código:
#include <utility/w5100.h>
e logo após o ethernet.begin:
w5100.setretransmissiontime(0x2710);
w5100.setretransmissioncount(5);
alguém tem alguma luz sobre como fazer o ethernet shield funcionar como cliente e servidor simultaneamente?
abraços,
ricardo
Arduino Forum > International > Portugues > [RESOLVIDO ufa...] Problema ao ler página web com Ethernet Shield
arduino
Comments
Post a Comment