comandare arduino da pagina web caricata su server remoto

Salve a tutti,
utilizzo il modulo ethernet ENC28J60 e la scheda arduino UNO.
Ho provato un paio di sketch che creano al loro interno la pagina html, ma, vista l'eccessiva occupazione di memoria, vorrei trovare il modo per comandare arduino da una pagina web caricata su un server remoto.
Sapete darmi qualche indizio?
Grazie
David

Bel moduletto ma l'ho dovuto abbandonare per un problemino .

Comincia con l'usare il parametro F( nei .print per risparmiare memoria, poi dovesti usare poco e niente la funzione string per problemi noti di memoria, al suo posto usa char.

Per il tuo problema lo potresti fare, ma il colloquo fra il server e l'arduino avverrebbe in http perchè le schede ethernet arduino non vanno in https.
Detto questo non devi far altro che inviare i comandi che invieresti dalla pagina in locale, devi inviarli da remoto, esempio

http://indizzo.arduino:porta/?led=1

,

naturulamente devi conoscere l'indirizzo ip pubblico dove è collegato l'arduino e devi nattare la porta del router che deve essere uguale a quella settata nello sketch.

per quanto riguarda la riduzione di occupazione memoria, nattare la porta ecc mi so muovere. Ho problemi proprio nella comunicazione tra pagina web ed arduino; in particolare come faccio ricevere ad arduino il comando inviato dal web? Esiste una funzione già implementata?

Ci sono molti esempi in rete il piu famoso penso che è questo di luca dentella , ci sono ad oggi 20 tutorial con esempi molto pratici con codice libero.

Ciao

Grazie pines, leggendo i tutorial di Luca Dentella ho iniziato a capire come muovermi ed a costruire qualcosa, ovvero ho creato una semplice pagina web che invia comandi on e off ad un led, ed implementato lo sketch per arduino nel modo seguente (per semplicità riporto solo il loop):

