ethernet reset

Salve ragazzi… io ho questo sketch. In pratica riesco a pilotare dei relè collegandomi via lan all’indirizzo 192.168.1.100. Inoltre ho fatto la registrazione a dyndns e quindi è come se avessi un sito web su cui posso entrare via internet da qualunqe parte. Lo sketch funziona bene, l’unica cosa è che se mi collego alla pagina con 2 computer contemporaneamente, o se clicco un paio di comandi nel sito dyndns, la pagina si blocca. Mentre invece se lo faccio funzionare semplicemente con la lan funziona perfettamente. Per far sbloccare il tutto basta che premo il tasto reset sulla shield e il tutto ricomincia a funzionare. Ho letto un po in giro e ho capito che potrebbe essere un problema del w5100 e che per risolverlo basta mettere un condensatore da 47nF tra il piedino di reset e quello di GND o di pilotare manualmente il piedino reset collegandolo ad un uscita digitale di arduino. Con il primo metedo ho provato, ma ci mette troppo tempo a resettare il sistema, mentre con il secondo metodo ho deciso di impostare un tempo di reset di 6-7 secondi ma ho avuto delle difficoltà nello schetch. Ho aggiunto nel void loop il seguente codice:

digitalWrite(2,LOW);
delay(6000);
digitalWrite(2,HIGH);
delay(500);

prima di collegarlo al piedino di reset, ho provato a collegare un led, funziona, solo che se premo nella pagina web un pulsante che mi permette di effettuare un comando (es. lampada n1) devo aspettare 4 secondi affinchè il comando possa essere effettuato. è possibile isolare il tempo di reset mettendolo diciamo in un altro void loop? c’è vorrei che il tutto funzionasse normalmente, solo che ogni 6-7 secondi il sistema si resettasse da solo. Potreste aiutarmi ragazzi?

lo sketch:

#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h> 
Servo myservo;

byte mac[] = { 0x54, 0x55, 0x58, 0x10, 0x05, 0x24 };
byte ip[]  = { 192, 168, 1, 100 };                  // IP-Adresse
byte gateway[] = { 192, 168, 1, 1 };                // Gateway
byte subnet[]  = { 255, 255, 255, 0 };

Server server(80);

int Pin1 = 8;
int Pin2 = 3;
int Pin3 = 4;
int Pin4 = 4;
int servo = 9;
String readString = String(100);
int pos = 0; 
int pos1 = 45; 
int pos2 = 90;
int controllo = 0;
int resetta = 2;
void setup(){
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
pinMode(Pin1, OUTPUT);
pinMode(Pin2, OUTPUT);
pinMode(Pin3, OUTPUT);
pinMode(Pin4, OUTPUT);
pinMode(servo, OUTPUT);
pinMode(resetta, OUTPUT);
Serial.begin(9600); 
myservo.attach(9); 
}
void loop(){
  
Client client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();

if (readString.length() < 100) {
readString = readString + c;
}

Serial.print(c);

if (c == '\n') {

if(readString.indexOf("1=Accendi") > -1) {
digitalWrite(Pin1, HIGH);
controllo = true;
}
if(readString.indexOf("10=Spegni") > -1) {
digitalWrite(Pin1, LOW);
controllo = false;
}
if(readString.indexOf("11=1+Minuto") > -1) {
  controllo = true;
digitalWrite(Pin1, HIGH);
delay(60000);
digitalWrite(Pin1, LOW);
delay(1000);
controllo = false;
}
if(readString.indexOf("2=0+Gradi") > -1) {
    myservo.write(pos);             
    delay(20);                       
} if(readString.indexOf("22=45+Gradi") > -1) {
    myservo.write(pos1);              
    delay(20);                       
}
if(readString.indexOf("3=Lampeggio") > -1) {
digitalWrite(Pin1, HIGH);
delay(500);
digitalWrite(Pin1, LOW);
delay(500);
digitalWrite(Pin1, HIGH);
delay(500);
digitalWrite(Pin1, LOW);
delay(500);
digitalWrite(Pin1, HIGH);
delay(500);
digitalWrite(Pin1, LOW);
delay(500);
digitalWrite(Pin1, HIGH);
delay(500);
digitalWrite(Pin1, LOW);
delay(500);
digitalWrite(Pin1, HIGH);
delay(500);
digitalWrite(Pin1, LOW);
delay(500);
digitalWrite(Pin1, HIGH);
controllo = true;
}
if(readString.indexOf("4=On+%2F+Off") > -1) {
digitalWrite(Pin4, HIGH);
delay(5000);
digitalWrite(Pin4, LOW);
}
if(readString.indexOf("all=Spegni") > -1){
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
digitalWrite(Pin4, LOW);
myservo.write(pos);             
delay(20); 
controllo = false;
}
//--------------------------HTML------------------------
client.println("HTTP/1.1 200 OK");

client.println("Content-Type: text/html");

client.println();

client.print("<html><head>");

client.print("<title>Arduino Webserver</title>");

client.println("</head>");

client.print("<body>");

client.println("<div style='width:1024px; height:768px;'>");

client.println("<center><font color='#FF0000'>ARDUINO GINO</font color></center>");

client.println("
");

client.println("<table><tr>");

client.println("<td><font color='#FF0000' face='Verdana' size='2'>Lampada n1</font></td>");

client.println("<td><form method=get><input type=submit name=1 value='Accendi'></form></td>""<td><form method=get><input type=submit name=10 value='Spegni'></form></td>"
               "<td><form method=get><input type=submit name=11 value='1 Minuto'></form></td>");

client.println("</tr><tr><td><font color='#489EF5' face='Verdana' size='2'>Servo</font></td>");

client.println("<td><form method=get ><input type=submit name=2 value='0 Gradi' ></form></td>""<td><form method=get ><input type=submit name=22 value='45 Gradi' ></form></td>");

client.println("</tr><tr><td><font color='#f59e47' face='Verdana' size='2'>Campanello per papa'</font></td>");

client.println("<td><form method=get><input type=submit name=3 value='Lampeggio'></form></td>");

client.println("</tr><tr><td><font color='#00FF00' face='Verdana' size='2'>Controllo n4
</font></td>");

client.println("<td><form method=get><input type=submit name=4 value='On / Off'></form></td>");

client.println("</tr><tr><td><font color='#FF00FF' face='Verdana' size='2'>Spegni tutto</font></td><td><form method=get><input type=submit name=all value='Spegni'></form></td>");
if(controllo == true){
 client.println("Acceso");
 }else{
 client.println("Spento");
}
client.println("</tr><table></div></body></html>");
readString="";
client.stop();
}}}}}

