В данном руководстве рассмотрим возможности библиотеки 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 для указания правильного порта, на который выведена с шилда линия включения модема.
В настоящий момент в библиотеке реализованы следующие функциональные возможности.
Для регистрация модема в сети необходимо указать пин-код симкарты. Важно помнить, что если вы укажете неправильный номер, симкарта может заблокироваться, т.к. функция инициализация будет периодически повторяться до удачной попытки. Процесс инициализации обычно занимает около 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 }
Для отправки текстовых сообщений служит функция 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 сообщений служит функция 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(); }
Бывают ситуации, когда соединение с сетью пропадает. Для выявления потери сети служит функция CheckStatus(), которая возвращает 0 в том случае, когда соединение с сетью утеряно. Пример использования приводится в следующем блоке кода.
// Через определенные промежутки времени проверяем состояние GPRS подключения! if(currentMillis - previousMillis > interval) { if ((GSM.CheckStatus() != 1)) { // GPRS соединение не установлено! while (GSM.Init(PIN)<0); // Делаем инициализацию } GSM.WaitCall(); currentMillis = previousMillis = millis(); }
Для выполнения AT-команд из скетча используется функция WriteStr_P().
GSM.WriteStr_P(PSTR("AT\r\n"));