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);
}
Tags:
As respostas para este tópico estão encerradas.
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
Troca um Diecimila por um Duemilanove.
Brincadeira ! he he
Veja essas dicas :
https://oscarliang.com/arduino-sketch-too-big-error-reduce-sketch-s...
https://forum.makehackvoid.com/t/reducing-compiled-size-of-arduino-...
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por