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