MAB Ingenieros

mabingenieros

Desarrollo y Legalización de Proyectos de Ingeniería. Realización de proyecto técnico y memoria para la obtención de licencia de apertura.

Avisador SMS con Arduino

Exposición

Para explorar las posibilidades de Arduino vamos a hacer un proyecto cuyo objetivo será enviar un sms o una llamada perdida al detectar una señal desde un sensor externo. La aplicación real dependerá del tipo de sensor que utilicemos pero el diseño será practicamente el mismo en todos los casos:

  • Pulsador de botón grande: serviría como avisador de emergencia para personas mayores
  • Célula fotoeléctrica: alarma de acceso de intrusos
  • Sensor de temperatura: avisará cuando la temperatura supere un valor umbral
  • Señal de fallo de una máquina: Aviso de fallo
  • ...

Hardware

Los componentes que utilizaremos serán:

El cableado depende de varias consideraciones de las que vamos a intentar contemplar las más importantes aunque no todas:

  • La alimentación del sistema puede realizarse de las siguientes formas:
    • Indiferente. Recomendado para pruebas y programar Arduino
    • Cargador de móvil conectado a mini usb del GSM. Recomendado en situación operativa por el elevado consumo del módulo GSM.
    • Por puerto USB o clavija alimentación del Arduino
    • Independiente
  • Para comunicar el Arduino con el módulo GSM se pueden usar sin problemas cualquier pin I/O entre el 2 y el 12, hemos escogido arbitrariamente los pines 2 y 3.
  • Análogamente ocurre con el pin para detectar la señal, hemos seleccionado el 4. Por necesidades del sensor o simplemente porque lo decidamos así, la activación del sensor puede ser por:
    • Estado alto (5v) con sensor activo
    • Estado alto (5v) con sensor pasivo
    • Estado bajo (gnd)
    • No conectado

Software

El diseño del programa será lo que determinará cómo funcionará el sistema. Nuestro diseño usará los siguientes condicionantes:

  • Los avisos se alternarán entre llamadas perdidas y sms
  • La activación se produzca sólo si el sensor se activa durante más de S segundos
  • Una vez enviado el aviso, el sistema se bloqueará durante M minutos
  • Una vez enviados A avisos el sistema se bloqueará totalmente hasta pulsar reset o reiniciarlo.
  • A excepción del PIN de la SIM, todos los datos de configuración (S, M, A, teléfono a llamar, APN, etc) se leerán de la SIM para facilitar configurarlo simplemente poniendo la SIM en un móvil y creando las direcciones oportunas
  • Todos los datos, PIN incluído, podrán introducirse también desde un ordenador conectado al puerto USB del Arduino
  • Al introducir una SIM virgen, los datos preconfigurados se grabarán en ella para tener un patrón inequívoco de configuración

Los componentes que utilizaremos serán:

Como las posibilidades de diseño del programa son infinitas, en este artículo solo expondremos los detalles comunes o problemáticos o los que puedan sorprender a los que tienen experiencia en programación en otros sistemas

  • La capacidad de memoria SRAM es muy limitada y muchas constantes se almacenan en ella quitando un espacio precioso para las variables, la forma más simple y eficaz de hacer que las constantes se almacenen en la memoria flash es hacer uso de la función F() siempre que sea posible. Serial.println(F("Esto es una prueba ..."));
  • Para controlar la memoria SRAM utilizable cuando el programa está en marcha: int freeRam() {
    extern int __heap_start, *__brkval;
    int v;
    return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
    }
  • Si queremos dar la posibilidad opcional de introducir datos por el puerto USB del Arduino, para evitar que un error de programación o de conexión bloquee el programa cuando no esté conectado ese puerto, conviene crear un indicador que controle si se está introduciendo algo y actuar en consecuencia. Lo más sencillo es recurrir a serialEvent: bool USBActivado = false; void serialEvent(){ if (!USBActivado) { USBActivado = true; ... } } ... if (USBActivado) ...
  • La captura de datos a través del puerto serie se realiza dígito a dígito por lo que hay que hacer un bucle de lectura cuya versión más simplificada sería: String respuesta="";
    while (Serial.available()>0) {
    respuesta + = Serial.read();
    }
  • La EEPROM es limitadísima pero interesante para almacenar variables de configuración que no se puedan almacenar en otra parte (p.e. el PIN) y que se perderían al resetear el sistema. Su lectura y escritura se realiza dígito a dígito entre posiciones determinadas por lo que hay que controlar la posición inicial y la longitud de la variable que debe ser fija: #include <EEPROM.h> ... // Lectura for (int i=0;i<lon;i++) { char dato = EEPROM.read(pos+i); valor += dato; } ... // Escritura for (int i=0;i<lon&&i<lon;i++) { char dato = valor.charAt(i); EEPROM.write(pos+i, dato); }
  • El módulo GSM que hemos usado se inicia siempre con su puerto serie a 115200 sin posibilidad de memorización, esa velocidad es excesiva sin usar protocolos de comunicación así que conviene reducirla a 9600: SIM900.begin(115200);
    SIM900.println("AT+IPR=9600");
    SIM900.end();
    SIM900.begin(9600);
  • El módulo GSM responde a los comandos AT devolviendo información sobre el resultado de ejecutarlos y es conveniente controlarlo así que es buena idea hacer una función que lance el comando y capture la respuesta: para así controlar el funcionamiento. En la mayoría de los casos basta con comprobar que la respuesta incluye la cadena "OK" que indica que el comando ha sido entendido y ejecutado correctamente String atGSM(String comando) { String respuesta; respuesta = ""; if (comando!="") { delay(100); // Limpia el buffer de entrada while (SIM900.available()>0) { SIM900.read(); } // Envia el comando AT SIM900.println(comando); delay(100); // Lee la respuesta while (SIM900.available()>0) { char dato = SIM900.read(); respuesta += String(dato); } } return respuesta; }
  • Comandos AT y respuestas de interés:
    • AT+IPR=xxxxx Configura los baudios en la comunicación del módulo gsm, responde con OK si el comando es aceptado
    • AT+CPIN="xxxx" introduce el PIN de la SIM, responde con OK si el comando es aceptado
    • AT+CPIN? Verifica si el PIN está introducido correctamente en cuyo caso responde con +CPIN:READY
    • AT+CSTT="apn","usu","pas" para configurar el APN, responde con OK si el comando es aceptado
    • AT+CPBS="SM" selecciona la libreta de direcciones de la SIM, responde con OK si el comando es aceptado
    • AT+CPBR=X Lee el registro X de la libreta de direcciones de la SIM, responde con "número", 129, "nombre" y OK si el comando es aceptado
    • AT+CPBW="X","número",129,"valor" Graba el registro X de la libreta de direcciones de la SIM, responde con OK si el comando es aceptado
    • ATDXXXXXXXXX Marca un número de teléfono
    • ATH Cuelga la llamada, responde con OK si el comando es aceptado
    • AT+CMGF=1 Selecciona el modo texto para el envío de mensajes SMS.
    • AT+CMGS="numero" Inicia el envío de un SMS al número indicado, a continuación hay que introducir el texto del mensaje con la precaución de terminar con ctrl+z es decir el carácter \x1A y posteriormente enviar varos CR+LF para asegurar el envío.
QR Code