Arduino webserver e browser Android

Ciao a tutti. Premetto che ho cercato in rete fino ad ora ma non ne sono venuto a galla..
Ho fatto il mio bel webserver Arduino con una paginetta che controlla 5 relè.
Se mi collego in locale, vedo tutta la pagina che ho caricato.

Se mi collego in remoto con lo smartphone, la pagina non viene visualizzata nella parte finale.

Potete vedere la pagina a: arduinoremote.ddns.net

Gli ultimi due pulsanti non vengono visualizzati e non riesco a capire il perchè...
Perchè in locale si vede tutto ed in remoto no?

Setup: Arduino Mega+ethernet shield

Grazie in anticipo,

Mimmo.

Secondo te da un immagine possiamo capire il perchè?
serve il codice altrimenti ciccia :slight_smile:

Ps. Lo sai che stai mostrando il tuo IP a tutto il mondo vero?

ciao

Beh, per l'IP non è che ci vuole un gran che ad averlo, e poi se non vedete non vi rendete conto dove finisce l'esecuzione del codice.
Ho omesso le impostazioni iniziali che funzionano ovviamente.

void setup(){
  pinMode(4, OUTPUT); //pin selected to control
  pinMode(5, OUTPUT); //pin selected to control
  pinMode(6, OUTPUT); //pin selected to control
  pinMode(7, OUTPUT); //pin selected to control
  pinMode(8, OUTPUT); //pin selected to control
  //start Ethernet
  Ethernet.begin(mac, ip, gateway, gateway, subnet);
  server.begin();

 Serial.begin(9600); 
 Serial.println("servertest1");

}

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 (readStr.length() < 100) {

          //store characters to string 
          readStr += c; 
          //Serial.print(c);
        } 

        //if HTTP request has ended
        if (c == '\n') {
          client.println("HTTP/1.1 200 OK"); //send new page
          client.println("Content-Type: text/html");
          client.println();

          client.println("<HTML>");
          client.println("<HEAD>");
          client.println("<TITLE>Arduino remote test page</TITLE>");
          client.println("</HEAD>");
          client.println("<BODY>");
          client.println("<table align=center border=3 cellpadding=1 cellspacing=1 style=width: 800px;height: 80px>");
          client.println("<tbody>");
          client.println("<tr>");
          client.println("<td style=text-align: center;>");
          client.println("<span style=font-size:36px;><strong>IZ0GIF&#39;S WEB REMOTE ANTENNA SWITCH</strong></span></td>");
          client.println("<tr>");
          client.println("<tbody>");
          client.println("</table>");
          client.println("
");
          client.println("<table align=center border=3 cellpadding=10 cellspacing=10 style=height: 400px; width: 800px;>");
          client.println("<tbody>");
          client.println("<tr>");
          client.println("<td style=text-align: center;>");
          client.print("<input type=submit value='ANT 1 ON' style=width:100px;height:45px onClick=location.href='/?on2;'>");
          client.println("<td>");
          client.println("<div style=text-align: center;>");
          client.print("<input type=submit value='ANT 1 OFF' style=width:100px;height:45px onClick=location.href='/?off3;'>");
          client.println("<td>");
          client.println("<div style=text-align: center;>");
          if(readStr.indexOf('2') >0)//checks for 2
          {
            digitalWrite(5, HIGH);    // set pin 5 high
            Serial.println("ANT 1 ON");            
          }
          if(readStr.indexOf('3') >0)//checks for 3
          {
            digitalWrite(5, LOW);    // set pin 5 low
            Serial.println("ANT 1 OFF");
          }
          if (digitalRead(5)==HIGH){
            client.print("<input type=submit value='ANT 1 is ON' style=background-color:yellowgreen;width:100px;height:45px>");
            }
          else{
          client.print("<input type=submit value='ANT 1 is OFF' style=background-color:red;width:100px;height:45px>");
          }              
          client.println("<tr>");
          client.println("<tr>");
          client.println("<td style=text-align: center;>");
          client.print("<input type=submit value='ANT 2 ON' style=width:100px;height:45px onClick=location.href='/?on4;'>");
          client.println("<td style=text-align: center;>");
          client.print("<input type=submit value='ANT 2 OFF' style=width:100px;height:45px onClick=location.href='/?off5;'>");
          client.println("<td style=text-align: center;>");
          if(readStr.indexOf('4') >0)//checks for 4
          {
            digitalWrite(6, HIGH);    // set pin 6 high
            Serial.println("ANT 2 ON");
          }
          if(readStr.indexOf('5') >0)//checks for 5
          {
            digitalWrite(6, LOW);    // set pin 6 low
            Serial.println("ANT 2 OFF");
          }
          if (digitalRead(6)==HIGH){
          client.print("<input type=submit value='ANT 2 is ON' style=background-color:yellowgreen;width:100px;height:45px>");
            }
          else{
          client.print("<input type=submit value='ANT 2 is OFF' style=background-color:red;width:100px;height:45px>");
          }
          client.println("<tr>");
          client.println("<tr>");
          client.println("<td style=text-align: center;>");
          client.print("<input type=submit value='ANT 3 ON' style=width:100px;height:45px onClick=location.href='/?on6;'>");
          client.println("<td style=text-align: center;>");
          client.print("<input type=submit value='ANT 3 OFF' style=width:100px;height:45px onClick=location.href='/?off7;'>");
          client.println("<td style=text-align: center;>");
          if(readStr.indexOf('6') >0)//checks for 6
          {
            digitalWrite(7, HIGH);    // set pin 7 high
            Serial.println("ANT 3 ON");
          }
          if(readStr.indexOf('7') >0)//checks for 7
          {
            digitalWrite(7, LOW);    // set pin 7 low
            Serial.println("ANT 3 OFF");
          }   
          if (digitalRead(7)==HIGH){
          client.print("<input type=submit value='ANT 3 is ON' style=background-color:yellowgreen;width:100px;height:45px>");
            }
          else{
          client.print("<input type=submit value='ANT 3 is OFF' style=background-color:red;width:100px;height:45px>");
          }
          client.println("<tr>");
          client.println("<tr>");
          client.println("<td style=text-align: center;>");
          client.print("<input type=submit value='ANT 4 ON' style=width:100px;height:45px onClick=location.href='/?on8;'>");          
          client.println("<td style=text-align: center;>");
          client.print("<input type=submit value='ANT 4 OFF' style=width:100px;height:45px onClick=location.href='/?off9;'>");
          client.println("<td style=text-align: center;>");
          if(readStr.indexOf('8') >0)//checks for 8
          {
            digitalWrite(8, HIGH);    // set pin 8 high
            Serial.println("ANT 4 ON");
          }
          if(readStr.indexOf('9') >0)//checks for 9
          {
            digitalWrite(8, LOW);    // set pin 8 low
            Serial.println("ANT 4 OFF");
          }
          if (digitalRead(8)==HIGH){
          client.print("<input type=submit value='ANT 4 is ON' style=background-color:yellowgreen;width:100px;height:45px>");
            }
          else{
          client.print("<input type=submit value='ANT 4 is OFF' style=background-color:red;width:100px;height:45px>");
          }
          client.println("<tr>");
          client.println("<tr>");
          client.println("<td style=text-align: center;>");
          client.print("<input type=submit value='ANT 5 ON' style=width:100px;height:45px onClick=location.href='/?onx;'>");          
          client.println("<td style=text-align: center;>");
          client.print("<input type=submit value='ANT 5 OFF' style=width:100px;height:45px onClick=location.href='/?offy;'>");
          client.println("<td style=text-align: center;>");
          if(readStr.indexOf('x') >0)//checks for x
          {
            digitalWrite(4, HIGH);    // set pin 4 high
            Serial.println("ANT 5 ON");
          }
          if(readStr.indexOf('y') >0)//checks for y
          {
            digitalWrite(4, LOW);    // set pin y low
            Serial.println("ANT 5 OFF");
          }
          if (digitalRead(4)==HIGH){
          client.print("<input type=submit value='ANT 5 is ON' style=background-color:yellowgreen;width:100px;height:45px>");
            }
          else{
          client.print("<input type=submit value='ANT 5 is OFF' style=background-color:red;width:100px;height:45px>");
          }
          
          delay(1);
                    
          //stopping client
          client.stop();                    
             
          //clearing string for next read
          readStr="";

        }
      }
    }
  }
}

