apertura cancello e accensione luce

Salve a tutti,
con questo sketch

/*
 Apertura cancello e suoneria
 Novembre 2013
 Roberto Ceccherini
 */

//Librerie impiegate per il progetto
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

//Creo un array di byte per specificare il mac address
byte mac[] = { 
  0x90, 0xA2, 0xDA, 0x0A, 0xF3, 0xC5 };
//creo un array di byte per specificare l'indirizzo ip per la villa
IPAddress ip( 192, 168, 1, 47); //modificare questo valore in base alla rete
//Creo un array per definire il gateway
IPAddress gateway(192, 168, 1, 254);
//Creo un array per la subnet
IPAddress subnet(255, 255, 255, 0);
// inririzzi ip remoti
IPAddress remoteC(192, 168, 1, 46);
//porta utilizzata per UDP
unsigned int localPort = 7878;
unsigned int remoteP = 7878;

int richiestaL = 1;
int richiestaC = 1;
int suoneria = 2; //pin per la suoneria del campanello (verificare se ci si deve collegare il relay a 12V)
int apriPorta = 6; //pin per il pulsante apertura cancello a muro (verificare se ci si deve collegare il relay a 12V)
int accendiLuce = 7; //pin per il pulsante accesione luce
String ric;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
char senData = 'a';
char senDatal = 'l';

//creo un oggetto server che rimane in ascolto sulla porta
//specificata ed un oggetto UDP
EthernetServer ArduinoServer(80);
EthernetUDP Udp;

void setup()
{
  //inizializza lo shield con il mac e l'ip  
  Ethernet.begin(mac, ip, gateway, subnet);
  //inizializza la porta UDP
  Udp.begin(localPort);
  //inizializza l'oggetto server
  ArduinoServer.begin();
  //inizializza la porta seriale
  Serial.begin(9600);
  //definisco il pin 2 come uscita ed il pin 6 come ingresso in HIGH
  pinMode(suoneria, OUTPUT); //collegare un filo dal pin 2 un filo da GND ed uno da 5V (per il relay)
  pinMode(apriPorta, INPUT_PULLUP); //collegare un filo al pin di input ed uno a GND
  pinMode(accendiLuce, INPUT_PULLUP); //collegare un filo al pin di input ed uno a GND
  Serial.println("Arduvilla Ver. 1.0");
  Serial.println(Ethernet.localIP());
}

void loop()
{
  richiestaL = 1;
  richiestaC = 1;
  int dimPac = Udp.parsePacket();
  if(dimPac)
  {
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    String ric = (packetBuffer);
    Serial.println(ric);
    for(int i=0;i<UDP_TX_PACKET_MAX_SIZE;i++) packetBuffer[i] = 0;
    if (ric == ("s"))
    {
      Serial.println("attivo il campanello");
      digitalWrite(suoneria, HIGH);
      delay(5000);
      Serial.println("disattivo il campanello");
      digitalWrite(suoneria, LOW);
    } 
  }
  //spedici messaggio se premono il pulsante a muro apertura cancello
  int camp = digitalRead(apriPorta);
  if (camp == LOW)
  {
    if (richiestaC <=1)
    {
       //mando il messaggio al cancello
       Serial.println("chiedo apertura cancello");
       Udp.beginPacket(remoteC, remoteP);
       Udp.write(senData);
       Udp.endPacket();
       delay(10);
       richiestaC = richiestaC++;
    }  
   }
  //spedici messaggio se premono il pulsante a muro accensione luce
  int luce = digitalRead(accendiLuce);
  if (luce == LOW)
  {
    if (richiestaL <= 1)
    {
      Serial.println("chiedo accensione luce");
      Udp.beginPacket(remoteC, remoteP);
      Udp.write(senDatal);
      Udp.endPacket();
      delay(10);
      richiestaL = richiestaL++;
    } 
  }
}

premendo un pulsante spedisco ad un altro arduino, nella stessa rete interna, un messaggio per attivare il relay per aprire il cancello o di attivare il relay per accendere la luce. Il problema è che sia la pressione del pulsante apriPorta che l'altro accendiLuce, generano 9 richiesta che vengono spedite, ed eseguite, tutte e 9.

.... segue nel post successivo

in quest'altro sketch invece

/*
 Apertura cancello suoneria e accendiLuce, aggiunta apertura cancello in differita di 10 minuti
 Novembre 2013
 Roberto Ceccherini
 */

//Librerie impiegate per il progetto
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

//Creo un array di byte per specificare il mac address
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x3F, 0x5C };
//creo un array di byte per specificare l'indirizzo ip
IPAddress ip( 192, 168, 1, 46); //modificare questo valore in base alla rete
//Creo un array per definire il gateway
IPAddress gateway(192, 168, 1, 254);
//Creo un array per la subnet
IPAddress subnet(255, 255, 255, 0);
// inririzzi ip remoti
IPAddress remoteV(192, 168, 1, 47);
IPAddress remoteC(192, 168, 1, 48);
//porta utilizzata per UDP
unsigned int localPort = 7878;
unsigned int remoteP = 7878;

char Data_RX;
char Dati_TX[20];
int apriCancello = 2; // collegare il relay apriCancello
String msg = "";
int cmd = 0;
int campanello = 6; // collegare il campanello
int accendiLuce = 7; // collegare il relay che controlla la accendiLuce a 220v
int buttonState;
char senData = 's';
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
long minuti = 0; 
char numero [3] = "  ";
long millisec = 60000 ;

//creo un oggetto server che rimane in ascolto sulla porta
//specificata ed un oggetto UDP
EthernetServer ArduinoServer(80);
EthernetUDP Udp;

void setup()
{
  //inizializzo lo shield con il mac e l'ip  
  Ethernet.begin(mac, ip, gateway, subnet);
  //inizializzo la porta UDP
  Udp.begin(localPort);
  //inizializzo l'oggetto server
  ArduinoServer.begin();
  //inizializzo la porta seriale
  Serial.begin(9600);
  //definisco il pin 2(cancello) ed il pin 7(accendiLuce) come uscita ed il pin 6(campanello) come ingresso in HIGH
  pinMode(apriCancello, OUTPUT);
  pinMode(accendiLuce, OUTPUT);
  pinMode(campanello, INPUT_PULLUP);
  Serial.println("Arducancello Ver. 1.5");
  Serial.println(Ethernet.localIP());
}

void loop()
{ //Apertura cancello normale, ritardata o accensione accendiLuce da web browser
  //IMPORTANTE pulisco la variabile msg
  msg = "";
  EthernetClient pc_client = ArduinoServer.available();
  //controllo se pc_client è true
  if (pc_client != false)
  {
    //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();
        Serial.write(Data_RX);

        //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 linea capisco che tutti i byte sono
        //stati letti
        if (Data_RX == '\n')
        {
          //cerco all'interno della stringa il parametro che mi interessa
          //Piloto l'uscita
          if (msg.indexOf("apri") > 0)
          { 
            pc_client.print("<p>Apertura cancello</p>");
            digitalWrite(apriCancello, HIGH);
            delay(2000);
            digitalWrite(apriCancello, LOW);
          }
          if (msg.indexOf("accendiLuce") > 0)
          { 
            pc_client.print("<p>Accensione accendiLuce</p>");
            digitalWrite(accendiLuce, HIGH);
            delay(30000);
            digitalWrite(accendiLuce, LOW);
          }
          if (msg.indexOf("rapr") > 0)
          { 
            if (msg.indexOf("15") > 0)
            {
               int numTemp = 15;
               minuti = numTemp * millisec;
            }   
            pc_client.print("<p>Apertura cancello ritardata di 15 minuti</p>");
            delay(minuti);   
            digitalWrite(apriCancello, HIGH);
            delay(1500);
            digitalWrite(apriCancello, LOW);
          }
        }
        break;
      }
    }
    //fermo il client
    pc_client.stop();    
  }
  //spedici messaggio se premono il pulsante del campanello
  int camp = digitalRead(campanello);
  //Serial.println(camp);
  if (camp == LOW)
    // Manda il messaggio se lo stato del pulsante è LOW (dichiarata in PULLUP è sempre HIGH fino a quando il pulsante non è premuto)
  {
    //mando il messaggio alla villa
    Serial.println("suono in villa");
    Udp.beginPacket(remoteV, remoteP);
    Udp.write(senData);
    Udp.endPacket();
    delay(10);
    //mando il messaggio alla cantina
    Serial.println("suono in cantina");
    Udp.beginPacket(remoteC, remoteP);
    Udp.write(senData);
    Udp.endPacket();
    delay(10);
  }
  //apro il cancello in base al messaggio via UDP
  int dimPac = Udp.parsePacket();
  if(dimPac)
  {
    //leggo il messaggio
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    //e lo metto in una varibile
    String ric = (packetBuffer);
    Serial.println(ric);
    for(int i=0;i<UDP_TX_PACKET_MAX_SIZE;i++) packetBuffer[i] = 0;
    //testo il valore
    if (ric == ("a"))
    {
      Serial.println("apro il cancello");
      digitalWrite(apriCancello, HIGH);
      delay(1500);
      digitalWrite(apriCancello, LOW);
    } 
  }
}

che sarebbe quello che riceve la richiesta di apertura cancello o accensione luce, anche lui, alla pressione del pulsante campanello, spedisce via UDP un messaggio (ed uno solo) che viene recepito dal primo sketch che ho postato ed eseguito. Questo sketch funziona il precedente invece no.
Mi date una mano a capire dove sta l'errore?

uso due arduino uno rev 3 con shield ethernet W5100
IDE 1.0.5

grazie e scusate la lunghezza del post

nel primo sketch (quello che non funziona) ho provato anche con il debounce ed una resistenza di 12K su gnd ma funziona quando gli pare a lui, cioè se premo il pulsante non va, poi improvvisamente si attivano tutti e due i pulsanti senza che io li abbia nemmeno sfiorati.

nessuna idea?

non capisco questa..
richiestaC = richiestaC++;

poi all'inizio del loop rimetti:
richiestaC = 1
cioò fa pensare che invii continuamente sino a che lasci il pulsante

cioè
if (richiestaC <=1) // questo è sempre uguale a 1
se non hjo letto male :cold_sweat:

edit
se è questo il problema prova a mettere subito sotto il camp = digitalRead(apriPorta);

 if (camp == HIGH){
   richiestaC  = 1;
 }

e togli

richiestaC  = 1;

che c'è allinizio del loop

ci proverò grazie per l'interessamento