Help me with gsm and magnetic sensor for doors SMS

Hello everyone, I would be grateful if you could help me with the following project: it consists of sending an SMS automatically when a door opens and when it closes, so far I achieved it more or less, the problem I have is that I need to send only one sms only, so far several are sent as long as the door remains open, I would greatly appreciate your help

include <SoftwareSerial.h>
SoftwareSerial SIM900(10, 11); // Configura el puerto serial para el SIM900

char incoming_char = 0; //Variable que guarda los caracteres que envia el SIM900
int salir = 0;
const int switchPin = 2; //Pin de el sensor magnético
const int ledPin = 8;    //Pin para encender led

void setup() {

  SIM900.begin(19200); //Configura velocidad serial para el SIM900
  delay(5000);  //Retardo para que encuentra a una RED
  Serial.begin(19200); //Configura velocidad serial para el Arduino
  Serial.println("OK"); //Mensaje OK en el arduino, para saber que todo va bien.

  pinMode (switchPin, INPUT); //Se establece el pin del sensor como entrada

  pinMode (ledPin, OUTPUT); //Se establece el pin de led como salida.

  digitalWrite (switchPin, HIGH);// Se establece el pin digital en alto el pin del sensor

}

void loop() {   //Cliclo repetitivo


  if (digitalRead(switchPin) == LOW ) { // Condición si el sensor se encuentra cerrado(LOW) se ejecuta accion
    digitalWrite (ledPin, LOW); // Led permanece apagado


  } else { //Condición si el sensor se encuentra abierto(HIGH)
    digitalWrite (ledPin, LOW); // Led se enciende
    mensaje_sms();
  }

}



void llamar()
// Función que permite llamar a un celular local
{
  // SIM900.println("ATD 10725275;"); //Numero
  SIM900.println("ATD 78305229;"); //Celular
  //delay(100);
  SIM900.println();
  delay(5000); // Espera 30 segundos.
  SIM900.println("ATH"); // Cuelga el telefono
  //delay(1000);
}


void mensaje_sms()
//Funcion para mandar mensaje de texto
{

  SIM900.print("AT+CMGF=1\r"); // Comando AT para enviar mensaje
  delay(100);
  SIM900.println("AT + CMGS = \"51109746\""); // Numero al que se le va enviar SMS
  delay(100);
  SIM900.println("ALERTA: Ingreso a Sitio:Ch1  ID:2014"); // Mensaje que vamos a enviar
  delay(100);
  SIM900.println((char)26); // Comando AT para finalizar con ^Z, ASCII code 26 //Comando de finalizacion
  delay(100);
  SIM900.println();
  delay(1000); // Tiempo para que se envie el mensaje
  Serial.println("SMS enviado satisfactoriamente");


}

.

proyecto_final.ino (2.04 KB)

Have not tested it, but you should get the idea.
If you turn on/off ledPin corectly you can use its state as a marker - if led is ON it means you already sent the SMS.

The code below does no debouncing, it should work that way since mensaje_sms() takes long enough.

....
....

void loop() {
   if(digitalRead(switchPin) == LOW ) {
    digitalWrite (ledPin, LOW);
  }else{ 
    int sms_sent = digitalRead(ledPin); // Output pins can be read too.  
    digitalWrite (ledPin, HIGH); // ??? everyone should have an opportunity to get HIGH
    if (sms_sent == LOW) mensaje_sms();     
  } 
}
...
...

Normal people use a boolean flag to store information of a pin status rather than an output pin.

bool oldSwitchPinStatus;

void loop() {
  if (digitalRead(switchPin) == LOW) {
    if (oldSwithcPinStatus == HIGH) {
      // It has just become pressed.
      oldSwitchPinStatus = LOW;
    }
  }
  else {
    oldSwitchPinStatus = LOW;
  }
}

See also the state change detection example in the IDE.