void loop(){
 EthernetClient client = server.available();
 if (client) {
 while (client.connected()) {
 if (client.available()) {
   
 if( client.find("ledon") ) {
 
 digitalWrite(6, HIGH);
 client.println("HTTP/1.1 200 OK");
 client.println("Content-Type: text/html");
 client.println("Access-Control-Allow-Origin: *");
 client.println();
 }
 
 
 if( client.find("ledoff) ) {
 
 digitalWrite(6, LOW);
 client.println("HTTP/1.1 200 OK");
 client.println("Content-Type: text/html");
 client.println("Access-Control-Allow-Origin: *");
 client.println();
 }
 
 // give the web browser time to receive the data
 delay(1);
 client.stop();
 //}
 }
}}

Il problema è che arduino esegue solo l'accensione del led, ovvero si verifica solo la condizione del primo if client.find. Quando comando lo spegnimento non succede nulla, il led resta acceso. Se inverto l'ordine dei due if client.find, cioè metto al primo posto if client.find("ledoff), arduino esegue solo quest'ultimo. Ho verificato questo mettendo una serie di serial.print.
Il problema potrebbe essere legato alla doppia chiamata alla funzione find?

if( client.find("ledoff) ) {

qui mancano le " di chiusura

la parte che fa la negoziazione

client.println("HTTP/1.1 200 OK");
 client.println("Content-Type: text/html");
 client.println("Access-Control-Allow-Origin: *");
 client.println();

andrebbe scritta una volta sola, metterlo più volte è inutile e uno spreco di ram, inoltre se arrivano 2 negoziazioni nella stessa istanza si incricca tutto.

dovrebbe essere per correttezza

...
...
if( client.find("ledon")) digitalWrite(6, 1);
if( client.find("ledoff")) digitalWrite(6, 0);

        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
...
...
 delay(1);
 client.stop();

Salve ho questo progetto arduino (robot con servo che si muove) vorrei comndarla sul web possiedo un ip pubblico ed un programma con cui crea dei siti html.
qulcuno mi puo aiutare vi allego il progetto
#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <Bridge.h>
#include <BridgeClient.h>
#include <BridgeServer.h>
#include <BridgeSSLClient.h>
#include <BridgeUdp.h>
#include <Console.h>
#include <FileIO.h>
#include <HttpClient.h>
#include <Mailbox.h>
#include <Process.h>
#include <YunClient.h>
#include <YunServer.h>

int E1 = 9; //controllo potenza motore
int M1 = 8; //controllo direzione motore
int E2 = 7;
int M2 = 6;
int sp = 128; //velocità motori
int cmd; //comando inserito
int ciclo = 0; //ciclo
int enab = 5;
void setup()
{
Serial.begin(9600);
pinMode(E1, OUTPUT);
pinMode(E2, OUTPUT);
pinMode(M1, OUTPUT);
pinMode(M2, OUTPUT);
pinMode(enab, OUTPUT);
Bridge.begin();
Console.begin();
while (!Console); // wait for Serial port to connect.
delay(10);

// server.listenOnLocalhost();
// server.begin();
}

void loop()
{
analogWrite(enab, sp);
// fermo();
/* BridgeClient client = server.accept();

if (client)
{
process(client);
client.stop();
}

delay(50);
*/
//if (ciclo == 0) { //mostra i comandi solo all'inizio e quando viene premuto Stop
Console.println(">> COMANDI ROBOT <<\n w - Avanti \n d - Destra \n a - Sinistra \n s - Indietro \n e - Ruota Destra \n q - Ruota Sinistra \n 0 - Stop");
Console.println(" 1 - Velocita' 35/100");
Console.println(" 2 - Velocita' 50/100");
Console.println(" 3 - Velocita' 75/100");
Console.println(" 4 - Velocita' 100/100");
Console.println("// Velocita' impostata //");
Console.println(sp);
// ciclo++;
delay(20);
// }

// else {
if (Console.available() > 0) {
cmd = Console.read();
Console.flush();

switch (cmd) {

case 'w': { //Avanti
digitalWrite(M1, LOW); //imposta direzione rotazione motore
digitalWrite(M2, LOW);
digitalWrite(E1, HIGH); //Controllo velocità PWM
digitalWrite(E2, HIGH);
delay(100);
Console.println("\nAVANTI");
}
break;

case 'd': { //Destra
digitalWrite(M1, HIGH); //imposta direzione rotazione motore
digitalWrite(M2, LOW);
digitalWrite(E1, LOW); //Controllo velocità PWM
digitalWrite(E2, HIGH);
delay(100);
Console.println("\nDESTRA");
}
break;

case 'a': { //Sinistra
digitalWrite(M1, LOW); //imposta direzione rotazione motore
digitalWrite(M2, HIGH);
digitalWrite(E1, HIGH); //Controllo velocità PWM
digitalWrite(E2, LOW);
delay(100);
Console.println("\nSINISTRA");
}
break;

case 's': { //Indietro
digitalWrite(M1, HIGH); //imposta direzione rotazione motore
digitalWrite(M2, HIGH);
digitalWrite(E1, LOW); //Controllo velocità PWM
digitalWrite(E2, LOW);
delay(100);
Console.println("\nINDIETRO");
}
break;
case '0':
{ //Stop
digitalWrite(M1, LOW); //imposta direzione rotazione motore
digitalWrite(M2, LOW);
digitalWrite(E1, LOW); //Controllo velocità PWM
digitalWrite(E2, LOW);
delay(100);
Console.println("\nSTOP\n");
//ciclo = 0;
}
break;

case '1': { //velocità 1 = 35%
sp = 89;
Console.println(sp);
}
break;

case '2': { //velocità 2 = 50%
sp = 128;
Console.println(sp);
}
break;

case '3': { //velocità 2 = 75%
sp = 192;
Console.println(sp);
} break;

case '4': { //velocità 2 = 100%
sp = 255;
Console.println(sp);
}
break;

} //fine switch
} //fine if
// } //fine else
} //fine loop

>dream82: essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO ...

... poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More -> Modify) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Grazie.

Guglielmo

Ciao dream82, ti consiglio patire piano piano, ti allego il listato che puoi comandare da serial monitor,poi dopo implementare via web.

int E1 = 9;   //controllo potenza motore
int M1 = 8;  //controllo direzione motore
int E2 = 7;
int M2 = 6;
int sp = 128;  //velocità motori
int cmd;  //comando inserito
int ciclo = 0; //ciclo
int enab = 5;
void setup()
{
  Serial.begin(9600);
  pinMode(E1, OUTPUT);
  pinMode(E2, OUTPUT);
  pinMode(M1, OUTPUT);
  pinMode(M2, OUTPUT);
  pinMode(enab, OUTPUT);


  delay(10);

  Serial.println(">> COMANDI ROBOT <<\n w - Avanti \n d - Destra \n a - Sinistra \n s - Indietro \n e - Ruota Destra \n q - Ruota Sinistra \n 0 - Stop");
  Serial.println(" 1 - Velocita' 35/100");
  Serial.println(" 2 - Velocita' 50/100");
  Serial.println(" 3 - Velocita' 75/100");
  Serial.println(" 4 - Velocita' 100/100");
  Serial.println("// Velocita' impostata //");
  Serial.println(sp);
  Serial.println("//ciAOOOO");
}

void loop()
{
  analogWrite(enab, sp);
  
  if (Serial.available() > 0) {
    cmd = Serial.read();
    Serial.flush();

    switch (cmd) {

      case 'w': {  //Avanti
          digitalWrite(M1, LOW);    //imposta direzione rotazione motore
          digitalWrite(M2, LOW);
          digitalWrite(E1, HIGH);   //Controllo velocità PWM
          digitalWrite(E2, HIGH);
          delay(100);
          Serial.println("\nAVANTI");
        }
        break;

      case 'd': {  //Destra
          digitalWrite(M1, HIGH);    //imposta direzione rotazione motore
          digitalWrite(M2, LOW);
          digitalWrite(E1, LOW);   //Controllo velocità PWM
          digitalWrite(E2, HIGH);
          delay(100);
          Serial.println("\nDESTRA");
        }
        break;

      case 'a': {  //Sinistra
          digitalWrite(M1, LOW);    //imposta direzione rotazione motore
          digitalWrite(M2, HIGH);
          digitalWrite(E1, HIGH);   //Controllo velocità PWM
          digitalWrite(E2, LOW);
          delay(100);
          Serial.println("\nSINISTRA");
        }
        break;

      case 's': {  //Indietro
          digitalWrite(M1, HIGH);    //imposta direzione rotazione motore
          digitalWrite(M2, HIGH);
          digitalWrite(E1, LOW);   //Controllo velocità PWM
          digitalWrite(E2, LOW);
          delay(100);
          Serial.println("\nINDIETRO");
        }
        break;
      case '0':
        { //Stop
          digitalWrite(M1, LOW);    //imposta direzione rotazione motore
          digitalWrite(M2, LOW);
          digitalWrite(E1, LOW);   //Controllo velocità PWM
          digitalWrite(E2, LOW);
          delay(100);
          Serial.println("\nSTOP\n");
          //ciclo = 0;
        }
        break;

      case '1': {  //velocità 1 = 35%
          sp = 89;
          Serial.println(sp);
        }
        break;

      case '2': {  //velocità 2 = 50%
          sp = 128;
          Serial.println(sp);
        }
        break;

      case '3': {  //velocità 2 = 75%
          sp = 192;
          Serial.println(sp);
        } break;

      case '4': {  //velocità 2 = 100%
          sp = 255;
          Serial.println(sp);
        }
        break;


    }  //fine switch
  }  //fine if
  // }  //fine else
}  //fine loop

Un robot può essere programmato da remoto per poi essere autonomo, ma via web scordati di muoverlo come se avessi un telecomando radio