Arduino如何发送短信?

Arduino发送短信是物联网项目中常见的需求,通过结合GSM/GPRS模块(如SIM800L、SIM900A等),可以实现设备与远程通信的功能,本文将详细介绍Arduino发送短信的原理、硬件连接、代码实现、常见问题及解决方案,帮助读者快速掌握这一技术。

arduino发送短信

硬件准备

要实现Arduino发送短信,需要以下核心组件:

  1. 主控板:Arduino UNO、Nano或Mega等均可,推荐使用UNO,因其性价比高且易于上手。
  2. GSM模块:SIM800L或SIM900A是常用选择,前者体积小、功耗低,后者支持更多通信协议,需确保模块支持2G网络(部分运营商已逐步退网,需提前确认兼容性)。
  3. SIM卡:开通短信功能的手机SIM卡,插入GSM模块的卡槽中。
  4. 连接线:杜邦线(公对母、公对公)若干,用于模块与Arduino的连接。
  5. 电源:GSM模块工作电流较大(峰值可达2A),建议使用外部电源(如9V电池或适配器),避免通过Arduino的5V引脚供电导致不稳定。

硬件连接

以SIM800L模块与Arduino UNO为例,接线方式如下表所示:

SIM800L引脚 Arduino UNO引脚 功能说明
VCC 5V 模块电源(需外部供电)
GND GND 公共地线
TXD Digital Pin 10 模块发送端(Arduino接收)
RXD Digital Pin 11 模块接收端(Arduino发送)
RST Digital Pin 9 可选,用于硬复位模块

注意事项

  • 模块的TXD需连接Arduino的RXD(软件串口),反之亦然,若使用硬件串口(Pin 0/1),需注意与上传代码的冲突,建议使用软件串口(如SoftwareSerial库)。
  • 电源接线时务必确认正负极,接反可能导致模块烧毁。

软件实现

开发环境准备

安装Arduino IDE(1.8以上版本),并确保已安装SoftwareSerial库(默认包含)。

arduino发送短信

代码编写

以下是一个完整的发送短信示例代码:

#include <SoftwareSerial.h>
// 定义软件串口引脚
SoftwareSerial gsmSerial(10, 11); // RX, TX
void setup() {
  Serial.begin(9600);   // 与电脑通信的串口
  gsmSerial.begin(9600); // 与GSM模块通信的串口
  delay(1000);          // 等待模块启动
  // 初始化GSM模块
  sendATCommand("AT", "OK", 1000);
  sendATCommand("AT+CMGF=1", "OK", 1000); // 设置为文本模式
  sendATCommand("AT+CNMI=2,2,0,0,0", "OK", 1000); // 新短信直接输出
}
void loop() {
  if (Serial.available()) {
    String command = Serial.readString();
    gsmSerial.println(command);
    delay(100);
    while (gsmSerial.available()) {
      Serial.write(gsmSerial.read());
    }
  }
  // 示例:发送短信到指定号码
  sendSMS("13800138000", "这是一条来自Arduino的测试短信");
  delay(60000); // 每分钟发送一次
}
// 发送短信的函数
void sendSMS(String phoneNumber, String message) {
  sendATCommand("AT+CMGS="" + phoneNumber + """, ">", 1000);
  gsmSerial.print(message);
  gsmSerial.write(0x1A); // 发送Ctrl+Z
  gsmSerial.println();
  delay(2000);
  while (gsmSerial.available()) {
    Serial.write(gsmSerial.read());
  }
}
// 发送AT指令并等待响应
boolean sendATCommand(String command, String expectedAnswer, unsigned int timeout) {
  gsmSerial.println(command);
  long previous = millis();
  while ((millis() - previous) < timeout) {
    if (gsmSerial.available()) {
      String response = gsmSerial.readString();
      if (response.indexOf(expectedAnswer) != -1) {
        return true;
      }
    }
  }
  return false;
}

代码解析

  • 初始化:通过AT指令设置模块为文本模式(AT+CMGF=1),并启用新短信提示(AT+CNMI)。
  • 发送短信:使用AT+CMGS指令指定接收方号码,输入短信内容后以0x1A(Ctrl+Z)结束。
  • 调试技巧:通过Serial.print输出模块的响应信息,便于排查问题。

常见问题与解决方案

  1. 模块无响应

    • 检查接线是否正确,尤其是TX/RX交叉连接。
    • 确认SIM卡是否正常插入且未欠费。
    • 尝试降低波特率(如9600、115200),部分模块默认波特率可能不同。
  2. 发送失败

    • 确认信号强度(AT指令AT+CSQ,值越高信号越好)。
    • 检查短信内容是否过长(通常限制为160字符)。
    • 尝试重启模块(通过RST引脚或断电重连)。

相关问答FAQs

Q1:GSM模块与Arduino的波特率不匹配怎么办?
A1:波特率需两者一致,可通过AT指令AT+IPR=9600设置模块波特率,或尝试常用波特率(9600、19200、115200)测试,若仍无法通信,可使用逻辑分析仪捕获信号判断实际波特率。

arduino发送短信

Q2:如何实现Arduino接收短信并解析内容?
A2:在初始化时设置AT+CNMI=2,2,0,0,0,使新短信直接输出到串口,通过监听串口数据,使用AT+CMGR读取短信内容,并利用字符串函数(如indexOfsubstring)解析指令,若短信内容为“LED ON”,则触发控制LED亮起的操作。

通过以上步骤,读者可快速搭建基于Arduino的短信通信系统,实际应用中,可结合传感器(如温湿度、烟雾报警器)实现远程监控,或通过短信指令控制继电器等执行器,拓展物联网项目的功能边界。

【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!

(0)
热舞的头像热舞
上一篇 2025-11-22 18:00
下一篇 2025-11-22 18:03

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

广告合作

QQ:14239236

在线咨询: QQ交谈

邮件:asy@cxas.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信