Arduino与短信发送的原理

Arduino作为一款开源电子原型平台,常用于各类自动化项目,要让Arduino具备短信发送功能,通常需要借助GSM/GPRS模块(如SIM800L、SIM900A、SIM7672等),这类模块内置蜂窝网络通信功能,可通过AT指令与Arduino交互,实现短信的收发、通话及网络连接等功能,Arduino负责控制指令的发送与响应解析,GSM模块负责将指令转化为实际的短信操作,二者通过串口(UART)通信,共同完成短信发送任务。
硬件准备:搭建短信发送系统
在开始前,需准备好以下核心硬件:
- 主控板:建议选用Arduino UNO、Nano或MEGA等常见型号,它们具备足够的I/O口和串口资源。
- GSM模块:以SIM800L为例(性价比高、体积小),支持GSM/GPRS 850/900/1800/1900MHz频段,需搭配天线确保信号稳定。
- SIM卡:普通GSM SIM卡(无需开通数据流量,仅需短信功能),确保未PIN码锁定(或提前解除PIN码)。
- 电源:GSM模块工作电流较大(峰值约2A),需独立供电(如5V/2A电源适配器),或通过稳压模块(如AMS1117)为模块提供稳定电压,避免ArduinoUSB供电不足。
- 连接线:杜邦线若干,用于模块与Arduino的引脚连接。
软件环境:配置Arduino开发环境
- 安装Arduino IDE:从官网下载并安装最新版Arduino IDE(建议1.8以上版本)。
- 安装GSM库:IDE内置了
GSM库(位于“项目”→“加载库”→“管理库”中,搜索“GSM”并安装),若使用非标准模块,可能需安装第三方库(如SoftwareSerial用于扩展串口)。 - 驱动安装:若通过USB转TTL模块连接GSM模块与电脑,需安装相应驱动(如CH340/FT232),确保串口通信正常。
接线步骤:连接模块与Arduino
以SIM800L模块与Arduino UNO为例,接线方式如下(注意:不同模块引脚定义可能存在差异,需参考模块手册):
- VCC:接模块5V(部分模块为3.8V-4.2V,需确认供电电压,避免烧毁);
- GND:接模块GND(共地是通信基础,务必接正确);
- TXD:模块发送引脚,接Arduino的RX引脚(如D0);
- RXD:模块接收引脚,接Arduino的TX引脚(如D1);
- RST:模块复位引脚(可选,可接Arduino数字引脚,用于软件复位);
- NETLIGHT:网络指示灯引脚(可选,用于观察网络连接状态)。
若Arduino硬件串口(D0/D1)已被占用,可使用SoftwareSerial库扩展软串口(如D2/D3),避免冲突。

代码实现:分步骤编写短信发送程序
以下是基于GSM库的短信发送代码示例,以SIM800L模块为例,支持发送英文短信(中文短信需额外编码处理,后文FAQs详述):
#include <GSM.h>
// 初始化GSM库(SIM800L模块)
#define PINNUMBER "" // SIM卡PIN码(若未设置则留空)
GSM gsmAccess;
GSM_SMS sms;
void setup() {
Serial.begin(9600); // 硬件串口,用于调试信息输出
while (!Serial); // 等待串口连接
Serial.println("Initializing GSM module...");
boolean notConnected = true;
// 启动GSM连接(最多10秒)
while (notConnected) {
if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
notConnected = false;
Serial.println("GSM module connected!");
} else {
Serial.println("Not connected. Retrying in 1 second...");
delay(1000);
}
}
}
void loop() {
Serial.print("Sending message to ");
Serial.println("+8613800138000"); // 替换为目标手机号(需加国家代码,如中国为+86)
// 发送短信内容
char txtMsg[] = "Hello from Arduino! This is a test message.";
// 发送短信
if (sms.beginSMS("+8613800138000")) { // 目标号码
sms.print(txtMsg); // 短信内容
if (sms.endSMS()) { // 完成发送
Serial.println("Message sent successfully!");
} else {
Serial.println("Error sending message.");
}
} else {
Serial.println("Error creating message.");
}
// 短信发送间隔(避免频繁触发运营商限制)
delay(30000); // 30秒后重复发送(测试用,实际项目根据需求调整)
} 代码解析:
- 库引入:
GSM.h提供GSM通信功能,GSM_SMS类专门处理短信操作。 - 初始化:
gsmAccess.begin()启动模块,需等待网络注册成功(GSM_READY状态)。 - 发送短信:
sms.beginSMS():指定目标号码(需包含国家代码,如中国手机号前加+86);sms.print():写入短信内容(支持英文,中文需UTF-8或UCS2编码);sms.endSMS():执行发送,返回true表示成功。
常见问题与解决方法
模块无响应,串口输出乱码或无数据
- 原因:波特率不匹配、接线错误(如TX/RX交叉接反)、电源供电不足。
- 解决:确认模块与Arduino串口波特率一致(默认9600);检查TX接Arduino RX,RX接Arduino TX;使用独立电源(5V/2A)为模块供电。
短信发送失败,提示“Error creating message”
- 原因:SIM卡未插好、无网络信号、目标号码格式错误、短信内容过长(单条短信限70字符,中文35字符)。
- 解决:重新插拔SIM卡,观察模块网络指示灯(常亮表示已注册网络);检查号码格式(加国家代码);缩短短信内容。
模块无法注册网络
- 原因:SIM卡欠费、信号弱(地下室或偏远地区)、模块频段与运营商不匹配。
- 解决:确认SIM卡可正常收发短信;将模块放置在信号开阔处;选择支持本地运营商频段的模块(如国内主要用900/1800MHz)。
总结与拓展

通过Arduino与GSM模块的组合,可轻松实现短信发送功能,广泛应用于物联网报警、远程控制、数据采集等场景,若需发送中文短信,需使用UCS2编码(将中文转换为Unicode字符),或借助第三方平台(如阿里云IoT)转发消息,结合传感器模块(如温湿度传感器),还可实现“超阈值报警短信通知”等进阶功能,为项目提供更灵活的远程交互方案。
FAQs
Q1:为什么我的GSM模块初始化时一直显示“Not connected”?
A:可能原因包括:① SIM卡未插入或接触不良;② 电源供电不足(模块峰值电流达2A,USB供电可能不够);③ 模块与串口波特率不匹配(默认9600,部分模块可能是115200),建议先检查SIM卡和电源,再用串口工具(如Arduino IDE串口监视器)发送AT指令(AT),若模块返回OK则说明硬件通信正常,问题可能在网络注册阶段(需等待1-3分钟)。
Q2:如何通过Arduino发送中文短信?
A:GSM模块发送中文短信需采用UCS2编码(16位Unicode),可通过以下步骤实现:① 将中文文本转换为Unicode字符(如“你好”转换为“0048000065”);② 使用GSM_SMS库的print()方法发送编码后的字符,示例代码片段:
char unicodeMsg[] = "x00x48x00x65"; // “你好”的Unicode编码
sms.beginSMS("+8613800138000");
sms.print(unicodeMsg);
sms.endSMS(); 或使用在线工具(如“Unicode编码转换器”)将中文转换为编码字符串,再嵌入代码中。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复