arduino + shield W5100 travando

ola,
consegui fazer a comunicação delphi -- arduino, fazendo um browser dentro do meu programa (ultilizando soket internet).
ae apareceu outro problema é seguinte o arduino trava, as vez funciona horas, dias...; e as vez segundos, então trava. Nao consigo nem pingar, volta a pingar quando reset arduino e as vez também necessário reset roteador, já outras vez necessário reset varias vez ate uma hora ele conseguir pingar.
Sera incompatibilidade com o roteador? estou com 2 arduino + shield ethernet. uso para controlar reles. (ex1.: 192.168.1.50/r1on … ex2.: 192.168.1.50/r1off …. ex3.: 192.168.1.60/r15on…. )
sera programação?? Na rede (192.168.1.50 e o 192.168.1.60) um deles trava muito mais que o outro (na verdade o 50 quase não trava)
A programação é a mesma nos 2 arduinos, mudando apenas o endereço IP.
(já troquei um pelo outro, mudando apenas a programação de um no outro) (problema de hardware esta descartado, pois coloquei um 3º kit e mesmo assim ele trava)
Ruim porque quando trava desliga os reles que estavam ligados quando reset.

Programação é o mais provável... Mete aqui o programa.

Nao sei como colocar codigo aqui.


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

byte mac[] = {
0xDB, 0xAD, 0xBC, 0xEF, 0xAE, 0xEC };
IPAddress ip(192,168,1,60);
byte gateway[] = { 192,168,1, 1 };
byte subnet[] = { 255, 255, 255, 0 };

EthernetServer server(80);

const int rele1 = 2;
const int rele2 = 3;
const int rele3 = 4;
const int rele4 = 5;
const int rele5 = 6;
const int rele6 = 7;
const int rele7 = 8;
const int rele8 = 9;
const int rele9 = A0;
const int rele10 = A1;
const int rele11 = A2;
const int rele12 = A3;
const int rele13 = A4;
const int rele14 = A5;

void setup() {

Serial.begin(9600);
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();

pinMode(rele1, OUTPUT);
pinMode(rele2, OUTPUT);
pinMode(rele3, OUTPUT);
pinMode(rele4, OUTPUT);
pinMode(rele5, OUTPUT);
pinMode(rele6, OUTPUT);
pinMode(rele7, OUTPUT);
pinMode(rele8, OUTPUT);
pinMode(rele9, OUTPUT);
pinMode(rele10, OUTPUT);
pinMode(rele11, OUTPUT);
pinMode(rele12, OUTPUT);
pinMode(rele13, OUTPUT);
pinMode(rele14, OUTPUT);

}

