Como copiar la dirección IP desde la tarjerta SD.

Hola muy buenas, y gracias de antemano.
Estoy buscando por el buscador del foro y solo encuentro ejemplos en ingles y no los entiendo.
También he encontrado comentarios de que no es dificil tomar datos de la tarjeta SD y convertirlos
en otros tipos de datos acorde con las variables del programa. Pero no soy muy ducho en programación y menos a la hora del cambio de tipos de datos.
Pues bueno, despues de dos días mirando por el foro y de estar cada vez más confundido con los arrays, String, etc.. voy hacer una pregunta.
En un arduino mega con una shield ethernet y con una micro sd, he hecho un programa que al conectarte al arduino, a trabes de una dirección ip, desde un ordenador, este te muestra una pagina html con varios botones a pulsar, que pulsados estos, el arduino ejecuta ciertas funciones como es normal. Esto funciona perfectamente.
Bien, lo malo es que este arduino hay que cambiarlo a diferentes lugares en diferentes días, y hay que cambiarle la ip para que trabaje en otra lan diferente. Claro, que cada vez que hay que cambiarle la
ip entro en el programa, le cambio la ip y lo vuelvo a grabar en el arduino y ya está. Pero esto solo lo puedo hacer yo. Pues bien, la idea es que cada vez que arranque el arduino, este coja la ip de la tarjeta SD, y así que no dependan de mí y que con que cambien la ip en el fichero de la tarjeta SD
no haya que volver a grabar el programa de nuevo en el arduino y puedan poner la ip que quieran y en la lan que quieran.
Por ejemplo en la tarjeta SD habría un fichero llamado ip.txt y tendría una ip como esta 192,168,20,72 para que se grabara en la “IPAddress ip” . Bueno también habría otros dos ficheros para el gateway y el subnet.
Pues bien, después de todo tipo de errores que me da el compilador, al intentar yo hacer las conversiones de las variables, ¿como se podría hacer?

Saludos y perdón por toda la chapa.

Pues en este momento hay dos o tres hilos desarrollándose con temas SD.
Me parece que no has buscado mucho pero no hablo del buscador sino de las páginas de Software y Hardware.

Mira las primeras paginas de ambas secciones. Claro que no siempre se encuentra lo que uno busca pero te ayudará.
Te recomiendo que no desviés el tema de cada hilo sino que lo leas y luego consultes tus dudas acá. Esa es la manera de proceder.

Normas del foro

Gracias surbyte, los miraré a ver si me aclaro.
Saludos.

Hola otra vez a todos.
Despues de darle unas vueltas creo que ya podría cargar la ip del fichero que tengo en la sd a la variable ip de la Ethernet.begin.
He declarado a la ip como byte ip[17] y la cargaría así:

archivoip=SD.open("ip.txt");   
 if (archivoip !=0)
  {  
   while(archivoip.available()>0)     
    {
     ippp=archivoip.read(); //leemos el archivo dato a dato 
     Serial.println(ippp);
     ip[x]=ippp;
     x=x+1;
     }//fin while
    //} // fin if 
    x=0;
   }// fin if
  else 
   {
    Serial.println("Error al abrir el fichero");  
   }// fin else
   archivoip.close();

Pero me da error al inicializar la SD. Que lo hago así:

