Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/GSMExamplesSendSMS

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


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

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

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

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

Цепь

GSMShield ArduinoUno.png

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

Код

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

  1. #include <GSM.h>

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

  1. #define PINNUMBER ""

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

  1. GSM gsmAccess;
  2. GSM_SMS sms;

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

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

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

  1. boolean notConnected = true;

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

  1. while(notConnected)
  2.   {
  3.     if(gsmAccess.begin(PINNUMBER)==GSM_READY)
  4.       notConnected = false;
  5.     else
  6.     {
  7.       Serial.println("Not connected");
  8.       delay(1000);
  9.     }
  10.   }

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

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

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

  1. int readSerial(char result[])
  2. {

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

  1. int i = 0;
  2.   while(1)
  3.   {

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

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

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

  1. if (inChar == '\n')
  2.       {
  3.         result[i] = '\0';
  4.         Serial.flush();
  5.         return 0;
  6.       }

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

  1. if(inChar!='\r')
  2.       {
  3.         result[i] = inChar;
  4.         i++;
  5.       }
  6.     }
  7.   }
  8. }

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

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

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

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

Далее вызываем три функции. Первая (чтобы начать отправку сообщения) – это sms.beginSMS() с аргументом в виде массива remoteNumber. Вторая (чтобы отправить сообщение) – sms.print(). Третья (чтобы завершить процесс отправки) – sms.endSMS(). Печатаем пару «диагностических» сообщений и закрываем loop(). Ваше сообщение полетело к адресату!

  1. Serial.println("SENDING");
  2.   Serial.println();
  3.   Serial.println("Message:");
  4.   Serial.println(txtMsg);
  5.  
  6.   sms.beginSMS(remoteNumber);
  7.   sms.print(txtMsg);
  8.   sms.endSMS();
  9.   Serial.println("\nCOMPLETE!\n");
  10. }

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

  1. /*
  2. Отправщик SMS
  3.  
  4. Этот скетч, предназначенный для Arduino GSM Shield,
  5. отправляет на указанный адрес SMS-сообщение, введенное через Serial Monitor.
  6. Подключив Shield к Arduino и настроив скетч, откройте Serial Monitor
  7. и, увидев сообщение READY, начинайте писать сообщение.
  8. Убедитесь, что Serial Monitor настроен таким образом,
  9. чтобы при нажатии на клавишу ввода отправлять только символ новой строки.
  10.  
  11. Цепь:
  12. * GSM Shield, подключенный к Arduino
  13.  
  14. Создан 25 февраля 2012 Томом Иго (Tom Igoe).
  15.  
  16. Этот код не защищен авторским правом.
  17. */
  18.  
  19. // Библиотека:
  20. #include <GSM.h>
  21.  
  22. #define PINNUMBER ""
  23.  
  24. // Создаем экземпляры классов GSM и GSM_SMS:
  25. GSM gsmAccess; // включая параметр «true» для активации отладки
  26. GSM_SMS sms;
  27. void setup()
  28. {
  29.   // Инициализируем последовательную передачу данных:
  30.   Serial.begin(9600);
  31.  
  32.   Serial.println("SMS Messages Sender");  //  "Отправщик SMS-сообщений"
  33.  
  34.   // Состояние соединения:
  35.   boolean notConnected = true;
  36.  
  37.   // Запускаем GSM Shield.
  38.   // Если ваша SIM-карта заблокирована PIN-кодом,
  39.   // ставим его параметром в функции gsmAccess.begin():
  40.   while(notConnected)
  41.   {
  42.     if(gsmAccess.begin(PINNUMBER)==GSM_READY)
  43.       notConnected = false;
  44.     else
  45.     {
  46.       Serial.println("Not connected");  //  "Подключиться не удалось"
  47.       delay(1000);
  48.     }
  49.   }
  50.  
  51.   Serial.println("GSM initialized");  //  "GSM не инициализирован"
  52. }
  53.  
  54. void loop()
  55. {
  56.  
  57.   Serial.print("Enter a mobile number: ");  //  "Введите мобильный номер"
  58.   char remoteNumber[20];  // телефонный номер, которому будем слать SMS
  59.   readSerial(remoteNumber);
  60.   Serial.println(remoteNumber);
  61.  
  62.   // Текст SMS-сообщения:
  63.   Serial.print("Now, enter SMS content: ");  //  "Теперь введите SMS-сообщение: "
  64.   char txtMsg[200];
  65.   readSerial(txtMsg);
  66.   Serial.println("SENDING");  //  "Отправка"
  67.   Serial.println();
  68.   Serial.println("Message:");  //  "Сообщение:"
  69.   Serial.println(txtMsg);
  70.  
  71.   // Отправляем сообщение:
  72.   sms.beginSMS(remoteNumber);
  73.   sms.print(txtMsg);
  74.   sms.endSMS();
  75.   Serial.println("\nCOMPLETE!\n");  //  "\nГотово!\n"
  76. }
  77.  
  78. /*
  79. Считываем входящие данные, пришедшие через последовательный порт
  80. */
  81.  
  82. int readSerial(char result[])
  83. {
  84.   int i = 0;
  85.   while(1)
  86.   {
  87.     while (Serial.available() > 0)
  88.     {
  89.       char inChar = Serial.read();
  90.       if (inChar == '\n')
  91.       {
  92.         result[i] = '\0';
  93.         Serial.flush();
  94.         return 0;
  95.       }
  96.       if(inChar!='\r')
  97.       {
  98.         result[i] = inChar;
  99.         i++;
  100.       }
  101.     }
  102.   }
  103. }

См.также

  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()

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

  1. Arduino - Send SMS