< >
Home » Arduino库教程 » Arduino库教程-GSM-Send SMS

Arduino库教程-GSM-Send SMS

Send SMS

  • 这个程序发送一个来自装有GSM shield的Arduino 或者 Genuino 的SMS消息。通过Arduino软件(IDE)串口监视器,你输入数字来连接,和输入文本信息来发送。

硬件要求

  • Arduino 或者 Genuino 开发板
  • Arduino + Telefonica GSM/GPRS Shield
  • SIM卡

电路

请输入图片描述
这是在一块Arduino或者Genuino开发板上的Arduino GSM Shield图

样例代码

  • 首先,加上GSM库
#include <GSM.h>
  • SIM卡可能有一个引脚数,来使能它们的功能。为您的SIM卡定义引脚。如果你的卡没有引脚,你可以让它空白:
#define PINNUMBER ""
  • 初始化将要使用的类的实例。你同时需要GSM和GSMVoiceCall类。
GSM gsmAccess; 
GSM_SMS sms;

[Get Code]

  • 在setup()里,打开一个到计算机的串口连接。打开连接后,发送一个消息示意程序已经开始了。
void setup(){
  Serial.begin(9600); 
  Serial.println("SMS Messages Sender");

[Get Code]

  • 创建一个本地变量来跟踪连接状态。直到SIM连接到网络之前,你可以用这个来防止程序开始运行:
boolean notConnected = true;

[Get Code]

  • 通过调用gsmAccess.begin()连接到网络。它以SIM卡的引脚当作一个参数。你也可以用gprs.attachGPRS()连接到GPRS网络。这个要求你前面声明的APN,登录和密码。通过放在while()循环里,你可以不断地检查连接的状态,等到他们都成为真。

  • 当调制解调器连接到GPRS网络,gsmAccess() 将返回GSM_READY。以此为连接与否的标志。一旦连接好,setup()的其余部分将会运行。

while(notConnected)
  {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }

[Get Code]

  • 发送一些信息到串口监视器来结束setup。
Serial.println("GSM initialized.");
}

[Get Code]

  • 创建一个名为readSerial整型函数。你将使用它来申明来自串口监视器的输入,存储你想发送短信的数字,和你将要发送的消息。它应该把一个字符数组作为一个参数。
int readSerial(char result[])
{

[Get Code]

  • 创建一个变量来计算串口缓存器的项目,并开始一个持续执行的while循环。
int i = 0;
  while(1)
  {

[Get Code]

  • 只要存在有效的串口信息,读取数据到一个名为inChar的变量。
while (Serial.available() > 0)
    {
      char inChar = Serial.read();

[Get Code]

  • 如果读的是换行符,终止阵列,清除串口缓冲区并退出函数。
if (inChar == '\n')
      {
        result[i] = '\0';
        Serial.flush();
        return 0;
      }

[Get Code]

  • 如果输入的字符是一个换行键或回车键以外的ASCII字符,将其添加到阵列并增量索引。关闭while循环和这个函数。
if(inChar!='\r')
      {
        result[i] = inChar;
        i++;
      }
    }
  }
}

[Get Code]

  • 在loop里,创建一个名为remoteNumber的字符数组来保存你想发送一个SMS的数字。调用你刚刚创建的readSerial函数,并将remoteNumber作为依据输入。当readSerial执行时,它把要发送消息的数字填充remotenumber。
Serial.print("Enter a mobile number: ");
  char remoteNumber[20];
  readSerial(remoteNumber);
  Serial.println(remoteNumber);

[Get Code]

  • 创建一个名为txtMsg的新字符数组。这数组将保存你的短信内容。传txtMsg到readserial来填充阵列。
Serial.print("Now, enter SMS content: ");
  char txtMsg[200];
  readSerial(txtMsg);

[Get Code]

  • 调用sms.beginSMS(),并把它传到remoteNumber来启动发送信息,传到sms.print()来发送信息,传到sms.endSMS()来结束程序。打印出一些诊断信息并关闭loop。就这样得到你要的信息!
