Ethernet shield non va in rete.

Buongiorno,
Ho un problema con la ethernet shield di Arduino programmata come router per pilotare 4 relais da remoto.
Lo sketch passa il controllo dell'IDE e viene compilato senza errori, apro il monitor seriale e mi dice "Domotic Server test 1.0", ho impostato l'indirizzo IP sulla stessa categoria del router (IP impostato 192.168.1.100 - IP Router 192.168.1.1), fin qui tutto ok, il problema è che nella mia rete la shield non si trova, pingo l'indirizzo ma mi da "Host di destinazione non raggiungibile". L'hardware che uso è:

n.1 Arduino UNO ( originale Arduino )

n.1 ethernet shield ( https://www.hobbytronics.co.uk/arduino-wiznet-shield )

n.1 modulo relè 8 canali

n.1 PC Windows

n.1 switch semplice a 5 porte.

I cavi ethernet sono testati e funzionanti.

Ho anche provato a disabilitare il DHCP al router ma niente. Il mac sulla shield non è riportato quindi ne metto uno ricavato su internet e che comunque non è assegnato a nessun altro device all'interno della mia rete. Se non chiedo troppo, mi potreste dare qualche dritta per provare a risolvere questo problema, sto impazzendo! Grazie anticipatamente. Posto lo sketch anche se dovrebbe essere corretto.

#include <SPI.h>
#include <Ethernet.h>
 
boolean statop1 = false;
boolean statop2 = false;
boolean statop3 = false;
boolean statop4 = false;
boolean statop5 = false;
boolean statop6 = false;
boolean statop7 = false;
boolean statop8 = false;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 31, 220, 16, 204 }; // ip in lan
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port
 
String readString;
 
//////////////////////
 
void setup(){
 
  pinMode(9, OUTPUT); //pin selected to control
  pinMode(8, OUTPUT); //pin selected to control
  pinMode(7, OUTPUT); //pin selected to control
  pinMode(6, OUTPUT); //pin selected to control
  pinMode(5, OUTPUT); //pin selected to control
  pinMode(4, OUTPUT); //pin selected to control
  pinMode(3, OUTPUT); //pin selected to control
  pinMode(2, OUTPUT); //pin selected to control
  //start Ethernet
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.begin(9600);
  Serial.println("Domotic Server test 1.0"); // so I can keep track of what is loaded
}
 
