Comandare le porte di casa con etherneth shield

Salve a tutti!!
Sto cercando di aprire le porte di casa tramite arduino uno+etherneth shield. Inizialmente sto simulando tutto con i led, ovvero la semplice l’apertura e la chiusura tramite bottoni in html.
Successivamente volevo temporizzare l’apertura della porta con il millis, ovvero dopo tot secondi far chiudere la porta automaticamente però ho trovato alcune difficoltà in quanto vorrei (nei secondi che apro la prima porta) aprire anche la seconda porta. in poche parole vorrei isolare le due porte. posto il codice sperando in un aiuto!!!

#include <SPI.h>
#include <Ethernet.h>
byte mac = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip = { 192,168,1, 134 };
Server server(80);
String query;
int var=0;
int var1=0;
int x=0;

long previousMillis = 0;
long interval = 3000;

#define led 8
#define led1 7
void setup()
{
query = String("");
Ethernet.begin(mac, ip);
server.begin();
Serial.begin(9600);
pinMode(led,OUTPUT);
pinMode(led1,OUTPUT);
previousMillis=millis();
}

void loop()
{

Client client = server.available();

if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
query.concat(c);
if (c == ‘\n’) {
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println();

if (query.indexOf(“apertura”) > 0) {
digitalWrite(led,HIGH);
if(millis() - previousMillis >= 3000)
{
previousMillis = millis();

digitalWrite(led,LOW);;
}
}
if(query.indexOf(“chiusura”)>0 ) {
digitalWrite(led,LOW);
//client.print("LA PORTA D’INGRESSO E’ CHIUSA
");
}
if (query.indexOf(“pippo”) > 0) {
digitalWrite(led1,HIGH);
//client.print("LA PORTA D’USCITA E’ APERTA
");
}
if(query.indexOf(“pluto”)>0 ) {
digitalWrite(led1,LOW);
//client.print("LA PORTA D’USCITA E’ CHIUSA
");
}
if(query.indexOf(“stato”)>0 )
{
var=digitalRead(led);
var1=digitalRead(led1);
if(var==HIGH)
{
client.print("LA PORTA D’INGRESSO E’ APERTA
");
}
if(var==LOW)
{
client.print("LA PORTA D’INGRESSO E’ CHIUSA
");
}
if(var1==HIGH)
{
client.print("LA PORTA D’USCITA E’ APERTA
");
}
if(var1==LOW)
{
client.print("LA PORTA D’USCITA E’ CHIUSA
");
}

}

client.print("

");

client.print("

"); client.print(" "); client.print(" "); client.print(" "); client.print("
");//DEBUG
var=digitalRead(led);
var1=digitalRead(led1);
if(var==HIGH)
{
client.print("LA PORTA D'INGRESSO E' APERTA
");
}
if(var==LOW)
{
client.print("LA PORTA D'INGRESSO E' CHIUSA
");
} 
if(var1==HIGH)
{
client.print("LA PORTA D'USCITA E' APERTA
");
}
if(var1==LOW)
{
client.print("LA PORTA D'USCITA E' CHIUSA
");
}
client.print("
");//DEBUG break;//fermo il ciclo } } } delay(1); client.stop(); query = String(""); } }

Per rendere il tutto più performante e di facile lettura ti consiglio di sostituire gli "if" con i "case" poi riposta il codice e gli diamo un'altra occhiata.

Saluti Totodix.

Ciao totodix & grazie per la tua disponibilità! Non l’ho semplificato mettendo i case ma togliendo delle cose, credo che così sia più comprensibile ( ho lasciato solo un bottone così fatto uno fatti tutti :)).

void loop()
{
Client client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
query.concat(c);
if (c == ‘\n’) {
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println();

// per capire se è stato premuto il bottone di apertura o chiusura
if (query.indexOf(“apertura”) > 0) {

digitalWrite(led,HIGH);// accendi il led
tempo=millis();
if((millis()-tempo>=5000))// e dopo 5 secondi si dovrebbe spengere il led
{
digitalWrite(led,LOW);
}
}
if(query.indexOf(“chiusura”)>0 ) {
digitalWrite(led,LOW);
}
// parte in html per i bottoni
client.print("
“);
client.print(”
“);
break;
}
}
}
delay(1);
client.stop();
query = String(”");
}
}

Help … perche’ non funziona ?
ho messo un LED su pin 10

ma rimane sempre acceso.

Ho lesso il // per eliminare i comandi e la definizione … ma rimane sempre acceso :frowning:

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

//int Led = 10;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,3,151 };
Server server(80);
String query;
int stato = 0;


void setup()
{
  query = String("");
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);
  //pinMode(Led,OUTPUT);
}

void loop()
{
  Client client = server.available();
  if (client) {
    while (client.connected()) {
	if (client.available()) {
	  char c = client.read();
          Serial.print(c);
	  query.concat(c);
	  if (c == '\n') {
	    client.println("HTTP/1.0 200 OK");
	    client.println("Content-Type: text/html");
	    client.println();
            if (query.indexOf("spegni") > 0) {
		//digitalWrite(Led,LOW);
                stato=0;
		client.print("Spengo
");
	    }
	    if (query.indexOf("accendi") > 0) {
		//digitalWrite(Led,HIGH);
                stato=stato+1;
		client.print("Accendo
");
	    }
	    client.print("<a href='/accendi'>Accendi LED</a>
<a href='/spegni'>Spegni LED</a>
");
            //client.print("<pre>");//DEBUG
	    //client.print(query);// DEBUG
	    //client.print("</pre>");//DEBUG
            client.print(stato);
	    break;//fermo il ciclo
	  }
	}
    }
    delay(1);
    client.stop();
    Serial.println("");
    query = String("");
  }
}

Non ho letto il codice comunque stai attento ad usare dei link all'interno delle pagine e sopratutto attendo ad usare indexOf, fra gli header http arriva anche il Refer (cioè la pagina da cui provieni) se io clicco su accendi finisco su /accendi se poi clicco su spegni e vengo portato a /spegni nell'header compare sia GET /spegni che Referral: /accendi quindi il led si spegne e si riaccende subito.

Purtroppo oggi non riesco a verificare con lo shield ma il codice che ho postato, senza i cambiamenti che hai fatto tu funziona…
Non è necessario che colleghi tutti e tre i led… prova anche con uno solo lasciando il codice intatto… e quando funziona, provi le modifiche… se non riesci a venirne a capo facci sapere che risolviamo.