Usa la macro F() per le stringhe statiche, soprattutto in un web server ci metti un attimo a finire la ram.

Dal compilatore, ho la seguente risposta, e di 8k di SRAM ne sto usando solo 3 scarsi.
Non sono ferratissimo ma mi sembra ce ne sia ancora o sbaglio interpretazione?

Ma la cosa che strana è che in locale vedo tutto correttamente. Ho provato a usare il mio pc in tethering con lo smartphone e di nuovo non vedo tutto e mancano gli ultimi due pulsanti..
Mi sto annodando il cervello :frowning:

Lo sketch usa 17.256 byte (6%) dello spazio disponibile per i programmi. Il massimo è 253.952 byte.
Le variabili globali usano 2.964 byte (36%) di memoria dinamica, lasciando altri 5.228 byte liberi per le variabili locali. Il massimo è 8.192 byte.

Mimmo

Il tuo link dns non funziona, ma lo sketch funziona sia su browser che su smartphone, anzi su smartphone le 5 righe di button occupano meno di metà schermo.

che browser usi sullo smartphone?
gli ultimi pulsanti non li vedi, ma gli altri funzionano quando li pigi o no?

Usare la macro F() è un buon consiglio
usare il pin 4 va bene basta che non inserisci SD nello slot
mettere readStr come variabile pubblica non è buona cosa

