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

相关推荐

  • 苹果11的红外设备隐藏在哪里?

    苹果iPhone 11系列并未配备红外设备。苹果公司在其手机中通常不包含红外线发射器或接收器,这意味着iPhone 11不能用作遥控器来控制电视等设备。

    2024-08-18
    00127
  • 徐州手机网站揭秘,徐州地区手机用户如何高效获取本地信息?

    便捷生活的信息港湾徐州手机网站作为徐州地区的重要信息平台,致力于为用户提供丰富、便捷的移动信息服务,网站涵盖了新闻、生活、娱乐、教育等多个领域,是徐州市民生活中不可或缺的助手,新闻资讯时政要闻徐州手机网站及时报道国内外重大新闻事件,让用户第一时间了解时政动态,网站还设有本地新闻板块,关注徐州本土热点,满足用户对……

    2026-01-11
    002
  • WPS如何匹配两列数据库?

    在数据处理和分析工作中,经常需要比对两列数据中的重复项或差异项,WPS Office作为常用的办公软件,其内置的函数和工具可以高效完成这一任务,以下是几种常用的WPS匹配两列数据库的方法及其操作步骤,帮助用户快速定位数据关系,使用VLOOKUP函数进行匹配VLOOKUP函数是WPS中最常用的查找函数,适用于在首……

    2025-11-22
    0034
  • Android如何实现自定义音频播放圆形进度条?Android自定义圆形进度条

    Android自定义View实现音频播放圆形进度条的核心在于重写onDraw方法结合Canvas绘制,通过监听音频播放状态实时更新角度,并采用贝塞尔曲线或PathMeasure优化动画流畅度,目前主流方案已普遍采用Jetpack Compose或Kotlin协程替代传统Handler以解决主线程阻塞问题,在移动……

    2026-06-01
    002

发表回复

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

广告合作

QQ:14239236

在线咨询: QQ交谈

邮件:asy@cxas.com

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

关注微信