Problema con il programma per modulo RFID e shield Keyes GSM/GPRS con SIM900.

Salve a tutti, mi chiamo Manuel D’Ambrosio e frequento attualmente il quinto anno della scuola E.Alessandrini di Vittuone (MI). Il progetto della maturità prevede un modulo RFID per l’apertura di una pompa per il controllo a breve distanza e il modulo GSM per il controllo remoto della stessa pompa.
In pratica vorrei che il programma facesse questo:
Il sistema rileva l’umidità del terreno di una pianta grazie a un apposito sensore che controllerà ciclicamente il valore di umidità. A terreno umido il sistema non farà nulla poiché la pianta ha acqua a sufficienza per sopravvivere.
Il sistema si attiverà quando il sensore di umidità rileverà un indicativo valore di terreno secco preimpostato. A questo punto Arduino manderà un messaggio tramite il modulo GSM a un numero di telefono caricato nel programma stesso e contemporaneamente attiverà un led o un buzzer. Successivamente l’utente potrà scegliere se utilizzare il controllo remoto oppure il controllo a breve distanza.
Se sceglierà il controllo remoto l’utente manderà un messaggio ad Arduino per l’attivazione di una pompa tramite un relè che spingerà l’acqua verso il terreno.
Se sceglierà il controllo a breve distanza l’utente tramite il modulo RFID-RC522 passando la tessera magnetica sul modulo stesso contenente il codice caricato nel programma, si accenderà un led bianco soltanto per la fase di eccitazione del relè e un led verde per confermare l’apertura della pompa. Se è stata passata una tessera contenente il codice sbagliato si accenderà il led rosso e la pompa non si aprirà.
Una volta aperta la pompa il terreno diventerà umido. Il sensore di umidità invierà ad Arduino il corrispettivo valore indicativo per terreno umido. La pompa si arresterà, Arduino manderà il messaggio di operazione compiuta e il buzzer o il led smetterà di suonare.
Il problemi del mio programma sono due, il modulo RFID non funziona correttamente con questo programma (in altri programmi ad esempio presenti su progettiarduino.com sì) e il messaggio di notifica non viene mandato al primo ciclo ma solo dal secondo in poi. Come posso risolverli?

#include "SIM900.h"
#include <SoftwareSerial.h> // necessaria alla libreria gsm.h richiamata in sms.h
// #include "inetGSM.h"     // necessaria per l'uso di HTTP
#include "sms.h"            // Libreria per la gestione degli SMS
SMSGSM sms;

#include <SPI.h>
#include <RFID.h>
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10  // Pin 53 per Arduino Mega
#define RESET_DIO 9
#define delayRead 1000 // Tempo 
#define delayLed 1000 
#define ledVerde 6
#define ledRosso 4
#define rele 8
/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO); 
  // inserire tutti i codici esadecimali delle schede magnetiche riconosciute 
String codiceAutorizzato1 = "40756DA3FB";
int y;
int valuesensor;
int pinsensor=0;
int ledsensor=5;
const int sogliacritica = 40; //Soglia alla quale il led sarà ON
int numdata;
boolean started=false;
char smsbuffer[160];
char Mittente[20];

void setup()
{
Serial.begin(9600);
 /* Abilita SPI*/
  SPI.begin(); 
  /* Viene inizilizzato RFID reader */
  RC522.init();
  Serial.println("Setup");
  pinMode(ledVerde,OUTPUT);
  pinMode(ledRosso,OUTPUT);
 
  Serial.println("ESEMPIO INVIO/RICEZIONE SMS");
  pinMode(ledsensor, OUTPUT);
  pinMode(rele, OUTPUT);   // imposta il pin 8 come pin di OUTPUT.
  digitalWrite(rele, HIGH); // spegne inizialmente il led
  // Inizializzo la connessione GSM impostando il baudrate
  // Per l'utilizzo di HTTP è opportuno usare 4800 baud o meno
  if ( gsm.begin(2400) )
  {
     Serial.println("STATUS Modulo GSM = PRONTO");
     started=true;  
  }
  else 
     Serial.println("STATUS Modulo GSM = INATTIVO");

}

void loop()
{
valuesensor = analogRead(pinsensor); //Legge il valore analogico
valuesensor = map (valuesensor, 1023,0,0,100); 
Serial.println(valuesensor); //Stampa a schermo il valore
if (valuesensor <= sogliacritica)
digitalWrite(ledsensor,HIGH); //Accendi led
else
digitalWrite(ledsensor,LOW); //Spegni led
delay(2000); //Attende due secondi
char inSerial[50];
char position;
if (started)
  {
     // -- Righe commentate poichè utilizzate per nei test
     // strcpy(Mittente,"3380000000");
     // if (SerialRead(smsbuffer))
     // ------------------------------------------------------
    // Legge se ci sono messaggi disponibili sulla SIM Card
    // e li visualizza sul Serial Monitor.
    position = sms.IsSMSPresent(SMS_ALL); // Valore da 1..20
 
   if (valuesensor<=sogliacritica && y==0)
     {  
      sms.SendSMS("+393278276733","TERRENO SECCO"); // restituisce true se invia l'SMS
      Serial.println(" => ATTESA AVVIO");
      y=1;
     }
   if (valuesensor>sogliacritica)
     {
      y=0;
     }
   
    if (position) 
    {
      sms.GetSMS(position,"+393278276733", smsbuffer, 160);
      Serial.print("Comando Ricevuto [tel. "+String("+393278276733")+String("]: ") + String(smsbuffer));
      if (strcmp(smsbuffer,"ON")==0)
      {
         digitalWrite(rele, LOW);   // Accende il RELE impostando il voltaggio a LOW
         delay(3000);
         digitalWrite(rele,HIGH);
         Serial.println(" => Accendo il RELE");
         sms.SendSMS("+393278276733","TERRENO UMIDO"); // restituisce true se invia l'SMS
         Serial.println(" => OPERAZIONE COMPLETATA");
      }
      
       else
         Serial.println(" => non riconosciuto!");
      sms.DeleteSMS(position); // Elimina l'SMS appena analizzato
    }
    delay(1000);
  }


/* Temporary loop counter */
  byte i;
  // Se viene letta una tessera
  if (RC522.isCard())
  {
    // Viene letto il suo codice 
    RC522.readCardSerial();
    String codiceLetto ="";
    Serial.println("Codice delle tessera letto:");
  
    // Viene caricato il codice della tessera, all'interno di una Stringa
    for(i = 0; i <= 4; i++)
    {
      codiceLetto+= String (RC522.serNum[i],HEX);
      codiceLetto.toUpperCase();
    }
    Serial.println(codiceLetto);
    if(verificaCodice(codiceLetto,codiceAutorizzato1))
    {
      Serial.println("Tessera autorizzata");
      accendiLed(ledVerde);
      digitalWrite (rele,LOW);
      delay (3000);     // Tempo relè in stato ON
      digitalWrite (rele,HIGH);
    }
    else
    {
      Serial.println("Tessera non autorizzata");
      accendiLed(ledRosso);
    }
  delay(delayRead);  
  }
}



// Questa funzione verifica se il codice Letto e' autorizzato
boolean verificaCodice(String codiceLetto, String codiceAutorizzato)
{
  if(codiceLetto.equals(codiceAutorizzato))
  {
    return true;
  }
  else
  {
    return false;
  }  
}    
// Questa funzione permette di accendere un LED per un determinato periodo
void accendiLed(int ledPin)
{
  digitalWrite(ledPin,HIGH);
  delay(delayLed);
  digitalWrite(ledPin,LOW);
}