Serial.println("SENDING");
  Serial.println();
  Serial.println("Message:");
  Serial.println(txtMsg);

  sms.beginSMS(remoteNumber);
  sms.print(txtMsg);
  sms.endSMS(); 
  Serial.println("\nCOMPLETE!\n");
}

[Get Code]

  • 一旦你的代码被上传,打开串口监视器。确保串口监视器被设置为只发送一个换行符返回。当提示输入要拨打的数字时,输入数字并按回车键。然后,你会被要求输入你的信息。一旦你键入了,按回车键发送。

  • 完整程序如下:

/*
 SMS sender

 This sketch, for the Arduino GSM shield,sends an SMS message
 you enter in the serial monitor. Connect your Arduino with the
 GSM shield and SIM card, open the serial monitor, and wait for
 the "READY" message to appear in the monitor. Next, type a
 message to send and press "return". Make sure the serial
 monitor is set to send a newline when you press return.

 Circuit:
 * GSM shield
 * SIM card that can send SMS

 created 25 Feb 2012
 by Tom Igoe

 This example is in the public domain.

 http://www.arduino.cc/en/Tutorial/GSMExamplesSendSMS

 */

// Include the GSM library
#include <GSM.h>

#define PINNUMBER ""

// initialize the library instance
GSM gsmAccess;
GSM_SMS sms;

void setup() {
  // initialize serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  Serial.println("SMS Messages Sender");

  // connection state
  boolean notConnected = true;

  // Start GSM shield
  // If your SIM has PIN, pass it as a parameter of begin() in quotes
  while (notConnected) {
    if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
      notConnected = false;
    } else {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  Serial.println("GSM initialized");
}

void loop() {

  Serial.print("Enter a mobile number: ");
  char remoteNum[20];  // telephone number to send sms
  readSerial(remoteNum);
  Serial.println(remoteNum);

  // sms text
  Serial.print("Now, enter SMS content: ");
  char txtMsg[200];
  readSerial(txtMsg);
  Serial.println("SENDING");
  Serial.println();
  Serial.println("Message:");
  Serial.println(txtMsg);

  // send the message
  sms.beginSMS(remoteNum);
  sms.print(txtMsg);
  sms.endSMS();
  Serial.println("\nCOMPLETE!\n");
}

/*
  Read input serial
 */
int readSerial(char result[]) {
  int i = 0;
  while (1) {
    while (Serial.available() > 0) {
      char inChar = Serial.read();
      if (inChar == '\n') {
        result[i] = '\0';
        Serial.flush();
        return 0;
      }
      if (inChar != '\r') {
        result[i] = inChar;
        i++;
      }
    }
  }
}

[Get Code]
更多

  • GSM Constructor

  • GSM.begin()

  • GSM.shutdown()

  • GSM_SMS Constructor

  • beginSMS()

  • ready()

  • endSMS()

  • available()

  • remoteNumber()

  • read()

  • write()

  • print()

  • peek()

  • flush()

  • Arduino GSM Shield – 完整的产品描述。

  • Getting started with the GSM Shield – 在几分钟内启动所有东西

  • GSM library – GSM 库的参考网页

  • GSMExamplesMakeVoiceCall -如何用麦克风和扬声器进行语音通话。

  • GSMExamplesReceiveVoiceCall - 接收并连接该呼叫,呼叫的号码显示在串口监视器上,然后挂断电话。

  • GSMExamplesReceiveSMS - 如何收到一个SMS信息。

  • GSMExamplesSendSMS - 如何通过串口监视器发送SMS输入号码和文本。

  • GSMExamplesWebServer - 当从客户端获取一个请求时,Web服务器返回模拟输入引脚上的值。

  • GSMToolsTestGPRS – 试图用提供的APN和证书来通过GPRS访问互联网 。

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: arduino库教程, arduino send sms