Ciao, anticipo che non ho letto il tuo codice, ma il problema che segnali lo segnalai taaaanto tempo fa anche io. La soluzione (per me) è stata appunto di utilizzare un pin di Arduino collegato al piedino reset dello shield eth piegato verso l'esterno. Da codice, ho istanziato una sorta di watchdog: se entro un tempo prefissato non ricevo una determinata get da un sistema di controllo di rete, si resetta. Altrimenti non fa nulla (inutile continuare a resettare).

La soluzione alternativa, è effettuare una query in rete (gateway o sito esterno), e nel caso non ci sia risposta (che significa eth shield freeze-ato) allora effettua reset. Ti link qui: http://arduino.cc/forum/index.php/topic,59184.msg434561.html#msg434561 e qui: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1282231155/27#27 post inerenti.

vorrei che il tutto funzionasse normalmente, solo che ogni 6-7 secondi il sistema si resettasse da solo.

questo metodo non te lo consiglio, rischi di perderti comandi per strada...

Lo shield eth che hai, è la prima o la seconda versione (con slot sd)? Inoltre, ho visto al volo che utilizzi delay() all'intenro del codice, per esempio per mantenere accesa la lampada per 1 minuto. Questo blocca l'esecuzione di tutto il codice.... Usa piuttosto millis() http://www.arduino.cc/en/Reference/Millis o metro() http://www.arduino.cc/playground/Code/Metro

pitusso: Ciao, anticipo che non ho letto il tuo codice, ma il problema che segnali lo segnalai taaaanto tempo fa anche io. La soluzione (per me) è stata appunto di utilizzare un pin di Arduino collegato al piedino reset dello shield eth piegato verso l'esterno. Da codice, ho istanziato una sorta di watchdog: se entro un tempo prefissato non ricevo una determinata get da un sistema di controllo di rete, si resetta. Altrimenti non fa nulla (inutile continuare a resettare).

La soluzione alternativa, è effettuare una query in rete (gateway o sito esterno), e nel caso non ci sia risposta (che significa eth shield freeze-ato) allora effettua reset. Ti link qui: http://arduino.cc/forum/index.php/topic,59184.msg434561.html#msg434561 e qui: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1282231155/27#27 post inerenti.

vorrei che il tutto funzionasse normalmente, solo che ogni 6-7 secondi il sistema si resettasse da solo.

questo metodo non te lo consiglio, rischi di perderti comandi per strada...

Lo shield eth che hai, è la prima o la seconda versione (con slot sd)? Inoltre, ho visto al volo che utilizzi delay() all'intenro del codice, per esempio per mantenere accesa la lampada per 1 minuto. Questo blocca l'esecuzione di tutto il codice.... Usa piuttosto millis() http://www.arduino.cc/en/Reference/Millis o metro() http://www.arduino.cc/playground/Code/Metro

ciao..Pitusso.. ho risolto mettendo il watchdog...grazie :) ascolta..vorrei imparare a usare millis...ho trovato degli esempi su cm far lampeggiare un led xo nn riesco a trovare il modo x regolare il tempo di accesione e quello di spegnimento..potresti darmi un esempio di un lampeggio di un led che faccia ad esempio:

5 secondi il led è spento e dopo 5 secondi accendi il led per 1 secondo..

potresti aiutarmi x favore cercando di prepararmi uno sketch molto molto semplice e banale? ti ringrazio..ho bisogno di capire..:) ciao

ciao,

potresti aiutarmi x favore cercando di prepararmi uno sketch molto molto semplice e banale?

semplice e banale come questo? http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay :P

Qui trovi invece un'esauriente spiegazione dell'utilizzo di millis(), scritta da Vittorio Zuccalà aka nathanvi: http://zuccala.blogspot.com/2010/01/multitasking-arduino-millis-parte-1.html c'è pure una parte 2.

pitusso: ciao,

potresti aiutarmi x favore cercando di prepararmi uno sketch molto molto semplice e banale?

semplice e banale come questo? http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay :P

Qui trovi invece un'esauriente spiegazione dell'utilizzo di millis(), scritta da Vittorio Zuccalà aka nathanvi: http://zuccala.blogspot.com/2010/01/multitasking-arduino-millis-parte-1.html c'è pure una parte 2.

si ho capito, queste già le avevo lette anche io..xo, se cambio l'intervallo automaticamente si cambia sia il tempo di accensione che quello di spegnimento... in pratica se metto interval = 1000; il led 1secondo sarà acceso e 1 secondo sarà spento...e se per esempio io vorrei che il led stesse spento per 4 secondi e acceso per 1 secondo? come devo fare?