potevi usare un FOR di 5 cicli accorciavi di molto lo sketch ... esempio [post #6]
http://forum.arduino.cc/index.php?topic=298046.0

oppure usi il JqueryMobile che è molto semplice da usare e si adatta agli schermi dei cellulari ... esempio
http://forum.arduino.cc/index.php?topic=140852.0

puoi anche riconoscere tramite la request del client sapere se si sta connettendo un android, un linux, un windows e adattare le linee da inviare.

Leggere il MAC e IP remoto di chi si collega .. ma forse questo non ti serve

Scusatemi, ho spento il pc e quindi l'alimentazione alla board. Ora è di nuovo online.
Intanto grazie per i suggerimenti, riadatterò tutto usando la macr F() ed il FOR per accorciare.

Dal browser Android Chrome e da quello standard Android, non vedo gli ultimi due pulsanti. Per il resto funziona tutto perfettamente.

Qualsiasi cosa è scritto dopo il primo pulsante dell'ultima fila, non viene visualizzato.
Per i vari linguaggi "web", io non ci capisco nulla... cerco quello che mi serve, cerco di capire come funziona e poi lo adatto al mio scopo.

Darò un'occhiata al JqueryMobile, anche se già l'HTML è arabo per me :disappointed_relieved:

Mimmo

Ma non è comunque visibile la tua pagina, la connessione viene annullata a metà, ad esempio io ne vedo solo 3 e quei 3 funzionano, probabilmente è un problema di permessi, di firewall, non credo di sketch

A questo punto credo di si, dato che comunque in locale funziona tutto perfettamente.
Proverò a vedere le impostazioni del router e a cercare di cavarne qualcosa.
Per il momento grazie a tutti,
ciao,

Mimmo

Se può servire, vi posto il listato accorciato con i cicli FOR come suggerito da pablos.

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { "your ip" }; // ip in lan
byte gateway[] = { "your gateway" }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server("your port); //server port
String readStr; 

void setup(){
  pinMode(4, OUTPUT); //pin selected to control
  pinMode(5, OUTPUT); //pin selected to control
  pinMode(6, OUTPUT); //pin selected to control
  pinMode(7, OUTPUT); //pin selected to control
  pinMode(8, OUTPUT); //pin selected to control
  //start Ethernet
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
}

void loop(){
  // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
         readStr += c; 
        if (c == '\n') {
          for (byte i=1; i < 6; i++){  
          if(readStr.indexOf("on_"  + String(i)) > 0) digitalWrite(i+3, 1);        
          if(readStr.indexOf("off_" + String(i)) > 0) digitalWrite(i+3, 0); 
        }
          client.println(F("HTTP/1.1 200 OK")); //send new page
          client.println(F("Content-Type: text/html"));
          client.println();
          client.println(F("<HTML>"));
          client.println(F("<HEAD>"));
          client.println(F("<TITLE>Arduino remote test page</TITLE>"));
          client.println(F("</HEAD>"));
          client.println(F("<BODY>"));
          client.println(F("<table align=center border=3 cellpadding=1 cellspacing=1 style=width: 800px;height: 80px>"));
          client.println(F("<tbody>"));
          client.println(F("<tr>"));
          client.println(F("<td style=text-align: center;>"));
          client.println(F("<span style=font-size:36px;><strong>IZ0GIF&#39;S WEB REMOTE ANTENNA SWITCH</strong></span></td>"));
          client.println(F("<tr>"));
          client.println(F("<tbody>"));
          client.println(F("</table>"));
          client.println(F("
"));
          client.println(F("<table align=center border=3 cellpadding=10 cellspacing=10 style=height: 400px; width: 800px;>"));
          client.println(F("<tbody>"));
//********************************************************************************************************************************************************************
          for (byte i=1; i <6; i++){
          client.println(F("<tr>"));
          client.println(F("<tr>"));
          client.println(F("<td style=text-align: center;>"));
          client.print("<input type=submit value='ANT "+ String(i) +" ON' style=width:100px;height:45px onClick=location.href='/?on_"+ String(i) +";'>");
          client.println(F("<td>"));
          client.println(F("<div style=text-align: center;>"));
          client.print("<input type=submit value='ANT "+ String(i) +" OFF' style=width:100px;height:45px onClick=location.href='/?off_"+ String(i) +";'>");
          client.println(F("<td>"));
          client.println(F("<div style=text-align: center;>"));
          //if(readStr.indexOf('2') >0)//checks for 2            
          if (digitalRead(i+3)==HIGH){
            client.print("<input type=submit value='ANT "+ String(i) +" is ON' style=background-color:yellowgreen;width:100px;height:45px>");
            }
          else{
          client.print("<input type=submit value='ANT "+ String(i) +" is OFF' style=background-color:red;width:100px;height:45px>");
          }
       }
          delay(1);
                    
          //stopping client
          client.stop();                    
             
          //clearing string for next read
          readStr="";

        }
      }
    }
  }
}

Usare F non l'ho scritto per risolvere il problema, è un uso comune per rendere piu leggero l'invio di stringhe statiche. Io la pagina la vedo e da Firefox riscontro lo stesso identico problema.
L'unica idea che mi viene in mente è un esaurimento del timeout oppure di un buffer interno della libreria ethernet oppure proprio della shield.

Porto all'attenzione questi due listati
/?off_4;

<HTML>
<HEAD>
<TITLE>Arduino remote test page</TITLE>
</HEAD>
<BODY>
<table align=center border=3 cellpadding=1 cellspacing=1 style=width: 800px;height: 80px>
<tbody>
<tr>
<td style=text-align: center;>
<span style=font-size:36px;><strong>IZ0GIF&#38;#39;S WEB REMOTE ANTENNA SWITCH</strong></span></td>
<tr>
<tbody>
</table>


<table align=center border=3 cellpadding=10 cellspacing=10 style=height: 400px; width: 800px;>
<tbody>
<tr>
<tr>
<td style=text-align: center;>
<input type=submit value='ANT 1 ON' style=width:100px;height:45px onClick=location.href='/?on_1;'><td>
<div style=text-align: center;>
<input type=submit value='ANT 1 OFF' style=width:100px;height:45px onClick=location.href='/?off_1;'><td>
<div style=text-align: center;>
<input type=submit value='ANT 1 is OFF' style=background-color:red;width:100px;height:45px><tr>
<tr>
<td style=text-align: center;>
<input type=submit value='ANT 2 ON' style=width:100px;height:45px onClick=location.href='/?on_2;'><td>
<div style=text-align: center;>
<input type=submit value='ANT 2 OFF' style=width:100px;height:45px onClick=location.href='/?off_2;'><td>
<div style=text-align: center;>
<input type=submit value='ANT 2 is OFF' style=background-color:red;width:100px;height:45px><tr>
<tr>
<td style=text-align: center;>
<input type=submit value='ANT 3 ON' style=width:100px;height:45px onClick=location.href='/?on_3;'><td>
<div style=text-align: center;>
<input type=submit value='ANT 3 OFF' style=width:100px;height:45px onClick=location.href='/?off_3;'><td>
<div style=text-align: center;>
<input type=submit value='ANT 3 is OFF' style=background-color:red;width:100px;height:45px><tr>
<tr>
<td style=text-align: center;>
<input type=submit value='ANT 4 ON' style=width:100px;height:45px onClick=location.href='/?on_4;'><td>
<div style=text-align: center;>
<input type=submit value='ANT 4 OFF' style=width:100px;height:45px onClick=location.href='/?off_4;'><td>
<div style=text-align: center;>
<input type=submit value='ANT 4 is OFF' style=background-color:red;width:100px;height:45px><tr>
<tr>
<td style=text-align: center;>
<input type=submit value='ANT 5 ON' style=width:100px;height:45px onClick=location.href='/?on_5;'><td>
<div style=text-align: center;>
<input t

/?off_2;

<HTML>
<HEAD>
<TITLE>Arduino remote test page</TITLE>
</HEAD>
<BODY>
<table align=center border=3 cellpadding=1 cellspacing=1 style=width: 800px;height: 80px>
<tbody>
<tr>
<td style=text-align: center;>
<span style=font-size:36px;><strong>IZ0GIF&#38;#39;S WEB REMOTE ANTENNA SWITCH</strong></span></td>
<tr>
<tbody>
</table>


<table align=center border=3 cellpadding=10 cellspacing=10 style=height: 400px; width: 800px;>
<tbody>
<tr>
<tr>
<td style=text-align: center;>
<input type=submit value='ANT 1 ON' style=width:100px;height:45px onClick=location.href='/?on_1;'><td>
<div style=text-align: center;>
<input type=submit value='ANT 1 OFF' style=width:100px;height:45px onClick=location.href='/?off_1;'><td>
<div style=text-align: center;>
<input type=submit value='ANT 1 is OFF' style=background-color:red;width:100px;height:45px><tr>
<tr>
<td style=text-align: center;>
<input type=submit value='ANT 2 ON' style=width:100px;height:45px onClick=location.href='/?on_2;'><td>
<div style=text-align: center;>
<input type=submit value='ANT 2 OFF' style=width:100px;height:45px onClick=location.href='/?off_2;'><td>
<div style=text-align: center;>
<input type=submit value='ANT 2 is OFF' style=background-color:red;width:100px;height:45px><tr>
<tr>
<td style=text-align: center;>
<input type=submit value='ANT 3 ON' style=width:100px;height:45px onClick=location.href='/?on_3;'><td>
<div style=text-align: center;>
<input type=submit value='ANT 3 OFF' style=width:100px;height:45px onClick=location.href='/?off_3;'><td>
<div style=text-align: center;>
<input type=submit value='ANT 3 is OFF' style=background-color:red;width:100px;height:45px><tr>
<tr>
<td style=text-align: center;>
<input type=submit value='ANT 4 ON' style=width:100px;height:45px onClick=location.href='/?on_4;'><td>
<div style=text-align: center;>
<input type=submit value='ANT 4 OFF' style=width:100px;height:45px onClick=location.href='/?off_4;'><td>
<div style=text-align: center;>
<input type=submit value='ANT 4 is ON' style=background-color:yellowgreen;width:100px;height:45px><tr>
<tr>
<td style=text-align: center;>
<input type=submit value='ANT 5 ON' style=width:100px;height:45px onClick=location.href='/?on_5;'><td>
<div style=text-align: center;>
<

Non ci scommetto il cappello, ma sono abbastanza sicuro che contino lo steso numero di byte, lascio a voi le conclusioni.

Anzi ve la do io la conferma, sono esattamente lo stesso numero di byte 2229.

Roberto,
mettendo F() ovunque sembra risolto il problema. Purtroppo non posso mettere F() nelle "client.print" ove ci sono le variabili, altrimenti mi da errore.
Al momento funziona tutto.

La cosa che non mi spiego è perchè collegandomi in locale mi visualizzava tutto correttamente, mentre accedendo da web no.
Mahh...

Grazie,

Mimmo

Da locale cosa vuol dire?

Intendo dal mio pc collegato wireless al router, digitando direttamente l'IP della scheda, ad esempio 192.168.xx.xx:porta

In questo caso ho sempre visto tutto. Il problema è solo il collegamento da web usando il servizio di noip.com

Ora, dopo aver piazzatto tutte le F() possibili, riesco a vedere tutto ma non penso che io possa andare oltre senza ritrovarmi lo stesso problema. Le mie competenze sono molto limitate e non saprei dove mettere mano.

Mimmo

Troppe variabili in gioco non mi viene in mente cosa possa essere se non un esaurimento di ram.

io non sono riuscito a visualizzare la sorgente pagina html.

String readStr; è una variabile che nel tuo caso assume un carico enorme durante il caricamento/ricevimento dei char del client ... è sbagliato metterla pubblica, compromette la RAM, va utilizzata e dichiarata solo nel momento in cui ci sono char in arrivo, terminata la connessuone la sua funzione termina, la variabile viene distrutta e liberata RAM, se tu la lasci pubblica e l'ultima riga aveva 150 char ... sono 150 byte occupati inutilmente, spazio che resta inutilmente occupato, che impedisce ad altre funzioni di usare la poca RAM che c'è, ecco perchè te l'ho fatto notare nell'elenco pochi post sopra.

String readStr=""; la svuota ed è giusto farlo, ma non ne elimina lo spazio di RAM occupato

come ad esempio queste

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
 IPAddress ip(192, 168, 2, 177);

a che servono pubbliche? possono stare benissimo dentro il setup() una volta che la function setup() l'ha usate e memorizzate alla sua uscita vengono distrutte, liberando 10 byte

anche queste sono inutili

byte gateway[] = { "your gateway" }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
Ethernet.begin(mac, ip, gateway, subnet);

a che serve stabilire un gateway e un mask se sei un server?
il gateway si dichiara quando è arduino che deve uscrire e conoscere le porte/percorsi di uscita, [sei tu che entri nel negozio a comprare e non il negozio che viene a casa tua, non è compito suo uscire, tanto meno sapere il tuo indirizzo].

è sufficiente
Ethernet.begin(mac, ip);
e vedrai che funziona lo stesso
sono altri 8byte risparmiati

Grazie pablos,
hai applicato in pieno la tua firma, hi :slight_smile:
Mi hai fatto l'esame e poi spiegato la lezione ! Grazie, apprezzo molto!

Fatto ed aggiunto anche qualcosa. Ora tutto funziona a meraviglia!!
Ciao,

Mimmo