Hola
Un compañero de trabajo me pidio que su alarma pudiera enviar sms o llamar a varios telefonos para avisar de la intrusion, empleando una salida de esta, le he realizado un montaje empleando un modem wavecom por RS232 y aprovechando una placa de arduino clonico con RS232 incorporado, por lo de no emplear modulos conversores TTL-RS232 externos.
Como el envio de mensajes SMS tiene un coste y cada x mensajes podria quedarse sin saldo en la tarjeta la opcion que he elegido es que cuando suene o detecte intrusion realize unas llamadas a los numeros de telefono almacenados en la SIM.
Esta opcion no le hace consumir saldo pues son llamadas perdidas (el usuario en su telefono ha cambiado el tono para cuando recibe una llamada del sistema de alarma bien escandaloso) aparte que le he añadido un pulsador para que pueda verificar cuando este en el lugar que funciona bien pues este pulsador realiza una llamada solo al primer numero de la guia.
El sistema es muy sencillo, la programacion tambien, sin florituras pues un atmega8 no tiene nada de espacio para almacenar un programa decente, os dejo el codigo para cualquier aficionado que este empezando y quiera entender un poco como conectar un modem gsm a un arduino.
Este es el montaje:
Este es el cable para conectar modem GSM y Arduino RS232 (los conectores de ambos son hembras SuB-D)
Y este es el codigo que he empleado, veran muchos delays pero son necesarios para que la SIM quede preparada.
(Estoy intentando arreglar los saltos de linea que quedan hechos un churro al copiarlo al foro)
// ????????????????????????????????????????????????????????????????????????????????
// ? PROGRAMA: ALARMA GSM REALIZA LLAMADAS PERDIDAS A USUARIOS CUANDO HAY ALARMA
// ? Autor: HEKE Mail: TF:
// ????????????????????????????????????????????????????????????????????????????????
// ? Fecha Inicio: 06 JULIO DE 2013
// ? Version 0.9 Modem Wavecom y Arduino clonico con chip Atmega-8 CON TTL--> RS232
// ? Observaciones: Dar de alta los numeros en la SIM añadiendo numero de orden al
// ? nombre en la agenda, ej: 1Heke 2OtroNombre 3OtroMas etc... maximo 9 nombres
// ????????????????????????????????????????????????????????????????????????????????
// ??????????????????????????????????????????????????????????????????
// ? **** CONECTOR SUBD-9 HEMBRA DE LA PLACA ATMEGA-8
// ??????????????????????????????????????????????????????????????????
//
// ????????????????????????????????????????????? 1.-DCD 7.-RTS
// ? ????????????????????????????? ? 2.-RX 8.-CTS
// ??? \ (05) (04) (03) (02) (01) / ?? ? 3.-TX 9.-RI
// ??? \ (09) (08) (07) (06) / ?? ? 4.-DTR
// ? \_______________________/ ? 5.-GND
// ????????????????????????????????????????????? 6.-DSR
//
//
// ????????????????????????????????????????????????????????
// ? **** CONECTOR SUBD-15 HEMBRA DEL MODEM WAVECOM
// ????????????????????????????????????????????????????????
//
// ????????????????????????????????????????????????? 1.-CD 8.-DTR 15.-SPK2N
// ? ?????????????????????????????????????? ? 2.-TX 9.-GND
// ??? \ (05) (04) (03) (02) (01) / ?? ? 3.-BOOT 10.-SPK2P
// ??? \ (10) (09) (08) (07) (06) / ?? ? 4.-MIC2P 11.-CTS
// ? \ (15) (14) (13) (12) (11) / ? 5.-MIC2N 12.-RTS
// ? \____________________________/ ? 6.-RX 13.-RI
// ????????????????????????????????????????????????? 7.-DSR 14.-RESET
//
// CABLE DEL WAVECOM AL ARDUINO CLONICO
// =======================================
// DB15 DB9
//
// 2 --------> 2
// 6 --------> 3
// 9 --------> 5
// 11??
// 12??
String Texto = ""; // Variable para sacar por display lo que devuelve el modem
String Texto1 = ""; // Variable para sacar por display lo que devuelve el modem
int ManualPin = 14; // Entrada para pulsar y comprobar que funciona
int AlarmaPin = 15; // Entrada cuando se activa la alarma
int Guia = 0;
int PrimeraComa = 0;
char Usuarios[1];
// ????????????????????????????????????????????????
// ? FUNCION Setup
// ????????????????????????????????????????????????
void setup(){
pinMode(ManualPin, INPUT);
pinMode(AlarmaPin, INPUT);
digitalWrite(ManualPin, HIGH);
digitalWrite(AlarmaPin, HIGH);
Serial.begin(9600); // 9600 baudios velocidad del wavecom
Serial.flush(); // Limpiamos puerto serie
delay(2000);
Envia("AT+CFUN=1"); // Inicializacion
delay(4000);
Serial.print("AT+CPBS=");
Serial.write((byte)0x22); // Envia comillas
Serial.print("SM");
Serial.write((byte)0x22); // Envia comillas
Serial.write((byte)0x0D); // Envia intro
LeeSerie();
delay(12000);
Envia("ATE0");
delay(29000);
while (Guia < 1){
Envia("AT+CPBS?"); // Pregunta cuantos numeros de TF hay en la SIM
PrimeraComa = 0;
Usuarios[1] = '0';
delay(3000);
int PrimeraComa = Texto.indexOf(','); // Busca la primera coma en la respuesta
Texto.substring((PrimeraComa+1),(PrimeraComa+3)).toCharArray(Usuarios, 2);
Guia = atoi(Usuarios);
}
delay(2000);
LeeSerie();
Serial.flush();
delay(1000);
}
// ????????????????????????????????????????????????
// ? FUNCION Loop
// ????????????????????????????????????????????????
void loop(){
Texto,Texto1="";
LeeSerie();
Texto1=Texto.trim();
if (digitalRead(AlarmaPin) == LOW) {
for (int Posicion=1; Posicion < Guia+1; Posicion=Posicion+1){
Envia("ATH0"); // Cuelga cualquier posible llamada
delay(2000);
String Listin = "ATD>SM";
Envia(Listin+Posicion+";"); // Llama uno por uno a todos los numeros de la lista de la SIM
delay(16000);
Envia("ATH0"); // Cuelga la llamada antes de pasar al siguiente numero
delay(2000);
}
}
if (digitalRead(ManualPin) == LOW) {
Envia("ATH0"); // Cuelga cualquier posible llamada
Envia("ATD>SM1;"); // Llama al primer numero de la lista de la SIM PARA COMPROBACION
delay(18000);
Envia("ATH0"); // Cuelga la llamada de comprobacion
delay(2000);
}
}
// ????????????????????????????????????????????????
// ? FUNCION Envia comando al Modem
// ????????????????????????????????????????????????
void Envia(String Comando) {
Serial.print(Comando);
Serial.write((byte)0x0D); // Envia retorno de carro o INTRO
delay(300); // Le da tiempo a respirar al bicho
LeeSerie();
}
// ????????????????????????????????????????????????
// ? FUNCION LeeSerie
// ????????????????????????????????????????????????
String LeeSerie(){
Texto="";
while (Serial.available() > 0){
char inChar = Serial.read();
Texto += inChar;
}
return Texto;
}
Como podeis ver es muy simple y obvia todos los mensajes que envia el modem excepto cuando le pedimos que nos diga cuantos numeros de telefono tiene almacenados en la SIM, con la orden AT+CPBS? entonces si leemos la respuesta pues el usuario puede haber dado de alta 1, 2 o 9 (9 es el maximo porque creo que una alarma que tenga que marcar mas de 10 numeros es una burrada).
Luego pondre unos ejemplos de como he leido las respuestas para cuando ingresamos el pin y otros tipos de comandos pero en ese montaje no lo he empleado, de hecho he quitado la libreria LCD pues se me iba de memoria (8k) y he dejado la SIM sin peticion de PIN.
Simplemente le hago un bucle hasta que me devuelva un valor numerico de numeros almacenados en la guia, esto significa que el modem esta operativo, se ha registrado en la red y esta listo para llamar.
Os aconsejo descargaros los manuales del wavecom o dle modem que querais usar y los comandos AT, necesarios para entender como funciona un modem GSM.
Un saludo.