void loop(){
  // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
 
        //read char by char HTTP request
        if (readString.length() < 100) {
 
          //store characters to string
          readString += c;
          //Serial.print(c);
        }
 
        //if HTTP request has ended
        if (c == '\n') {
 
          ///////////////
          Serial.println(readString); //print to serial monitor for debuging
 
          client.println("HTTP/1.1 200 OK"); //send new page
          client.println("Content-Type: text/html");
          client.println();
 
          client.println(F("<!DOCTYPE html><html><head><meta name='apple-mobile-web-app-capable' content='yes'><meta name='apple-mobile-web-app-status-bar-style' content='black-translucent'><link rel='stylesheet' type='text/css' href='http://homeautocss.net84.net/a.css'><TITLE>Domotic Home JDM.snake</TITLE></HEAD><BODY><H1>Domotic Home JDM.snake</H1><hr>
<ul><li><p align=\"left\">Corridoio:<a href=\"/?light1on\">Accendi</a><a href=\"/?light1off\">Spegni</a></li></p>

<li><p align=\"left\">Salotto:<a href=\"/?light2on\">Accendi</a><a href=\"/?light2off\">Spegni</a></li></p>

<li><p align=\"left\">Cucina:<a href=\"/?light3on\">Accendi</a><a href=\"/?light3off\">Spegni</a></li></p>

<li><p align=\"left\">Bagno:<a href=\"/?light4on\">Accendi</a><a href=\"/?light4off\">Spegni</a></li></p>

<li><p align=\"left\">Ripostiglio:<a href=\"/?light5on\">Accendi</a><a href=\"/?light5off\">Spegni</a></li></p>

<li><p align=\"left\">Esterno:<a href=\"/?light6on\">Accendi</a><a href=\"/?light6off\">Spegni</a></li></p>

<li><p align=\"left\">Ufficio:<a href=\"/?light7on\">Accendi</a><a href=\"/?light7off\">Spegni</a></li></p>

<li><p align=\"left\">Camera da Letto:<a href=\"/?light8on\">Accendi</a><a href=\"/?light8off\">Spegni</a></li></p>

</ul></BODY><body bgcolor=\"grey\"></HTML>"));
 
          delay(1);
          //stopping client
          client.stop();
 
          ///////////////////// control arduino pin
          if(readString.indexOf("?light1on") >0)//checks for on
          {
            statop1 = true;
          }
          if(readString.indexOf("?light1off") >0)//checks for off
          {
            statop1 = false;
          }
          if(readString.indexOf("?light2on") >0)//checks for on
          {
            statop2 = true;
          }
          if(readString.indexOf("?light2off") >0)//checks for off
          {
            statop2 = false;
          }
          if(readString.indexOf("?light3on") >0)//checks for on
          {
            statop3 = true;
          }
          if(readString.indexOf("?light3off") >0)//checks for off
          {
            statop3 = false;
          }
          if(readString.indexOf("?light4on") >0)//checks for on
          {
            statop4 = true;
          }
          if(readString.indexOf("?light4off") >0)//checks for off
          {
            statop4 = false;
          }
          if(readString.indexOf("?light5on") >0)//checks for on
          {
            statop5 = true;
          }
          if(readString.indexOf("?light5off") >0)//checks for off
          {
            statop5 = false;
          }
          if(readString.indexOf("?light6on") >0)//checks for on
          {
            statop6 = true;
          }
          if(readString.indexOf("?light6off") >0)//checks for off
          {
            statop6 = false;
          }
          if(readString.indexOf("?light7on") >0)//checks for on
          {
            statop7 = true;
          }
          if(readString.indexOf("?light7off") >0)//checks for off
          {
            statop7 = false;
          }
          if(readString.indexOf("?light8on") >0)//checks for on
          {
            statop8 = true;
          }
          if(readString.indexOf("?light8off") >0)//checks for off
          {
            statop8 = false;
          }
          
          
          if(statop1 == true)
          {
            digitalWrite(9, LOW);            
          }
          if(statop1 == false)
          {
            digitalWrite(9, HIGH);            
          }
          if(statop2 == true)
          {
            digitalWrite(8, LOW);            
          }
          if(statop2 == false)
          {
            digitalWrite(8, HIGH);            
          }
          if(statop3 == true)
          {
            digitalWrite(7, LOW);            
          }
          if(statop3 == false)
          {
            digitalWrite(7, HIGH);            
          }
          if(statop4 == true)
          {
            digitalWrite(6, LOW);            
          }
          if(statop4 == false)
          {
            digitalWrite(6, HIGH);
          }
          if(statop5 == true)
          {
            digitalWrite(5, LOW);            
          }
          if(statop5 == false)
          {
            digitalWrite(5, HIGH);            
          }
          if(statop6 == true)
          {
            digitalWrite(4, LOW);            
          }
          if(statop6 == false)
          {
            digitalWrite(4, HIGH);            
          }
          if(statop7 == true)
          {
            digitalWrite(3, LOW);            
          }
          if(statop7 == false)
          {
            digitalWrite(3, HIGH);            
          }
          if(statop8 == true)
          {
            digitalWrite(2, LOW);            
          }
          if(statop8 == false)
          {
            digitalWrite(2, HIGH);            
          }
          //clearing string for next read
          readString="";
 
        }
      }
    }
  }
}

Questo è l'ip che hai assegnato:

byte ip[] = { 31, 220, 16, 204 }; // ip in lan

Che non è quello che tu dichiari di aver assegnato (192.168.1.100), l'ip assegnato non è nella tua rete interna.

Scusa ma ho postato lo sketch originale, l'IP inserito è quello corretto (192.168.1.100), l'ho modificato prima di lanciarlo su arduino.

E allora se l'ip assegnato è corretto devi provare a contattarlo via browser e verificare che se metti http://192.168.1.100 nel monitor seriale appaiano i messaggi di debug, se non appaiono decommenta la riga di codice che stampa ogni carattere letto e vedi se almeno quelli li stampa, se non è così probabile che qualche impostazione di rete instradi la chiamata a quell'ip verso un altro dispositivo.

Ci sono shield cinesi che per un errore di fabbrica (delle resistenze) non funzionano correttamente. Per verificare se hai una di queste, prova a collegare la shield direttamente ad una porta del router ossia senza passare per alcuno switch: se così funziona, allora hai (come me) una di quelle "fallate". L'ultriore conferma puoi averla andando a vedere l'indicazione sulla resistenza vicino al connettore Ethernet, che in quelle difettose è marcato 511 (ossia 510 Ohm) invece di 510 (51 Ohm). Per correggere il problema dovresti saldare due resistenze da 47 Ohm sui pin 1-2 e 3-6 del connettore.
Trovi tutte le info QUI.

fabpolli:
E allora se l'ip assegnato è corretto devi provare a contattarlo via browser e verificare che se metti http://192.168.1.100 nel monitor seriale appaiano i messaggi di debug, se non appaiono decommenta la riga di codice che stampa ogni carattere letto e vedi se almeno quelli li stampa, se non è così probabile che qualche impostazione di rete instradi la chiamata a quell'ip verso un altro dispositivo.

Ho inserito l'http ma sul monitor seriale non mi ha dato nulla, scusa la mia ignoranza ma non ho capito cosa devo decommentare.

docdoc:
Ci sono shield cinesi che per un errore di fabbrica (delle resistenze) non funzionano correttamente. Per verificare se hai una di queste, prova a collegare la shield direttamente ad una porta del router ossia senza passare per alcuno switch: se così funziona, allora hai (come me) una di quelle "fallate". L'ultriore conferma puoi averla andando a vedere l'indicazione sulla resistenza vicino al connettore Ethernet, che in quelle difettose è marcato 511 (ossia 510 Ohm) invece di 510 (51 Ohm). Per correggere il problema dovresti saldare due resistenze da 47 Ohm sui pin 1-2 e 3-6 del connettore.
Trovi tutte le info QUI.

Con mia grande delusione apprendo, per come mi hai consigliato, che è una di quelle cinesi fallate, riporta sulla resistenza 511. E meno male che l'ho comprata di persona presso arduiner per non ritirare una cineseria qualsiasi...... Roba da matti!!!! Scusa tanto, quali sono i pin 1-2 e 3-4? Di quale connettore si tratta? Grazie in anticipo.

Ecco tutto quello che ti occorre sapere:

Come vedi, sono i pin 1-2 e 3-6, come ti avevo scritto. Metti due resistenze (più piccole che hai) da 47 o da 56 ohm (con 47 hai un valore un po' più basso dei 51 originari, meglio 56 se ne hai...)

chico157:
Ho inserito l'http ma sul monitor seriale non mi ha dato nulla, scusa la mia ignoranza ma non ho capito cosa devo decommentare.

L'importanza delle virgole che non ho messo :slight_smile:
L'indirizzo http://192.168.1.100 devi metterlo nel browser non nel monitor seriale.
A seguito della richiesta inviata da browser devi vedere sul monitor seriale i messaggi di debug.
La riga da decommentare è:

Serial.print(c)

Fermo restando che prima devi sistemare la shield come indicato da @docdoc

fabpolli:
L'importanza delle virgole che non ho messo :slight_smile: .....

Tranquillo avevo capito bene, l'http l'ho inserito nel browser e ho aspettato dei segnali dal monitor seriale che non sono arrivati. Nel pomeriggio saldo le resistenze, decommento la riga che mi hai indicato e provo di nuovo, speriamo bene!

>chico157: Quando si quota un post, NON è necessario riportarlo (inutilmente) tutto; bastano poche righe per far capire di cosa si parla ed a cosa ci si riferisce, inoltre, se si risponde al post immediatamente precedente, normalmente NON è necessario alcun "quote" dato che è sottinteso. :slight_smile:

Gli utenti da device "mobile" (piccoli schermi) ringrazieranno per la cortesia :wink:

Guglielmo

P.S.: Ho troncato io il "quote" dal tuo post qui sopra :wink:

gpb01: Ok, grazie per il suggerimento.

fabpolli:
docdoc:
Siete Grandi!!!!!!!!!
Ho fatto quello che mi avete detto e funziona perfettamente.
Grazie mille.

Ottimo! Good coding!