void loop() {

EthernetClient client = server.available();
if (client) {
Serial.println("new client");

boolean currentLineIsBlank = true;
String vars;
int varOnOff = 0 ;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.print(c);

vars.concat(c);

 if ( vars.endsWith(  "r1on" ))
          {    
           varOnOff = 1 ;
                        
          }
              if( vars.endsWith(  "r1off" ))
          {
           
            varOnOff = 2 ;
            
          }
       
             if ( vars.endsWith(  "r2on" ))
          {    
            varOnOff = 3  ;
            
            
          }
              if( vars.endsWith(  "r2off" ))
          {
           
            varOnOff = 4 ;
            
          }

              if ( vars.endsWith(  "r3on" ))
          {    
            varOnOff = 5 ;
            
            
          }
              if( vars.endsWith(  "r3off" ))
          {
            
          varOnOff = 6 ;
            
          }

            if( vars.endsWith(  "r4on" ))     
          {    
            varOnOff = 7 ;
            
            
          }
              if ( vars.endsWith(  "r4off" ))
          {
            
           varOnOff =8  ;
            
          }
          
            if( vars.endsWith(  "r5on" ))
          {    
            varOnOff = 9 ;
            
            
          }
              if( vars.endsWith(  "r5off" ))
          {
            
           varOnOff = 10 ;
            
          }
          
            if( vars.endsWith(  "r6on" ))
          {    
            varOnOff = 11 ;
            
            
          }
              if( vars.endsWith(  "r6off" ))
          {
            varOnOff =  12;
            
          }

            if( vars.endsWith(  "r7on" ))
          {    
            varOnOff = 13 ;
            
            
          }
              if( vars.endsWith(  "r7off" ))
          {
            
            varOnOff =14  ;
           
          }

            if( vars.endsWith(  "r8on" ))
          {    
            varOnOff = 15 ;
            
            
          }
          
              if( vars.endsWith(  "r8off" ))
          {
            
            varOnOff = 16 ;
            
          } 
    
              if( vars.endsWith(  "r9on" ))
          {
            
            varOnOff = 17 ;
            
          }
          
              if( vars.endsWith(  "r9off" ))
          {
            
            varOnOff =18  ;
            
          }

              if( vars.endsWith(  "r10on" ))
          {    
           varOnOff = 19 ;
            
            
          }
          
             if( vars.endsWith(  "r10off" ))
          {
            
          varOnOff = 20 ;
            
          }

              if( vars.endsWith(  "r11on" ))
          {    
           varOnOff = 21 ;
            
            
          }
             if( vars.endsWith(  "r11off" ))
          {
           
            varOnOff = 22 ;
            
          }

             if( vars.endsWith(  "r12on" ))
          {    
            varOnOff = 23 ;
            
          }
             if( vars.endsWith(  "r12off" ))
          {
            
            varOnOff = 24 ;
          }
          
            if( vars.endsWith(  "r13on" ))
          {    
            varOnOff = 25 ;
            
            
          }
              if( vars.endsWith(  "r13off" ))
          {
            
            varOnOff = 26 ;
            
          }
          
           if( vars.endsWith(  "r14on" ))
          {    
           varOnOff =  27;
            
            
          }
              if( vars.endsWith(  "r14off" ))
          {
            
          varOnOff =  28;
            
          }
          
          if( vars.endsWith(  "rton" ))
          {    
            varOnOff = 33 ;
            
            
          }
              if( vars.endsWith(  "rtoff" ))
          {
            
            varOnOff =34  ;
           
          }
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connnection: close");
client.println();

 if ( varOnOff == 1 )
          {    
            digitalWrite(rele1, HIGH);            
            client.println("Ligando Rele 1");
                        
          }
              if( varOnOff ==2)
          {
           
            digitalWrite(rele1, LOW);    
            client.println("Desligando Rele 1");
            
          }
       
             if ( varOnOff ==3)
          {    
            digitalWrite(rele2, HIGH);            
            client.println("Ligando Rele 2");
            
            
          }
              if(varOnOff ==4)
          {
           
            digitalWrite(rele2, LOW);    
            client.println("Desligando Rele 2");
            
          }

              if ( varOnOff ==5)
          {    
            digitalWrite(rele3, HIGH);            
            client.println("Ligando Rele 3");
            
            
          }
              if(varOnOff ==6)
          {
            
            digitalWrite(rele3, LOW);    
            client.println("Desligando Rele 3");
            
          }

            if( varOnOff ==7)     
          {    
            digitalWrite(rele4, HIGH);           
            client.println("Ligando Rele 4");
            
            
          }
              if ( varOnOff ==8)
          {
            
            digitalWrite(rele4, LOW);    
            client.println("Desligando Rele 4");
            
          }
          
            if( varOnOff ==9)
          {    
            digitalWrite(rele5, HIGH);            
            client.println("Ligando Rele 5");
            
            
          }
              if( varOnOff ==10)
          {
            
            digitalWrite(rele5, LOW);    
            client.println("Desligando Rele 5");
            
          }
          
            if( varOnOff ==11)
          {    
            digitalWrite(rele6, HIGH);            
            client.println("Ligando Rele 6");
            
            
          }
              if( varOnOff ==12)
          {
            
            digitalWrite(rele6, LOW);    
            client.println("Desligando Rele 6");
            
          }

            if( varOnOff ==13)
          {    
            digitalWrite(rele7, HIGH);            
            client.println("Ligando Rele 7");
            
            
          }
              if( varOnOff ==14)
          {
            
            digitalWrite(rele7, LOW);   
            client.println("Desligando Rele 7");
           
          }

            if(varOnOff ==15)
          {    
            digitalWrite(rele8, HIGH);            
            client.println("Ligando Rele 8");
            
            
          }
          
              if( varOnOff ==16)
          {
            
            digitalWrite(rele8, LOW);   
            client.println("Desligando Rele 8");
            
          } 
    
              if( varOnOff ==17)
          {
            
            digitalWrite(rele9, HIGH);    
            client.println("Ligando Rele 9");
            
          }
          
              if( varOnOff ==18)
          {
            
            digitalWrite(rele9, LOW);    
            client.println("Desligando Rele 9");
            
          }

              if( varOnOff ==19)
          {    
            digitalWrite(rele10, HIGH);           
            client.println("Ligando Rele 10");
            
            
          }
          
             if( varOnOff ==20)
          {
            
            digitalWrite(rele10, LOW);    
            client.println("Desligando Rele 10");
            
          }

              if( varOnOff ==21)
          {    
            digitalWrite(rele11, HIGH);         
            client.println("Ligando Rele 11");
            
            
          }
             if( varOnOff ==22)
          {
           
            digitalWrite(rele11, LOW);    
            client.println("Desligando Rele 11");
            
          }

             if(varOnOff ==23)
          {    
            digitalWrite(rele12, HIGH);           
            client.println("Ligando Rele 12");
            
            
          }
             if( varOnOff ==24)
          {
            
            digitalWrite(rele12, LOW);    
            client.println("Desligando Rele 12");
            
          }
          
            if( varOnOff ==25)
          {    
            digitalWrite(rele13, HIGH);          
            client.println("Ligando Rele 13");
            
            
          }
              if( varOnOff ==26)
          {
            
            digitalWrite(rele13, LOW);   
            client.println("Desligando Rele 13");
            
          }
          
           if( varOnOff ==27)
          {    
            digitalWrite(rele14, HIGH);           
            client.println("Ligando Rele 14");
            
            
          }
              if( varOnOff ==28)
          {
            
            digitalWrite(rele14, LOW);   
            client.println("Desligando Rele 14");
            
          }

             

         if( varOnOff ==33)
          {    
            digitalWrite(rele1, HIGH);   digitalWrite(rele2, HIGH);digitalWrite(rele3, HIGH); digitalWrite(rele4, HIGH); digitalWrite(rele5, HIGH);                                                                                    digitalWrite(rele6, HIGH); 
           digitalWrite(rele7, HIGH);   digitalWrite(rele8, HIGH);digitalWrite(rele9, HIGH); digitalWrite(rele10, HIGH); digitalWrite(rele11, HIGH); digitalWrite(rele12, HIGH);
           digitalWrite(rele13, HIGH);   digitalWrite(rele14, HIGH);           
            client.println("Ligando Rele Todos");
                
          }
              if( varOnOff ==34)
          {
            
            digitalWrite(rele1, LOW);   digitalWrite(rele2, LOW);digitalWrite(rele3, LOW); digitalWrite(rele4, LOW); digitalWrite(rele5, LOW); digitalWrite(rele6, LOW); 
           digitalWrite(rele7, LOW);   digitalWrite(rele8, LOW);digitalWrite(rele9, LOW); digitalWrite(rele10, LOW); digitalWrite(rele11, LOW); digitalWrite(rele12, LOW);
           digitalWrite(rele13, LOW);   digitalWrite(rele14, LOW);             
            client.println("Desligando Rele Todos");
           
          }
 
break;
}
if (c == '\n') {

currentLineIsBlank = true;
} 
else if (c != '\r') {

currentLineIsBlank = false;
}
}
}