void setup()
{  
 pinMode(10,OUTPUT); 
 pinMode(ssred,OUTPUT);
 pinMode(sssd,OUTPUT);
 ssred=HIGH;
 sssd=LOW;
 Serial.begin(9600);
 if(!SD.begin(sssd))
  {
   Serial.println("Error al inicializar la SD");

¿ que es lo que me falla?

Creo que me liado un poco al hacer el comentario anterior en el tema de copiar el codigo.
Bueno al final ahora no consigo abrir la SD.

Bueno aquí otra vez :-[ .
Ahora ya consigo abrir la SD. Resulta que como quería copiar la dirección IP desde la tarjeta SD, antes de mandar
esto:

Ethernet.begin(mac,ip,gateway,subnet);
miservidor.begin();

Al inicio del void setup() y mandar ese codigo al final del setup una vez que ya hubiese optenido la IP de la SD.
Pues no me dejaba inicializar la SD.
Ahora pongo el código al inicio y al final del setup y así me deja inicializar la SD y al final le vuelvo a mandar la
nueva IP ya copiada desde la SD.

Ahora me pasa esto y no se porque. A ver si sabeis por que me pasa esto:

La variable ippp la he creado como byte
La ip la he creado así: bite
Parte del código es este:

#include <SD.h>
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {0xDE,0xAD,0xBE,0xEF,0xFE,0xED};
//IPAddress ip(192,168,1,155);
byte ip[]={192,168,1,166};
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
EthernetServer miservidor(80);
EthernetClient micliente;

boolean lineaactualestavacia=true;  //para saber cuando acaba la solicitud recibida del cliente
char caracter;   //caracter recibido del cliente que forma parte de la peticion HTTP
String peticion="";

byte ippp;

File archivoip;//archivo en la sd
File archivo;
int ssred=53;// seleccion de la tarjeta red
int sssd=4;// seleccion de la tarjera sd
String estacionvia; 
int x;
int i;

i


void setup()
{
  Ethernet.begin(mac,ip,gateway,subnet);
  miservidor.begin();
  
  
  pinMode(ssred, OUTPUT);
  pinMode(sssd,OUTPUT);
  
  
  Serial.begin(9600);
  if(!SD.begin(sssd))
   {
    Serial.println("Error al inicializar la SD");
   }
   archivoip=SD.open("ip.txt"); 
   if (archivoip!=0)
   {
     while(archivoip.available()>0)
     {
       ippp=archivoip.read(); //leemos el contenido de la sd 
       delay(20);
       ip[x]=ippp;
       Serial.println(ippp);
       Serial.println(ip[x]);
       x=x+1;
     }// fin while 
   } // fin if 
   else 
   {
    Serial.println("Error al abrir el fichero");  
   }// fin else
   archivoip.close(); 
   
    x=0;
    sssd=HIGH;  
    ssred=LOW; 
    
 
  
  Ethernet.begin(mac,ip,gateway,subnet);
  miservidor.begin();

  
}

:disappointed_relieved: Se me ha olvidado poner como inicializo la variable ip,
es así byte ip[]={192,168,1,155}; por poner una ip cualquiera.

La cuestión es que cuando la copio de la sd, se ve que la coge bien pero
al mandarla al Ethernet. begin, la manda con los tres últimos nº cambiados :o

Ahora me he dado cuenta,( pasando ya de coger la IP de la tarjeta SD,), que poniendola directamente al
iniciar las variables, dependiendo de si la declaro como: IPAddress ip(129.168,1,155); si que funciona el
progra y veo la página HTML.
Pero si la declaro como byte ip[]={192,168,1,155}; no comunico con el arduino y he visto en otros programas
que suelen declarar a la IP así.
Porque no me funciona, que diferencia hay. :frowning:

No, no es por el tipo de las variables.

Es por poner dos veces las mismas instrucciones.
Tengo que poner al empiece del void setup las instrucciones

Ethernet.begin(mac,ip,gateway,subnet);
  miservidor.begin();

para que pueda habilitar luego la SD (sino es imposible). Una vez que cargo la nueva IP de la tarjeta SD,
al final del void setup, vuelvo a poner otra vez las instrucciones:

Ethernet.begin(mac,ip,gateway,subnet);
  miservidor.begin();

para que me cargue la nueva IP, pero ya no consigo contactar con el arduino. Cosa que si no las pongo al
final si contacto.

¿Sabe alguien que puedo hacer?

Hola!

Te has planteado poner en el programa todas las IP dentro de un switch y que sólo se ejecute la línea correspondiente a lo que se seleccione con unos Jumper o unos micrositches lo digo por que es un alternativa para no usar la SD, no esté quitando la SD ponerla en el ordenador y vuelta al Arduino...

Gracias GO_zalo por contestar.
Si que podría ser una solución pero la cantidad de direcciones IP serían muchas y también
tengo que hacer lo mismo con el gateway porque también podría cambiar la LAN de trabajo.
Saludos.