Modifiche del Void Setup tramite seriale

Buonasera a tutti.
La domanda è un po insolita, ma la faccio lo stesso!

Per questione di praticità mi chiedevo se fosse possibile programmare il void setup direttamente dall esterno, magari proprio attraverso il seriale!
Mi spiego meglio: sto lavorando con il modulo ethernet e devo fare delle prove su 3 indirizzi ip diversi.
Ogni volta x provare tutti e tre devo fare il noioso passaggio di aprire lo sketch, cambiare l ip, caricare il firmware e riprovare. Ma essendo l indirizzo nient altro k un vettore, avevo pensato di associare a tre vettori tre indirizzi ip e poi farli leggere all Arduino tramite dei byte inviati direttamente alla porta seriale, e qui arriva il grosso punto interrogativo! L inizializzazione dell erhernet sta nel setup, che è proprio il "ki sono?" Dell arduino. È possibile riuscire quindi ad immettere informazioni "variabili" dentro il setup???? Grazie a tutti per la disponibilità!

Puoi mettere nel setup un ciclo che aspetta l' indirizzo o una valore che identifica quale indirizzo IP predefinito vuoi usare.

un idea di codice:

listaIP[] = {ip1,ip2,ip3};

setup()
{
while (!Serial.aviable())
{
//aspetta arrivo di un carattere dalla seriale; valori aspettati: numeri da 0 a 9
}

index =(Serial.read()-48)

ip = listaIP[index]

inizalizzazione Ethernet;
altre cose;
}

Ciao Uwe

Puoi anche creare un setup.ini sulla sd con impostazione ip, pin, variabili varie.

Avevo pensato ad una cosa del genere anche se l'ho gestita diversamente, e funziona abbastanza bene. Ho fatto la prova con un solo indirizzo ip e cmq è ancora tutto da limare, il codice è il seguente:

int INDIRIZZO[4] = { 80, 81, 82, 83};
int z = 0;
int x = 0;
int c = 0;
int v = 0;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };                                   // indirizzo fisico arduino
byte ip[4] = { z ,x ,c ,v };                                                     // indirizzo ip
EthernetServer server(80);                                                             // porta di comunciazione router

void setup(){   
  
  for (byte j = 0; j < 4 ; j++){
  ip[j] = EEPROM.read(INDIRIZZO[j]);
  }
  
  Serial.begin(9600);

    statoLed[i] = EEPROM.read(addr[i]);
  }

  pinMode(10, OUTPUT); digitalWrite(10, 1);                                              // ethernet
  pinMode(4, OUTPUT); digitalWrite(4, 1);                                                 // SD dello shield anche se non si usa
  Ethernet.begin(mac, ip);                                                                             // inizializzazione ethernet
}

void loop(){
  
  for (byte j=0; j<4; j++){
  if (Serial.available ())  {
   byte lettura = Serial.read();
    
    if (lettura = 'a') {
      
      Serial.print(ip[0]);
      Serial.print(".");
      Serial.print(ip[1]);
      Serial.print(".");
      Serial.print(ip[2]);
      Serial.print(".");
      Serial.println(ip[3]);
     ip[0] = z = 192;
     ip[1] = x = 168;
     ip[2] = c = 0;
     ip[3] = v = 220;
      Serial.print(ip[0]);
      Serial.print(".");
      Serial.print(ip[1]);
      Serial.print(".");
      Serial.print(ip[2]);
      Serial.print(".");
      Serial.println(ip[3]);
      EEPROM.write(INDIRIZZO[j],  ip[j]);
 }
}
  }

purtroppo ho dovuto inserire ip[0] ecc ecc xkè se digitavo solamente le variabili non succedeva niente!

Come si capisce il primo loop che esegue serve solo a dargli l'indirizzo ip e memorizzarlo nelle celle della memoria EEPROM, dopodichè nel momento in cui resetto ho la lettura della eeprom e quindi il mio indirizzo ip è funzionante!
Un po maccheronico, ma efficace(penso).

Scusate se ora vado oltre, ma mi chiedevo se invece di essere "vincolato" ai diversi indirizzi ip, io volessi "scriverli" direttamente dal seriale, è possibile??? Perchè in questo modo potrei anche cambiare eventualmente una password da seriale, e non sarebbe una fesseria !!! Che ne dite? è fattibile?

Per verificare se un indirizzo IP è già memorizzato nella EEPROM potresti fare così:
nel setup, leggi il 1° byte dell'indirizzo e controlli che non sia pari a zero. Se è zero (non mi pare che esistano classi di indirizzo 0.xxx.xxx.xxx) vuol dire che nessun IP è mai stato memorizzato, se è diverso da zero, leggi i restanti byte e ricomponi l'IP.
Lo zero nella 1a cella ce lo devi mettere tu caricando un minisketch che non faccia altro che la scrittura nel suddetto byte del valore 0 (non ti fidare della memoria vergine: una cella "vergine" contiene 255, per ragioni che ora non sto a spiegarti).