Bom dia Senhores,

Estou com um problema que já gastei um tempo considerável sem conseguir resolver,

Peguei o código na net para reproduzir o netboot(reiniciar o modem toda vez que a net cair), porém tenho um impecílio para implementação. minha placa é uma Diecmila com 14.336 de memória e o exemplo é maior que isso, estou usando uma placa de rede Ethernet Shield W5100. No exemplo original o netboot executa ping 5 sites diferentes e analisa se a concecção de internet caiu ou não.

Como não tenho espaço suficiente fui tentando cortar partes do código cirurgicamente mas o mesmo não está funcionando. 

O código o qual eu usei de exemplo para fazer o meu é:

https://www.zolalab.com.br/repos/netboot.ino

e esse abaixo é o meu código que executa ping apenas em um lugar, nesse caso o meu código está apenas mostrando que a conecção caiu e enviando comando de boot para o relé, porém o mesmo não está encontrando a rede.

Fica difícil fazer testes pois qualquer coisa adicionada estoura o valor de tamanho do programa.

Tenho certeza que o cabo de rede está funcionando pois testei num notbook, 

O ip dessa rede é do range padrão do tplink: 10.32.0.1

Se alguém tiver alguma sugestão...


#include <SPI.h>
#include <Ethernet.h>
#include <ICMPPing.h>
byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02};
int ERRORS_COUNT = 0;
SOCKET pingSocket = 0;
IPAddress pingAddrs=(192,168,0,1);
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));
void setup() {
pinMode(9, OUTPUT);
digitalWrite(9, HIGH);
pinMode(8, OUTPUT);
digitalWrite(8, HIGH);
Serial.begin(9600);
Ethernet.begin(mac);
}
void loop()
{
if (ERRORS_COUNT >= 4)
{
ERRORS_COUNT = 0;
Serial.println("BOOT");
boot();
}

ICMPEchoReply echoReply = ping(pingAddrs, 4);
if (echoReply.status == SUCCESS)
Serial.println("pingando");
else{

Serial.println("caiu");

ERRORS_COUNT ++;
}}
void boot()
{

digitalWrite(9, LOW);
delay(2000);
digitalWrite(9, HIGH);
delay(6 * 1000);
}

Exibições: 460

As respostas para este tópico estão encerradas.

Respostas a este tópico

Minha sugestão seria, você substituir o microcontrolador da placa, trocar o Atmega168 pelo Atmega328p, esse ultimo é usado no Arduino Duemilanove, UNO, por exemplo. Você deveria comprar um Atmega328p já com o bootloader do UNO. Mas isso só seria uma boa escolha, se o código compilado, ocupar um espaço menor que 30,720.

Outra seria, você comprar um Arduino MEGA2560. Esse tem "muito" espaço, comparado com a memória do seu Arduino.

Para fazer modificações no código, seria interessante entender a lógica dele e assim remover as partes "desnecessárias" ao seu projeto.

Comprar outra placa não é uma opção, seria a necessidade de resolver ping com a placa que tenho. 

Se o projeto for capaz de executar ping e ficar dentro do tamanho necessário já é o suficente.

AMD, boa tarde.

AMD usando um Intel pra programar um Atmega. kkkkkk

AMD, a primeira sugestão do amigo FH, foi de substituir o processador na placa.

Remover o Atmega168 e plugar um Atmega328.

Rui

Valeu ga

Tive um roteador que simplesmente perdia a conexão, toda vez eu tinha que reiniciar, queria fazer exatamente isso aqui, mas o problema dele foi piorando, uma vez eu tentei reiniciar quase umas dez vezes, e depois disso eu comprei um novo. Vou guardar isso, quem sabe eu precise novamente, um dia ...

Esse código usa 6,560 bytes, fiz alguns testes e aparentemente está funcionando bem.

// #define SERIAL_DEBUG // descomentar para ver na serial
// #define TIME_DEBUG  // descomentar para executar mais rapido

#define ERROS_MAX 4

#define RELAY_PIN 9

#include /font>SPI.h>         
#include /font>Ethernet.h>
#include /font>ICMPPing.h>

byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02};

IPAddress ip(192,168,0,177); // ip address for ethernet shield

IPAddress pingAddr(74,125,26,147); // ip address to ping

int ERRORS_COUNT = 0;

SOCKET pingSocket = 0;

char buffer [256];

ICMPPing ping(pingSocket, (uint16_t)random(0, 255));

void setup()
{

 pinMode(RELAY_PIN, OUTPUT);  // relay pin
 digitalWrite(RELAY_PIN, LOW);

 
 // start Ethernet
 Ethernet.begin(mac, ip);
 
 #ifdef SERIAL_DEBUG
 Serial.begin(9600);
 #endif
}

void loop()
{
 
 if (ERRORS_COUNT >= ERROS_MAX)
 {

   ERRORS_COUNT = 0;

   #ifdef SERIAL_DEBUG
   Serial.println("REBOOT modem");
   #endif
   
   boot();

 }
 
 ICMPEchoReply echoReply = ping(pingAddr, 4);
 if (echoReply.status == SUCCESS)
 {
   
   ERRORS_COUNT = 0;

   #ifdef SERIAL_DEBUG
   sprintf(buffer,
           "Reply[%d] from: %d.%d.%d.%d: bytes=%d time=%ldms TTL=%d",
           echoReply.data.seq,
           echoReply.addr[0],
           echoReply.addr[1],
           echoReply.addr[2],
           echoReply.addr[3],
           REQ_DATASIZE,
           millis() - echoReply.data.time,
           echoReply.ttl);
   #endif
 }
 else
 {
   #ifdef SERIAL_DEBUG
   sprintf(buffer, "Echo request failed; %d", echoReply.status);
   #endif

   ERRORS_COUNT ++;

 }
 
#ifdef SERIAL_DEBUG
 Serial.println(buffer);
#endif

#ifdef TIME_DEBUG
 delay(500);
#else
 delay(10000); // tempo entre ping
#endif
}

void boot()
{

 digitalWrite(RELAY_PIN, HIGH); // desliga o modem, o relay deve ser conectado em NC

 delay(5000); // aguarda 5 segundos com o modem desligado

 
 digitalWrite(RELAY_PIN, LOW);

 #ifdef TIME_DEBUG
 delay(5000);
 #else
 delay(60 * 1000 * 5); // aguarda 5 minutos para o modem inicializar e reconectar.
 #endif

}

No caso do meu roteador não é ele, é a prestadora que sacaneia, quando nota que o uso é intenso aí trava.

Roteador proprietário tbm, se for preciso trocar é eles que trocam. já trocaram mais algumas vezes e o problema pesiste.

Mas agora tá resolvido. não levanto mais pra dar reset em router

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço