Sketch per relè che comandano un telecomando

Salve a tutti sono alle prime armi con arduino ho piccole basi di elettronica ,però a livello di conoscenze informatiche sono agli esordi,prendendo spunto dal web ho cercato di mettere in piedi il mio primo progettino di domotica utilizzando questo sketch:

#include <EtherCard.h>

#define LED1PIN  2 //definisce il pin del LED 1
#define LED2PIN  3 //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,61};
static byte gwip[] = {192,168,1,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(9600);
  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);
        Serial.println("Ricevuto comando per Rele' 1");  
      }
      
      if(strstr((char *)Ethernet::buffer + pos, "GET /?RELAY2") != 0) {
        led2Status = !led2Status;
        digitalWrite(LED2PIN, led2Status);
        Serial.println("Ricevuto comando per Rele' 2");        
      }
      
      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());
   }
  }

Bene tutto funziona i relè si accendono e si spengono dalla pagina web.
Il problema nasce dal fatto che io ho deciso di far comandare a una scheda da 4 relè, due per l’accensione e due per lo spegnimento, un telecomando che a sua volta accenda e spenga delle prese radiocomandate.
Il cablaggio del telecomando e riuscito,il problema è lo sketch, cosi scritto, fa si che il relè rimanga ho sempre acceso o sempre spento.Io invece dovendo comandare un telecomando dovrei far si che il relè resti acceso circa un secondo, il tempo di dare il segnale al telecomando e poi si spenga in modo da non far rimanere premuto il tasto sul telecomando. Il telecomando ha 4 tasti 2 per l’accensione e due per lo spegnimento.
Mi dareste qualche consiglio ho un esempio per come fare a modificare lo sketch?
Grazie saluti a tutti

Analizzando il codice in cui cambi lo stato del relè potresti cambiarlo da cosi:

      if(strstr((char *)Ethernet::buffer + pos, "GET /?RELAY1") != 0) {
        led1Status = !led1Status;
        digitalWrite(LED1PIN, led1Status);
        Serial.println("Ricevuto comando per Rele' 1");  
      }

a cosi:

      if(strstr((char *)Ethernet::buffer + pos, "GET /?RELAY1") != 0) {
        led1Status = !led1Status;
        digitalWrite(LED1PIN, led1Status);
        Serial.println("Ricevuto comando per Rele' 1");  
        delay(1000); //Aspetti 1 secondo e inverti di nuovo il valore della variabile che riporterà il relè allo stato iniziale
        led1Status = !led1Status;
        digitalWrite(LED1PIN, led1Status);
      }

Ovviamente esistono altri modi, evitando l'uso di delay(); ma se non ti causa problemi il fatto di avere il microprocessore fermo in attesa per 1 secondo puoi usare questa che è sicuramente la via più semplice

Ti interessa attivare un output e spegnerlo dopo un tot di tempo.

crea 2 array da 4 elementi:

  • nel primo ci metti i numeri dei pin interessati
  • nel secondo ci registri unsignedlong del millis() che ha rilevato la pressione del pulsante corrispondente in quell'istante

loop()
if (digitalread(pin_a) digitalwrite(out_a,1); + la registrazione del millis() corrente nell'array
...
...
...

verifica_timer()
...

  • un solo ciclo for controlla i tempi trascosi sui tutti e 4 pulsanti tra il millis() attuale e quello memorizzato
  • un if dentro al for spegne l'output corrispondente [0...3]dopo il tempo trascorso

5a2v0:
Analizzando il codice in cui cambi lo stato del relè potresti cambiarlo da cosi:

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

led1Status = !led1Status;
       digitalWrite(LED1PIN, led1Status);
       Serial.println("Ricevuto comando per Rele' 1");  
     }




a cosi:



if(strstr((char *)Ethernet::buffer + pos, "GET /?RELAY1") != 0) {
       led1Status = !led1Status;
       digitalWrite(LED1PIN, led1Status);
       Serial.println("Ricevuto comando per Rele' 1");  
       delay(1000); //Aspetti 1 secondo e inverti di nuovo il valore della variabile che riporterà il relè allo stato iniziale
       led1Status = !led1Status;
       digitalWrite(LED1PIN, led1Status);
     }




Ovviamente esistono altri modi, evitando l'uso di delay(); ma se non ti causa problemi il fatto di avere il microprocessore fermo in attesa per 1 secondo puoi usare questa che è sicuramente la via più semplice

Ciao, grazie per la risposta, ho provato cosi però sembra non funzionare praticamente quando dalla pagina web do il comando i relè si accendono a intermittenza prima rele 1, poi relè 2 ed ho anche problemi nella visualizzazione della pagina,nel senso che le immagine on of relè non corrisponde più al vero stato dei relè.forse bisogna modificare altro nello skatch?

pablos:
Ti interessa attivare un output e spegnerlo dopo un tot di tempo.

crea 2 array da 4 elementi:

  • nel primo ci metti i numeri dei pin interessati
  • nel secondo ci registri unsignedlong del millis() che ha rilevato la pressione del pulsante corrispondente in quell'istante

loop()
if (digitalread(pin_a) digitalwrite(out_a,1); + la registrazione del millis() corrente nell'array
...
...
...

verifica_timer()

...

  • un solo ciclo for controlla i tempi trascosi sui tutti e 4 pulsanti tra il millis() attuale e quello memorizzato
  • un if dentro al for spegne l'output corrispondente [0...3]dopo il tempo trascorso

Ciao Grazie per la risposta purtroppo ho poca esperienza in campo informatico quindi adesso devo cercare di capire come funziona la funzione arry.Quando parli di pulsanti intendi in senso fisico?perchè nel mio progetto i relè vengono attivati da pagina web.
Scusa la mia ignoranza, è la stessa cosa?