Pagina HTML o comandi con bottone.......

salve, ho questo listato, che se NON includo i 3 punti chiamati evidenziati in rosso,
mi funziona la pagina web, se includo i 3 punti posso solo comandare il led/luce solo da pulsante, sembra che i due sistemi HTML e PULSANTI, non vadino d’accordo.
dov’è che sbaglio?
quando definisco il pulsante, il sistema fa uno o l’altro.
grazie dell’aiuto

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


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x00 };   
byte ip[] = { 192, 168, 1, 10 };   
byte gateway[] = { 192, 168, 1, 1 };   
byte subnet[] = { 255, 255, 255, 0 };   
EthernetServer server(80);   
 

String readString;   
// CONTROLLO INVIO
int statoLUCE1; //stato LUCE1 
int USCITAluci1=6; //USCITA LUCE1 

int statoCancelloCarrabile=false;   
int USCITACancelloCarrabile=31;

int statoPortoncinoPersonale=false;   
int USCITAPortoncinoPersonale=32;

#define PulsanteLUCE1 44
  
void setup(){   
Serial.begin(9600);   
Ethernet.begin(mac, ip, gateway, subnet);  

pinMode(PulsanteLUCE1, INPUT);

pinMode(USCITAluci1,OUTPUT);    
digitalWrite(USCITAluci1,LOW); 
pinMode(USCITAPortoncinoPersonale,OUTPUT); 
digitalWrite(USCITAPortoncinoPersonale,LOW);  
pinMode(USCITACancelloCarrabile,OUTPUT); 
digitalWrite(USCITACancelloCarrabile,LOW);    
}   



 
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);   
  

//GESTIONE LUCE1   
if(readString.indexOf("LUCE1on") > 0) {   
digitalWrite(USCITAluci1,HIGH); 
statoLUCE1=true;   
}   
if(readString.indexOf("LUCE1off") > 0) {   
digitalWrite(USCITAluci1,LOW);  
statoLUCE1=false;   
}   
  
 //GESTIONE PortoncinoPersonale   
if(readString.indexOf("PortoncinoPersonale") > 0) {   
digitalWrite(USCITAPortoncinoPersonale,HIGH);   
delay(800);   
digitalWrite(USCITAPortoncinoPersonale,LOW);   
delay(200);   
statoPortoncinoPersonale=true;   
}   

//GESTIONE CancelloCarrabile   
if(readString.indexOf("CancelloCarrabile") > 0) {   
digitalWrite(USCITACancelloCarrabile,HIGH);   
delay(800);   
digitalWrite(USCITACancelloCarrabile,LOW);   
delay(200);   
statoCancelloCarrabile=true;   
}   


//GESTIONE tuttoff   
if(readString.indexOf("tuttooff") > 0) {   
digitalWrite(USCITAluci1,LOW);  

}   




client.println("HTTP/1.1 200 OK");   
client.println("Content-Type: text/html");   
client.println();   
client.print("<html><title>Domotic Panel</title><body bgcolor=black><center><table width=10 height=6 border=1>");   

//Gestione LUCE1   
client.print("<td><font color=#C0C0C0 size=12>LUCE1: </font></td><td><center>");   
if(statoLUCE1){   
client.print("<a href='/?LUCE1off'><img border=0 src=http://www.ilsentierone.it/online/accesa.jpg width=155 height=155 /> </a>");   
}   
else   
client.print("<a href='/?LUCE1on'><img border=0 src=http://www.ilsentierone.it/online/spenta.jpg width=155 height=155 /> </a>");   
client.print("</center></td>"); 

 
client.print("<td></td><td></td></tr>");     
  

 
//Gestione PortoncinoPersonale   
client.print("<td><font color=#C0C0C0 size=12>Portoncino Personale: </font></td><td><center>");   
if(statoPortoncinoPersonale){   
client.print("<a href='/?PortoncinoPersonale'><img border=0 src=http://www.ilsentierone.it/online/xCancellettoAperto.gif width=155 height=155 /> </a>");   
}   
else   
client.print("<a href='/?PortoncinoPersonale'><img border=0 src=http://www.ilsentierone.it/online/xCancellettoChiuso.gif width=155 height=155 /> </a>");   
client.print("</center></td></tr>");  