delay(1);

client.stop();
Serial.println("client disonnected");
}
}

Coloquei o gateway e submascara ontem ainda nao testei, tb nao sei se muda muita coisa. (outra coisa que fiz foi colocar no roteador o mac dos arduino e fixando o ip)

Se puder me ajudar agradeço.

Estás a usar um mega?

Nao é um arduino uno

arduino.txt (12.5 KB)

E isso cabe tudo lá????

Podes estar a ficar sem memória... reparei que estás a usar a String e isso pode acontecer. No entanto, o shield bloqueia se tiver dados numa socket que não foram lidos.

Então convém garantir que não tens nada numa socket antes de fechares a ligacão. Estás a fazer isso aqui?

Bubulindo,

nao sei como fazer isso que voce disse.

os dados que mando é com se fosse pelo browser (192.168.1.50/comando) (exemplo de comando: r1on ou 1off)

No meu programa (delphi) tenha a funçao de salvar o ultimo estado de cada porta (rele). Quando mando essa funçao de verificar (varrer) os reles que estavam ligados e então religalos, é quando ele mais trava. Nao sei se é informaçao de mais pra ele nesse momento. (apesar de ter um delay entre cada comando de ligar).

Em relação a memoria ele ultiliza 16.222bytes (maximo 32.256 bytes) Ultilizo metade da memoria.

Quem te dera que o chip tivesse 32k de memória RAM...

Tem muito menos e pode ser isso que te está a bloquear o programa.

client.flush();

Limpa o buffer do client. Ou então podes fazeR:

while (client.available() >0) client.read();

em qual parte do meu codigo eu uso o: client.flush();

Antes do client.stop()...

Ok, eu posso colocar cartao de memria no w5100 para resolver problema de memoria?
Colocando esse cartao eu irei ocupar a porta 4?

