使用Arduino和GSM模块进行呼叫和消息

原文:https://circuitdigest.com/microcontroller-projects/call-and-message-using-arduino-sim900-gsm

使用Arduino和GSM模块进行呼叫和消息

ARDUINO的

经过**萨达姆** 2016年8月17日39
在这里插入图片描述
有时,人们发现很难将GSM模块用于其基本功能,例如呼叫,发短信等,尤其是在微控制器中。因此,在这里我们将使用Arduino构建一个简单的手机,其中GSM模块用于拨打电话,接听电话,发送短信和阅读短信,并且该Arduino手机还具有麦克风和扬声器以通过该手机进行通话。 该项目还将用作GSM模块与Arduino的正确接口,以及操作任何手机基本功能所需的所有代码。

所需组件:

  • Arduino Uno
  • GSM模块SIM900
  • 16x2液晶屏
  • 4x4键盘
  • 面包板或PCB
  • 连接跳线
  • 电源供应
  • 扬声器
  • 麦克风
  • SIM卡

工作说明:

在这个Arduino移动电话项目中,我们使用Arduino Uno来控制整个系统的功能并连接该系统中的所有组件。甲4x4的字母数字键盘用于拍摄所有种像输入:输入手机号码,类型消息,拨打电话,接听电话,发送短信,读取短信等GSM模块用于与网络进行通信用于呼叫和消息的目的。我们还连接了一个MIC和一个用于语音呼叫和铃声的扬声器,一个16x2 LCD用于显示消息,说明和警报。

字母数字是使用同一键盘输入数字和字母的一种方法。在这种方法中,我们已经将4x4键盘与Arduino相连,并且还编写了接受字母的代码,请查看下面代码部分的代码。
在这里插入图片描述
这个项目的工作很容易。所有功能都将通过使用字母数字键盘来执行。查看下面的完整代码和演示视频,以正确了解该过程。在这里,我们将解释以下项目的所有四个功能。

解释Arduino手机的四个功能:

1.拨打电话:

要使用基于Arduino的电话拨打电话,我们必须按“ C”键,然后需要输入要拨打电话的手机号码。将使用字母数字键盘输入数字。输入数字后,我们再次需要按“ C”。现在,Arduino将使用AT命令处理将呼叫连接到输入号码的过程:

ATDxxxxxxxxxx; <Enter>,其中输入xxxxxxxxx手机号码。

2.接听电话:

接听电话非常容易。当有人呼叫您的系统SIM卡号(位于GSM模块中)时,您的系统将在LCD上显示“ Incoming…”消息,显示呼叫者的来话号码。现在,我们只需要按“ A”键即可参加此通话。当我们按“ A”时,Arduino将向GSM模块发送给定命令:

ATA <输入>

3.发送短信:

当我们想使用基于Arduino的手机发送SMS时,我们需要按’B’。现在,系统将要求提供收件人号码,即我们要向其发送短信的“收件人”。输入数字后,我们需要按’D’,现在LCD询问信息。现在,我们需要像使用普通手机一样输入信息,方法是使用键盘,然后在输入信息后,我们需要按“ D”键来发送短信。发送短信Arduino发送给定命令:

AT + CMGF = 1 <enter>
AT + CMGS =“ xxxxxxxxxx” <enter>其中:xxxxxxxxxx输入了手机号码

并发送26到GSM发送短信。

4.接收和阅读短信:

此功能也很简单。在这种情况下,GSM将接收SMS并将其存储在SIM卡中。Arduino持续监控通过UART接收到的SMS指示。当我们在LCD上看到“新消息”符号(如信封:请参阅末尾的视频)时,只需按“ D”键即可阅读SMS 。下面是在串行端口上显示的“ SMS Received”指示

+CMTI: “SM” <SMS stored location>    //<SMS存储位置>       
+CMTI: “SM”,6  Where 6 is message location where it stored in SIM card. //6其中6是存储在SIM卡中的消息位置。

当Arduino获得此“接收到SMS”指示时,它将提取SMS存储位置,并向GSM发送命令以读取接收到的SMS。并在液晶显示屏上显示“新消息符号”。

AT + CMGR = <短信存储位置> <enter>
AT + CMGR = 6

