Arduino gsm проекты
Источник: robotchip.ru
GSM GPRS в Arduino
Модули GSM GPRS
GSM модуль используется для расширения возможностей обычных плат Ардуино – отправка смс, совершение звонков, обмен данными по GPRS. Существуют различные виды модулей, наиболее часто используемые – SIM900, SIM800L, A6, A7.
Описание модуля SIM900
Модуль SIM900 используется в различных автоматизированных системах. С помощью интерфейса UART осуществляется обмен данными с другими устройствами. Модуль обеспечивает возможность совершения звонков, обмен текстовыми сообщениями. Работа модуля релизуется на компоненте SIM900, созданным фирмой SIMCom Wireless Solution.
Технические характеристики:
- Диапазон напряжений 4,8-5,2В;
- В обычном режиме ток достигает 450 мА, максимальный ток в импульсном режиме 2 А;
- Поддержка 2G;
- Мощность передачи: 1 Вт 1800 и 1900 МГц, 2 Вт 850 и 900 МГц;
- Имеются встроенные протоколы TCP и UDP;
- GPRS multi-slot class 10/8;
- Рабочая температура от -30С до 75С.
С помощью устройства можно отслеживать маршрут транспорта совместно с ГЛОНАСС или GPS устройством. Возможность отправки смс-сообщений используется в беспроводной сигнализации и различных охранных системах.
Описание модуля SIM800L
Модуль выполнен на основе компонента SIM800L и используется для отправки смс, реализации звонков и обмена данными по GPRS. В модуль устанавливается микро сим карта. Устройство обладает встроенной антенной и разъемом, к которому можно подключать внешнюю антенну. Питание к модулю поступает от внешнего источника либо через DC-DC преобразователь. Управление осуществляется с помощью компьютера через UART, Ардуино, Raspberry Pi или аналогичные устройства.
Технические характеристики:
- Диапазон напряжений 3,7В – 4,2В;
- Поддержка 4х диапазонной сети 900/1800/1900 МГц;
- GPRS class 12 (85.6 кБ/с);
- Максимальный ток 500 мА;
- Поддержка 2G;
- Автоматический поиск в четырех частотных диапазонах;
- Рабочая температура от –30С до 75С.
Описание модуля A6
Модуль A6 разработан фирмой AI-THINKER в 2016 году. Устройство используется для обмена смс-сообщениями и обмена данными по GPRS. Плата отличается низким потреблением энергии и малыми размерами. Устройство полностью совместимо с российскими мобильными операторами.
Технические характеристики:
- Диапазон напряжений 4,5 – 5,5В;
- Питание 5В;
- Диапазон рабочих температур от -30С до 80С;
- Максимальное потребление тока 900мА;
- GPRS Class 10;
- Поддержка протоколов PPP, TCP, UDP, MUX.
Модуль поддерживает карты формата микросим.
Описание модуля A7
A7 является новейшим модулем от фирмы AI-THINKER. По сравнению со своим предшественником A6 имеет встроенный GPS, позволяющий упрощать конструкцию устройства.
Технические характеристики:
- Диапазон рабочих напряжений 3,3В-4,6В;
- Напряжение питания 5В;
- Частоты 850/900/1800/1900 МГц;
- GPRS Class 10: Макс. 85.6 кбит;
- Подавление эха и шумов.
Устройство поддерживает микросим карты. Модуль поддерживает обмен звонками, обмен смс-сообщениями, передачу данных по GPRS, прием сигналов по GPS.
Где купить GSM модули для ардуино
Традиционно, прежде чем начать, несколько советов и полезных ссылок на продавцов Aliexpress.
![]() |
![]() |
![]() |
![]() |
Подключение GSM GPRS шилда к Arduino
В этом разделе мы рассмотрим вопросы подключения GSM – модулей к плате адуино. За основу почти во всех примерах берется Arduino Uno, но в большинстве своем примеры пойдут и для плат Mega, Nano и т.д.
Подключение модуля SIM800
Для подключения нужны плата Ардуино, модуль SIM800L, понижающий преобразователь напряжения, провода для соединения и батарея на 12В. Модуль SIM800L требует нестандартное для ардуино напряжение в 3,7В, для этого нужен понижающий преобразователь напряжения.
Распиновка модуля SIM800 приведена на рисунке.
Плату Ардуино нужно подключить к компьютеру через USB кабель. Батарею на 12 В подключить через преобразователь: -12В на землю Ардуино, от земли в преобразователь в минус, +12В в преобразователь в плюс. Выходы с модуля TX и RX нужно подключить к пинам 2 и 3 на Ардуино. Несколько модулей можно подключать к любым цифровым пинам.
Подключение модуля A6
Модуль A6 стоит дешевле, чем SIM900, и его очень просто подключать к Ардуино. Модуль питается напряжением 5В, поэтому для соединения не нужны дополнительно понижающие напряжение элементы.
Для подключения потребуются плата Ардуино (в данном случае рассмотрена Arduino UNO), GSM модуль А6, соединительные провода. Схема подключения приведена на рисунке.
Вывод RX с модуля GSM нужно подключить к TX на плате Ардуино, вывод TX подключить к пину RX на Ардуино. Земля с модуля соединяется с землей на микроконтроллере. Вывод Vcc на GSM модуле нужно соединить с PWR_KEY.
Подключение с помощью GSM-GPRS шилда
Перед подключением важно обратить внимание на напряжение питания шилда. Ток в момент звонка или отправки данных может достигать значений в 15-2 А, поэтому не стоит запитывать шилд напрямую от Ардуино.
Перед подключением к Ардуино нужно установить сим-карту на GSM-GPRS шилд. Также нужно установить джамперы TX и RX, как показано на рисунке.
Подключение производится следующим образом – первый контакт (на рисунке желтый провод) с шилда нужно соединить с TX на Ардуино. Второй контакт (зеленый провод) подключается к RX на Ардуино. Земля с шилда соединяется с землей с аруино. Питание на микроконтроллер поступает через USB кабель.
Макет соединения шилда и платы Ардуино изображен на рисунке.
Для работы потребуется установить библиотеку GPRS_Shield_Arduino.
Для проверки правильности собранной схемы нужно сделать следующее: соединить на Ардуино RESET и GND (это приведет к тому, что данные будут передаваться напрямую от шилда к компьютеру), вставить сим-карту в шилд и включить питание шилда. Плату Ардуино нужно подключить к компьютеру и нажать кнопку включения. Если все соединено правильно, загорится красный светодиод и будет мигать зеленый.
Краткое описание взаимодействия через AT-команды
AT-команды – это набор специальных команд для модема, состоящий из коротких текстовых строк. Чтобы модем распознал поданную ему команду, строки должны начинаться с букв at. Строка будет восприниматься, когда модем находится в командном режиме. AT-команды можно отправлять как при помощи коммуникационного программного обеспечения, так и вручную с клавиатуры. Практические все команды можно разделить на 3 режима – тестовый, в котором модуль отвечает, поддерживает ли команду; чтение – выдача текущих параметров команды; запись – произойдет записывание новых значений.
Список наиболее используемых AT-команд:
- AT – для проверки правильности подключения модуля. Если все исправно, возвращается OK.
- A/ – повтор предыдущей команды.
- AT+IPR? – получение информации о скорости порта. Ответом будет +IPR: 0 OK (0 в данном случае – автоматически).
- AT+ICF? – настройка передачи. В ответ придет +ICF: бит, четность.
- AT+IFC? – контроль передачи. Ответом будет +IFC: терминал от модуля, модуль от терминала (0 – отсутствует контроль, 1 – программный контроль, 2 – аппаратный).
- AT+GCAP – показывает возможности модуля. Пример ответа – +GCAP:+FCLASS,+CGSM.
- AT+GSN – получение IMEI модуля. Пример ответа 01322600XXXXXXX.
- AT+COPS? – показывает доступные операторы.
- AT+CPAS – состояние модуля. Ответ +CPAS: 0. 0 – готовность к работе, 3 – входящий звонок, 4 – голосовое соединение, 2 – неизвестно.
- AT+CCLK? – информация о текущем времени и дате.
- AT+CLIP=1 – включение/выключение АОН. 1 – включен, 0 – выключен.
- AT+CSCB=0 – прием специальных смс-сообщений. 0 – разрешено, 1 – запрещено.
- AT+CSCS= “GSM” – кодирование смс-сообщения. Можно выбрать одну из следующих кодировок: IRA, GSM, UCS2, HEX, PCCP, PCDN, 8859-1.
- AT+CMEE=0 – получение информации об ошибке.
- AT+CPIN=XXXX – ввод пин-кода сим-карты.
- AT&F – сброс до заводских настроек.
- AT+CPOWD=1 – срочное(0) или нормальное(1) выключение модуля.
- ATD+790XXXXXXXX – звонок на номер +790XXXXXXXX.
- ATA – ответ на вызов.
- AT+CMGS=”+790XXXXXXXX”>Test sms – отправка смс-сообщения на номер +790XXXXXXXX.
В данном случае рассмотрены основные команды для модуля SIM900. Для разных модулей команды могут незначительно отличаться. Данные для модуля будут подаваться через специальную программу «терминал», которую нужно установить на компьютер. Также подавать команды модулю можно через монитор порта в Arduino IDE.
Скетчи для работы с модулем GSM
Отправка СМС на примере SIM900
Перед тем, как отправить сообщение, нужно настроить модуль. В первую очередь нужно перевести в текстовый формат передаваемое сообщение. Для этого существует команда AT+CMGF=1. Нужно перевести кодировку на GSM командой AT+CSCS=»GSM». Эта кодировка наиболее удобная, так как там символы представлены в ASCII коде, который легко понимает компилятор.
Затем нужно набрать смс-сообщение. Для этого посылается команда с номером абонента AT+CMGS=»+79XXXXXXXXX» r, в ответ предлагается набрать текст смс. Нужно выполнить отправку сообщения. По окончании требуется отправить код комбинации Ctrl+Z, модуль позволит отправку текста адресату. Когда сообщение будет отправлено, вернется OK.
Взаимодействие с модулем основано на индексах, которые присваиваются каждому новому сообщению. По этому индексу можно указать, какое из сообщений удалить или прочитать.
Получение смс. Для чтения смс-сообщения используется команда AT + CNMI = 2,2,0,0,0. Когда на модуль придет текстовое сообщение, он отправит в последовательный порт +CMTI: «SM»,2 (в данном случае 2 – порядковый номер сообщения). Чтобы его прочитать, нужно отправить команду AT+CMGR=2.
Прием голосового звонка. В первую очередь для разговора нужно подключить к модулю динамик и микрофон. При получении звонка будет показан номер, с которого он совершен. Для осуществления работы нужно включить библиотеку GSM:
#include <GSM.h>
Если сим-карта заблокирована, нужно ввести ее пин-код. Если пин-код не требуется, это поле нужно оставить пустым.
#define PINNUMBER “”
В setup() должна быть произведена инициализация передачи данных на компьютер. Следующим шагом будет создание локальной переменной, чтобы отследить статус подключения к сети. Скетч не будет запущен, пока сим-карта не подключена к сети.
boolean notConnected = true;
С помощью функции gsmAccess.begin() происходит подключение к сети. При установлении соединения вернется значение GSM_READY.
vcs.hangCall(); – функция, показывающая, что модем готов принимать звонки.
getvoiceCallStatus() – определяет статус скетча. Если кто-то звонит, она возвращает значение RECEIVINGCALL. Для записи номера нужно воспользоваться функцией retrieveCallingNumber(). Когда будет совершен ответ на звонок, вернется TALKING. Затем скетч будет ждать символа новой строки, чтобы прервать разговор.
Источник: ArduinoMaster.ru
Введение:
В этом уроке мы создадим систему удаленного управления домом по смс, используя GSM/GPRS Shield.
При получении смс устройство будет выполнять одну из указанных в смс функций, после чего уведомит вас об этом в ответной смс.
Видео:
Нам понадобится:
- 1х Piranha UNO
- 1х GSM/GPRS Shield;
- 1х Battery Shield;
- 2х Реле;
- 2х Силовой ключ;
- 1х Линейный привод 12В;
- 1х Светодиодная лента 12В;
- 1х Источник питания 12В;
- 1х Вентилятор(кулер) 12В;
- 2х Лампочка;
Для реализации проекта нам необходимо установить библиотеки:
- iarduino_GSM- для работы с GSM/GPRS Shield;
- Библиотеки SoftwareSerial входит в базовый набор Arduino IDE и не требует установки;
О том, как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE.
Описание работы системы удалённого управления:
- После подачи питания дождитесь получения смс с уведомлением о том, что инициализация прошла успешно и модем GSM зарегистрировался в сети. После этого устройство готово к работе.
- Устройство может принимать сообщения, содержащие параметры «Действие», «Устройство», «Яркость».
- Для управления устройством вам необходимо сформировать смс по следующему алгоритму:
- Основные функции:
- [ДЕЙСТВИЕ] [УСТРОЙСТВО];
- Дополнительные функции:
- [ЗНАЧЕНИЕ%]; — задаём значение ШИМ-сигнала для яркости/скорости;
- Основные функции:
- После правильно написанной и отправленной информации дождитесь обратного сообщения с уведомлением о том, что ваша команда прошла.
Схема сборки:
Arduino / Piranha UNO:

Batery Shield:
Установите Battery Shield на Arduino / Piranha UNO:
Во время установки Battery Shield должен быть в выключенном состоянии.

GSM/GPRS Shield:
На Battery Shield установите GSM/GPRS Shield A6:
На плате GSM/GPRS Shield A6 имеется слот для SIM-карт и переключатель UART. Установите SIM-карту в слот, выберите положение переключателя RX-7/TX-8.

Trema Shield:
На GSM/GPRS Shield A6 установите Trema Shield:

Линейный привод:
Подключим линейный привод к Trema Shield. Для этого необходимо 2 электромеханических реле подключить к выводу 4.
После этого установить перемычки согласно рисунку.
Далее подключить к реле линейный привод и подвести внешнее питание 12В.

Лампочки:
Подключите к выводу 2 и 3 Trema Shield 2 твердотельных реле.
Далее согласно схеме подключите к реле лампочки и питание 220В.
Будьте предельно внимательны и осторожны!

Светодиодная лента:
Подключите к 6 выводу Trema Shield Trema-модуль Силовой ключ, а к нему подключите светодиодную ленту, пустив провод питания ленты (красный) напрямую к источнику питания 12В, а провод GND ленты (чёрный) в разрыв через Trema-модуль Силовой ключ.

Вентилятор(кулер):
Подключите к 5 выводу Trema Shield Trema-модуль Силовой ключ, а к нему подключите вентилятор (кулер), пустив провод питания вентилятора (красный) напрямую к источнику питания 12В, а провод GND вентилятора (чёрный) в разрыв через Trema-модуль Силовой ключ.

