Arduino:Примеры/GSMExamplesSendSMS: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
м (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">»)
 
Нет описания правки
Строка 23: Строка 23:
Для начала импортируем библиотеку '''GSM'''.
Для начала импортируем библиотеку '''GSM'''.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
#include <GSM.h>
#include <GSM.h>
</syntaxhighlight>
</syntaxhighlight>
Строка 29: Строка 29:
При помощи директивы #define определяем '''PIN'''-код как константу, чтобы разблокировать '''SIM'''-карту. Если '''PIN'''-кода нет, оставляем это место пустым.
При помощи директивы #define определяем '''PIN'''-код как константу, чтобы разблокировать '''SIM'''-карту. Если '''PIN'''-кода нет, оставляем это место пустым.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
#define PINNUMBER ""
#define PINNUMBER ""
</syntaxhighlight>
</syntaxhighlight>
Строка 35: Строка 35:
Создаем экземпляры классов '''GSM''' и '''GSM_SMS'''.  
Создаем экземпляры классов '''GSM''' и '''GSM_SMS'''.  


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
GSM gsmAccess;  
GSM gsmAccess;  
GSM_SMS sms;
GSM_SMS sms;
Строка 42: Строка 42:
В блоке setup() запускаем последовательную передачу данных на компьютер. Запустив, отсылаем на '''Serial Monitor''' сообщение, информирующее о начале работы скетча.
В блоке setup() запускаем последовательную передачу данных на компьютер. Запустив, отсылаем на '''Serial Monitor''' сообщение, информирующее о начале работы скетча.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
void setup(){
void setup(){
   Serial.begin(9600);  
   Serial.begin(9600);  
Строка 50: Строка 50:
Создаем локальную переменную, чтобы отслеживать статус соединения. Это нужно для того, чтобы скетч не начинал работать, пока '''SIM'''-карта не подключится к сети.
Создаем локальную переменную, чтобы отслеживать статус соединения. Это нужно для того, чтобы скетч не начинал работать, пока '''SIM'''-карта не подключится к сети.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
boolean notConnected = true;
boolean notConnected = true;
</syntaxhighlight>
</syntaxhighlight>
Строка 56: Строка 56:
Подключаемся к сети при помощи функции gsmAccess.begin(), и '''PIN'''-код в ней будет в качестве аргумента. Размещаем эту функцию в цикле while(), чтобы постоянно проверять статус соединения. Когда модем подключится, gsmAccess() вернет значение '''GSM_READY''', и это будет сигналом для того, чтобы задать для переменной notConnected значение true или false. Если подключиться не удалось, информируем об этом через '''Serial Monitor'''.
Подключаемся к сети при помощи функции gsmAccess.begin(), и '''PIN'''-код в ней будет в качестве аргумента. Размещаем эту функцию в цикле while(), чтобы постоянно проверять статус соединения. Когда модем подключится, gsmAccess() вернет значение '''GSM_READY''', и это будет сигналом для того, чтобы задать для переменной notConnected значение true или false. Если подключиться не удалось, информируем об этом через '''Serial Monitor'''.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
while(notConnected)
while(notConnected)
   {
   {
Строка 71: Строка 71:
Заканчиваем секцию setup() выводом на '''Serial Monitor''' сообщения о том, что инициализация '''GSM''' прошла успешно.
Заканчиваем секцию setup() выводом на '''Serial Monitor''' сообщения о том, что инициализация '''GSM''' прошла успешно.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
Serial.println("GSM initialized.");
Serial.println("GSM initialized.");
}
}
Строка 78: Строка 78:
Создаем функцию типа int под названием readSerial. Она будет делать перебор входящих данных, присланных через '''Serial Monitor''', попутно сохраняя номер, на который вы хотите отправить '''SMS''', а также само сообщение. В качестве аргумента у нее будет массив типа char.
Создаем функцию типа int под названием readSerial. Она будет делать перебор входящих данных, присланных через '''Serial Monitor''', попутно сохраняя номер, на который вы хотите отправить '''SMS''', а также само сообщение. В качестве аргумента у нее будет массив типа char.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
int readSerial(char result[])
int readSerial(char result[])
{
{
Строка 85: Строка 85:
Создаем переменную, которая будет пересчитывать содержимое буфера последовательного порта, а потом запускаем цикл while(), который будет выполнятся непрерывно.
Создаем переменную, которая будет пересчитывать содержимое буфера последовательного порта, а потом запускаем цикл while(), который будет выполнятся непрерывно.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
int i = 0;
int i = 0;
   while(1)
   while(1)
Строка 93: Строка 93:
Покуда в буфере последовательного порта доступна какая-либо информация, считываем ее в переменную под названием '''inChar'''.
Покуда в буфере последовательного порта доступна какая-либо информация, считываем ее в переменную под названием '''inChar'''.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
while (Serial.available() > 0)
while (Serial.available() > 0)
     {
     {
Строка 101: Строка 101:
Если добрались до символа новой строки, стираем содержимое массива, очищаем буфер последовательного порта и выполняем функцию.
Если добрались до символа новой строки, стираем содержимое массива, очищаем буфер последовательного порта и выполняем функцию.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
if (inChar == '\n')
if (inChar == '\n')
       {
       {
Строка 112: Строка 112:
Если входящий символ является '''ASCII'''-символом, а не символом новой строки или возврата строки, добавляем его к массиву и увеличиваем индекс. Затем закрываем циклы while() и саму функцию.
Если входящий символ является '''ASCII'''-символом, а не символом новой строки или возврата строки, добавляем его к массиву и увеличиваем индекс. Затем закрываем циклы while() и саму функцию.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
if(inChar!='\r')
if(inChar!='\r')
       {
       {
Строка 125: Строка 125:
В секции loop() создаем массив типа char под названием remoteNumber, чтобы хранить в нем номер, на который вы хотите отправить '''SMS'''. Далее вызываем только что созданную функцию readSerial(), где remoteNumber будет в качестве аргумента. Эта функция заполнит массив remoteNumber номером, которому будет адресоваться '''SMS'''-сообщение.
В секции loop() создаем массив типа char под названием remoteNumber, чтобы хранить в нем номер, на который вы хотите отправить '''SMS'''. Далее вызываем только что созданную функцию readSerial(), где remoteNumber будет в качестве аргумента. Эта функция заполнит массив remoteNumber номером, которому будет адресоваться '''SMS'''-сообщение.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
Serial.print("Enter a mobile number: ");
Serial.print("Enter a mobile number: ");
   char remoteNumber[20];
   char remoteNumber[20];
Строка 134: Строка 134:
Создаем еще один массив типа char, но уже под названием txtMsg. Он будет содержать в себе содержимое вашего SMS и станет аргументом для функции readSerial().
Создаем еще один массив типа char, но уже под названием txtMsg. Он будет содержать в себе содержимое вашего SMS и станет аргументом для функции readSerial().


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
Serial.print("Now, enter SMS content: ");
Serial.print("Now, enter SMS content: ");
   char txtMsg[200];
   char txtMsg[200];
Строка 142: Строка 142:
Далее вызываем три функции. Первая (чтобы начать отправку сообщения) – это sms.beginSMS() с аргументом в виде массива remoteNumber. Вторая (чтобы отправить сообщение) – sms.print(). Третья (чтобы завершить процесс отправки) – sms.endSMS(). Печатаем пару '''«диагностических»''' сообщений и закрываем loop(). Ваше сообщение полетело к адресату!
Далее вызываем три функции. Первая (чтобы начать отправку сообщения) – это sms.beginSMS() с аргументом в виде массива remoteNumber. Вторая (чтобы отправить сообщение) – sms.print(). Третья (чтобы завершить процесс отправки) – sms.endSMS(). Печатаем пару '''«диагностических»''' сообщений и закрываем loop(). Ваше сообщение полетело к адресату!


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
Serial.println("SENDING");
Serial.println("SENDING");
   Serial.println();
   Serial.println();
Строка 157: Строка 157:
Загрузив код, открываем '''Serial Monitor'''. Убедитесь, что он настроен таким образом, что при нажатии на клавишу ввода отсылается только символ новой строки. Когда скетч попросит вас ввести желаемый номер, впишите цифры и нажмите клавишу ввода. Затем вас попросят ввести сообщение. Напечатайте его и снова нажмите клавишу ввода.
Загрузив код, открываем '''Serial Monitor'''. Убедитесь, что он настроен таким образом, что при нажатии на клавишу ввода отсылается только символ новой строки. Когда скетч попросит вас ввести желаемый номер, впишите цифры и нажмите клавишу ввода. Затем вас попросят ввести сообщение. Напечатайте его и снова нажмите клавишу ввода.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
/*
/*
Отправщик SMS
Отправщик SMS

Версия от 12:32, 20 мая 2023

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Отправка SMS[1]

Этот скетч отправляет SMS-сообщение, используя для этого тандем из платы Arduino и модуля GSM Shield. Номер, на который будет передано SMS, а также само сообщение вводятся через Serial Monitor.

Необходимое оборудование

  • Плата Arduino;
  • Модуль Arduino + Telefonica GSM/GPRS Shield;
  • SIM-карта;

Цепь

Изображение модуля Arduino GSM Shield, установленного поверх платы Arduino Uno

Код

Для начала импортируем библиотеку GSM.

#include <GSM.h>

При помощи директивы #define определяем PIN-код как константу, чтобы разблокировать SIM-карту. Если PIN-кода нет, оставляем это место пустым.

#define PINNUMBER ""

Создаем экземпляры классов GSM и GSM_SMS.

GSM gsmAccess; 
GSM_SMS sms;

В блоке setup() запускаем последовательную передачу данных на компьютер. Запустив, отсылаем на Serial Monitor сообщение, информирующее о начале работы скетча.

void setup(){
  Serial.begin(9600); 
  Serial.println("SMS Messages Sender");

Создаем локальную переменную, чтобы отслеживать статус соединения. Это нужно для того, чтобы скетч не начинал работать, пока SIM-карта не подключится к сети.

boolean notConnected = true;

Подключаемся к сети при помощи функции gsmAccess.begin(), и PIN-код в ней будет в качестве аргумента. Размещаем эту функцию в цикле while(), чтобы постоянно проверять статус соединения. Когда модем подключится, gsmAccess() вернет значение GSM_READY, и это будет сигналом для того, чтобы задать для переменной notConnected значение true или false. Если подключиться не удалось, информируем об этом через Serial Monitor.

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

Заканчиваем секцию setup() выводом на Serial Monitor сообщения о том, что инициализация GSM прошла успешно.

Serial.println("GSM initialized.");
}

Создаем функцию типа int под названием readSerial. Она будет делать перебор входящих данных, присланных через Serial Monitor, попутно сохраняя номер, на который вы хотите отправить SMS, а также само сообщение. В качестве аргумента у нее будет массив типа char.

int readSerial(char result[])
{

Создаем переменную, которая будет пересчитывать содержимое буфера последовательного порта, а потом запускаем цикл while(), который будет выполнятся непрерывно.

int i = 0;
  while(1)
  {

Покуда в буфере последовательного порта доступна какая-либо информация, считываем ее в переменную под названием inChar.

while (Serial.available() > 0)
    {
      char inChar = Serial.read();

Если добрались до символа новой строки, стираем содержимое массива, очищаем буфер последовательного порта и выполняем функцию.

if (inChar == '\n')
      {
        result[i] = '\0';
        Serial.flush();
        return 0;
      }

Если входящий символ является ASCII-символом, а не символом новой строки или возврата строки, добавляем его к массиву и увеличиваем индекс. Затем закрываем циклы while() и саму функцию.

if(inChar!='\r')
      {
        result[i] = inChar;
        i++;
      }
    }
  }
}

В секции loop() создаем массив типа char под названием remoteNumber, чтобы хранить в нем номер, на который вы хотите отправить SMS. Далее вызываем только что созданную функцию readSerial(), где remoteNumber будет в качестве аргумента. Эта функция заполнит массив remoteNumber номером, которому будет адресоваться SMS-сообщение.

Serial.print("Enter a mobile number: ");
  char remoteNumber[20];
  readSerial(remoteNumber);
  Serial.println(remoteNumber);

Создаем еще один массив типа char, но уже под названием txtMsg. Он будет содержать в себе содержимое вашего SMS и станет аргументом для функции readSerial().

Serial.print("Now, enter SMS content: ");
  char txtMsg[200];
  readSerial(txtMsg);

Далее вызываем три функции. Первая (чтобы начать отправку сообщения) – это 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");
}

Загрузив код, открываем Serial Monitor. Убедитесь, что он настроен таким образом, что при нажатии на клавишу ввода отсылается только символ новой строки. Когда скетч попросит вас ввести желаемый номер, впишите цифры и нажмите клавишу ввода. Затем вас попросят ввести сообщение. Напечатайте его и снова нажмите клавишу ввода.

/*
Отправщик SMS

Этот скетч, предназначенный для Arduino GSM Shield, 
отправляет на указанный адрес SMS-сообщение, введенное через Serial Monitor.
Подключив Shield к Arduino и настроив скетч, откройте Serial Monitor
и, увидев сообщение READY, начинайте писать сообщение.
Убедитесь, что Serial Monitor настроен таким образом,
чтобы при нажатии на клавишу ввода отправлять только символ новой строки.

Цепь:
* GSM Shield, подключенный к Arduino

Создан 25 февраля 2012 Томом Иго (Tom Igoe).

Этот код не защищен авторским правом.
*/

// Библиотека:
#include <GSM.h>

#define PINNUMBER ""

// Создаем экземпляры классов GSM и GSM_SMS:
GSM gsmAccess; // включая параметр «true» для активации отладки
GSM_SMS sms;
void setup()
{
  // Инициализируем последовательную передачу данных:
  Serial.begin(9600);

  Serial.println("SMS Messages Sender");  //  "Отправщик SMS-сообщений"

  // Состояние соединения:
  boolean notConnected = true;

  // Запускаем GSM Shield.
  // Если ваша SIM-карта заблокирована PIN-кодом,
  // ставим его параметром в функции gsmAccess.begin():
  while(notConnected)
  {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");  //  "Подключиться не удалось"
      delay(1000);
    }
  }

  Serial.println("GSM initialized");  //  "GSM не инициализирован"
}

void loop()
{

  Serial.print("Enter a mobile number: ");  //  "Введите мобильный номер"
  char remoteNumber[20];  // телефонный номер, которому будем слать SMS
  readSerial(remoteNumber);
  Serial.println(remoteNumber);

  // Текст SMS-сообщения:
  Serial.print("Now, enter SMS content: ");  //  "Теперь введите SMS-сообщение: "
  char txtMsg[200];
  readSerial(txtMsg);
  Serial.println("SENDING");  //  "Отправка"
  Serial.println();
  Serial.println("Message:");  //  "Сообщение:"
  Serial.println(txtMsg);

  // Отправляем сообщение:
  sms.beginSMS(remoteNumber);
  sms.print(txtMsg);
  sms.endSMS(); 
  Serial.println("\nCOMPLETE!\n");  //  "\nГотово!\n"
}

/*
Считываем входящие данные, пришедшие через последовательный порт
*/

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++;
      }
    }
  }
}

См.также

  1. GSM Constructor
  2. GSM.begin()
  3. GSM.shutdown()
  4. GSM_SMS Constructor
  5. beginSMS()
  6. ready()
  7. endSMS()
  8. available()
  9. remoteNumber()
  10. read()
  11. write()
  12. print()
  13. peek()
  14. flush()

Внешние ссылки