在本文中我们将学习如何使用Arduino控制的GSM modem发送和接收短信。让我们看看什么是GSM modem,如何与Arduino接口,如何用设置发送短信。
我们还将探索除了人类发送短信外,GSM调制解调器能实现的所有应用。
什么是GSM modem?
GSM是全球移动通信系统的缩写;它是由ETSI(欧洲电信标准协会)开发的一个标准,描述了2G通信的协议。
它是第一个为全双工语音通信而优化的移动通信数字协议。简而言之,全双工通信意味着双方可以同时发送/接收数据(或语音)。
GSM协议也允许包数据的传输,如GPRS和EDGE。
SIM800 GSM调制解调器:
GSM modem是一种硬件,它接受一个有效的SIM卡(用户身份模块),基本上任何SIM卡都可以工作,它支持GSM协议和网络订阅。
它就像一个没有屏幕和键盘的手机。它有四个I/O引脚,取决于你选择的型号。
两个为TX和RX(发送和接收),另两个引脚为VCC和GND,这是普遍的。
它还包括RS232端口,用于调制解调器和计算机之间的串行通信,但我们不打算在这个项目中使用。
它有标准的直流电源插孔,可以从外部电源如电压适配器供电。
它的工作电压范围从5到12V的直流插孔,取决于型号。它有3个LED指示灯,用于电源,状态和网络。
电源指示灯表示电源是否供电,状态指示灯表示GSM modem是否工作,网络指示灯表示移动网络已建立。
初始网络LED在搜索网络时每1秒闪一次,一旦建立移动网络,每3秒闪一次。
您需要按2 - 3秒的电源按钮来激活GSM modem,一旦您按下电源按钮,GSM modem就会与移动网络连接。
要验证您的GSM modem工作,只需拨打您插入SIM卡的号码。你应该收到回铃音。如果是,那么您的模块工作正常。
我们将使用SIM800 GSM modem,支持四频段850/900/1800/1900 MHz。如果您有一个SIM900调制解调器,不用担心,程序和电路在这个项目是兼容的。
现在,你可能已经对GSM modem有了一些了解,现在让我们学习如何将它与arduino接口。
线路图:
从图中可以看出,电路连接非常简单。你只需要3个从公到母的头槌。在这个项目中,USB电缆是必须的,因为我们将通过串行监视器进行通信。
一般情况下,GSM modem需使用外接电源。GSM modem arduino电源不足;它甚至会使arduino的电压调节器过载。
这就是硬件部分。现在,让我们转向编码。
计划:
//------------- 项目由R.Girish ---------------//
# include < SoftwareSerial.h >
#define rxPin 9 // gsm TX------> arduino 9
#define txPin 8 //gsm RX--------> arduino
SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);
字符文本[150];
字符串消息= " ";
int x;
无效的设置()
{
Serial.begin (9600);
而(串行){}
mySerial.begin (9600);
延迟(1000);
系列。println("写你的信息(以点结尾):");
}
无效循环()
{
x = 0;
而(Serial.available () > 0)
{
文本(x) = Serial.read ();
文本消息+ = [x];
x + +;
如果(文本(x - 1) = = 46)
{
系列。println(“你的消息发送......”);
SendTextMessage ();
ShowSerialData ();
延迟(1000);
以(r);
以“成功”);
消息= " ";
x = 0;
}}}
空白SendTextMessage ()
{
mySerial.print(“在+ CMGF = 1 r”);
延迟(1000);
mySerial.print(“在+发生= " + 91 xxxxxxxxxx“r”);//将x替换为10位数的电话号码
延迟(1000);
mySerial.println(消息);
mySerial.print (r);
延迟(1000);
mySerial.println((字符)26);
mySerial.println ();
}
空白ShowSerialData ()
{
而(mySerial.available () ! = 0)
Serial.write (mySerial.read ());
}
//------------- 项目由R.Girish ---------------//
不要忘记在信息的每一个结尾都加上,否则它不会将消息发送到程序中指定的号码。在程序中用你的10个数字电话号码替换x。确保你的SIM卡上有一个可用的短信计划。
如果您不是来自印度,请更改程序中的国家代码。
例如:
英国:+ 44
对我们来说:+ 1
加拿大:+ 1
俄罗斯:+ 7
您还可以通过适当编码Arduino自动发送短信调制解调器。你可以在你的手机上收到自动信息警报,如:防盗警报,火灾警报,你所在地区的天气警报等。
你甚至可以在GSM调制解调器中用GPRS连接互联网,但这是另一篇文章的主题。
我们将在接下来的文章中学习如何使用GSM Modem和Arduino接收短信
如果你有更多关于如何使用GSM Modem发送短信的问题,请在评论部分提问。
如何使用GSM Modem接收短信
在上面的讨论中,我们学习了如何使用GSM调制解调器发送短信,也讨论了GSM调制解调器的基础知识。
在本节中,我们将讨论如何通过arduino IDE的串行监视器接收SMS。我们不仅要接收短信,还要通过按不同的键发送短信。在一个瞬间,按“s”将发送预先输入的文本信息,按“r”将收到实时短信。
以下是作者的原型:
它是如何工作的
电路接收SMS使用GSM modem是非常简单的,你只需要3公到母头引脚。GSM modem的TX连接arduino的引脚9号,GSM modem的RX连接arduino的引脚8号,GSM和arduino之间也给出了接地。
GSM modem总是使用外置电源,不要从arduino连接5Vcc到GSM modem,因为arduino的电压调节器很有可能过载。
不要忘记在你的短信订阅上实施短信费率削减或类似的东西,以减少你的短信费用。
否则,在发送了几条短信后,你的账户余额就会变成空的,因为SIM卡在GSM调制解调器里,所以每次发送短信后,你的手机运营商都不会确认你的短信。
你得到的唯一确认是警告短信,关于你的空帐户,所以小心你的开支。现在让我们进入项目的编码部分。
计划:
//----------------- 项目由R.Girish -------------//
# include < SoftwareSerial.h >
SoftwareSerial gsm (9 8);
无效的设置()
{
gsm.begin (9600);//设置GSM模块波特率
Serial.begin (9600);//设置串口监控(Arduino)波特率
延迟(100);
}
无效循环()
{
如果(Serial.available () > 0)
开关(Serial.read ())
{
例“s”:
Send ();
打破;
例“r”:
接待();
打破;
例“S”:
Send ();
打破;
例“R”:
接待();
打破;
}
如果(gsm.available () > 0)
Serial.write (gsm.read ());
}
无效发送()
{
gsm.println(“+ CMGF = 1”);
延迟(1000);
gsm.println(“在+发生= " + 91 xxxxxxxxxx“r”);//将x替换为手机号码
延迟(1000);
gsm。println("Hello I am GSM modem!! ");//您要发送的短信
延迟(100);
gsm.println((字符)26);// CTRL+Z的ASCII码
延迟(1000);
}
无效的接待()
{
gsm.println(“+ CNMI = 2 2 0, 0, 0);// AT命令接收实时短信
延迟(1000);
}
//----------------- 项目由R.Girish -------------//
输入电话号码
在程序的“xxxxxxxxxxx”上输入接收人的电话号码,并在开头写上你的国家代码。
在程序中输入您想要发送的文本,引号为:gsm。你好,我是GSM modem!!//你想发送的短信
编写程序并上传至arduino。
插入SIM卡,给GSM modem上外部电源,按下电源按钮3秒(视型号而定),等待10 ~ 20秒建立移动网络,网络LED每3秒闪烁1次。如果以上所述的一切都做好了,我们就可以进行下一步了。
现在打开串行监视器并按“r”GSM调制解调器准备接收短信。现在从任何移动电话发送短信到插入GSM调制解调器的SIM卡号码。
文本消息应该在串行监视器上弹出,类似如下所示:
“Hello world”是发送到GSM调制解调器的信息,发送短信的号码也会显示出来。
现在,让短信发送到预先输入的号码在程序与预先输入的消息。按“s”,你会看到类似下图所示的内容:发送的短信是“Hello I am GSM modem”。
现在,您知道了如何使用GSM调制解调器发送和接收短信。
你好先生,
我没有收到GSM模块的回复。..你能帮助我如何得到回复。..在这一行程序显示了一个错误
mySerial.print(“在+发生= " + 91 xxxxxxxxxx“r”);
如果我们给出如下所示,它没有显示任何错误
mySerial.print(“+发生= \”+ 91 xxxxxxxxxx \ " \ r ");