Код программы (скетч):
В скетче используются библиотеки iarduino_GSM и SoftwareSerial.
// БИБЛИОТЕКИ #include <iarduino_GSM.h> // Подключаем библиотеку iarduino_GSM для работы с GSM/GPRS Shield. #include <SoftwareSerial.h> // Подключаем библиотеку SoftwareSerial для программной реализации шины UART. iarduino_GSM gsm; // Создаём объект gsm для работы с функциями и методами библиотеки iarduino_GSM. SoftwareSerial softSerial(7, 8); // Создаём объект softSerial для работы по программной шине UATR, указывая выводы RX и TX платы Arduino (выводы 7 и 8) // ПЕРЕМЕННЫЕ uint8_t Sum = 0; // Переменная для хранения процентного значения ШИМ-сигнала // Для отправки СМС о удачном запуске устройства, укажите в строке ниже номер телефона без пробелов. char SMSnum[13] = "7_ВАШ_НОМЕР_ТЕЛЕФОНА"; // Объявляем строку для хранения номера отправителя SMS сообщений. char SMStxt[161]; // Объявляем строку для хранения текста принятых SMS сообщений. String strSMStxt; // переменная типа String для более удобной работы uint8_t flgFunc; // флаг наличия действия uint8_t flgDev; // флаг наличия устройства uint8_t flgPWM; // флаг наличия ШИМ uint8_t lvlPWM; // Переменная количества символов в строке const char* Func[2][5] = {{"ВКЛЮЧИТЬ", "ВЫКЛЮЧИТЬ"}, // Двумерный массив с функциями и устройствами {"СВЕТ КУХНЯ" , "СВЕТ КОМНАТА", "ДВЕРЬ", "ВЕНТИЛЯТОР", "ПОДСВЕТКА"}}; // const char Pins[] = { 2, 3, 4, 5, 6 }; // Массив с номерами выводов устройств // void setup() { // // Инициируем GSM/GPRS Shield и проверяем его готовность к работе: gsm.begin(softSerial); // Инициируем работу GSM/GPRS Shield, указывая объект шины UART. while (gsm.status() != GSM_OK) { delay(1000); } // Ждём завершения регистрации модема в сети оператора связи. // Установка кодировки для символов Кириллицы: gsm.TXTsendCodingDetect("п"); // Выполняем автоопределение кодировки скетча для отправки текста на Русском языке. // Отправка сообщения об удачном запуске: gsm.SMSsend( F("Инициализация прошла успешно."), SMSnum); // Данная строка будет отвечать отправителю указанным SMS сообщением. // Настраиваем выводы pinMode(Pins[0], OUTPUT); // настройка вывода на работу в режиме выхода pinMode(Pins[1], OUTPUT); // настройка вывода на работу в режиме выхода pinMode(Pins[2], OUTPUT); // настройка вывода на работу в режиме выхода pinMode(Pins[3], OUTPUT); // настройка вывода на работу в режиме выхода pinMode(Pins[4], OUTPUT); // настройка вывода на работу в режиме выхода digitalWrite(Pins[0], LOW); // устанавливаем на выходе значение сигнала равным LOW digitalWrite(Pins[1], LOW); // устанавливаем на выходе значение сигнала равным LOW digitalWrite(Pins[2], LOW); // устанавливаем на выходе значение сигнала равным LOW digitalWrite(Pins[3], LOW); // устанавливаем на выходе значение сигнала равным LOW digitalWrite(Pins[4], LOW); // устанавливаем на выходе значение сигнала равным LOW flgFunc = 20; // Сбрасываем флаг flgDev = 20; // Сбрасываем флаг flgPWM = 0; // Сбрасываем флаг } // // void loop () { // if (millis() % 1000 < 100) { // Выполняем код в теле оператора if первые 100 мс каждой секунды. delay(100); // Устанавливаем задержку в 100 мс, чтоб не выполнить код более 1 раза за секунду. if (gsm.SMSavailable()) { // Функция SMSavailable() возвращает количество входящих непрочитанных SMS сообщений. gsm.SMSread(SMStxt, SMSnum); // Читаем SMS сообщение в ранее объявленные переменные (текст SMS сообщения, адрес отправителя, дата отправки, идентификатор SMS, количество SMS, номер SMS). strSMStxt = SMStxt; // Присваиваем массиву atrSMStxt значения массива SMStxt для дальнейшей проверки на совпадения for (int m = 0; m < (sizeof(Func[0]) / 2); m++) { // проверяем в цикле, совпадает ли команда из массива с тем, что пришло в СМС if (strSMStxt.indexOf(Func[0][m]) > -1 && *Func[0][m] != 0) { // если совпадения есть, то flgFunc = m; // присваиваем флагу порядковый номер совпавшего слова из массива Func for (int i = 0; i < (sizeof(Func[1]) / 2); i++) { // проверяем в цикле, совпадает ли имя устройства из массива с тем, что пришло в СМС if (strSMStxt.indexOf(Func[1][i]) > -1 && *Func[1][i] != 0) { // если совпадения есть и это не пустая строка, то flgDev = i; // присваиваем флагу порядковый номер совпавшего слова из массива Device if (strchr(SMStxt, '%')) { // проверяем, есть ли в тексте СМС символ % flgPWM = 1; // и если есть, то устанавливаем флаг } // } // } // } // } // if (flgPWM == 1) { // если установлен флаг flgPWM, то lvlPWM = uint8_t(strchr(SMStxt, '%' ) - SMStxt); // определяем количество символов в строке до совпадения с символом % if (SMStxt[lvlPWM - 1] >= '0' && SMStxt[lvlPWM - 1] <= '9') { // Проверяем, является ли символ, расположенный в строке на 1 позицию левее символа %, цифрой от 0 до 9, и если да, то Sum = uint8_t(SMStxt[lvlPWM - 1] - '0'); // прибавляем эту цифру к переменной (единицы) if (SMStxt[lvlPWM - 2] >= '0' && SMStxt[lvlPWM - 2] <= '9') { // Проверяем, является ли символ, расположенный в строке на 2 позиции левее символа %, цифрой от 0 до 9, и если да, то Sum += uint8_t((SMStxt[lvlPWM - 2] - '0') * 10); // прибавляем эту цифру к переменной, умножив на 10 (десятки) if (SMStxt[lvlPWM - 3] > '0' && SMStxt[lvlPWM - 3] <= '1') { // Проверяем, является ли символ, расположенный в строке на 3 позиции левее символа %, цифрой от 0 до 1, и если да, то Sum += uint8_t((SMStxt[lvlPWM - 3] - '0') * 100) ; // прибавляем эту цифру к переменной, умножив на 100 (сотни) } else // иначе проверяем, что if (SMStxt[lvlPWM - 3] >= '2' && SMStxt[lvlPWM - 3] <= '9') { // число "сотен" не больше 1, и если больше то flgPWM = 0; // сбрасываем флаг ШИМ } // } // } // } // if (flgFunc != 20) { // если флаг flgFunc установлен, то switch (flgFunc) { // проверяем значение флага flgFunc с определёнными в операторе case case 0: // Если 0 - значит указано действие ВКЛЮЧИТЬ if (flgDev != 20) { // Если установлен флаг наличия устройства, то if (flgPWM == 1) { // проверяем флаг ШИМ. Если он установлен, то uint8_t mapPWM = map(Sum, 0, 100, 0, 255); // переопределяем множество для ШИМ и analogWrite(Pins[flgDev], mapPWM ); // подаём ШИМ-сигнал на вывод и gsm.SMSsend(F("Процент задан!"), SMSnum); // отправляем сообщение об успешном выполнении. Sum = 0; // сбрасываем количество процентов для задания ШИМ-сигнала после выполнения flgPWM = 0; // сбрасываем флаг ШИМ после выполнения } // else { // Если же флага ШИМ нет, то digitalWrite(Pins[flgDev], HIGH); // подаём высокий сигнал на вывод для включения и gsm.SMSsend(F("Устройство включено!"), SMSnum); // отправляем сообщение об успешном выполнении. } // flgDev = 20; // сбрасываем флаг устройства после выполнения } else { // если в СМС не указано устройство, то gsm.SMSsend(F("Что включить?"), SMSnum); // отправляем об этом сообщение } // flgFunc = 20; // сбрасываем флаг действия после выполнения break; // case 1: // Если 1 - значит указано действие ВЫКЛЮЧИТЬ if (flgDev != 20) { // Если установлен флаг наличия устройства, то digitalWrite(Pins[flgDev], LOW); // подаём низкий сигнал на вывод для выключения gsm.SMSsend(F("Устройство выключено!"), SMSnum); // и отправляем сообщение об успешном выполнении. flgDev = 20; // сбрасываем флаг устройства после выполнения } else { // если в СМС не указано устройство, то gsm.SMSsend(F("Что выключить?"), SMSnum); // отправляем об этом сообщение } // flgFunc = 20; // сбрасываем флаг действия после выполнения break; // } // } else { // gsm.SMSsend(F("Ошибка в тексте!"), SMSnum); // Если текст пришёл не верный, то отправляем об этом сообщение } // } // } // } //
Алгоритм работы скетча:
До кода void setup()
определяются номера выводов, объявляются переменные и функции, подключаются библиотеки, и создаются объекты для работы с ними.
В коде void setup()
конфигурируются выбранные выводы, инициируется работа GSM/GPRS Shield, выполняется цикл ожидания готовности GSM/GPRS Shield к работе (регистрация в сети оператора). И после выполнения всех указанных действий выполняется оповещение о готовности к работе, путем отправки смс на указанный номер.
Код void loop()
выполняется только при получении смс сообщения. Сам блок разделён на две основные части: приём входящих сообщений и выполнение указанных в сообщении действий.
Приём входящих сообщений состоит из следующих действий:
- Считывание сообщения из памяти SIM-карты, после чего функция автоматически их оттуда удаляет.
- После считывания сообщения запускается цикл, в котором текст сообщения проверяется на наличие в нём управляющих команд;
- Если команда найдена, то внутри него запускается второй цикл, в котором текст так же проверяется, но уже на наличие в нём имени устройства;
- Если имя устройства найдено, то выполняется проверка на наличие дополнительного параметра, указанного с символом «
%
» — процент (от 0 до 100) яркости/скорости, с которым будет работать указанное устройство. - Если дополнительный параметр был указан, то ставится флаг о его наличии в полученном смс.
Выполнение указанных в сообщении действий:
- После того, как все флаги были выставлены, происходит проверка наличия флага дополнительного параметра. Если он присутствует, тогда выполняется вычисление значения числа, указанного перед символом
%
:- Для этого мы находим количество символов в строке, расположенных слева от символа
%
; - Полученное число покажет нам порядковый номер символа
%
в массивеstrSMStxt
; - Для того, чтобы узнать, какое значение было указано, проверим 3 ближайшие ячейки массива, расположенные слева от символа
%
:- Если 1 ячейка, расположенная ближе всего к символу %, содержит число от 0 до 9, то тогда мы заносим её значение в переменную
Sum
. Это будет разряд «единицы»; - После этого внутри первой проверки выполняется вторая проверка 2 ячейки на наличие числа от 0 до 9. Если число найдено, то оно умножается на 10 и прибавляется к переменной
Sum
. Это будет разряд «десятки»; - После этого внутри второй проверки производится третья проверка 3 ячейки. Если в ней найдена 1, то она умножается на 100 и прибавляется к переменной
Sum
. Это будет разряд «сотни». - Если же в третьей проверке окажется, что в «сотнях» указано больше 1, то флаг
flgPWM
будет сброшен;
- Если 1 ячейка, расположенная ближе всего к символу %, содержит число от 0 до 9, то тогда мы заносим её значение в переменную
- Для этого мы находим количество символов в строке, расположенных слева от символа
- Выполняется проверка наличия флага
flgFunc
:- Если флаг
flgFunc
был установлен, тогда выполняется проверка наличия флагаflgDev
:- Если флаг
flgDev
был установлен, тогда выполняется проверка наличия флагаflgPWM
:- Если флаг
flgPWM
установлен, тогда выполняется подача ШИМ-сигнала на вывод с указанным в сообщении устройством и отправка смс с уведомлением об успешном выполнении; - Если флаг
flgPWM
не установлен, тогда выполняется подача сигналаHIGH
на вывод с указанным устройством и отправка смс с уведомлением об успешном выполнении;
- Если флаг
- Если флаг
flgDev
не установлен, тогда производится отправка смс уведомления о том, что в сообщении не указано устройство;
- Если флаг
- Если флаг
flgFunc
не установлен, тогда производится отправка смс уведомления о том, что пришло ошибочное сообщение.
- Если флаг
Источник: lesson.iarduino.ru