Indirizzo ip ethernet shield

Salve a tutti, stavo cercando di controllare un led da remoto.

#include <SPI.h>
#include <Ethernet.h>
#define LED 13
#define LT String("<")

// Imposto le configurazioni di rete
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 32);
IPAddress dnServer(8, 8, 8, 8); // DNS Server di Google
IPAddress gateway(192, 168, 0, 1); // IP del GATEWAY
IPAddress subnet(255, 255, 255, 0); // subnet mask

EthernetServer server(80);

void setup() 
{
  // Inizializza la connessione Ethernet e il server:
  Ethernet.begin(mac, ip, dnServer, gateway, subnet);
  // oppure solo:  Ethernet.begin(mac, ip);
  // Se uso il DHCP: 
  // if (Ethernet.begin(mac) == 0) {
  //    Serial.println("configurazione Ethernet utilizzando DHCP fallita!")
  server.begin();
  // Inizializzo il LED a spento
  pinMode(LED,OUTPUT);
  digitalWrite(LED,LOW);
}

void loop() 
{
   int p,q;
   char c;
   String msg = "";
   String cmd = "";

   // rimane in attesa di un client 
   EthernetClient client = server.available();
   if (client) // Se ho una richiesta al server ... 
   {
     // Una richiesta http termina con una linea bianca
     boolean currentLineIsBlank = true;
     while (client.connected()) 
     {
       if (client.available()) 
       {
         c = client.read();
         msg += c; //ricostruisco la stringa ricevuta concatenando i singoli byte
         // Se si riceve la fine di una riga (indicata con il carattere '\n') 
         // e la linea è vuota allora la richiesta http si è conclusa e il 
         // server può inviare la risposta
         if (c == '\n' && currentLineIsBlank) 
         {
            // Invia l'header di risposta standard -------------
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");  // La connessione verrà chiusa al termine della trasmissione
            client.println();
            // Invia la pagina vera e propria
            client.println("");
            client.println(LT+"html>");
            client.println(LT+"title>Arduino WEB Server"+LT+"/title>");
            client.println(LT+"body>");
            client.println("Richiesta HTTP ricevuta:"+LT+"hr>"+LT+"font color=red>"+LT+"pre>");
            client.print(msg); // richiesta http del browser
            client.println(LT+"/pre>"+LT+"/font>"+LT+"hr>"+LT+"H1>");
            
            // Estraggo il comando:
            msg.toUpperCase();
            p=msg.indexOf("GET /");
            q=msg.indexOf(" HTTP/1.1");
            if ((p>=0) && (q>=0))
               cmd=msg.substring(p+strlen("GET /"),q);
            // Eseguo il comando
            if (cmd=="LED_ON")
            {
              digitalWrite(LED, HIGH);
              client.print("Comando LED_ON: accendo il LED");
            }
            else if (cmd=="LED_OFF")
            {
              digitalWrite(LED, LOW);
              client.print("Comando LED_OFF: spengo il LED");
            }
            else if (cmd=="STATUS")
            {
              client.print("Comando STATUS: il LED è ");
              if (digitalRead(LED)==HIGH)
                 client.print("acceso");
              else
                 client.print("spento");
            }
            else
            {
                if (cmd!="")
                   client.print("Comando "+cmd+": non riconosciuto!"+LT+"br>");
                // Costruzione del MENU se manca o metto un comando errato
                client.print(LT+"U>DIGITA SULLA BARRA DEGLI INDIRIZZI"+LT+"/U>:"+LT+"br>"+LT+"br>");
                client.print(LT+"A href=LED_ON>http://");
                client.print(Ethernet.localIP());
                client.print("/led_on"+LT+"/A> per accendere il LED"+LT+"br>");
                client.print(LT+"A href=LED_OFF>http://");
                client.print(Ethernet.localIP());
                client.print("/led_off"+LT+"/A> per spegnere il LED"+LT+"br>");
                client.print(LT+"A href=STATUS>http://");
                client.print(Ethernet.localIP());
                client.print("/status"+LT+"/A> per vedere lo stato del LED"+LT+"br>");
            }
            client.println(LT+"/h1>"+LT+"/body>"+LT+"/html>");
            cmd=msg="";
            break;
         }
         if (c == '\n') 
           currentLineIsBlank = true; // Inizia una nuova linea
         else if (c != '\r') 
           currentLineIsBlank = false; // ricevuto un nuovo carattere sulla linea corrente
       }
     }
     delay(1);  // lascia il tempo al browser per ricevere il dato
     client.stop(); // chiude la connessione con il client
   }
}

Ho usato questo codice e andando sulla pagina 192.168.1.32 mi si apre la pagina per la selezione dell'accensione, spegnimento e status del led. Il problema è che non funziona. Possibile che ci sia l'errore sull'indirizzo ip?

Grazie per il supporto

Se all'indirizzo ip c'è la pagina che cerchi, il problema sta nel codice di controllo del led.

Ciao, ho visto il tuo codice ma non l ho capito del tutto.. però ho capito quello che vuoi fare per questo ti posto il codice che ho usato io, molto più semplice rispetto al tuo, per comandare più led basta che inserisci più bottoni e fai fare più controlli. Spero di esserti stato utile, se hai dubbi (riguardante il codice che ti posto sotto, puoi chiedere tranquillamente).

