EnglishRussian

GSM библиотека для Arduino IDE

В данном руководстве рассмотрим возможности библиотеки GSM под Arduino и шилд «Cosmo GSM Connect».

GSM-lib написанна под Arduino IDE версии 1.0. Скачать последную версию библиотеки с готовыми примерами использования можно из репозитория проекта.  Для установки — распакуйте архив GSM в директорию libraries (/arduino-1.0/libraries/GSM). После запуска среды разработки Arduino, в меню программы «File -> Examples» появится пункт GSM, с примерами скетчей.

Библиотека GSM разработана для работы с шилдом «Cosmo GSM Connect». Она аппаратно совместима с платами Arduino (Uno, Duemilanove и прочие аналоги). При использовании других плат, возможно, потребуется внесение правок в GSM.cpp для указания правильного порта, на который выведена с шилда линия включения модема.

В настоящий момент в библиотеке реализованы следующие функциональные возможности.

  • Регистрация в GSM-сети
  • Отправка SMS
  • Прием и разбор SMS
  • Прием входящих вызовов
  • Проверка статуса соединения с сетью GSM, восстановление сети при потере сигнала
  • Выполнение произвольных AT-команд из скетча

 

Регистрация в GSM-сети

Для регистрация модема в сети необходимо указать пин-код симкарты. Важно помнить, что если вы укажете неправильный номер, симкарта может заблокироваться, т.к. функция инициализация будет периодически повторяться до удачной попытки. Процесс инициализации обычно занимает около 1 минуты.

Первичная инициализация выполняется в функции setup().

#include <gsm.h>
#include <avr/pgmspace.h>
const char PIN[] PROGMEM = "0000"; // ПИН-код
void setup() {
  while (GSM.Init(PIN)<0); // Регистрация в сети
  GSM.NewSMSindic(); // Настройка индикатора новых SMS
  GSM.WaitCall(); // Ждем входящие вызовы
  GSM.WaitSMS(); // Ждем входящих SMS
}

 

Отправка SMS

Для отправки текстовых сообщений служит функция SendSMS(), в которую передаются 2 параметра — номер получателя SMS и само сообщение.

while(GSM.SendSMS(RemoteID, "Hello from Arduino!") < 0); 

Где RemoteID — это номер получателя. Эту константу предпочтительнее выносить в заголовок программы.

const char RemoteID[] PROGMEM = "+79280000000";

Текст сообщения можно формировать также динамически.

String textMessage;
textMessage += "Sensor1 ";
textMessage += "Sensor2";
char Out[textMessage.length()+1];
textMessage.toCharArray(Out,(textMessage.length())+1);
while(GSM.SendSMS(RemoteID, Out) < 0);

 

Прием и разбор SMS

Для считывания входящих SMS сообщений служит функция ReadSMS(), в которую передаются 2 параметра — индекс SMS и указатель, куда будет скопирован текст. Ниже представлен фрагмент скетча, в котором разбирается текст входящего сообщения. Когда SMS равен 1 — выполняем некое действие, а когда равен 2 — производим другое действие. Полный пример скетча SmsCheck.ino смотрите в examples.

if (GSM.CheckSMS()== 1) { //Есть новое СМС
  GSM.ReadSMS(NewSMS_index, (char*) SMStxt);
  GSM.DeleteAllSMS(); // Удалить СМСки (накапливать не будем!)
  strSMS = String(SMStxt);
  if(strSMS == "1") {
    // тут выполняем действие 1
  }
  if(strSMS == "2") {
    // тут выполняем действие 2
  }
  GSM.WaitCall();
  GSM.WaitSMS();
}

Примечание. Библиотека GSM умеет работать только с латинскими символами, кириллица в настоящее время не поддерживается.

 

Прием входящих вызовов

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

Например, можно сделать вызов на шилд, на Ардуино проверить номер звонящего абонента и в случае совпадения с шаблонным номером — выслать на него SMS с показаниями датчиков. Следующий фрагмент реализует подобный функционал. Полная версия скетча CallCheck.ino смотрите в examples.

if (IncomingCall == 1) { //пришёл звонок!
  while (GSM.TerminateCall()<0); // Ложим трубку
  IncomingCall = 0;
  // Проверяем, если номер звонящего CallerID совпал с шаблоном RemoteID
  if (strstr_P(CallerID, RemoteID)) {
    while(GSM.SendSMS(RemoteID, "Hello from Arduino!") < 0);// SMS из SRAM памяти
  }
  GSM.WaitCall();
}

 

Проверка статуса соединения с сетью GSM

Бывают ситуации, когда соединение с сетью пропадает. Для выявления потери сети служит функция CheckStatus(), которая возвращает 0 в том случае, когда соединение с сетью утеряно. Пример использования приводится в следующем блоке кода.

// Через определенные промежутки времени проверяем состояние GPRS подключения!
if(currentMillis - previousMillis > interval) {
  if ((GSM.CheckStatus() != 1)) { // GPRS соединение не установлено!
    while (GSM.Init(PIN)<0); // Делаем инициализацию
  }
  GSM.WaitCall();
  currentMillis = previousMillis = millis();
}

 

Выполнение произвольных AT-команд из скетча

Для выполнения AT-команд из скетча используется функция WriteStr_P().

GSM.WriteStr_P(PSTR("AT\r\n"));