//Gestione CancelloCarrabile   
client.print("<tr>");   
client.print("<td colspan=2><font color=#C0C0C0 size=12>Cancello Carrabile: </font></td><td colspan=2><center>");   
if(statoCancelloCarrabile){   
client.print("<a href='/?CancelloCarrabile'><img border=0 src=http://www.ilsentierone.it/online/xCarrabileinAPERTURA.gif width=155 height=155 /> </a>");   
}   
else   
client.print("<a href='/?CancelloCarrabile'><img border=0 src=http://www.ilsentierone.it/online/xCarrabileCHIUSO.gif width=155 height=155 /> </a>");   
client.print("</center></td></tr>");   

 //Gestione aggiorna   
client.print("<tr>");   
client.print("<td><center><a href='/'><img border=0 src=http://www.ilsentierone.it/online/aggiorna.png width=96 height=66 />
<font color=ffffff>AGGIORNA</font></a></center></td>");   
//Gestione TUTTOOFF   
client.print("<td><center><a href='/?tuttooff'><img border=0 src=http://www.ilsentierone.it/online/tuttospento.jpg width=96 height=96 />
<font color=ffffff>SPEGNI_TUTTO</font></a></center></td>");  
// Gestione ANTIFURTO
client.print("<td><center><a href='/'><img border=0 src=http://www.ilsentierone.it/online/xantifurtoTOTALE-NO.jpg width=155 height=155 />
<font color=ffffff>TOTALE</font></a></center></td>");   
client.print("<td><center><a href='/'><img border=0 src=http://www.ilsentierone.it/online/xantifurtoPERIMETRO-NO.jpg width=155 height=155 />
<font color=ffffff>SOLO ESTERNO</font></a></center></td>");   
 client.print("</tr>");   


client.print("<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>");   
client.print("<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>");   
client.print("<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>");   
client.print("<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>");   
client.print("<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>");   
 

client.print("
");
client.print("</table></center>");  


client.print("</html>");     
readString="";   
client.stop();     
 
 }   // if (c == '\n' && currentLineIsBlank) {  
}    //  if (client.available()) { 
}    //while (client.connected()) { 
}    // if (client) {  

  if (digitalRead(PulsanteLUCE1) == HIGH) {
      if (digitalRead(USCITAluci1) == HIGH) {
      digitalWrite(USCITAluci1,LOW); 
      delay(400);  
      statoLUCE1=false;    
    }
    else
      if (digitalRead(USCITAluci1) == LOW) {
      digitalWrite(USCITAluci1,HIGH); 
      delay(400);  
      statoLUCE1=true;    
    }
   }
 
 
}   //void loop(){

Se riesci a inserire il codice con gli appositi "tag" è meglio, rischi che qualcosa venga interpretato male, classico esempio il due punti e la parentesi interpretati come faccina...

ehhh? Pagina HTML o comandi con bottone....... è una domanda o una risposta?
Il listato mezzo rosso mezzo nero ..... me pirdia!! :slight_smile:
Comunque manca la descrizione hardware come sempre ... per me ci sono già troppi "client.print" e troppi delay

Ho provato a copiare il tuo codice ma a me nemmeno compila !!! Mi dice che è terminata la memoria a disposizione (suppongo per l’uso intensivo di client.print che fai nel tuo sketch!)

Io mi sono limitato a mettere qualche parentesi graffa per indentare bene il codice e ad aggiungere l’uso della funzione print(F) appunto per risolvere il problema della memoria esaurita !
Ti invito a proposito a leggere qui:
http://playground.arduino.cc/Main/Printf

Ecco il codice con queste modifiche che ora compila

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


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x00 };
byte ip[] = { 192, 168, 1, 10 };
byte gateway[] = { 192, 168, 1, 1 };
byte subnet[] = { 255, 255, 255, 0 };
EthernetServer server(80);


String readString;
// CONTROLLO INVIO
int statoLUCE1; //stato LUCE1
int USCITAluci1 = 6; //USCITA LUCE1

int statoCancelloCarrabile = false;
int USCITACancelloCarrabile = 31;

int statoPortoncinoPersonale = false;
int USCITAPortoncinoPersonale = 32;


