Check stato porte

Vi prego aiutatemi!!
(Spero di riuscire a spiegarmi bene)

Sto realizzando un modellino di casa domotica.
Utilizzo un web server sul mio Arduino Ethernet:

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

//Creao un array di byte per specificare il mac address
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//creo un array di byte per specificare l'indirizzo ip
byte ip[] = {192,168,0,5}; //modificate questo valore in base alla vostra rete
Servo myservo;  // create servo object to control a servo 
char Data_RX;
 
String msg = "";
int AccendiLuci, SpegniLuci, ApriCancello, ChiudiCancello, AccendiVentola, SpegniVentola,pos=0;
 
//creao un oggetto server che rimane in ascolto sulla porta
//specificata
EthernetServer ArduinoServer(80);
 
void setup()
{
    //inizializza lo shield con il mac e l'ip
    Ethernet.begin(mac, ip);
    //inizializza l'oggetto server
    ArduinoServer.begin();
 
    //definisco i pin2 e pin3 come uscite
    pinMode(2, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
}
 
void loop()
{
    //IMPORTANTE pulisco la variabile msg
    msg = "";
 
    EthernetClient pc_client = ArduinoServer.available();
 
    //controllo se pc_client è true
    if (pc_client != false)
    {
                          pc_client.println("HTTP/1.1 200 OK");
                    //imposto il data type
                    pc_client.println("Content-Type: text/html");
                    pc_client.println();
                    //invio codice html
                    pc_client.print("<html>");
                    pc_client.print("<head><style type='text/css'>body {  font-family: Georgia, serif;color: green; background: #FFFFCC; text-align: center;}</style>");
                    pc_client.print("</head><body>");
        //controllo continuamente che il client sia connesso
        while (pc_client.connected())
        {
            //Controllo se ci sono byte disponibili per la lettura
            if (pc_client.available())
            {
                //leggo i byte disponibili
                //provenienti dal client
                Data_RX = pc_client.read();
 
                //ricostruisco la stringa ricevuta concatenando i singoli byte
                msg += Data_RX;
 
                //Attendo che tutti i byte siano letti
                //quando Data_RX contiene il carattere
                //di nuova line capisco tutti i byte sono
                //stati letti
                if (Data_RX == '\n')
                {
                    //cerco all'interno della stringa i parametri che mi interessano
                    AccendiLuci = msg.indexOf("ledon");
                    SpegniLuci = msg.indexOf("ledoff");
                    ApriCancello = msg.indexOf("gateon");
                    ChiudiCancello = msg.indexOf("gateoff");
                    AccendiVentola = msg.indexOf("funon");
                    SpegniVentola = msg.indexOf("funoff");

                    
                    //Piloto l'uscita e invio lo stato al browser
                    if (AccendiLuci >= 0)
                    {
                      digitalWrite(7, HIGH);
                      pc_client.print("<p>LUCI ACCESE</p>");
                    
                    }
                    if (SpegniLuci >= 0)
                    {
                      digitalWrite(7, LOW);
                      pc_client.print("<p>LUCI SPENTE</p>");
                    }
                     
                    if(ApriCancello>=0)
                    {
                      pc_client.print("<p>CANCELLO APERTO</p>");
                      for(pos = 0; pos < 100; pos += 1)  // goes from 0 degrees to 180 degrees 
                      {                                  // in steps of 1 degree 
                        myservo.write(pos);              // tell servo to go to position in variable 'pos' 
                        delay(15);                       // waits 15ms for the servo to reach the position 
                       } 
                      
                    }
                    if(ChiudiCancello>=0)
                    {
                      pc_client.print("<p>CANCELLO CHIUSO</p>");
                      for(pos = 100; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
                      {                                
                        myservo.write(pos);              // tell servo to go to position in variable 'pos' 
                        delay(15);                       // waits 15ms for the servo to reach the position 
                      } 
                      
                    }
                    if(AccendiVentola>=0)
                    {
                      digitalWrite(8,HIGH);
                      pc_client.print("<p>VENTOLA ACCESA</p>");
                    }
                    if(SpegniVentola>=0)
                    {
                      digitalWrite(8,LOW);
                      pc_client.print("<p>VENTOLA SPENTA</p>");
                    }
 
                    //aspetto 1 ms affinche la risposta giunga al browser del client
                    delay(1);
                    //esco dal ciclo while una volta completato l'invio della risposta
                    break;
                }
            }
        }
        pc_client.print("</body></html>");
        //chiudo la connessione
        pc_client.stop();
    }
    //digitalWrite(7, HIGH);
    //delay(2000);
}

Che comando tramite chiamate http che effettuo da una pagina html:

<html>
<head>
<title>Inserire i fogli di stile in un documento</title>
<style type="text/css"> 
body 
{
  font-family: Georgia, serif;
  color: green;
  background: #FFFFCC;
}
</style>
<script type="text/javascript">
function premutoLuci() 
{

var elem = document.getElementById('TastoLuci'); 
var cmd=document.getElementById('LinkLuci'); 
if(elem.src.indexOf("off.png")>=0)
{
  elem.src="on.png";
  cmd.href='http://192.168.0.5/ledon';
}
else if(elem.src.indexOf("on.png")>=0)
{
  elem.src="off.png";
  cmd.href='http://192.168.0.5/ledoff';
}

}

function premutoCancello() 
{

var elemC = document.getElementById('TastoCancello'); 
var cmdC=document.getElementById('LinkCancello'); 
if(elemC.src.indexOf("off.png")>=0)
{
  elemC.src="on.png";
  cmdC.href='http://192.168.0.5/gateon';
}
else if(elemC.src.indexOf("on.png")>=0)
{
  elemC.src="off.png";
  cmdC.href='http://192.168.0.5/gateoff';
}

}

function premutoVentola() 
{

var elemV = document.getElementById('TastoVentola'); 
var cmdV=document.getElementById('LinkVentola'); 
if(elemV.src.indexOf("off.png")>=0)
{
  elemV.src="on.png";
  cmdV.href='http://192.168.0.5/funon';
}
else if(elemV.src.indexOf("on.png")>=0)
{
  elemV.src="off.png";
  cmdV.href='http://192.168.0.5/funoff';
}

}
</script>
</head>
<body bgcolor='black'>



<h2 align='center'>PANNELLO DI CONTROLLO CASA PISCO
<h6 align='center'>© Creato da Piscopiello Italo ||  v. 10.0.0 Beta






<table align='center'width='250' height='200' border='0' cellspacing='0'>
<tr>
<td COLSPAN='2' align='center'>
<img src='logo.png' >
</td>
<tr>
<td COLSPAN='2' height='30'></td>
<tr>
<td width='100' height='20' ><h5>LUCI      </td>
<td align='right'>
<a target='luci' onClick='premutoLuci();' id='LinkLuci' href=''>
<img src='off.png' id="TastoLuci" ></td></a>
<tr>
<td width='100'><h5>CANCELLO      </td>
<td align='right'>
<a target='cancello' onclick='premutoCancello();' id='LinkCancello' href=''>
<img src='off.png' id="TastoCancello"></td>
</a>
<tr>
<td width='100'><h5>VENTOLA      </td>
<td align='right'>
<a target='ventola' onclick='premutoVentola();' id='LinkVentola' href=''>
<img src='off.png' id="TastoVentola"></td>
</a>
</table>



</body>
</html>

Il mio problema è fare un check iniziale in cui controllo lo stato delle porte che utilizzo, in modo che se mi connetto al server ma per esempio le luci siano già accese, sulla pagina html questo risulti e quindi il comando che potrò fare sarà "SpegniLuci" e non tentare nuovamente di accenderle.

Non so se mi sono spiegato...spero di si!!

Qualcuno mi sa proporre qualche soluzione?

Grazie
Italo

Potresti far inviare da arduino quando si accende cioè chiamare una funzione in setup() che invia lo stato delle tue uscite.

Eh ma in pratica come si fa?
Come le mando da arduino?
E la mia pagina html come le riceve?

Non conosco html comunque vedo che da arduino tu fai:

digitalWrite(7, HIGH);
pc_client.print("<p>LUCI ACCESE</p>");

o

digitalWrite(7, LOW);
pc_client.print("<p>LUCI SPENTE</p>");

nel caso tu riceva una determinata stringa quindi quando entri in setup() non fai altro che eseguire il comando digitalRead() (http://arduino.cc/en/Reference/DigitalRead) su tutti i pin che ti interessa e in base al risultato invii o Luci Accese o Luci Spente. CIao

Ti ringrazio per la risposta, ma il mio problema sta proprio nel far capire alla pagina HTML in che stato si trovano Le uscite di arduino al momento della connessione...
Qualche idea?

Da quello che ho capito l' html non lo conosci bene neppure te, il mio consiglio è di vedere un pò qualche guida tipo questa:
http://programmazione.html.it/guide/lezione/1096/controlli-condizionali-ifelse/
come vedi puoi porre delle condizioni nel codice altrimenti qualcuno che lo conosce potrà aiutarti. Ciao

con un codice tipo questo

if (digitalRead(numero_pin)== true) pc_client.println("ON");
else pc_client.println("OFF");

questo ti dice appena ti collrghi se è ON oppure OFF

già si è capito poco la questione dell' ethernet e musica, qui non comprendo perchè usi 2 pagine html quando ne potevi fare solo una dentro il codice arduino, fatto così ti complichi la vita.

ciao

Ciao pablos,
Forse avrò dei seri problemi di espressione io.......cercherò di miglirare...!
Ad ogni modo, il motivo per cui non ho fatto un unica pagina dentro arduino è che quella soluZione non mi avrebbe permesso di creare un interfaccia grafica decente per la mia pagina. Da quello che ho postato non si vede, ma la mia pagina utilizza particolari script per i menù e per le animazioni, che sarebbe non dico impossibile, ma alquanto diffice da gestire su arduino.

Detto questo, non abbiamo ancora risolto il mio problemA. È la pagina HTML che deve capire in che stato si trovano luci ecc, da arduino so come stampare su client lo stato.
Immagino che tu sia un puro elettronico, quindi capisco il tuo punto di vista, ma per quanto mi riguarda ho più bisogno di completare la parte software........ Altri suggerimenti?

Se a qualcuno interessasse ho trovato la soluzione.
Ho trasformato il mio HTML in PHP.. Arduino manda con il metodo get lo stato delle porte alla pagina PHP, che riceve e si comporta di conseguenza.

Arduino:

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

//Creao un array di byte per specificare il mac address
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//creo un array di byte per specificare l'indirizzo ip
byte ip[] = {192,168,49,115}; //modificate questo valore in base alla vostra rete
Servo myservo;  // create servo object to control a servo 
char Data_RX;
 
String msg = "";
int AccendiLuci, SpegniLuci, ApriCancello, ChiudiCancello, AccendiVentola, SpegniVentola,check=0,pos=0,l,c,v;
 
//creao un oggetto server che rimane in ascolto sulla porta
//specificata
EthernetServer ArduinoServer(80);
 
void setup()
{
    //inizializza lo shield con il mac e l'ip
    Ethernet.begin(mac, ip);
    //inizializza l'oggetto server
    ArduinoServer.begin();
 
    //definisco i pin2 e pin3 come uscite
    pinMode(2, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
}
 
void loop()
{
    //IMPORTANTE pulisco la variabile msg
    msg = "";
 
    EthernetClient pc_client = ArduinoServer.available();
 
    //controllo se pc_client è true
    if (pc_client != false)
    {
                          pc_client.println("HTTP/1.1 200 OK");
                    //imposto il data type
                    pc_client.println("Content-Type: text/html");
                    pc_client.println();
                    //invio codice html
                    pc_client.print("<html>");
                    pc_client.print("<head><style type='text/css'>body {  font-family: Georgia, serif;color: green; background: #FFFFCC; text-align: center;}</style>");
                    pc_client.print("</head><body>");
        //controllo continuamente che il client sia connesso
        while (pc_client.connected())
        {
            //Controllo se ci sono byte disponibili per la lettura
            if (pc_client.available())
            {
                //leggo i byte disponibili
                //provenienti dal client
                Data_RX = pc_client.read();
 
                //ricostruisco la stringa ricevuta concatenando i singoli byte
                msg += Data_RX;
 
                //Attendo che tutti i byte siano letti
                //quando Data_RX contiene il carattere
                //di nuova line capisco tutti i byte sono
                //stati letti
                if (Data_RX == '\n')
                {
                    //cerco all'interno della stringa i parametri che mi interessano
                    AccendiLuci = msg.indexOf("ledon");
                    SpegniLuci = msg.indexOf("ledoff");
                    ApriCancello = msg.indexOf("gateon");
                    ChiudiCancello = msg.indexOf("gateoff");
                    AccendiVentola = msg.indexOf("funon");
                    SpegniVentola = msg.indexOf("funoff");
                    check=msg.indexOf("check");

                    
                    //Piloto l'uscita e invio lo stato al browser
                    if (AccendiLuci >= 0)
                    {
                      digitalWrite(7, HIGH);
                      pc_client.print("<p>LUCI ACCESE</p>");
                      l=1;
                    }
                    if (SpegniLuci >= 0)
                    {
                      digitalWrite(7, LOW);
                      pc_client.print("<p>LUCI SPENTE</p>");
                      l=0;
                    }
                     
                    if(ApriCancello>=0)
                    {
                      pc_client.print("<p>CANCELLO APERTO</p>");
                      c=1;
                      for(pos = 0; pos < 100; pos += 1)  // goes from 0 degrees to 180 degrees 
                      {                                  // in steps of 1 degree 
                        myservo.write(pos);              // tell servo to go to position in variable 'pos' 
                        delay(15);                       // waits 15ms for the servo to reach the position 
                       } 
                      
                    }
                    if(ChiudiCancello>=0)
                    {
                      pc_client.print("<p>CANCELLO CHIUSO</p>");
                      c=0;
                      for(pos = 100; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
                      {                                
                        myservo.write(pos);              // tell servo to go to position in variable 'pos' 
                        delay(15);                       // waits 15ms for the servo to reach the position 
                      } 
                      
                    }
                    if(AccendiVentola>=0)
                    {
                      digitalWrite(8,HIGH);
                      pc_client.print("<p>VENTOLA ACCESA</p>");
                      v=1;
                    }
                    if(SpegniVentola>=0)
                    {
                      digitalWrite(8,LOW);
                      pc_client.print("<p>VENTOLA SPENTA</p>");
                      v=0;
                    }
                    if(check>=0)
                    {
                      pc_client.print("<meta HTTP-EQUIV='refresh' CONTENT='1; URL=http://127.0.0.1/domotica/pannellocmd.php?l=");
                      pc_client.print(l,DEC);
                      pc_client.print("&c=");
                      pc_client.print(c,DEC);
                      pc_client.print("&v=");
                      pc_client.print(v,DEC);
                      pc_client.print("'>");
                      
                    }
                    //aspetto 1 ms affinche la risposta giunga al browser del client
                    delay(1);
                    //esco dal ciclo while una volta completato l'invio della risposta
                    break;
                }
            }
        }
        pc_client.print("</body></html>");
        //chiudo la connessione
        pc_client.stop();
    }
    //digitalWrite(7, HIGH);
    //delay(2000);
}

PHP:

<html>
<head>
<title>Inserire i fogli di stile in un documento</title>
<style type="text/css"> 
body 
{
  font-family: Georgia, serif;
  color: green;
  background: #FFFFCC;
}
</style>
<script type="text/javascript">
function premutoLuci() 
{

var elem = document.getElementById('TastoLuci'); 
var cmd=document.getElementById('LinkLuci'); 
if(elem.src.indexOf("off.png")>=0)
{
  elem.src="on.png";
  cmd.href='http://192.168.49.115/ledon';
}
else if(elem.src.indexOf("on.png")>=0)
{
  elem.src="off.png";
  cmd.href='http://192.168.49.115/ledoff';
}

}

function premutoCancello() 
{

var elemC = document.getElementById('TastoCancello'); 
var cmdC=document.getElementById('LinkCancello'); 
if(elemC.src.indexOf("off.png")>=0)
{
  elemC.src="on.png";
  cmdC.href='http://192.168.49.115/gateon';
}
else if(elemC.src.indexOf("on.png")>=0)
{
  elemC.src="off.png";
  cmdC.href='http://192.168.49.115/gateoff';
}

}

function premutoVentola() 
{

var elemV = document.getElementById('TastoVentola'); 
var cmdV=document.getElementById('LinkVentola'); 
if(elemV.src.indexOf("off.png")>=0)
{
  elemV.src="on.png";
  cmdV.href='http://192.168.49.115/funon';
}
else if(elemV.src.indexOf("on.png")>=0)
{
  elemV.src="off.png";
  cmdV.href='http://192.168.49.115/funoff';
}

}
</script>
<?php   
$l = $_GET['l'];
$c = $_GET['c'];
$v = $_GET['v'];   
//echo "variabili get  inviate  ".$v,$l,$c;   
?>  
</head>
<body bgcolor='black'>



<h2 align='center'>PANNELLO DI CONTROLLO CASA PISCO
<h6 align='center'>© Creato da Piscopiello Italo ||  v. 10.0.0 Beta






<table align='center'width='250' height='200' border='0' cellspacing='0'>
<tr>
<td COLSPAN='2' align='center'>
<img src='logo.png' >
</td>
<tr>
<td COLSPAN='2' height='30'></td>
<tr>
<td width='100' height='20' ><h5>LUCI      </td>
<td align='right'>
<a target='luci' onClick='premutoLuci();' id='LinkLuci' href=''>
<?php
if($l==0)
echo "<img src='off.png' id='TastoLuci' >";
else if ($l==1)
echo "<img src='on.png' id='TastoLuci' >";
?>
</td></a>
<tr>
<td width='100'><h5>CANCELLO      </td>
<td align='right'>
<a target='cancello' onclick='premutoCancello();' id='LinkCancello' href=''>
<?php
if($c==0)
echo "<img src='off.png' id='TastoCancello'>";
else if($c==1)
echo "<img src='on.png' id='TastoCancello'>";
?>
</td>
</a>
<tr>
<td width='100'><h5>VENTOLA      </td>
<td align='right'>
<a target='ventola' onclick='premutoVentola();' id='LinkVentola' href=''>
<?php
if($v==0)
echo "<img src='off.png' id='TastoVentola'>";
else if ($v==1)
echo "<img src='on.png' id='TastoVentola'>";
?>
</td>
</a>
</table>



</body>
</html>

Grazie comunque a tutti per le risposte..

Ciao
Italo