|

Tablero de avisos inalámbrico con GSM y Arduino

ARDUINO

Por Saddam

Wireless Notice Board Using GSM and Arduino

Tablero de avisos inalámbrico es un término muy general para este proyecto, ya que tiene un alcance mucho más amplio que el de un simple tablero de avisos. Primero debemos entender el propósito de este proyecto: en este sistema podemos mostrar un mensaje o aviso en algún dispositivo de visualización como una LCD, y ese mensaje se puede establecer o cambiar fácilmente desde cualquier parte del mundo, con solo usar la función de SMS de tu teléfono móvil. Cualquier aviso que queramos mostrar, basta con enviar el SMS con ese texto, agregando un prefijo y un sufijo.

Esto es muy útil en hoteles, centros comerciales, universidades, oficinas y se puede usar en cualquier lugar, incluso en casa. Por ejemplo, puedes poner el mensaje “No molestar” en la puerta de tu habitación de hotel, dejar un mensaje en la puerta de tu casa cuando estás fuera y, por supuesto, se usa como tablero de avisos en escuelas, universidades, salas de cine, etc. Y sí, no es solo un simple tablero de mensajes; la utilidad de este proyecto es que puedes establecer o cambiar el mensaje o aviso desde cualquier lugar, con solo enviar un SMS desde tu teléfono.

Explicación del funcionamiento:

En este proyecto se utiliza un Arduino UNO para controlar todo el proceso, un módulo GSM (SIM900A) para recibir el SMS/mensaje enviado desde el teléfono móvil y una LCD para mostrar el mensaje.

GSM Arduino and LCD for wireless notice board

Podemos enviar algún mensaje o aviso como “#Circuit Digest*”, “#We Welcomes You*” a través del SMS. Aquí hemos usado un prefijo en la cadena del mensaje, que es ‘#’. Este prefijo sirve para identificar el inicio del mensaje o aviso. Y ‘*’ se usa como sufijo para indicar el final del mensaje o aviso.

Cuando enviamos un SMS desde el teléfono móvil al módulo GSM, este recibe ese SMS y lo envía al Arduino. Ahora el Arduino lee este SMS, extrae el mensaje principal del aviso de la cadena recibida y lo almacena en otra cadena. Después envía el mensaje extraído a la LCD de 16×2 usando los comandos apropiados.

Wireless Notice Board Using GSM Block-diagram

El funcionamiento más detallado de este sistema se explica en la sección ‘Descripción del código’ más abajo. Antes de entrar en los detalles de programación, debemos conocer el módulo GSM.

Módulo GSM:

El módulo GSM se usa en muchos dispositivos de comunicación basados en la tecnología GSM (Global System for Mobile Communications). Se utiliza para interactuar con la red GSM mediante una computadora. El módulo GSM solo entiende comandos AT, y puede responder en consecuencia. El comando más básico es “AT”: si el GSM responde OK significa que funciona bien, de lo contrario responde con “ERROR”. Existen varios comandos AT como ATA para contestar una llamada, ATD para marcar una llamada, AT+CMGR para leer el mensaje, AT+CMGS para enviar el SMS, etc. Los comandos AT deben ir seguidos de un retorno de carro, es decir \r (0D en hexadecimal), como “AT+CMGS\r”. Podemos usar el módulo GSM con estos comandos:

ATE0 Para desactivar el eco

AT+CNMI=2,2,0,0,0  <ENTER>           Recepción automática de mensajes.  (No es necesario abrir el mensaje)

ATD<Número de móvil>; <ENTER>      realizar una llamada (ATD+919610126059;\r\n)

AT+CMGF=1 <ENTER>                        Seleccionar el modo texto

AT+CMGS=”Número de móvil” <ENTER>  Asignar el número de móvil del destinatario

>>Ahora podemos escribir nuestro mensaje

>>Después de escribir el mensaje

Ctrl+Z  comando para enviar el mensaje (26 en decimal).

ENTER=0x0d en HEX

GSM-Module-SIM900A

El SIM900 es un módulo GSM/GPRS Quad-band completo que ofrece rendimiento GSM/GPRS 850/900/1800/1900MHz para voz, SMS y datos con bajo consumo de energía.

Descripción del circuito:

Las conexiones del Tablero de avisos inalámbrico con GSM y Arduino son sencillas y se muestran en la figura de abajo. Aquí se utiliza una pantalla de cristal líquido (LCD) para mostrar el “Aviso” o mensaje, que se envía a través del teléfono móvil como SMS. Los pines de datos de la LCD, es decir RS, EN, D4, D5, D6, D7, se conectan a los pines digitales 7, 6, 5, 4, 3, 2 del Arduino. Y los pines Rx y Tx del módulo GSM se conectan directamente a los pines Tx y Rx del Arduino respectivamente. El módulo GSM se alimenta con un adaptador de 12 voltios.

Wireless Notice Board using GSM circuit diagram

Descripción del código:

El código del programa es fácil de entender; lo nuevo aquí es la función de inicialización del GSM gsm_init(), que se explica al final.

En el programa, antes que nada incluimos la librería para la pantalla de cristal líquido (LCD) y luego definimos los pines de datos y de control de la LCD y algunas variables.

#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);

int led=13;

int temp=0,i=0,x=0,k=0;
char str[100],msg[32];

Después de esto, la comunicación serial se inicializa a 9600 bps y se da la dirección al pin utilizado. Y se inicializa el módulo GSM en el bucle de setup.

