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

Osiris, boa tarde!

Quando você fez o testes com lib iniFile, como estava definido o arquivo INI?

Pergunto isso, pois o formato de arquivo que você postou não está de acordo com as regras de um arquivo INI da Microsoft.

O correto seria assim:

[network]

ip = 192.168.1.1

gateway = 192.168.1.1

mac = 0xDE:0xAD:0xBE:0xEF:0xFE:0xED


A seção é network e as variáveis são IP, GATEWAY e MAC.

Para o mac, prefira valores decimais, pois será mais fácil tratar depois. Converta os valores para colocar no arquivo.


Usando a iniFile, para ler o IP da seção network em uma variável buffer de tamanho 80, você usaria o seguinte comando:


if (ini.getValue("network", "ip", buffer, 80)) {
    Serial.println(buffer);
  }
 

ini seria o nome da variável (objeto) representando o arquivo.

Poste os testes que você usou com o iniFile para verificarmos.

Boa tarde José,

Obrigado pelo retorno.

Na verdade os parâmetros foram apenas de exemplo. Na realidade os testes que fiz com o iniFile eu utilizei o arquivo ini de exemplo existente na biblioteca chamado net.ini, respeitando os parâmetros nele existente, alterei apenas para a faixa de ip da minha rede, gravei o mini SD e subi o Sketch de exemplo da biblioteca.

Após compilar, no monitor serial aparece a seguinte mensagem: "

Ini file net.ini does not exist".

No código do exemplo, o apontamento para o arquivo está na linha:

const char *filename = "net.ini";

Você obteve sucesso ao usar essa biblioteca para o Shiel Ethernet?

Mais uma vez obrigado pelo retorno.

Abraços.

Isso quer dizer que não foi encontrado o arquivo no seu sdcard, você gravou o arquivo antes de rodar esse código?

Ajudei um rapaz com algo parecido à um tempo atrás, veja como ficou:

http://pastebin.com/HHiPEjCb

Espero que sirva

Obrigado Eduardo,
Vou dar uma olhada no link e volto a comentar.
Obrigado por compartilhar!
Abraços!
Obrigado Luis!
Na realidade o comentário sobre utilizar arquivos .ini foi apenas uma das possibilidades, podendo ser em outro formato ou conceito.
Abraços e obrigado.

Osiris, um motivo que pode estar causando o erro de leitura no SD é a formatação utilizada.

Você formatou o cartão usando FAT32? A library suporta 32 e 16. Sendo preferível a 16.

Faça uma teste com as duas. Além disso, o arquivo INI deve estar na pasta raiz.

Boa tarde José,

Formatei o SD para FAT16, e agora ele acha o arquivo, porém continua dando alguns erros.

(não consegui colar os erros, o sistema não deixou eu adicionar a resposta com eles)

Já fiz alguns testes, alterando partes do código, porém sem sucesso.

Fiz algumas pesquisas e não achei nada funcionando de concreto.

Vou continuar testando pra ver se consigo chegar a um resultado positivo.

Abraços e obrigado pelas dicas.

José,
Fiz mais alguns testes e acho que não estou sabendo usar a biblioteca no formato correto.
Consegui fazer a leitura do arquivo ini do SD. Consigo exibir no serial monitor os valores gravados no arquivo. Porém não consigo setar esses valores (o ip por exemplo) como sendo o valor a ser utilizado pelo shield.
Codigo do Sketch:

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

#define SD_SELECT 4
#define ETHERNET_SELECT 10

EthernetServer server(80);

void setup() {
Serial.begin(9600);
while (!Serial) {
;
}

//Sketch do ini
pinMode(SD_SELECT, OUTPUT);
digitalWrite(SD_SELECT, HIGH); // disable SD card

pinMode(ETHERNET_SELECT, OUTPUT);
digitalWrite(ETHERNET_SELECT, HIGH); // disable Ethernet

const size_t bufferLen = 80;
char buffer[bufferLen];

const char *filename = "/net.ini";
SPI.begin();
if (!SD.begin(SD_SELECT))
while (1)
Serial.println("SD.begin() failed");

IniFile ini(filename);
if (!ini.open()) {
Serial.print("Ini file ");
Serial.print(filename);
Serial.println(" does not exist");
// Cannot do anything else
while (1)
;
}
Serial.println("Ini file exists");
if (!ini.validate(buffer, bufferLen)) {
Serial.print("ini file ");
Serial.print(ini.getFilename());
Serial.print(" not valid: ");
while (1)
;
}

if (ini.getValue("network", "ip", buffer, bufferLen)) {
Serial.print("section 'network' has an entry 'ip' with value ");
Serial.println(buffer);
}
else {
Serial.print("Could not read 'ip' from section 'network', error was ");
//printErrorMessage(ini.getError());
}
//fim do ini
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE };
byte ip[] = { 192, 168, 1, 24 };
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}


void loop() {

EthernetClient client = server.available();
if (client) {
Serial.println("new client");
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '\n' && currentLineIsBlank) {

}
if (c == '\n') {
currentLineIsBlank = true;
} else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
Serial.println("client disconnected");
Ethernet.maintain();
}
}


#####
Dados do INI
#####
[network]
mac = 01:23:45:67:89:AB
# hash comment, leading spaces below
gateway = 192, 168, 1, 1
# extraneous spaces before and after key and value
ip = 192, 168, 1, 24
#######
Anexo o print do retorno na serial.
O problema esta sendo em como colocar o valor do BUFFER no lugar do ip que está fixo no codigo.
O Sketch não monta nada para o browser, estou apenas testando a configuração do shield mesmo.

Abraços e obrigado.

Anexos

Osiris, o ponto em que ele pega o IP é:

if (ini.getValue("network", "ip", buffer, bufferLen)) {
Serial.print("section 'network' has an entry 'ip' with value ");
Serial.println(buffer);
}

Nesse ponto você deve setar o IP do código. O problema é que o IP do INI é uma string única (variável buffer) e você precisa setar o IP em um vetor.

Uma das soluções e quebrar a String em 4 partes e atribuir cada uma ao vetor.

O Arduino não tem o método split, então temos que fazer um a um, dessa forma:

String ip1 = substring(buffer,0,3);

String ip2 = substring(buffer,3,6);

String ip3 = substring(buffer,6,9);

String ip4 = substring(buffer,9,12);

byte ip[] = { ip1.toInt(), ip2.toInt(), ip3.toInt(), ip4.toInt() }; //Aqui estamos mudando o IP

Depois, é necessário fazer o mesmo para o mac.

Obs: Para facilitar, coloque o IP no INI sem vírgulas, preenchendo com zeros à esquerda, dessa forma:

IP = 192168001024

Ficaria assim então:

if (ini.getValue("network", "ip", buffer, bufferLen)) {
Serial.print("section 'network' has an entry 'ip' with value ");
Serial.println(buffer);

String ip1 = substring(buffer,0,3);

String ip2 = substring(buffer,3,6);

String ip3 = substring(buffer,6,9);

String ip4 = substring(buffer,9,12);

byte ip[] = { ip1.toInt(), ip2.toInt(), ip3.toInt(), ip4.toInt() }; //Aqui estamos mudando o IP

//Apague a outra linha que configura o ip de de forma fixa.

Serial.println(ip1);

Serial.println(ip2);

Serial.println(ip3);

Serial.println(ip4);
}

Obs: Veja que estou imprimindo no monitor serial os ips quebrados também. Veja se os valores batem, pois fiz o código sem testar. Se der diferenças, ajuste os valores do método substring.

Veja se funciona para o IP. Qualquer coisa, pergunte aí...

Bom dia José,

Vou testar ao meio dia e retorno assim que concluir.

Muito obrigado pelo pronto atendimento.

Abraços.

Oziris, segue uma correção no código que te passei. Esqueci que a variável buffer não é uma String, então é preciso convertê-la antes:

if (ini.getValue("network", "ip", buffer, bufferLen)) {
Serial.print("section 'network' has an entry 'ip' with value ");

Serial.println(buffer);

String meuIP = String(buffer);
String ip1 = substring(meuIP,0,3);

String ip2 = substring(meuIP,3,6);

String ip3 = substring(meuIP,6,9);

String ip4 = substring(meuIP,9,12);

byte ip[] = { ip1.toInt(), ip2.toInt(), ip3.toInt(), ip4.toInt() }; //Aqui estamos mudando o IP

//Apague a outra linha que configura o ip de de forma fixa.

Serial.println(ip1);

Serial.println(ip2);

Serial.println(ip3);

Serial.println(ip4);
}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço