Ethernet shield per ON/OFF led da browser, mi sfugge qualcosa?! Aiutoo

Ciao a tutti,
ho un piccolo problema con uno sketch per la ethernet shield; inserisco qui sotto il codice:

String stringa="";

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};

IPAddress ip(192, 168, 0, 177);

EthernetServer server(80);

void setup() {
  
  Ethernet.begin(mac, ip);
  server.begin();
  
  pinMode(5,OUTPUT);
  pinMode(7,OUTPUT);
}


void loop() {
  
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n') {
          if(stringa.substring(5,11) == "acceso")
            digitalWrite(5,HIGH);
          else if(stringa.substring(5,11) == "spento")
            digitalWrite(5,LOW);
           
            if(stringa.substring(5,12) == "acceso2")
            digitalWrite(7,HIGH);
          else if(stringa.substring(5,12) == "spento2")
            digitalWrite(7,LOW);
         
          
          // Pagina in HTML
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          
          client.println("<html>");
          client.println("<a href='http://");
          client.println(Ethernet.localIP());
          client.println("/acceso'> Accendi rosso </a>");
          client.println("
");
          client.println("<a href='http://");
          client.println(Ethernet.localIP());
          client.println("/spento'> Spegni rosso </a>");
          client.println("</html>");
          client.println("
");
     
          client.println("</html>");
          client.println("<a href='http://");
          client.println(Ethernet.localIP());
          client.println("/acceso2'> Accendi verde </a>");
          client.println("
");
          
          client.println("<a href='http://");
          client.println(Ethernet.localIP());
          client.println("/spento2'> Spegni verde </a>");
          client.println("</html>");
   
          
          stringa="";
          break;
          
        }
        stringa+=c;
      }
    }
    delay(1);

    client.stop();

  }
}

Aprendo la pagina dal browser vedo correttamente i quattro comandi uno sotto l'altro, i primi due funzionano correttamente, gli altri due no; mi spiego meglio sperando di riuscirci:

Se clicco sul comando "accendi rosso", il led rosso (abbinato al Pin 5) si accende, se clicco sul comando "spegni rosso", il led rosso si spegne.

Quando vado a cliccare sulla voce "accendi verde", mi si accendono entrambi i led (sia rosso che verde), cliccando "spegni verde" mi si spengono entrambi; se invece clicco su "accendi verde" (si accendono entrambi) e poi clicco su "spegni rosso", rimane acceso solo il led verde.
Cosa mi sfugge nel codice secondo voi? :drooling_face:

Grazie mille!!!

Miky

Funziona!!!
Grazie a tutti per l’aiuto, l’unico problema che è rimasto è che posso controllare solo in locale e non in remoto, non saprei come fare.

Chiedo scusa per gli errori commessi nel post, spero di aver usato l’anno funzione corretta ora.

Per forza, la stringa "acceso2" che accende il secondo led contiene anche la stringa "acceso", che accende il primo led.

Idem per lo spegnimento.

Grazie mille!!!

Come faccio a dividerle?

bhe...banalmente invia: acceso1 ed acceso2....spento1 e spento2 ...e per entrambi controlli la medesima substring(5,12).

>MichelePap: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post iniziale (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Grazie.

Guglielmo

Ciao a tutti,
ho seguito le indicazioni di Guglielmo, probabilmente in maniera errata e mi sono accorto che la mia risposta non l’ha visualizzata nessuno, probabilmente ho sbagliato quanlcosa.

Vorrei ringraziavi per il vostro aiuto, ora funziona tutto alla perfezione, grandi!!!
L’unica cosa che non riesco a fare è agire da remoto, ho provato a fare mille modifiche allo sketch ma niente da fare, il locale tutto perfetto, da remoto zero...
Come potrei fare?
Grazie mille!

Miky

MichelePap:
Ciao a tutti,
ho seguito le indicazioni di Guglielmo, probabilmente in maniera errata

Ovviamnete SI ... hai messo '<' e '>' mentre ti ho detto di usare IL BOTTONE con il simbolo "</>" che include i tag CODE che vanno messi all'inizio ed alla fine del codice !

Ho corretto io il tuo post ... vai a vedere come ...

Guglielmo

MichelePap:
L’unica cosa che non riesco a fare è agire da remoto, ho provato a fare mille modifiche allo sketch ma niente da fare, il locale tutto perfetto, da remoto zero...

Non capisco, cosa intendi con "locale" e "remoto"?

Chiedo scusa per l’errore, grazie mille.

Intendevo che se accedo alla pagina web inserendo l’indirizzo IP locale attribuito ad Arduino dai dispositivi collegati alla stessa rete, riesco ad eseguire il comando; se cerco di accedere alla pagina da remoto tramite l’IP pubblico attribuito al route, si apre la pagina corretta con i comandi, ma se clicco sui “pulsanti” il comando non viene eseguito.

Probabilmente perché costruisci la pagina inserendo dei riferimenti all'IP interno

client.println("<a href='http://");
client.println(Ethernet.localIP());

Esatto. Togli dagli URI i riferimenti al protocollo e all'indirizzo IP, ossia invece di:

client.println(" Accendi verde ");

metti semplicemente:

client.println(" Accendi verde ");

Il browser utilizzerà automaticamente protocollo (http o anche https se l'hai usato) e indirizzo IP o nome host (e magari con un DynamicDNS puoi definirti un nome senza stare ad impazzire per sapere quale sia l'IP pubblico, se dinamico).

Occhio però che così facendo chiunque da qualunque parte del mondo potrà accendere e spegnere le tue cose...

Grandi, grazie mille, funziona alla grandissima!!!
Bhe ma per poter accedere da remoto occorre conoscere l'indirizzo IP pubblico, lo conosco solo io.

Ora l'ultimo step che mi blocca è riuscire ad utilizzare un router secondario come bridge, altrimenti sono obblicato a tenere la shield collegata al pc (che funziona da bridge)...

Certo, lo conosci solo tu, come no...

MichelePap:
Bhe ma per poter accedere da remoto occorre conoscere l'indirizzo IP pubblico, lo conosco solo io.

:smiley: :smiley: :smiley: ... hai le idee piuttosto confunse sull'argomento ... t'assicuro che lo conoscono TUTTI quelli che vogliono fare "danni" !

Ci sono "bot" e "spyder" che girano 24/24 ore alla ricerca di "porte aperte" come vuoi fare tu ... :smiling_imp:

Guglielmo

Scusate, ma mi sto avvicinando ora al complicato mondo del networking e non è facile capirne tutte le dinamiche in poco tempo.
Ci sarebbe un modo per ovviare a questo inconveniente?
Grazie