#define PulsanteLUCE1 44


void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac, ip, gateway, subnet);



  pinMode(PulsanteLUCE1, INPUT);



  pinMode(USCITAluci1, OUTPUT);
  digitalWrite(USCITAluci1, LOW);
  pinMode(USCITAPortoncinoPersonale, OUTPUT);
  digitalWrite(USCITAPortoncinoPersonale, LOW);
  pinMode(USCITACancelloCarrabile, OUTPUT);
  digitalWrite(USCITACancelloCarrabile, LOW);
}




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);


          //GESTIONE LUCE1
          if (readString.indexOf("LUCE1on") > 0) {
            digitalWrite(USCITAluci1, HIGH);
            statoLUCE1 = true;
          }
          else if (readString.indexOf("LUCE1off") > 0) {
            digitalWrite(USCITAluci1, LOW);
            statoLUCE1 = false;
          }

          //GESTIONE PortoncinoPersonale
          else if (readString.indexOf("PortoncinoPersonale") > 0) {
            digitalWrite(USCITAPortoncinoPersonale, HIGH);
            delay(800);
            digitalWrite(USCITAPortoncinoPersonale, LOW);
            delay(200);
            statoPortoncinoPersonale = true;
          }

          //GESTIONE CancelloCarrabile
          else if (readString.indexOf("CancelloCarrabile") > 0) {
            digitalWrite(USCITACancelloCarrabile, HIGH);
            delay(800);
            digitalWrite(USCITACancelloCarrabile, LOW);
            delay(200);
            statoCancelloCarrabile = true;
          }


          //GESTIONE tuttoff
          else if (readString.indexOf("tuttooff") > 0) {
            digitalWrite(USCITAluci1, LOW);

          }




          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));
          client.println();
          client.print(F("<html><title>Domotic Panel</title><body bgcolor=black><center><table width=10 height=6 border=1>"));

          //Gestione LUCE1
          client.print(F("<td><font color=#C0C0C0 size=12>LUCE1: </font></td><td><center>"));
          if (statoLUCE1) {
            client.print(F("<a href='/?LUCE1off'><img border=0 src=http://www.ilsentierone.it/online/accesa.jpg width=155 height=155 /> </a>"));
          }
          else {
            client.print(F("<a href='/?LUCE1on'><img border=0 src=http://www.ilsentierone.it/online/spenta.jpg width=155 height=155 /> </a>"));
          }
          client.print(F("</center></td>"));
          client.print(F("<td></td><td></td></tr>"));



          //Gestione PortoncinoPersonale
          client.print(F("<td><font color=#C0C0C0 size=12>Portoncino Personale: </font></td><td><center>"));
          if (statoPortoncinoPersonale) {
            client.print(F("<a href='/?PortoncinoPersonale'><img border=0 src=http://www.ilsentierone.it/online/xCancellettoAperto.gif width=155 height=155 /> </a>"));
          }
          else {
            client.print(F("<a href='/?PortoncinoPersonale'><img border=0 src=http://www.ilsentierone.it/online/xCancellettoChiuso.gif width=155 height=155 /> </a>"));
          }
          client.print(F("</center></td></tr>"));


          //Gestione CancelloCarrabile
          client.print(F("<tr>"));
          client.print(F("<td colspan=2><font color=#C0C0C0 size=12>Cancello Carrabile: </font></td><td colspan=2><center>"));

          if (statoCancelloCarrabile) {
            client.print(F("<a href='/?CancelloCarrabile'><img border=0 src=http://www.ilsentierone.it/online/xCarrabileinAPERTURA.gif width=155 height=155 /> </a>"));
          }
          else {
            client.print(F("<a href='/?CancelloCarrabile'><img border=0 src=http://www.ilsentierone.it/online/xCarrabileCHIUSO.gif width=155 height=155 /> </a>"));
          }
          client.print(F("</center></td></tr>"));

          //Gestione aggiorna
          client.print(F("<tr>"));
          client.print(F("<td><center><a href='/'><img border=0 src=http://www.ilsentierone.it/online/aggiorna.png width=96 height=66 />
<font color=ffffff>AGGIORNA</font></a></center></td>"));
          //Gestione TUTTOOFF
          client.print(F("<td><center><a href='/?tuttooff'><img border=0 src=http://www.ilsentierone.it/online/tuttospento.jpg width=96 height=96 />
<font color=ffffff>SPEGNI_TUTTO</font></a></center></td>"));
          // Gestione ANTIFURTO
          client.print(F("<td><center><a href='/'><img border=0 src=http://www.ilsentierone.it/online/xantifurtoTOTALE-NO.jpg width=155 height=155 />
<font color=ffffff>TOTALE</font></a></center></td>"));
          client.print(F("<td><center><a href='/'><img border=0 src=http://www.ilsentierone.it/online/xantifurtoPERIMETRO-NO.jpg width=155 height=155 />
<font color=ffffff>SOLO ESTERNO</font></a></center></td>"));
          client.print(F("</tr>"));


          client.print(F("<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>"));
          client.print(F("<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>"));
          client.print(F("<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>"));
          client.print(F("<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>"));
          client.print(F("<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>"));


          client.print(F("
"));
          client.print(F("</table></center>"));


          client.print(F("</html>"));
          readString = "";
          client.stop();

        }   // if (c == '\n' && currentLineIsBlank) {
      }    //  if (client.available()) {
    }    //while (client.connected()) {
  }    // if (client) {


  if (digitalRead(PulsanteLUCE1) == HIGH) {
    if (digitalRead(USCITAluci1) == HIGH) {
      digitalWrite(USCITAluci1, LOW);
      //delay(400);
      statoLUCE1 = false;
    }
    else if (digitalRead(USCITAluci1) == LOW) {
      digitalWrite(USCITAluci1, HIGH);
      //delay(400);
      statoLUCE1 = true;
    }
  }


}   //void loop(){

Importante: perchè usi delay(400); nella parte gestita dai bottoni ? Soprattutto visto che dopo il delay non rimetti le cose al loro stato originario non capisco proprio! Mi sono permesso quindi di commentare e togliere anche il delay (che ti bloccherebbe il programma) e quindi probabilmente causare il problema della non compatibilità da te esposta…

Prova e fai sapere!

Salvo, sulla Mega compila anche se spreca un sacco di ram inutilmente, la pag web funziona in parte, proprio perchè usa la GET nell'invio comandi che rende il tutto un sistema poco efficiente.
Osservando il numero dei pin che usa si nota che ha una Mega.
Comunque è un altro utente che non risponde..............

Solo oggi mi sono collegato a leggere e poter risponder, grazie delle risposte, in questi giorni proverò la versione consigliata.

sto "allungando" il programma, aggiungendo altre opzioni,... con le modifiche mi avete consigliato ho migliorato un la memoria....
quando lo metto in funzione, credo per sabto prossimo(25 luglio) postero i risultati e quanto di altro.
grazie

scusate... al posto del metodo GET quale metodo posso usare?
per cortesia fammi un esempio di invio comando e ricezione comando.
grazie

ho seguito i vostri consigli, ho realizzato il software e una parte dell'hardware (impianto)
come mai se si connettono due utenti alla pagina html per comandare arduino, la pagina si blocca, rimanene ferma sulla schermata.
Grazie

Dipende da come hai strutturato il programma, il programma l'hai fatto tu, lo hai tu, lo vedi solo tu ... secondo te come potremmo mai darti la risposta? :o

in allegato c’è il programma,
inoltre la pagina html si visualizza in modo confusionario,
di cosa è colpa?

Domotica.ino (27.3 KB)

Ciao,
da quello che ho capito usi arduino come un server web (cioè ti invia una pagina web). Il tutto è molto statico e fai una miriade di client.println(). Ricordati che è un microprocessore!
Potresti provare cosi per ridurre i client.printn() e per trasferire meno informazioni possibili da arduino al browser.
1)Individua e separa la parte statica dalla parte dinamica della pagina HTML.
Mi spiego meglio:

client.println(F(“LuceGarage: [”));
if(statoLuceGarage){
client.println(F("<img border=0 src=http://www.ilsentierone.it/online/accesa.jpg width='160 height='160 /> “));
}
else
client.println(F(”<img border=0 src=http://www.ilsentierone.it/online/spenta.jpg width='160 height='160 /> “));
client.println(F(”"));

Primo: tutta la parte statica componila tramite HTML/CSS e rendila disponibile tramite un server web remoto o locale (nella stessa LAN,vedo un indirizzo remoto quindi potresti usare quello).
Secondo: usa javascript per aggiornare lo stato della parte dinamica.
In questo modo l’onere di trasmissione ricade solo ed esclusivamente sul server remoto, mentre arduino si dovrà limitare a risponderti vero/falso in base allo stato della variabile.

La parte di sopra potrebbe diventare:

//Gestione LuceGarage
~~client.println(F("LuceGarage: ")); ~~
if(statoLuceGarage){
client.println(F(“accesa”));
}
else
client.println(F(“spenta”));

Lato client quindi non ti resta che verificare se arduino ti invia “accesa” o “spenta” e grazie a javascript cambiare la l’immagine, il colore, il font etc etc.
Spero di esserti stato d’aiuto.
Saluti.

Grazie ardurico....
mi faresti un esmpio, magari solo di 2 comandi,
non ho conoscenze di javascript.
grazie

Posso anche farti l’esempio ma devi avere delle basi minime sull’argomento, ti consiglio di inizare la lettura dei seguenti link:

http://www.w3schools.com/js/
Una libreria javascript molto usata con ampia documentazione ed esempi è jQuery:

Comunque giusto per farti un’idea:
LATO SERVER (arduino)

if(statoLuceGarage){
client.println(F("{luceGarage{stato:accesa}}"));
}
else
client.println(F("{luceGarage{stato:spenta}}"));

LATO CLIENT (la tua pagina html salvata in un server remoto)

<!DOCTYPE html>
<html>
<script src="http://code.jquery.com/jquery-2.1.4.js"></script>
<body>

<h1>My First JavaScript</h1>

<button type="button"
onclick="javascript:getluce()">
Stato luce</button>

<p id="demo"></p>
<script type="text/javascript">
function getluce(){
var jsonData = $.getJSON( "http://<iparduino>/",function(){
  console.log( "success" );
  })
 .done(function(jsonData) {

   }
 .fail(function() {
   console.log( "error" );
                })
  .always(function() {
    console.log( "complete" );
      });
}
alert("ciao");
}
</script>

</body>
</html>

Gli argomenti sono 3:

  1. javascript
  2. jquery(libreria che semplifica l’uso di javascript)
  3. json
    Per riassumenre tu devi: “Chimare un server remoto tramite javascript e ottenere dei dati in json”
    Ti premetto che se sei completamente all’oscuro di ciò non è banale …quindi…non ti resta che impegnarti!
    Federico

@ardurico
Non hai mai usato una ethernet su arduino vero?

Un paio di volte...giusto per curiosità, ma nessun progetto.Perchè?

Quello che gli hai consigliato è giusto in se stesso ed un altra soluzione, però gli va anche detto che in quel modo non potrà più da un pc o da uno smarphone qualsiasi fare l'IP ed ottenere la pagina, ma si deve portare dietro la pagina html il relativo css e il suo file js (o tutto insieme è lo stesso) su una chiavetta usb, oppure una SD.
Io non credo che sia quello che vuole, credo che lo vuole indipendente e che tutto resti dentro arduino, un po' come quando entri nel setup del router.

Il problema che si inchioda quando fa una doppia connessione e vede le pagine in modo confusionario resterà ancora.

Perche' portarsi dietro la pagina html? Puo' essere richiesta ad un server remoto.E poi fare delle richieste asincrone in javascript....verso arduino che ritorna lo stato...oppure mi sfugge qualcosa?

Calmi, calmi....
Ho un dominio mio, che di certo userò per portarmi dietro la "chiavetta" e il bla bla
cmq devo vedere come impostare la cosa, e mi sa che devo togliere le protezioni alla station vodafone per poter accedere dall'esterno e andare su ARDUINO.
Giusto?

Ma allora se hai un dominio sarebbe da sviluppare con un php e tutte le autorizzazioni del caso + Database e arduino lo usi come client. Comunque vedi tu.
Se quel sito è tuo pare che tu faccia già impianti domotici, non penserai di sostituirli con arduino perchè l'azienda chiude subito :slight_smile: :slight_smile: :slight_smile: