Boa tarde Pessoal,

Esse é meu primeiro post aqui. Já recorri ao fórum várias vezes e por muitas vezes me ajudou direta e/ou indiretamente a resolver duvidas e problemas de alguns testes ou projetos. Então obrigado a TODOS!!!

Como sou novato na área de Arduíno procurei sempre ler ao invés de questionar.

Porém a um tempo eu procuro e testo algumas alternativas para configuração do Shiel de Ethernet W5100 através da leitura de um arquivo de configuração gravado no cartão SD inserido no próprio leitor de SD do Shield.

Basicamente (não quer dizer que seja simples) a ideia seria criar um arquivo tipo .INI com os parâmetros necessário para o Arduíno carregar e setar ao ser ligado.

Exemplo:

[IP]

192.168.1.1

[GATEWAY]

192.168.1.1

[MAC]

0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED

Assim seria possível definir as configurações da rede sem a necessidade de recompilar o Sketch.

Já testei algumas alternativas, entre elas a biblioteca IniFile todas sem sucesso.

Por antecipação, peço desculpas caso tenha cometido algum erro ao postar no fórum

Abraços e obrigado a todos.

Exibições: 1581

Responder esta

Respostas a este tópico

Boa tarde José,

Fiz o teste ao meio dia, acho que avançou legal, porém esbarrei em outro problema. Honestamente não quero ficar enchendo o saco de ninguém, mais como comecei o post, quero finaliza-lo (resolvendo ou não).

Acabei encurtando o código e mudando algumas coisas no que você citou para conseguir rodar o sketch (de String ip1 = substring(meuIP,0,3) para String ip1 = meuIP.substring(0,3)), ficando assim:

#include <SPI.h>
#include <IniFile.h>
#define SD_SELECT 4
#define ETHERNET_SELECT 10

EthernetServer server(80);

void setup() {
Serial.begin(9600);


//Sketch do ini
const size_t bufferLen = 80;
char buffer[bufferLen];

const char *filename = "/net.ini";
SPI.begin();
SD.begin(SD_SELECT);
IniFile ini(filename);
ini.open();
//ini.validate(buffer, bufferLen);

if (ini.getValue("network", "ip", buffer, bufferLen)) {
String meuIP = String(buffer);
String ip1 = meuIP.substring(0,3);
String ip2 = meuIP.substring(3,6);
String ip3 = meuIP.substring(6,9);
String ip4 = meuIP.substring(9,12);
Serial.println(ip1);
Serial.println(ip2);
Serial.println(ip3);
Serial.println(ip4);
}

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE };
//byte ip[] = { 131, 107, 30, 112 };
byte ip[] = { ip1.toInt(), ip2.toInt(), ip3.toInt(), ip4.toInt() };
Ethernet.begin(mac, ip);
server.begin();
}

void loop() {

}

###########

O erro que retorna no console é: 'ip1' was not declared in this scope'.

Obrigado.

Boa noite Luis, esse while está no sketch de exemplo da própria biblioteca. Agora está lendo do SD e printando na serial certinho, conforme os parâmetros do INI. O que está complicado é fazer com que o valor lido do SD funcione no lugar so IP fixado no sketch!
Se tiver alguma luz de como fazer isso e puder compartilhar, agradeço.
Abraços e obrigado.

Bom dia Luis,

Na verdade o código que postei está funcionando, porém com o IP setado no código.

O que questionei pedindo ajuda foi justamente trocar o IP fixo pelo ip vindo do SD / INI.

Vou testar a alternativa do José e em seguida respondo.

Abraços e obrigado pela contribuição.

Olá!

Esse erro ocorreu pois a declaração das variáveis está sendo feita dentro do IF.

Para corrigir, declare as variáveis no topo do arquivo antes do setup:

String meuIP;
String ip1;
String ip2;
String ip3;
String ip4;

Depois mude o código abaixo para:

if (ini.getValue("network", "ip", buffer, bufferLen)) {
meuIP = String(buffer);
ip1 = meuIP.substring(0,3);
ip2 = meuIP.substring(3,6);
ip3 = meuIP.substring(6,9);
ip4 = meuIP.substring(9,12);
Serial.println(ip1);
Serial.println(ip2);
Serial.println(ip3);
Serial.println(ip4);
}

José, seu ajuste foi na bucha!!!

O código tá rodando de boa e configurando o IP conforme os dados no INI.

Agora vou dar uma trabalhada na biblioteca, tentando reduzir o tamanho do sketch, pois com alguns prints adicionais cheguei a não conseguir rodar devido a falta de espaço.

Aproveito para agradecer você e todos que colaboraram...

Muito obrigado mesmo.

Abraços.

Oziris, a vantagem de usar a biblioteca iniFile é que ela organiza e facilita a leitura da configuração pelo SD.
A desvantagem é que ela pode consumir mais memória.
As últimas versões da IDE do Arduino informam quanta memória o sketch utilizou e avisa caso tenha sobrado pouca memória para os dados.
Neste post você encontra algumas dicas sobre otimização de sketchs:
Caso não seja suficiente, talvez seja necessário mudar a estratégia de leitura do arquivo ou usar um Arduino Mega que possui mais memória de trabalho.

Bom dia José,

Perfeito cara! Já estou usando a IDE 1.6.8 e realmente ele mostra o quanto o projeto ocupou da memória. Realmente a possibilidade de partir para um MEGA é grande.

De qualquer maneira vou realizar mais algumas pesquisas tentando diminuir o tamanho.

Obrigado pelo link e pelas dicas.

Abraços.

Boa tarde, alterei o título do post pois com a ajuda de todos vocês o meu problema foi resolvido.

Agradeço a paciência e a parceria.

Abraços a todos.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço