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;
}
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).