现在,GSM将存储的消息发送到Arduino,然后Arduino提取主SMS并将其显示在LCD上,然后在读取此SMS后,Arduino从LCD清除“新SMS符号”。

注意:MIC和扬声器没有编码。

查看下面的完整代码和演示视频,以正确了解该过程。

电路图和说明:

在这里插入图片描述
上面给出了用于连接GSM SIM900和Arduino的电路图。16x2 LCD引脚RS,EN,D4,D5,D6和D7分别与Arduino的引脚编号14、15、16、17、18和19连接。GSM模块的Rx和Tx引脚分别直接与Arduino的引脚D3和D2连接(Arduino和GSM的地必须相互连接)。4x4键盘行引脚R1,R2,R3,R4直接与Arduino的引脚编号11,10、9、8相连,键盘C1,C2,C3的Colum引脚与Arduino的引脚编号7、6、5、4相连。MIC直接连接到GSM模块的mic +和mic-,扬声器直接连接到GSM模块的SP +和SP-引脚。

编程说明:

对于初学者来说,该项目的编程部分并不复杂。在此代码中,我们使用了键盘库*#include <Keypad.h>来连接用于输入数字的简单键盘。为了使用相同的键盘输入字母,我们创建了函数void alfakey()*。意味着我们使每个键都具有多功能性,并且仅使用10个键就可以输入任何字符或整数。

就像我们按键2(abc2)一样,它将显示“ a”,如果再次按该键,它将把“ a”替换为“ b”,如果再次按三次,则它将在同一位置显示“ c”在LCD中。如果我们在按键后等待一段时间,光标将自动移至LCD的下一个位置。现在我们可以输入下一个字符或数字。其他键也使用相同的步骤。

