SIM900 encendido y apagado

Hola, estoy haciendo un proyecto y sólo me falta una cosa para que esté al 100% de mi gusto de principiante.

Estoy tratando de hacer una alarma con los siguiente componentes:

  • Arduino Uno (conectado a una fuente de 9V sin PC)
  • SIM900 Shield (conectado a una fuente de 12V)
  • UltrasonidoHC-SR04 (Alimentado a los 5V del Arduino)
  • Alarma conectada a un relay y una fuente de 12V

Mi intención es que cuando el ultrasonido detecte algo suene la alarma y me llame por teléfono, hasta ahí todo bien y funcionando, el tema es que me gustaría crear una agenda para que cuando envíe un SMS con mi número o el de mi esposa la alarma se desactive o active dependiendo si es que vamos a ingresar o salir de la casa.

El tema es en el código, he hecho un Frankenstein con el sacando cosas de diversos tutoriales logrando hacer funcionar esto pero me gustaría saber 2 cosas, la primera si es que está ordenada la programación y la segunda es cómo y en dónde debería agregar el encendido de este “sistema de seguridad” o la forma más fácil de agregar este control vía SMS.

Me gustaría implementar más adelante (en tiempo corto) un sensor de gas MQ2 por si hay fugas y uno de fuego por si hay incendio (ambos los tengo comprados pero me gustaría resolver el tema del encendido y apagado del sistema por SMS antes).

Obvio mi intención es que si alguien le interesa hacer este tipo de sistema poder desarrollar algo más integral como con una fuente tipo UPS por si hay cortes o la activación de la alarma si es que alguien desconecta o corta algún cable. De momento paso a paso primero con el tema de la activación del sistema por SMS.

Copio mi programa por si alguien me puede ayudar con el tema del encendido y apagado de todo el sistema por SMS con una agenda de 2 o más números. Se que hay líneas que están de más ya que el sistema no estaría conectado nunca a una PC o monitor, si alguien quiere limpiar la programación lo agradeceré bastante. más tarde subiré un esquema de la conexión que tengo por si alguien quiere seguir el proyecto.

Gracias de antemano, saludos.

// defines pins numbers
const int trigPin = 9;
const int echoPin = 10;
const int buzzer = 11;

// defines variables
long duration;
int distance;
int safetyDistance;

#include <SoftwareSerial.h>

SoftwareSerial SIM900(7, 8); // Configura el puerto serial para el SIM900

void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
pinMode(buzzer, OUTPUT);

  SIM900.begin(19200); //Configura velocidad del puerto serie para el SIM900
  Serial.begin(19200); //Configura velocidad del puerto serie del Arduino
  Serial.println("OK");
  delay(25000); //Tiempo para que encuentre una RED

}

void llamar()
{
  Serial.println("Realizando llamada...");
  SIM900.println("ATDXXXXXXXXX;"); //Comando AT para realizar una llamada
  delay(20000); // Espera 20 segundos mientras realiza la llamada
  SIM900.println("ATH"); // Cuelga la llamada
  delay(1000);
  Serial.println("Llamada finalizada");
}

void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);

// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);

// Calculating the distance
distance= duration*0.034/2;

safetyDistance = distance;
if (safetyDistance <= 200){
  digitalWrite(buzzer, HIGH);

  llamar(); //Realiza la llamada
  while (1);
}
else{
  digitalWrite(buzzer, LOW);
}

// Prints the distance on the Serial Monitor
Serial.print("Distance: ");
Serial.println(distance);
}

Encontré un código para hacer llamadas y encender un led con una agenda de números seguros. El código es este:

#include <SoftwareSerial.h>

SoftwareSerial SIM900(7, 8); // Configura el puerto serial para el SIM900

char incoming_char = 0; //Variable que guarda los caracteres que envia el SIM900
String agenda[] = {"XXXXXXXXX" , "XXXXXXXXX"}; //Array con los numeros autorizados
int numtotal = 2; //Cantidad de numeros de telefono autorizados
String mensaje = "";
int LED = 13 ;
bool estado = false ; //Variable para guardar el estado del LED

void setup()
{
  pinMode( LED, OUTPUT) ; // LED como salida
  inicializaSIM900();
}

void loop()
{
  if (SIM900.available() > 0)
  {
    incoming_char = SIM900.read(); //Guardamos el carácter del GPRS
    Serial.print(incoming_char); //Mostramos el carácter en el monitor serie
    mensaje = mensaje + incoming_char ; // Añadimos el carácter leído al mensaje
  }
  identifica_llamada ();
}


