Control de alarma por multiples usuarios via SMS

Buenas tardes por aca en Perú... me llamo Victor Ramos y estoy incursionando en Arduino con un proyecto tomado de varios ejemplos encontrados en la red...

El tema en cuestion es que tanto el hardware usado 1-Arduino mega, 1-Modulo SIM800L, 2-PIR HC-SR501, 1- reed switch, y el codigo fuente implementado funcionan correctamente, puedo activar y desactivar el sistema enviando ON/OFF, recibir un mensaje de confirmacion por los comandos enviados al arduino, y a la vez recibir el estado del sensor si sufriese alguna variacion...

Todo funciona como se muestra en el video de origen de donde tome el código Aplicación inalámbrica con SIM800L - YouTube que esta en los repositorios de GitHub GitHub - SETISAEDU/SIM800L-con-Arduino: En este repositorio se encuentra los sketch de Arduino y diagramas de conexión para poder utilizar el módulo SIM800L en modo SMS. .

Ahora el problema es que este proyecto lo implentaré en un pequeño negocio familiar, por lo tanto 5 personas necesitamos tener acceso al arduino tanto para activar o desactivar el sistema, así como poder recibir las notificaciones del mismo...

disculpen las preguntas formuladas pero recien entro en este mundo y la verdad no lo entiendo mucho, tengo la vaga idea de colocar mas entradas de numeros telefonicos, pero es solo mi idea, no se si sea correcto mi pensamiento... por eso acudo a ustedes...

Gracias..

Saludos...

Hola @zonosfera, bienvenido al foro Arduino.

Te felicito por presentar debidamente tu proyecto/problema.

Lo que estas imaginando es lo que debes hacer o sea enviar simultáneamente el SMS a los otros 4 telefonos. Si publicas el código (con etiquetas) te diremos como hacerlo o haz tu mejor esfuerzo intentándolo y te lo corregiremos si hiciera falta.

Buenas noches desde aqui...

Me ausente un poco por temas de trabajo que absorben mi tiempo...

He retomado parte del trabajo, para este proyecto me base en uno que encontré en GitHub y esto es lo que tengo hasta el momento...

1-He logrado que me detecte la activación de los PIR (2 en este caso).
2-que me envie SMS a traves del SIM800L al detectar movimiento en cualquiera de los PIR.
3-identificar en que zona ocurrio el evento.

Lo que espero lograr...

1-Que pueda enviarle un sms para activar o desactivar la sirena a voluntad, despues de ver las camaras de seguridad.
2-Como dice el titulo del post llegar a enviar SMS a 4 usuarios.

en el punto 1 de lo que espero lograr, no logro que acepte los comandos del sms, pero la parte de los pir funciona bien

Espero poder hacer mas pero es mi primer contacto con Arduino...

posteo el sketch que uso

#include <SoftwareSerial.h>   //Incluimos la libreria SoftwareSerial
SoftwareSerial SIM800L(2, 3); //Declaramos los pines RX(2) y TX(3) que vamos a usar
const int Pir1 = 4;  // Detector de movimiento (1) Entrada Principal.
const int Pir2 = 5;  // Detector de movimiento (2) Cocina.
const int LED1 = 9;  // Representa el dispositivo controlado a distancia (como un foco por ejemplo)
                        
int enviar =0;
String Mensaje;

boolean SMS_Open1  = true;
boolean SMS_Closed1  = true;
boolean SMS_Open2  = true;
boolean SMS_Closed2  = true;


void setup() {
  Serial.begin(115200);                  // Velocidad de comunicacion con el Monitor Serie
  SIM800L.begin(115200);                 // Velocidad de comunicacion con el modulo SIM800L
  pinMode(Pir1,INPUT);                  // permanente en LOW, requiere HIGH para activarse
  pinMode(Pir2,INPUT);                  // permanente en LOW, requiere HIGH para activarse
  pinMode(LED1,OUTPUT);                 // Activacion del dispositivo controlado a distancia
  pinMode(7,OUTPUT);                    // Salida del Detector de movimiento (1) enciende led
  pinMode(8,OUTPUT);                    // Salida del Detector de movimiento (2) enciende led
  SIM800L.println("AT+CMGF=1");         // Configurar el módulo en modo de texto
  delay(500);                           //Tiempo de espera para que el modulo se conecte a una red
  SIM800L.println("AT+CNMI=2,2,0,0,0"); //Configuracion de la forma como recibir mensajes
  Mensaje.reserve(100);
  delay(10000);
}

void loop() {
             // Para activar el dispositivo
 
     if(Mensaje.indexOf ("ENCENDER") >= 0 || Mensaje.indexOf ("Encender") >= 0) 
    {
      digitalWrite(LED1,HIGH); //Activa dispositivo 
      Mensaje = "";
    }
  
  //si el SMS contiene "APAGAR" o "Apagar"
    if(Mensaje.indexOf ("APAGAR") >= 0 || Mensaje.indexOf ("Apagar") >= 0)
    {
      digitalWrite(LED1,LOW);//Desactiva el dispositivo
      Mensaje = ""; 
    }
    
              // Cuando se detecta Movimiento
  // Cuando el Pir1 indica movimiento:  
    if((digitalRead(Pir1)  == HIGH) && (digitalRead(7)==LOW)) 
    {
     digitalWrite(7,HIGH);
     SMSPuerta1_Abierta(); //Se envía la notificacion del evento
     SMS_Closed1 = true;
    }
 
    if((digitalRead(Pir2)  == HIGH) && (digitalRead(8)==LOW)) 
    {
     digitalWrite(8,HIGH);
     SMSPuerta2_Abierta(); //Se envía la notificacion del evento
     SMS_Closed2 = true;
    }
 
}

//Lo que se escriba en el monitor serie, se trasladará al modulo SIM800L
void serialEvent(){
 if(Serial.available())       
  {
    String text=Serial.readString();
    SIM800L.println(text);
  }
}

//Rutina de servicio a la interrupcion para el monitor serie 1
void serialEvent1(){            
  if(SIM800L.available() > 0 )
  {
    Mensaje=SIM800L.readStringUntil("\n");
    Serial.println("Nuevo Mensaje:");
    Serial.println(Mensaje);
  }
}
    
//Funcion de alerta sobre puerta abierta por SMS
void SMSPuerta1_Abierta() 
{
  if(SMS_Open1 == true)
  {
  SIM800L.println("AT+CMGF=1");
  delay(200);
  SIM800L.println("AT+CMGS=\"+51980989627\""); 
  delay(200);
  SIM800L.print("Movimiento detectado en ENTRADA");
  delay(200);
  SIM800L.print((char)26);
  delay(200);
  SIM800L.println("");
  delay(200);
  SMS_Open1 = false;  
  }
  }
  

void SMSPuerta2_Abierta()
{
  if(SMS_Open2 == true)
  {
  SIM800L.println("AT+CMGF=1");
  delay(200);
  SIM800L.println("AT+CMGS=\"+51980989627\""); 
  delay(200);
  SIM800L.print("Movimiento Detectado en COCINA");
  delay(200);
  SIM800L.print((char)26);
  delay(200);
  SIM800L.println("");
  delay(200);
  SMS_Open2 = false;  
  }
}

Se que estas empezando y vas bien.
Mira esto para simplificar tus situaciones de alarma

//Funcion de alerta sobre puerta abierta por SMS
void SMSPuerta1_Abierta() {

  if (SMS_Open1 == true) {
      envio_SMS("Movimiento Detectado en ENTRADA");
      SMS_Open1 = false;  
  }
}
  

void SMSPuerta2_Abierta() {
  if (SMS_Open2 == true) {
      envio_SMS("Movimiento Detectado en COCINA");
      SMS_Open2 = false;  
  }
}

void envio_SMS(const char *str)  {
    SIM800L.println("AT+CMGF=1");
    delay(200);
    SIM800L.println("AT+CMGS=\"+51980989627\""); 
    delay(200);
    SIM800L.print(str);
    delay(200);
    SIM800L.print((char)26);
    delay(200);
    SIM800L.println("");
    delay(200);
}

Gracias surbyte...

lo pondre en practica y ya comentaré...

Saludos...

Existen librerías que te facilitan mucho las cosas y no tienes que empezar de 0 como lo que estas haciendo.

Prueba GSM.h que esta disponible en tu IDE o bien prueba esta librería GSMLIB. Esta ultima tiene permite enviar/recibir SMS, llamadas, GPRS, http, email, UDP,metodo GET, metoodo POST, GPS y otras cosas.

Bueno... aqui otra vez...

he ido avanzando de a pocos, tal vez mal, tal vez bien.... pero estoy obteniendo los resultados esperados, al menos asi es en el protoboard funciona y es esperanzador para alguien que tiene su contacto con arduino por primera vez, conseguí un chip atmega328pu y sobre el esto trabajando directamente con un "Arduino" reducido al maximo como estan sus diagramas circulando por la web...

1-he conseguido que se de un tiempo prudencial (15 seg.) para que el SIM800L se conecte al operador.
2-luego de otra secuencia inicial, un retardo a travez de delays, un tono generado por 45 seg, para completar 1 min de inactividad antes que se ejecute el LOOP.
3-tener led de estado del sistema (muy burdo pero funcional, al menos eso veo)
4-respuesta de activacion para tres PIR y un boton de pánico
5-aviso interno por el buzzer que se activo el sistema, con la generacion de tonos

voy en camino de ver el retardo de 30 seg para la activacion de la sirena....

voy probando en esketches separados, cada cambio para no deteriorar el que funciona bien...

no puedo publicar el codigo, ya que solo el sistema me permite subir 9000 caracteres...

Saludos...

Si puedes, cuando superas los 9k lo adjuntas.

Buenas noches por aca...

He podido ir probando algunas cosas, de un codigo extenso para encender y apagar un led cada segundo en un minuto (240 lineas de codigo) gracias a la informacion encontrada, y al bucle FOR, pude reducirla a solo 10... que tal ahorro en tipeo...

he conseguido entender el MILLIS, pero a duras penas., queria lograr que un led encienda dos veces en un segundo para indicar un estado del sistema, pero con lo que logre creo que basta, las lineas que estan comentadas es para que me permita probar con solo un sensor, lo demas ya esta hecho. veremos que pasa, por el momento seguire experimentando...

la secuencia void buzzer al final, esta hecha con delays para las pausas entre tonos, no he encontrado la manera de hacerlo con millis ya que todos los ejemplos solo tratan de un led 1-0xseg y no en 1-0-1-0xseg a ver si me tiran un ancla por alli para que el buzzer suene como lo programé necesito muchas mas lineas que implementar, ahh, ademas no consigo activar la sirena en el pin A0,(si me tiran el ancla, por este tendrian que tirarme la cadena tambien)

Saludos...

#include <SoftwareSerial.h>   //Incluimos la libreria SoftwareSerial
SoftwareSerial SIM800L(2, 3); //Declaramos los pines RX(2) y TX(3) que vamos a usar

const int Puls   = 9;   // Boton de panico(0) Barra y cocina.
const int Pir1   = 10;  // Detector de movimiento (1) Entrada Principal.
const int Pir2   = 11;  // Detector de movimiento (2) Cocina.
const int Pir3   = 12;  // Detector de movimiento (3) 2do piso.
const int Estado = 13;  // Led de estado del sistema: Apagado=No activo, Parpadeando=Activo
const int Siren  = A0;  // Activa la sirena
const int pinBuz = A1;  // Salida del BUZZER
                       
int enviar =0;
String Mensaje;
boolean flag = true;
long previousMillis = 0;
long On = 100;
long Off = 900;        

boolean SMSPuls_1  = true;
boolean SMSPuls_0  = true;
boolean SMSPir1_1  = true;
boolean SMSPir1_0  = true;
boolean SMSPir2_1  = true;
boolean SMSPir2_0  = true;
boolean SMSPir3_1  = true;
boolean SMSPir3_0  = true;

void setup()
{
  Serial.begin(115200);                 // Velocidad de comunicacion con el Monitor Serie
  SIM800L.begin(115200);                // Velocidad de comunicacion con el modulo SIM800L
  delay(600);
  pinMode(Puls,INPUT);                  // En LOW por resistencia PULLDOWN, cambia a HIGH al presionar
 // pinMode(Pir1,INPUT);                  // En LOW por el PIR, cambia a HIGH al detectar movimiento
 // pinMode(Pir2,INPUT);                  // En LOW por el PIR, cambia a HIGH al detectar movimiento
 // pinMode(Pir3,INPUT);                  // En LOW por el PIR, cambia a HIGH al detectar movimiento
  pinMode(A5, OUTPUT);                  // Salida Led, indica que se presionó el boton de panico
  //pinMode(A4, OUTPUT);                  // Salida Led, indica que se activó el Pir1
 // pinMode(A3, OUTPUT);                  // Salida Led, indica que se activó el Pir2
 // pinMode(A2, OUTPUT);                  // Salida Led, indica que se activó el Pir3
 // pinMode(A1, OUTPUT);                  // Salida Piezoelectrico(buzer)
 // pinMode(A0, OUTPUT);                  // Salida Sirena
  pinMode(Estado, OUTPUT);                  // Led de estado del sistema: Apagado=No activo, Parpadeando=Activo
  pinMode(4,  OUTPUT);                  // Led de general de activacion del sistema: Apagado=sin eventos, Encendido=Alarma de evento
  SIM800L.println("AT+CMGF=1");         // Configurar el módulo en modo de texto
  delay(200);                           // Tiempo de espera para que el modulo se conecte a una red
  SIM800L.println("AT+CNMI=2,2,0,0,0"); // Configuracion de la forma como recibie los mensajes
  Mensaje.reserve(100);
  delay(200);
  SIM800L.println("AT+CMGD=1,4");       //Borra todos los SMS enviados y recibidos

                    for (int i=0; i <= 90; i++)
                        {
                         delay(500);
                         digitalWrite(13, HIGH);
                         delay(300);
                         digitalWrite(13, LOW);
                         tone(A1,700);
                         delay(200);
                         noTone(A1);
                        }
}

void loop()
{
     if (millis() < (previousMillis + On + Off))
     {
      flag = true;
     }
        else
        {
         flag = false;
         previousMillis = millis();
        }
           if (flag == true)
           {
            if (millis() > (previousMillis + On))
              {
               digitalWrite(Estado, LOW);
              }
                 else
                 {
                  digitalWrite(Estado, HIGH);
                 }
            }
              
             // Para activar el dispositivo por SMS
 
     if(Mensaje.indexOf ("ENCENDER") >= 0 || Mensaje.indexOf ("Encender") >= 0) 
    {
      digitalWrite(Siren,HIGH); //Activa dispositivo 
      Mensaje = "";
    }
  
  //si el SMS contiene "APAGAR" o "Apagar"
    if(Mensaje.indexOf ("APAGAR") >= 0 || Mensaje.indexOf ("Apagar") >= 0)
    {
      digitalWrite(Siren,LOW);//Desactiva el dispositivo
      Mensaje = ""; 
    }
    
              // Cuando se activan los sensores
  
    if((digitalRead(Puls)  == HIGH) && (digitalRead(A5)==LOW)) 
    {
     digitalWrite(A5,HIGH);
     digitalWrite(4,HIGH);
     SMSPuls(); //Se envía la notificacion del evento
     SMSPuls_0 = true;
     }
                 if((digitalRead(4)  == HIGH))
                    { Buzzer();}
}

//Lo que se escriba en el monitor serie, se trasladará al modulo SIM800L
void serialEvent(){
 if(Serial.available())       
  {
    String text=Serial.readString();
    SIM800L.println(text);
  }
}

//Rutina de servicio a la interrupcion para el monitor serie
void serialEvent1(){            
  if(SIM800L.available() > 0 )
  {
    Mensaje=SIM800L.readStringUntil("\n");
    Serial.println("Nuevo Mensaje:");
    Serial.println(Mensaje);
  }
}
    
//Funcion de envio de SMS
void SMSPuls() 
{
  if(SMSPuls_1 == true)
  {
  SIM800L.println("AT+CMGF=1");
  delay(200);
  SIM800L.println("AT+CMGS=\"+51980989627\""); 
  delay(200);
  SIM800L.print("El Boton de Panico Fue Activado");
  delay(200);
  SIM800L.print((char)26);
  delay(200);
  SIM800L.println("");
  delay(200);
  SMSPuls_0 = false;  
  }}

  
  void Buzzer()
{
     tone(pinBuz, 700);
     delay(200);
     noTone(pinBuz);
     delay(50);
     tone(pinBuz, 700);
     delay(200);
     noTone(pinBuz);
     delay(50);
     tone(pinBuz, 1000);
     delay(500);
     noTone(pinBuz);
     delay(700);
  }

Un simple revisión de tu código muestra que tienes delay() y esperas que algo con millis() funcione, ya te digo que es imposible

Una vez mas...porque no lo habrás leído, delay() detiene el microprocesador y millis() no porque es otra cosa.

Asi que si por cada acción al SIM900/800 tienes que poner un delay() lograr un equilibrio con millis() es imposible.

Debe reevaluarse todo. Tal vez no lo vi antes pero si se me pasó me disculpo.

millis() es como el cronometro que hechas a funcionar cuando se larga una carrera y tu tomas valores cada vez que un corredor pasa cerca tuyo... y dices donde estará el corredor dentro de 5000 mseg? ahhh cuando pasen 5 hago sonar una alarma para tal cosa.

De ese modo todo fluye.
Pero si lo hicieras con delay() es como que pusieras una barrera y ningún corredor puede pasar... hasta que pasen los 5 segundos. Por lo tanto se te acumulan todos los corredores y la cosa no va.

En el setup() no importa tener delay() pero en el loop() si.

Aca en esta rutina void SMSPuls() tienes varios delays de 200mseg. en total 4 que acumulan 800 mseg.

Luego buzzer que acumula 1500 mseg

Esas dos rutinas deben modificarse tal que funcionen si PARAR el micro.

Entiendo surbyte, pero mo encuentro un ejemplo en el que pueda adaptar el codigo de la parte buzzer a un millis, estuve probando a replicar varias veces e incrementar los millis existentes (millis1, millis2, millis3 etc), pero se me complicó mucho el asunto... ser novato no me disculpa, pero creo que hay cosas que logro entenderlas aun...

pero como digo, no encuentro un ejemplo con un HIGH - LOW - HIGH - LOW x tiempo.. para adpaptarlo a los tonos de advertencia por el buzzer... a ver si me iluminas...

void Buzzer()
{
     tone(pinBuz, 700);
     delay(200);
     noTone(pinBuz);
     delay(50);
     tone(pinBuz, 700);
     delay(200);
     noTone(pinBuz);
     delay(50);
     tone(pinBuz, 1000);
     delay(500);
     noTone(pinBuz);
     delay(700);
  }

Ve a Documentación => Indice de temas tutoriales => Millis() y también lee máquina de estados.

Ahi tienes las dos cosas que buscas.

En otro hilo respondí algo parecido no con GSM.

Acá tienes el ejemplo, miralo completo, que hizo el autor del hilo y como lo cambio usando millis() y maquina de estados.
http://forum.arduino.cc/index.php?topic=558852.0

Gracias...

Ahora bajaré las rpm porque debo salir de viaje, procurare llevarme la placa arduino uno y la laptop para avanzar algo del tiempo que me quede libre...

Saludos...