#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char hexaKeys[ROWS][COLS] = 
{
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {11, 10, 9, 8}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7, 6, 5, 4}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void alfakey()
{
 int x=0,y=0;
 int num=0;
  while(1)
  {
    lcd.cursor();
    char key=customKeypad.getKey();
    if(key)
    {
       if(key=='1')
       {
         num=0;
         lcd.setCursor(x,y);
         .... .....
         ........ ....

除了操作键盘,我们创造了许多其他的功能,如*无效调用()调用电话,特征无效SMS()的消息传递功能,无效lcd_status()用于显示LCD状态无效gsm_init()*用于初始化GSM模块等检查下面的所有其他功能与使用GSM模块和Arduino进行收发短信以及收发短信有关。所有功能都是不言而喻的,易于理解。

#include <SoftwareSerial.h>
SoftwareSerial Serial1(2, 3); // RX, TX

#include<LiquidCrystal.h>
LiquidCrystal lcd(14,15,16,17,18,19);

byte back[8] = 
{
  0b00000,
  0b00000,
  0b11111,
  0b10101,
  0b11011,
  0b11111,
  0b00000,
  0b00000
};

String number="";
String msg="";
String instr="";
String str_sms="";
String str1="";
int ring=0;
int i=0,temp=0;
int sms_flag=0;
char sms_num[3];
int rec_read=0;
int temp1=0;

#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char hexaKeys[ROWS][COLS] = 
{
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {11, 10, 9, 8}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7, 6, 5, 4}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

String ch="1,.?!@abc2def3ghi4jkl5mno6pqrs7tuv8wxyz90 ";

void setup() 
{
  Serial1.begin(9600);
  lcd.begin(16,2);
  lcd.createChar(1, back);
  lcd.print("Simple Mobile ");
  lcd.setCursor(0,1);
  lcd.print("System Ready..");
  delay(1000);
  gsm_init();
  lcd.clear();
  lcd.print("System Ready");
  delay(2000);
}

void loop() 
{
  serialEvent();

  if(sms_flag==1)
  {
    lcd.clear();
    lcd.print("New Message");
    int ind=instr.indexOf("+CMTI: \"SM\",");
    ind+=12;
    int k=0;
    lcd.setCursor(0,1);
    lcd.print(ind);
    while(1)
    {
      while(instr[ind]!= 0x0D)
      {
        sms_num[k++]=instr[ind++];
      }
      break;
    }
    ind=0;
    sms_flag=0;
    lcd.setCursor(0,1);
    lcd.print("Read SMS --> D");
    delay(4000);
    instr="";
    rec_read=1;
    temp1=1;
    i=0;
  }

  
  if(ring == 1)
  {
    number="";
    int loc=instr.indexOf("+CLIP: \"");
    if(loc > 0)
    {
      number+=instr.substring(loc+8,loc+13+8);
    }
    lcd.setCursor(0,0);
    lcd.print("Incomming...    ");
    lcd.setCursor(0,1);
    lcd.print(number);
    instr="";
    i=0;
  }

  else
  {
  serialEvent();
  lcd.setCursor(0,0);
  lcd.print("Call --> C      ");
  lcd.setCursor(0,1);
  lcd.print("SMS  --> B   ");
  if(rec_read==1)
  {
    lcd.write(1);
    lcd.print("   ");
  }
  else
  lcd.print("     ");
  }
  
   char key=customKeypad.getKey();
  if(key)
  {
    if(key== 'A')
    {
      if(ring==1)
      {
      Serial1.println("ATA");
      delay(5000);
      }
    }
    else if(key=='C')
    {
      call();
    }

    else if(key=='B')
    {
      sms();
    }

    else if(key == 'D'  && temp1==1)
    {
      rec_read=0;
      lcd.clear();
      lcd.print("Please wait...");
      Serial1.print("AT+CMGR=");
      Serial1.println(sms_num);
      int sms_read_flag=1;
      str_sms="";
      while(sms_read_flag)
      {
        while(Serial1.available()>0)
        {
          char ch=Serial1.read();
          str_sms+=ch;
          if(str_sms.indexOf("OK")>0)
          {
            sms_read_flag=0;
            //break;
          }
        }
      }
      int l1=str_sms.indexOf("\"\r\n");
      int l2=str_sms.indexOf("OK");
      String sms=str_sms.substring(l1+3,l2-4);
      lcd.clear();
      lcd.print(sms);
      delay(5000);
      }
      delay(1000);
    }
}

void call()
{
  number="";
  lcd.clear();
  lcd.print("After Enter No.");
  lcd.setCursor(0,1);
  lcd.print("Press C to Call");
  delay(2000);
  lcd.clear();
  lcd.print("Enter Number:");
  lcd.setCursor(0,1);
  while(1)
  { 
     serialEvent();
    char key=customKeypad.getKey();
    if(key)
    {
      if(key=='C')
      {
        lcd.clear();
        lcd.print("Calling........");
        lcd.setCursor(0,1);
        lcd.print(number);
        Serial1.print("ATD");
        Serial1.print(number);
        Serial1.println(";");
        long stime=millis()+5000;
        int ans=1;
        while(ans==1)
        {           
          while(Serial1.available()>0)
          {
            if(Serial1.find("OK"))
            {
              lcd.clear();
              lcd.print("Ringing....");
              int l=0;
              str1="";
              while(ans==1)
              {
                while(Serial1.available()>0)
                {
                  char ch=Serial1.read();
                  str1+=ch;
                  if(str1.indexOf("NO CARRIER")>0)
                  {
                    lcd.clear();
                    lcd.print("Call End");
                    delay(2000);
                    ans=0;
                    return;
                  }
                 }
                  char key=customKeypad.getKey();
                   if(key == 'D')
                  {
                    lcd.clear();
                    lcd.print("Call End");
                    delay(2000);
                    ans=0;
                    return;
                  }
                   if(ans==0)
                   break;
                }
              }  
            }
        } 
      }
      else
      {
        number+=key;
        lcd.print(key);
      }
    }
  }
}

void sms()
{
  lcd.clear();
  lcd.print("Initilising SMS");
  Serial1.println("AT+CMGF=1");
  delay(400);
  lcd.clear();
  lcd.print("After Enter No.");
  lcd.setCursor(0,1);
  lcd.print("Press D        ");
  delay(2000);
  lcd.clear();
  lcd.print("Enter Rcpt No.:");
  lcd.setCursor(0,1);
  Serial1.print("AT+CMGS=\"");
  while(1)
  {
    serialEvent();
    char key=customKeypad.getKey();
    if(key)
    {
      if(key=='D')
      {
        //number+='"';
        Serial1.println("\"");
        break;
      }
      else
      {
        //number+=key;
        Serial1.print(key);
        lcd.print(key);
      }
    }
  }  
  lcd.clear();
  lcd.print("After Enter MSG ");
  lcd.setCursor(0,1);
  lcd.print("Press D to Send ");
  delay(2000);
  lcd.clear();
  lcd.print("Enter Your Msg");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0,0);
  alfakey();
}

void alfakey()
{
 int x=0,y=0;
 int num=0;
  while(1)
  {
    lcd.cursor();
    char key=customKeypad.getKey();
    if(key)
    {
       if(key=='1')
       {
         num=0;
         lcd.setCursor(x,y);
         lcd.print(ch[num]);
         for(int i=0;i<3000;i++)
         { 
          lcd.noCursor();
          char key=customKeypad.getKey();
          if(key=='1')
          {
           num++;
           if(num>5)
           num=0;
           lcd.setCursor(x,y);
           lcd.print(ch[num]);
           i=0;
           delay(200);
          } 
         }
         x++;
         if(x>15)
         {
           x=0;
           y++;
           y%=2;
         }
         msg+=ch[num];
        }

       else if(key=='2')
       {
         num=6;
         lcd.setCursor(x,y);
         lcd.print(ch[num]);
         for(int i=0;i<3000;i++)
         { 
          lcd.noCursor();
          char key=customKeypad.getKey();
          if(key=='2')
          {
           num++;
           if(num>9)
           num=6;
           lcd.setCursor(x,y);
           lcd.print(ch[num]);
           i=0;
           delay(200);
          } 
         }
         x++;
          if(x>15)
         {
           x=0;
           y++;
           y%=2;
         }
         msg+=ch[num];
        }

       else if(key=='3')
       {
         num=10;
         lcd.setCursor(x,y);
         lcd.print(ch[num]);
         for(int i=0;i<3000;i++)
         { 
          lcd.noCursor();
          char key=customKeypad.getKey();
          if(key=='3')
          {
           num++;
           if(num>13)
           num=10;
           lcd.setCursor(x,y);
           lcd.print(ch[num]);
           i=0;
           delay(200);
          } 
         }
         x++;
          if(x>15)
         {
           x=0;
           y++;
           y%=2;
         }
         msg+=ch[num];
        }

       else if(key=='4')
       {
         num=14;
         lcd.setCursor(x,y);
         lcd.print(ch[num]);
         for(int i=0;i<3000;i++)
         { 
          lcd.noCursor();
          char key=customKeypad.getKey();
          if(key=='4')
          {
           num++;
           if(num>17)
           num=14;
           lcd.setCursor(x,y);
           lcd.print(ch[num]);
           i=0;
           delay(200);
          } 
         }
         x++;
          if(x>15)
         {
           x=0;
           y++;
           y%=2;
         }
         msg+=ch[num];
        }

              else if(key=='5')
       {
         num=18;
         lcd.setCursor(x,y);
         lcd.print(ch[num]);
         for(int i=0;i<3000;i++)
         { 
          lcd.noCursor();
          char key=customKeypad.getKey();
          if(key=='5')
          {
           num++;
           if(num>21)
           num=18;
           lcd.setCursor(x,y);
           lcd.print(ch[num]);
           i=0;
           delay(200);
          } 
         }
         x++;
          if(x>15)
         {
           x=0;
           y++;
           y%=2;
         }
         msg+=ch[num];
        }

        else if(key=='6')
       {
         num=22;
         lcd.setCursor(x,y);
         lcd.print(ch[num]);
         for(int i=0;i<3000;i++)
         { 
          lcd.noCursor();
          char key=customKeypad.getKey();
          if(key=='6')
          {
           num++;
           if(num>25)
           num=22;
           lcd.setCursor(x,y);
           lcd.print(ch[num]);
           i=0;
           delay(200);
          } 
         }
         x++;
          if(x>15)
         {
           x=0;
           y++;
           y%=2;
         }
         msg+=ch[num];
        }

       else if(key=='7')
       {
         num=26;
         lcd.setCursor(x,y);
         lcd.print(ch[num]);
         for(int i=0;i<3000;i++)
         { 
          lcd.noCursor();
          char key=customKeypad.getKey();
          if(key=='7')
          {
           num++;
           if(num>30)
           num=26;
           lcd.setCursor(x,y);
           lcd.print(ch[num]);
           i=0;
           delay(200);
          } 
         }
         x++;
          if(x>15)
         {
           x=0;
           y++;
           y%=2;
         }
         msg+=ch[num];
        }

       else if(key=='8')
       {
         num=31;
         lcd.setCursor(x,y);
         lcd.print(ch[num]);
         for(int i=0;i<3000;i++)
         { 
          lcd.noCursor();
          char key=customKeypad.getKey();
          if(key=='8')
          {
           num++;
           if(num>34)
           num=31;
           lcd.setCursor(x,y);
           lcd.print(ch[num]);
           i=0;
           delay(200);
          } 
         }
         x++;
          if(x>15)
         {
           x=0;
           y++;
           y%=2;
         }
         msg+=ch[num];
        }

       else if(key=='9')
       {
         num=35;
         lcd.setCursor(x,y);
         lcd.print(ch[num]);
         for(int i=0;i<3000;i++)
         { 
          lcd.noCursor();
          char key=customKeypad.getKey();
          if(key=='9')
          {
           num++;
           if(num>39)
           num=35;
           lcd.setCursor(x,y);
           lcd.print(ch[num]);
           i=0;
           delay(200);
          } 
         }
         x++;
          if(x>15)
         {
           x=0;
           y++;
           y%=2;
         }
         msg+=ch[num];
        }

        else if(key=='0')
       {
         num=40;
         lcd.setCursor(x,y);
         lcd.print(ch[num]);
         for(int i=0;i<3000;i++)
         { 
          lcd.noCursor();
          char key=customKeypad.getKey();
          if(key=='0')
          {
           num++;
           if(num>41)
           num=40;
           lcd.setCursor(x,y);
           lcd.print(ch[num]);
           i=0;
           delay(200);
          } 
         }
         x++;
          if(x>15)
         {
           x=0;
           y++;
           y%=2;
         }
         msg+=ch[num];
        }

        else if(key=='D')
        {
          lcd.clear();
          lcd.print("Sending SMS....");
         // Serial1.print("AT+CMGS=");
         // Serial1.print(number);
         // delay(2000);
          Serial1.print(msg);
          Serial1.write(26);
          delay(5000);
          lcd.clear();
          lcd.print("SMS Sent to");
          lcd.setCursor(0,1);
          lcd.print(number);
          delay(2000);
          number="";
          break;
        } 
      }
    }
}

void send_data(String message)
{
  Serial1.println(message);
  delay(200);
}

void send_sms()
{
  Serial1.write(26);
}

void lcd_status()
{
  lcd.setCursor(2,1);
  lcd.print("Message Sent");
  delay(2000);
  //lcd.setCursor()
  //lcd.print("")
  //return;
}

void back_button()
{
  //lcd.setCursor(0,15);
}

void ok_button()
{
  lcd.setCursor(0,4);
  lcd.print("OK");
}

void call_button()
{
  lcd.setCursor(0,4);
  lcd.print("CALL");
}

void sms_button()
{
  lcd.setCursor(0,13);
  lcd.print("SMS");
}

void gsm_init()
{
  lcd.clear();
  lcd.print("Finding Module..");
  boolean at_flag=1;
  while(at_flag)
  {
    Serial1.println("AT");
    while(Serial1.available()>0)
    {
      if(Serial1.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)
  {
    Serial1.println("ATE1");
    while(Serial1.available()>0)
    {
      if(Serial1.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)
  {
    Serial1.println("AT+CPIN?");
    while(Serial1.available()>0)
    {
      if(Serial1.find("+CPIN: READY"))
      net_flag=0;
    }
    delay(1000);
  }
  lcd.clear();
  lcd.print("Network Found..");
  delay(1000);
  lcd.clear();
}

void serialEvent()
{
  while(Serial1.available())
  {
    char ch=Serial1.read();
    instr+=ch;
    i++;

    if(instr[i-4] == 'R' && instr[i-3] == 'I' && instr[i-2] == 'N' && instr[i-1] == 'G' )
    {
       ring=1;
    }

    if(instr.indexOf("NO CARRIER")>=0)
    {
       ring=0;
       i=0;
    }
    if(instr.indexOf("+CMTI: \"SM\"")>=0)
    {
      sms_flag=1;
    }
  }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值