Não sabes o significado de memoria RAM, pois não?

Ok, eu acha que estavamos falando de mem. rom.

Coloquei o flush, ta em teste. Em relaçao ao resto da programaçao esta ok? (pois vc disse que o problema poderia ser a programaçao)

Em outro forum de indicaram os seguintes teste: (pode me disser se cabe fazer realmente algum desses teste)

  • Outro arduino de outro lote;
  • Incluir um capacitor maior na entrada da placa, por ex 470uF eletrolitico com 100nF ceramico em paralelo;
  • Verificar com teste de continuidade se seu cabo esta bom. Ja vi cabo com 1 fio aberto comunicar mas provocar travamento do roteador depois de um tempo;
  • Procurar por funçoes de watchdog, que resetariam automaticamente o hardware se ele travar;
  • Trocar o hub. Se ele trava ja ta errado, nao poderia travar em nenhuma condiçao.

O condensador é a única que me parece realmente poder causar o que vês... o watchdog está desactivado de certeza.

Galera estou com o seguinte problema:

O meu Ethernet Shield está travando e não sei o motivo, estou monitorando o Arduino através de rede local com o Zabbix.
Observe no gráfico do zabbix as falhas de conexão:

Se alguém puder ajudar, eu envio o código utilizado...Obrigado.

patrickcassaro:
Galera estou com o seguinte problema:

O meu Ethernet Shield está travando e não sei o motivo, estou monitorando o Arduino através de rede local com o Zabbix.
Observe no gráfico do zabbix as falhas de conexão:

Se alguém puder ajudar, eu envio o código utilizado...Obrigado.

//Programa : Arduino Ethernet Shield W5100 e HC-SR04
//Alteracoes e adaptacoes : FILIPEFLOP
//
//Baseado no programa exemplo de
//by David A. Mellis e Tom Igoe

#include <SPI.h>
#include <Ethernet.h>
#define MAX_CMD_LENGTH 25

//Definicoes de IP, mascara de rede e gateway
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,25,64); //Define o endereco IP
IPAddress gateway(192,168,25,1); //Define o gateway
IPAddress subnet(255,255,255,0); //Define a máscara de rede

//Inicializa o servidor web na porta 10050
EthernetServer servidor(10051);
EthernetClient cliente;

String cmd; //Recebe o comando do zabbix
boolean conectado=false;
float contador=0;
float pinoPluviometro=13;
int pinoLed=7;

void setup()
{
pinMode(13, INPUT);
//Inicializa a interface de rede
Ethernet.begin(mac, ip, gateway, subnet);

servidor.begin();
Serial.begin(9600);

}

void loop() {

//Aguarda conexao do browser
cliente = servidor.available();
calcularChuva();
if (cliente) {
if(!conectado){
cliente.flush();
conectado=true;
Serial.println("Conectado");
}

if(cliente.available()>0){
recebeComando(cliente.read());

}
}
}

void calcularChuva(){
if (digitalRead(pinoPluviometro)==HIGH) {
Serial.println("Calculando chuva");
if (digitalRead(pinoPluviometro)==LOW){
contador += 0.28;
delay(100);

}
}
}

void recebeComando(char c){
if(cmd.length() == MAX_CMD_LENGTH) {
cmd = "";
}
cmd += c;
if(c == '\n') {
if(cmd.length() > 2) {
// remove \r and \n from the string
Serial.println(cmd);
cmd = cmd.substring(0,cmd.length() - 1);
tratarComando();

}
}
}

void tratarComando(){
// if(cmd.equals("agent.ping")){
// servidor.println("1");
// Serial.println("Ping: 1");
// cliente.stop();
// }
// else if(cmd.equals("version")){
// servidor.println("1.1");
// cliente.stop();
// }
if(cmd.equals("chuva")){
Serial.println("String recebida !");
float c = contador;
//servidor.println(contador);
servidor.println(c);
Serial.println(c);
Serial.println("mm");

cliente.stop();
delay(100);
}
else {
servidor.println("ZBX_NOTSUPPORTED");
cliente.stop();
Serial.println("ZBX_NOTSUPPORTED");
Serial.println(cmd);
}
cmd="";
}

Consegui resolver meu problema com o W5100 travando da seguinte forma, baixando a velocidade de comunicação ICSP entre o arduino e o W5100 mudei de 14MHz para 8MHz é so alterar o arquivo W5100.h #define SPI_ETHERNET_SETTINGS SPISettings(8000000, MSBFIRST, SPI_MODE0) dentro da biblioteca ETHERNET na IDE do arduino.