#include <String.h>  
#include <SPI.h>  
#include <Ethernet.h>  
  
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };   
byte ip[] = { 192, 168, 1, 3 }; // indirizzo IP della shield  
byte gateway[] = { 192, 168, 1, 1 }; // indirizzo ip del router  
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask  
EthernetServer server(80);   
  
int ledPin = 9; // LED pin  
String readString;   
boolean LEDON = false;   
  
void setup(){  
Ethernet.begin(mac, ip, gateway, subnet);  
pinMode(ledPin, OUTPUT);  
Serial.begin(9600);  
}  
  
void loop(){  
EthernetClient client = server.available();  
if (client) {  
 boolean currentLineIsBlank = true;  
 while (client.connected()) {  
 if (client.available()) {  
 char c = client.read();  
 readString.concat(c);   
   
 if (c == '\n' && currentLineIsBlank) {  
   
 Serial.print(readString);  
   
 if(readString.indexOf("Led=1") > 0) {  
   
 digitalWrite(ledPin, HIGH);   
 LEDON = true;  
 }else if(readString.indexOf("Led=0") > 0){  
   
 digitalWrite(ledPin, LOW);   
 LEDON = false;  
 }  
   
 client.println("HTTP/1.1 200 OK");  
 client.println("Content-Type: text/html");  
 client.println();  
 client.print("<html><head><title>Megalab.it by MGTeck & Gabry 1609</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>");  
 if (LEDON) {  
 client.println("<img src=http://img849.imageshack.us/img849/1513/accesao.jpg />");  
 }  
 else  
 {  
 client.println("<img src=http://img10.imageshack.us/img10/4719/spenta.jpg />");  
 }  
 client.print("<h2><a href='/?Led=1'>ACCENDI</a> | <a href='/?Led=0'>SPEGNI</a></h2>");  
 client.println("</body></html>");  
 readString="";  
 client.stop();  
  
 }   
 }   
 }   
}   
}

E comunque c'e' un'incogruenza tra la classe e l'IP

IPAddress ip(192, 168, 1, 32);
IPAddress gateway(192, 168, 0, 1); // IP del GATEWAY
IPAddress subnet(255, 255, 255, 0); // subnet mask

Brunello:
E comunque c'e' un'incogruenza tra la classe e l'IP

IPAddress ip(192, 168, 1, 32);

IPAddress gateway(192, 168, 0, 1); // IP del GATEWAY
IPAddress subnet(255, 255, 255, 0); // subnet mask

Vero, è praticamente impossibile che l'ip e il gateway abbiano 1 e 0 al terzo posto

Pur sapendo che queste 3 righe
IPAddress dnServer(8, 8, 8, 8); // DNS Server di Google
IPAddress gateway(192, 168, 0, 1); // IP del GATEWAY
IPAddress subnet(255, 255, 255, 0); // subnet mask
nello sketch sono completamente inutili

In pratica sì, perché hai bisogno solo dell ip della scheda, se lo assegni statico tu dal codice

Gianluca4697:
Ciao, ho visto il tuo codice ma non l ho capito del tutto.. però ho capito quello che vuoi fare per questo ti posto il codice che ho usato io, molto più semplice rispetto al tuo, per comandare più led basta che inserisci più bottoni e fai fare più controlli. Spero di esserti stato utile, se hai dubbi (riguardante il codice che ti posto sotto, puoi chiedere tranquillamente).

#include <String.h>  

#include <SPI.h>  
#include <Ethernet.h>  
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  
byte ip[] = { 192, 168, 1, 3 }; // indirizzo IP della shield  
byte gateway[] = { 192, 168, 1, 1 }; // indirizzo ip del router  
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask  
EthernetServer server(80);  
 
int ledPin = 9; // LED pin  
String readString;  
boolean LEDON = false;  
 
void setup(){  
Ethernet.begin(mac, ip, gateway, subnet);  
pinMode(ledPin, OUTPUT);  
Serial.begin(9600);  
}  
 
void loop(){  
EthernetClient client = server.available();  
if (client) {  
boolean currentLineIsBlank = true;  
while (client.connected()) {  
if (client.available()) {  
char c = client.read();  
readString.concat(c);  
 
if (c == '\n' && currentLineIsBlank) {  
 
Serial.print(readString);  
 
if(readString.indexOf("Led=1") > 0) {  
 
digitalWrite(ledPin, HIGH);  
LEDON = true;  
}else if(readString.indexOf("Led=0") > 0){  
 
digitalWrite(ledPin, LOW);  
LEDON = false;  
}  
 
client.println("HTTP/1.1 200 OK");  
client.println("Content-Type: text/html");  
client.println();  
client.print("Megalab.it by MGTeck & Gabry 1609");  
if (LEDON) {  
client.println("");  
}  
else  
{  
client.println("");  
}  
client.print("

ACCENDI | SPEGNI

");  
client.println("");  
readString="";  
client.stop();  
 
}  
}  
}  
}  
}

Ciao. Ho provato il tuo codice. Lo carico su arduino (collegato alla lan). Vado sul mio pc collegato alla rete e inserisco l'ip 192, 168, 1, 32 (che è anche quello inserito su arduino) mi si apre la pagina con accendi e spegni, però purtroppo il led non si muove.Rimane sempre acceso e se cerco di settarlo subito spento non si spegne.

Gianluca4697:
Ciao, ho visto il tuo codice ma non l ho capito del tutto.. però ho capito quello che vuoi fare per questo ti posto il codice che ho usato io, molto più semplice rispetto al tuo, per comandare più led basta che inserisci più bottoni e fai fare più controlli. Spero di esserti stato utile, se hai dubbi (riguardante il codice che ti posto sotto, puoi chiedere tranquillamente).

#include <String.h>  

#include <SPI.h> 
#include <Ethernet.h> 
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
byte ip[] = { 192, 168, 1, 3 }; // indirizzo IP della shield 
byte gateway[] = { 192, 168, 1, 1 }; // indirizzo ip del router 
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask 
EthernetServer server(80); 
 
int ledPin = 9; // LED pin 
String readString; 
boolean LEDON = false; 
 
void setup(){ 
Ethernet.begin(mac, ip, gateway, subnet); 
pinMode(ledPin, OUTPUT); 
Serial.begin(9600); 

 
void loop(){ 
EthernetClient client = server.available(); 
if (client) { 
boolean currentLineIsBlank = true; 
while (client.connected()) { 
if (client.available()) { 
char c = client.read(); 
readString.concat(c); 
 
if (c == '\n' && currentLineIsBlank) { 
 
Serial.print(readString); 
 
if(readString.indexOf("Led=1") > 0) { 
 
digitalWrite(ledPin, HIGH); 
LEDON = true; 
}else if(readString.indexOf("Led=0") > 0){ 
 
digitalWrite(ledPin, LOW); 
LEDON = false; 

 
client.println("HTTP/1.1 200 OK"); 
client.println("Content-Type: text/html"); 
client.println(); 
client.print("Megalab.it by MGTeck & Gabry 1609"); 
if (LEDON) { 
client.println(""); 

else 

client.println(""); 

client.print("

ACCENDI | SPEGNI

"); 
client.println(""); 
readString=""; 
client.stop(); 
 




}

No scusami ho risolto sbagliavo io. Se volessi invece pilotare il led da remoto, quindi non essendo collegato alla lan come posso fare? Creando una pagina web apposita.. Un'altra domanda, con il modulo wifi cambierebbe molto?

Da remoto devi praticamente andare nelle impostazioni del tuo router e rendere l'ip attuale da te usato visibile all'esterno, assegnando a quell'ip porta interna 80 e porta esterna 4600 nella sezione port mapping del tuo router. Poi per accedervi da qualsiasi parte del pianeta ti basterà digitale il tuo ip esterno.

le impostazioni del tuo router si trovano digitando nel tuo caso nella barra di ricerca 192.168.1.1

As_Needed:
Da remoto devi praticamente andare nelle impostazioni del tuo router e rendere l'ip attuale da te usato visibile all'esterno, assegnando a quell'ip porta interna 80 e porta esterna 4600 nella sezione port mapping del tuo router. Poi per accedervi da qualsiasi parte del pianeta ti basterà digitale il tuo ip esterno.

le impostazioni del tuo router si trovano digitando nel tuo caso nella barra di ricerca 192.168.1.1

Ok grazie. Non è possibile invece utilizzare una pagina web personalizzata? Se sostituisco la ethernet shield con un modulo wifi le cose si complicano?

La pagina web personalizzata la puoi creare anche tu con i vari client.print e codice html nel tuo codice di Arduino. :wink:

di moduli wifi ne esistono a bizzeffe: in generale si può optare per gli ESP, oppure per l'ethernet shield con access point, oppure come ho fatto io, con i power line porti il segnale al modem come vuoi :wink:
Ti consiglio di dare un'occhiata a questo topic. Più che le cose si complicano c'è da fare qualcosa in più :wink:

Quanto richiesto è facilmente fattibile anche con Webbino, ho appena aggiunto un esempio che sostanzialmente fa esattamente quel che serve a te ;).

https://github.com/SukkoPera/Sukkino/tree/sd_support/Webbino/examples/LedControl

SukkoPera:
Quanto richiesto è facilmente fattibile anche con Webbino, ho appena aggiunto un esempio che sostanzialmente fa esattamente quel che serve a te ;).

https://github.com/SukkoPera/Sukkino/tree/sd_support/Webbino/examples/LedControl

Glielo volevo anche consigliare infatti, mi sono dimenticato!

SukkoPera:
Quanto richiesto è facilmente fattibile anche con Webbino, ho appena aggiunto un esempio che sostanzialmente fa esattamente quel che serve a te ;).

https://github.com/SukkoPera/Sukkino/tree/sd_support/Webbino/examples/LedControl

mi va in errore il link... è un crash temporaneo o sono rinco io?

A me funziona. Prova da qua.

A me va, Grazie a tutti!!

adesso mi va
boo... misteri..
grazie scusate ancora