[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?

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


Arduino Forum > International > Portugues > [RESOLVIDO ufa...] Problema ao ler página web com Ethernet Shield


arduino

Comments

Popular posts from this blog

VIDIOC_S_FMT error 16, Device or resource busy - Raspberry Pi Forums

using a laptop skeleton to build a pi laptop - Raspberry Pi Forums

Forum for Joomla? - Joomla! Forum - community, help and support