void setup()
{
  lcd.begin(16,2);
  Serial.begin(9600);
  pinMode(led, OUTPUT);
  digitalWrite(led, HIGH);
  lcd.print("GSM Initilizing...");
  gsm_init();
  lcd.setCursor(0,0);
  lcd.print("Wireless Notice");

 Para recibir datos de forma serial usamos dos funciones: una es Serial.available, que comprueba si están llegando datos seriales o no, y la otra es Serial.read, que lee los datos que llegan de forma serial.

void serialEvent()
{
  while(Serial.available())
  {
    char ch=(char)Serial.read();
    str[i++]=ch;
    if(ch == '*')
    {
      temp=1;
      lcd.clear();
      lcd.print("Message Received");
      delay(1000);
    }
  }
}

Después de recibir los datos de forma serial, los almacenamos en una cadena y esta cadena se revisa buscando ‘#’ y ‘*’, para encontrar el inicio y el final del aviso o mensaje. Finalmente, el aviso se muestra en la LCD usando lcd.print:

void loop()
{
  for(unsigned int t=0;t<60000;t++)
  {
    serialEvent();
  if(temp==1)
  {
    x=0,k=0,temp=0;
    while(x<i)
    {
      while(str[x]=='#')
      {
        x++;
        while(str[x]!='*')
        {
          msg[k++]=str[x++];

La función de inicialización ‘gsm_init()’ para el GSM es importante aquí; en ella, primero se comprueba si el módulo GSM está conectado o no enviando el comando ‘AT’ al módulo GSM. Si se recibe la respuesta OK, significa que está listo. El sistema sigue verificando el módulo hasta que esté listo o hasta que se reciba ‘OK’. Luego se desactiva el ECO enviando el comando ATE0, de lo contrario el módulo GSM repetirá (eco) todos los comandos. Finalmente, se comprueba la disponibilidad de la red mediante el comando ‘AT+CPIN?’; si la tarjeta insertada es una SIM y el PIN está presente, devuelve la respuesta +CPIN: READY. Esto también se verifica repetidamente hasta que se encuentra la red. Esto se puede entender claramente con el video de abajo.

void gsm_init()
{
  lcd.clear();
  lcd.print("Finding Module..");
  boolean at_flag=1;
  while(at_flag)
  {
    Serial.println("AT");
    while(Serial.available()>0)
    {
      if(Serial.find("OK"))
      at_flag=0;
    }
    delay(1000);
  }

Código

#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);

int led=13;

int temp=0,i=0,x=0,k=0;
char str[100],msg[32];

void setup() 
{
  lcd.begin(16,2);
  Serial.begin(9600);
  pinMode(led, OUTPUT);
  digitalWrite(led, HIGH);
  lcd.print(“GSM Initilizing…”);
  gsm_init();
  lcd.setCursor(0,0);
  lcd.print(“Wireless Notice”);
  lcd.setCursor(0,1);
  lcd.print(”    Board      “);
  delay(2000);
  lcd.clear();
  lcd.print(“Circuit Digest”);
  delay(1000);
  lcd.setCursor(0,1);
  lcd.print(“System Ready”);
  Serial.println(“AT+CNMI=2,2,0,0,0”);
  delay(500);
  Serial.println(“AT+CMGF=1”);
  delay(1000);
  digitalWrite(led, LOW);
}

void loop()    
{
  for(unsigned int t=0;t<60000;t++)
  {
    serialEvent();
  if(temp==1)
  {
    x=0,k=0,temp=0;
    while(x<i)
    {
      while(str[x]==’#’)
      {
        x++;
        while(str[x]!=’*’)
        {
          msg[k++]=str[x++];
        }
      }
      x++;
    }
    msg[k]=’\0′;
    lcd.clear();
    lcd.print(msg);
    delay(1000);
    temp=0;
    i=0;
    x=0;
    k=0;
  }
  }
  lcd.scrollDisplayLeft();
}
void serialEvent()
{
  while(Serial.available())
  {
    char ch=(char)Serial.read();
    str[i++]=ch;
    if(ch == ‘*’)
    {
      temp=1;
      lcd.clear();
      lcd.print(“Message Received”);
      delay(1000);
    }
  }
}

void gsm_init()
{
  lcd.clear();
  lcd.print(“Finding Module..”);
  boolean at_flag=1;
  while(at_flag)
  {
    Serial.println(“AT”);
    while(Serial.available()>0)
    {
      if(Serial.find(“OK”))
      at_flag=0;
    }
    delay(1000);
  }

  lcd.clear();
  lcd.print(“Module Connected..”);
  delay(1000);
  lcd.clear();
  lcd.print(“Disabling ECHO”);
  boolean echo_flag=1;
  while(echo_flag)
  {
    Serial.println(“ATE0”);
    while(Serial.available()>0)
    {
      if(Serial.find(“OK”))
      echo_flag=0;
    }
    delay(1000);
  }

  lcd.clear();
  lcd.print(“Echo OFF”);
  delay(1000);
  lcd.clear();
  lcd.print(“Finding Network..”);
  boolean net_flag=1;
  while(net_flag)
  {
    Serial.println(“AT+CPIN?”);
    while(Serial.available()>0)
    {
      if(Serial.find(“+CPIN: READY”))
      net_flag=0;
    }
    delay(1000);
  }
  lcd.clear();
  lcd.print(“Network Found..”);
  delay(1000);
  lcd.clear();
}

Artículo traducido al español. Fuente original: Circuit Digest (autor: Saddam).

Similar Posts

Deja un comentario