原文:https://circuitdigest.com/microcontroller-projects/call-and-message-using-arduino-sim900-gsm
使用Arduino和GSM模块进行呼叫和消息
经过**萨达姆** 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;
}
}
}