void inicializaSIM900()
{
  //digitalWrite(9, HIGH);   // Descomentar para activar la alimentación de la tarjeta por Software
  //delay(1000);             
  //digitalWrite(9, LOW);
  delay (5000);
  SIM900.begin(19200); //Configura velocidad del puerto serie para el SIM900
  Serial.begin(19200); //Configura velocidad del puerto serie del Arduino
  Serial.println("OK");
  delay (1000);
  SIM900.println("AT + CPIN = \"XXXX\""); //Comando AT para introducir el PIN de la tarjeta
  delay(25000); //Tiempo para que encuentre una RED
  Serial.println("PIN OK");
  SIM900.print("AT+CLIP=1\r"); // Activa la identificación de llamada
  delay(100);
  SIM900.print("AT+CMGF=1\r"); //Configura el modo texto para enviar o recibir mensajes
  delay(1000);
  SIM900.print("AT+CNMI=2,2,0,0,0\r"); // Saca el contenido del SMS por el puerto serie del GPRS
  delay(1000);
}

void identifica_llamada()
{
  int finllamada = mensaje.indexOf("NO CARRIER");
  if (finllamada >= 0)
  {
    for ( int i = 0; i < numtotal; i++)
    {
      int pos = mensaje.indexOf(agenda[i]);
      if (pos >= 0)
      {
        estado = ! estado ; // cambiamos el estado del LED
        digitalWrite(LED, estado) ;
        Serial.println("\nEl numero esta autorizado");
      }
    }
    mensaje = "" ; //Bórralo para la próxima vez
  }
}

También tengo el código para encender los leds por SMS y es el siguiente:

#include <SoftwareSerial.h>

SoftwareSerial SIM900(7, 8); // Configura el puerto serie para el SIM900

char incoming_char = 0; //Variable que guarda los caracteres que envia el SIM900
String mensaje = "";
int LED = 13 ;

void setup()
{
pinMode( LED, OUTPUT) ; // LED como salida
inicializaSIM900();
}

void loop()
{
  if (SIM900.available() > 0)
  {
    incoming_char = SIM900.read(); //Guardamos el carácter del GPRS
    Serial.print(incoming_char); //Mostramos el carácter en el monitor serie
    mensaje = mensaje + incoming_char ; // Añadimos el carácter leído al mensaje
  }
identifica_SMS();
}


void inicializaSIM900()
{
  //digitalWrite(9, HIGH);   // Descomentar para activar la alimentación de la tarjeta por Software
  //delay(1000);             
  //digitalWrite(9, LOW);
  delay (5000);
  SIM900.begin(19200); //Configura velocidad del puerto serie para el SIM900
  Serial.begin(19200); //Configura velocidad del puerto serie del Arduino
  Serial.println("OK");
  delay (1000);
  SIM900.println("AT + CPIN = \"XXXX\""); //Comando AT para introducir el PIN de la tarjeta
  delay(25000); //Tiempo para que encuentre una RED
  Serial.println("PIN OK");
  SIM900.print("AT+CLIP=1\r"); // Activa la identificación de llamada
  delay(100);
  SIM900.print("AT+CMGF=1\r"); //Configura el modo texto para enviar o recibir mensajes
  delay(1000);
  SIM900.print("AT+CNMI=2,2,0,0,0\r"); // Saca el contenido del SMS por el puerto serie del GPRS
  delay(1000);
}

void identifica_SMS()
{
  int led_on = mensaje.indexOf("Encender LED");
  int led_off = mensaje.indexOf("Apagar LED");
  if (led_on >= 0)
  {
        digitalWrite( LED, HIGH) ;
        Serial.println("\nLED ENCENDIDO");
        mensaje = "" ; //Bórralo para la próxima vez
  }
  if (led_off >= 0)
  {
        digitalWrite( LED, LOW) ;
        Serial.println("\nLED APAGADO");
        mensaje = "" ; //Bórralo para la próxima vez
  }
}

Lo que me gustaría lograr es la combinación de los 3 programas (el que dejé al comienzo y estos 2 últimos) para que logre activarse y/o desactivarse la alarma con un SMS de una agenda de números seguros.
La verdad no me da el conocimiento para hacer la suma ya de estos 3 programas en uno que sea eficiente.