problema utilizzo delay per controllo led via web (arduino uno+enc28J60)

Buongiorno a tutti
Sono un programmatore alle primissime armi e mi sono imbattuto in un problema (per molti banale) nella modifica di uno sketch trovato in rete.
Lo sketch prevede una interfaccia web con due pulsanti in grado di accendere e spegnere due led.
Nel progetto si utilizza un Arduino uno e l’interfaccia ethernet ENC28J60.
Lo sketch originale che ho utilizzato è il seguente:

#include <EtherCard.h>
#define LED1PIN  4 //definisce il pin del LED 1
#define LED2PIN  5 //definisce il pin del LED 2

//settaggio dei valori statici
static byte mymac[] = {0x00,0x19,0xCB,0xF4,0x03,0x01};
static byte myip[] = {192,168,1,111};
static byte gwip[] = {10,0,0,1};
static byte netmask[] = {255,255,255,0};
static byte dnsip[] = {8,8,8,8};
byte Ethernet::buffer[700];

boolean led1Status;
boolean led2Status;

void setup () {

 Serial.begin(57600);
 Serial.println("2 WebRele' Ip Statico");

 if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
   Serial.println( "Accesso fallito all'Ethernet Shield");
else
  Serial.println("Ethernet Shield initializzato");

 if (!ether.staticSetup(myip, gwip, dnsip, netmask ))
   Serial.println("Impossibile assegnare l'indirizzo");
 else
   Serial.println("Indirizo statico configurato");
   
 ether.printIp("IP Address:\t", ether.myip);
 ether.printIp("Netmask:\t", ether.netmask);
 ether.printIp("Gateway:\t", ether.gwip);
 ether.printIp("DNS:\t\t", ether.dnsip);
  Serial.println();
 
 pinMode(LED1PIN, OUTPUT);
 pinMode(LED2PIN, OUTPUT);
 
 digitalWrite(LED1PIN, LOW);
 digitalWrite(LED2PIN, LOW);
 
 led1Status = false;
 led2Status = false;  
}
 
void loop() {

 word len = ether.packetReceive();
 word pos = ether.packetLoop(len);
 
 if(pos) 
    
    {
   
       if(strstr((char *)Ethernet::buffer + pos, "GET /?RELAY1") != 0) 
       {

       led1Status = !led1Status; 
       digitalWrite(LED1PIN, led1Status);   

       }
     
       if(strstr((char *)Ethernet::buffer + pos, "GET /?RELAY2") != 0) 
       {
       led2Status = !led2Status;
       digitalWrite(LED2PIN, led2Status);
       }

             
     BufferFiller bfill = ether.tcpOffset();
     bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
                       "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
                       "<html><head><meta name='viewport' content='width=200px'/></head><body>"
                       "<div style='position:absolute;width:200px;height:200px;top:1%;left:50%;margin:5px 0 0 -100px'>"
                       "<div style='font:bold 18px verdana;text-align:center'>Web Rele'</div>"
                       "
<div style='text-align:center'>"));

        if(led1Status) bfill.emit_p(PSTR("<a href=\"/?RELAY1\"><img src=\"http://www.byte4geek.com/images/arduino/butON.png\"></a>
Stato Rele' 1 OFF
"));

        else bfill.emit_p(PSTR("<a href=\"/?RELAY1\"><img    src=\"http://www.byte4geek.com/images/arduino/butOFF.png\"></a>
Stato rele' 1 ON
"));
     
        if(led2Status) bfill.emit_p(PSTR("
<a href=\"/?RELAY2\"><img src=\"http://www.byte4geek.com/images/arduino/butON.png\"></a>
Stato Rele' 2 OFF"));
        else bfill.emit_p(PSTR("
<a href=\"/?RELAY2\"><img src=\"http://www.byte4geek.com/images/arduino/butOFF.png\"></a>
Stato rele' 2 ON"));      

       bfill.emit_p(PSTR("
<a href=\"/\">Controlla lo stato dei Rele'</a></div></div></body></html>"));
     ether.httpServerReply(bfill.position());

  }
 }

Avrei la necessità di modificare il programma in modo che una volta premuto uno dei due pulsanti il led corrispondente si accenda per un tempo t e poi si rispenga.
Ho provato a modificarlo nel seguente modo:

[…]

if(pos) 
    
    {
   
       if(strstr((char *)Ethernet::buffer + pos, "GET /?RELAY1") != 0) 
       {

       led1Status = !led1Status; 
       digitalWrite(LED1PIN, led1Status);   
       delay(2000);
       led1Status = !led1Status;         
       digitalWrite(LED1PIN, led1Status);

       }

[…]

ma non ha alcuna intenzione di funzionare in quanto sembra che il processo “accensione-ritardo-spegnimento” venga ripetuto 2/3 volte senza che venga in realtà premuto alcun pulsante nell’interfaccia web.
Provando a togliere il delay, il led si accende e si spegne rapidamente (impulsivamente) senza creare altri cicli inutili.
Purtroppo le mie ridotte conoscenze di programmazione non mi aiutano a risolvere questo problema…quindi chiedo il vostro aiuto!!
Un grazie a tutti coloro mi volessero dare un suggerimento od eventualmente un metodo alternativo per ottenere quello che voglio.
Fabrizio

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Non è obbligatorio usare per forza quel flag:

if(...)
{ digitalWrite(LED1PIN, HIGH);   
  delay(2000);
 digitalWrite(LED1PIN, LOW);
}

Ma la delay() blocca tutto Arduino per 2 secondi. Sarebbe meglio accendere un flag e poi usare la millis().
Vedi l'esempio BlinkWithoutDelay e qui:

In primis mi scuso per l’errata pubblicazione del post!
Seconda cosa: purtroppo sono una vera capra con la programmazione quindi il tuo suggerimento è molto utile ma purtroppo non sono in grado di applicarlo così facilmente al mio caso… :frowning: :frowning:
F.

Ma la delay() blocca tutto Arduino per 2 secondi. Sarebbe meglio accendere un flag e poi usare la millis().

nid69ita:
Non è obbligatorio usare per forza quel flag:

if(...)

{ digitalWrite(LED1PIN, HIGH); 
  delay(2000);
digitalWrite(LED1PIN, LOW);
}



Ma la delay() blocca tutto Arduino per 2 secondi. Sarebbe meglio accendere un flag e poi usare la millis().
Vedi l'esempio BlinkWithoutDelay e qui:
http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/

In realtà a me poco importa bloccare arduino...perchè tanto non deve fare nulla se non tenermi attivo un led per qualche minuto in quanto lo dovrei abbinare ad una tapparella elettrica controllabile via web...