Sending SMS using GSM Module and LPC2148

SIM300 GSM Module

When accessing GSM networks comes in picture in embedded system ,the only way around i to use GSM/GPRS modules which provides RS-232/UART interface and supports for AT command sets (Commands used for calling,Messaging etc) and usually easy to integrate with embedded modules. Some of the modules manufactured by SIMCOM are widely used as they are pretty cheap and are easily available.This post is about connecting a SIM300 module to LPC2148 using UART and send message to a mobile number.

The SIM module is connected to the LPC2148 by using the UART port. Simple 2 wire connection is made between the board and the module. The Rx and Tx pins are connected accordingly.

 

#include <LPC214X.H>
#include "Serial.h"
#include "Utility.h"
#include "LCD4.h"

int main(void) {

  unsigned char x[200];
  int PosAck, y = 0;
  //hex code of "at enter" command for checking comm status of uart-reply should be ok
  unsigned char AckComm[3] = {
    0x61,
    0x74,
    0x0d
  };
  //hex code - for checking balance  -here sim-airtel so,atd*123#
  unsigned char BalChkComm[9] = { 0x61, 0x74, 0x64, 0x2A, 0x31, 0x32, 0x33, 0x23, 0x0d };
  //hex code for selecting text mode-
  unsigned char SmsConfigComm[10] = { 0x41, 0x54, 0x2B, 0x43, 0x4D, 0x47, 0x46, 0x3D, 0x31, 0x0d };
  // Setting No-9439421905   Bikash
 unsigned char SendMsgComm[21] = { 0x61, 0x74, 0x2B, 0x63, 0x6D, 0x67, 0x73, 0x3D, 0x22, 0x39, 0x34, 0x33, 0x39, 0x34, 0x32, 0x31, 0x39, 0x30, 0x35, 0x22, 0x0D };
  //message body NISt (change it to have diff content )
  unsigned char SendMsgBody[5] = { 0x4E, 0x49, 0x53, 0x54, 0x1A };
  //lcd data is used temoporarily to store data for lcd display
  unsigned char LcdData[16];
  //data used to clear the display
  unsigned char LcdClear[16] = {0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
  int i;
  LCD4_init( & IOPIN0, 20 /*D4*/ , 12 /*RS*/ , 14 /*E*/ ); //initialization of LCD in 4 bit mode
  DelayProc(2 * CCLOCK);
  PINSEL0 = 0;
  PINSEL1 = 0;
  PINSEL2 &= 0x0000000C;
  PINSEL2 |= 0x00000030;
  DelayProc(0.2 * CCLOCK);

  UART0_init(9600, 15000, length_8_bit, stop_bit_1, parity_disable, parity_odd); //UART initilization connected to PC
  UART1_init(9600, 15000, length_8_bit, stop_bit_1, parity_disable, parity_odd); //UART initilizaton connected to MODEM

  LCD4_sendstr(0, 2, "Modem Status :");
  for (i = 0; i < 3; i++) {
    UART1_sendchar(AckComm[i]); //Sending At command to check Status
  }
  for (i = 0; i < 7; i++) {
    x[i] = UART1_getchar(); //receiving Status
    UART0_sendchar(x[i]);
  }
  LcdData[0] = x[5];
  LcdData[1] = x[6];

  LCD4_sendstr(1, 1, LcdData);
  DelayProc(2 * CCLOCK);

  LCD4_sendstr(1, 1, LcdClear);
  LCD4_sendstr(0, 2, LcdClear);

  LCD4_sendstr(0, 2, "Account Balance:");
  DelayProc(2 * CCLOCK);
  for (i = 0; i < 9; i++) {
    UART1_sendchar(BalChkComm[i]); //Sending Command to Check balance

  }

  for (i = 0; i < 100; i++) {
    x[i] = UART1_getchar(); //getting reply
    UART0_sendchar(x[i]);
    if (x[i] == 0x3A && y < 2) {
      PosAck = i;
      //LCD4_sendstr (1,1,"reached");
      y++;
    }
  }

  LcdData[0] = x[PosAck];
  LcdData[1] = x[PosAck + 1];
  LcdData[2] = x[PosAck + 2];
  LcdData[3] = x[PosAck + 3];
  LcdData[4] = x[PosAck + 4];
  LcdData[5] = x[PosAck + 5];
  LCD4_sendstr(1, 1, LcdData);

  DelayProc(2 * CCLOCK);

  LCD4_sendstr(1, 1, LcdClear);
  LCD4_sendstr(0, 2, LcdClear);

  LCD4_sendstr(0, 2, "TEXT mode:");
  DelayProc(2 * CCLOCK);
  for (i = 0; i < 10; i++) {
    UART1_sendchar(SmsConfigComm[i]); //cONfiguring MODEM in TEXT Mode

  }
  for (i = 0; i < 15; i++) {
    x[i] = UART1_getchar();
    UART0_sendchar(x[i]);
    if (x[i] == 0x31) {
      PosAck = i;
      //LCD4_sendstr (1,1,"reached");
      //y++;
    }
  }

  LCD4_sendstr(1, 1, "ok");

  DelayProc(2 * CCLOCK);
  LCD4_sendstr(1, 1, LcdClear);
  LCD4_sendstr(0, 2, LcdClear);

  LCD4_sendstr(0, 2, "Sending Message");

  DelayProc(2 * CCLOCK);
  for (i = 0; i < 21; i++) {
    UART1_sendchar(SendMsgComm[i]); //Adding no to send Message

  }
  for (i = 0; i < 25; i++) {
    x[i] = UART1_getchar();
    UART0_sendchar(x[i]);
  }
  for (i = 0; i < 5; i++) {
    UART1_sendchar(SendMsgBody[i]); //Sending Message Body To Receipient. ctrl+z hex code 1A is used at last.

  }
  for (i = 0; i < 170; i++) {
    x[i] = UART1_getchar();
    UART0_sendchar(x[i]);
  }

  LCD4_sendstr(1, 1, "ok");
  DelayProc(2 * CCLOCK);
  LCD4_sendstr(1, 1, LcdClear);
  LCD4_sendstr(0, 2, LcdClear);

}

 

Bikash Panda
Catch Me On

Related posts