Как отправлять/принимать SMS и звонить с платой расширения SIM900 GSM Shield и Arduino

Добавлено 8 октября 2019 в 23:08

Хотите ли вы слышать то, что происходит в вашем доме, который находится на расстоянии многих километров от вас, или активировать систему полива в вашем саду просто беззвучным звонком, тогда плата расширения SIM900 GSM/GPRS Shield станет надежной отправной точкой для начала работы с IoT!

Как отправлять/принимать SMS и звонить с платой расширения SIM900 GSM Shield и Arduino
Как отправлять/принимать SMS и звонить с платой расширения SIM900 GSM Shield и Arduino

Плата расширения SIM900 GSM/GPRS Shield – это GSM-модем, который может быть интегрирован в большое количество проектов интернета вещей (IoT). Вы можете использовать эту плату расширения, чтобы выполнять почти все, что может обычный сотовый телефон; текстовые SMS сообщения, совершать или принимать телефонные звонки, выполнять подключение к интернету через GPRS, TCP/IP, и многое другое! В довершение всего, плата расширения поддерживает четырехдиапазонную сеть GSM/GPRS, что означает, что она работает практически в любой точке мира.

Содержание

Обзор аппаратного обеспечения SIM900 GSM/GPRS Shield

Плата расширения SIM900 GSM/GPRS Shield разработана для того, чтобы снабдить чип SIM900 всем необходимым для взаимодействия с Arduino, а также несколькими дополнительными вкусностями, чтобы воспользоваться уникальными функциями чипа.

Давайте познакомимся с особенностями и возможностями этой платы расширения. Вот краткий обзор:

Аппаратное обеспечение SIM900 GSM/GPRS Shield. Вид сверху
Рисунок 1 – Аппаратное обеспечение SIM900 GSM/GPRS Shield. Вид сверху
Аппаратное обеспечение SIM900 GSM/GPRS Shield. Вид снизу
Рисунок 2 – Аппаратное обеспечение SIM900 GSM/GPRS Shield. Вид снизу

Плата расширения SIM900 GSM/GPRS Shield обладает удивительным количеством функций при своих маленьких размерах. Некоторые из них перечислены ниже:

  • Поддержка четырех диапазонов: GSM850, EGSM900, DCS1800 и PCS1900
  • Подключение к любой глобальной сети GSM с любой 2G SIM картой
  • Совершение и прием голосовых звонков, используя внешний наушник и электретный микрофон
  • Отправка и получение SMS сообщений
  • Отправка и получение данных GPRS (TCP/IP, HTTP и т. д.)
  • Сканирование и прием FM радиопрограмм
  • Мощность передачи:
    • Класс 4 (2 Вт) для GSM850
    • Класс 1 (1 Вт) для DCS1800
  • Набор AT команд для управления через последовательный порт
  • Разъемы U.FL и SMA для сотовой антенны
  • Работа с полноразмерной SIM картой

Для получения дополнительной информации о чипе сотовой GSM связи SIM900 смотрите техническое описание:

Светодиодные индикаторы состояния

На плате расширения SIM900 GSM/GPRS Shield есть три светодиода, которые указывают на состояние подключения или питания. Наблюдая за этими светодиодами, вы можете получить визуальную информацию о том, что происходит с платой расширения.

Светодиодные индикаторы на SIM900 GSM/GPRS Shield
Рисунок 3 – Светодиодные индикаторы на SIM900 GSM/GPRS Shield

PWR: этот светодиод подключен к линии питания платы расширения. Если этот светодиод включен, плата расширения получает питание.

Status: этот индикатор показывает рабочее состояние SIM900. Если этот светодиод включен, микросхема находится в рабочем режиме.

Netlight: этот индикатор показывает состояние подключения к сотовой сети. Он будет мигать с разной скоростью, чтобы показать, в каком оно состоянии.

  • выкл.: чип SIM900 не работает;
  • вкл. 64 мс, выкл. 800 мс: чип SIM900 работает, но еще не зарегистрирован в сотовой сети;
  • вкл. 64 мс, выкл. 3 с: чип SIM900 зарегистрирован в сотовой сети и может отправлять/получать SMS сообщения и звонки.
  • вкл. 64 мс, выкл. 300 мс: соединение для передачи данных через GPRS, которое вы запросили, активно.

Питание для SIM900 GSM/GPRS Shield

Одной из наиболее важных частей работы платы расширения SIM900 GSM/GPRS Shield является обеспечение её достаточным питанием.

В зависимости от того, в каком состоянии он находится, SIM900 может быть относительно энергоемким устройством. Максимальный ток потребления чипа составляет около 2А во время передачи. Обычно он не требует так много, но может потребовать около 216 мА во время телефонных звонков или 80 мА во время передачи по сети. Следующая таблица описывает, что вы можете ожидать:

Потребление тока чипом SIM900 в различных состояниях
РежимЧастотаПотребляемый ток
Выключен 60 мкА
Спящий режим 1 мА
Режим ожидания 18 мА
ЗвонокGSM850199 мА
EGSM900216 мА
DCS1800146 мА
PCS1900131 мА
GPRS 453 мА
Старт передачи 2 А

Рабочее напряжение чипа SIM900 составляет от 3,4 до 4,4 В. Чтобы обеспечить безопасное напряжение питания при 4,1 В, плата расширения поставляется с мощным, высокоточным стабилизатором напряжения MIC29302WU с малым падением напряжения от Micrel, способным выдерживать токи нагрузки до 3 А.

Разъем питания постоянным напряжением, переключатель выбора источника питания и MIC29302 на SIM900 GSM Shield
Рисунок 4 – Разъем питания постоянным напряжением, переключатель выбора источника питания и MIC29302 на SIM900 GSM Shield

Вы можете подключить к плате расширения внешний источник питания с помощью разъема 5,5 мм, к которому можно подключить любой адаптер постоянного напряжения 5–9 В. Рядом с разъемом питания находится ползунковый переключатель для выбора источника питания с надписью EXTERN. Чтобы использовать внешний источник питания, переместите ползунок, как показано выше.

ВНИМАНИЕ

Источник питания должен обеспечивать минимальный пиковый ток 2 А, в противном случае микросхема будет продолжать отключаться.

Связь через UART

Плата расширения SIM900 GSM/GPRS Shield для связи с Arduino использует интерфейс UART. Чип поддерживает скорость передачи от 1200 бит/с до 115200 бит/с с автоматическим определением скорости.

Перемычка выбора UART на SIM900 GSM Shield
Рисунок 5 – Перемычки выбора UART на SIM900 GSM Shield

С помощью перемычек вы можете подключить (RX, TX) платы расширения к программному последовательному порту (D8, D7) или аппаратному последовательному порту (D1, D0) Arduino.

Установка перемычек выбора UART на SIM900 GSM Shield
Рисунок 6 – Установка перемычек выбора UART на SIM900 GSM Shield

Динамик и микрофон

Плата расширения поставляется с двумя стандартными разъемами 3,5 мм. Один для стереонаушников, и другой для монофонического микрофона. Плата позволяет использовать аудиоинтерфейс SIM900 для совершения и приема голосовых вызовов и прослушивания FM радио.

Динамик и микрофон на SIM900 GSM Shield
Рисунок 7 – Разъемы динамика и микрофона на SIM900 GSM Shield

Mic: к этому разъему можно подключить внешний электретный микрофон.

Earphone: к этому разъему можно подключить наушники. Все наушники, совместимые с "iPhone" или "Android" телефонами, должны работать.

Антенна

Антенна необходима для использования SIM900 для любого типа передачи голоса или данных, а также для некоторых команд SIM.

Антенный SMA и U.FL. разъем на SIM900 GSM Shield
Рисунок 8 – Антенные SMA и U.FL. разъемы на SIM900 GSM Shield

Плата расширения имеет два интерфейса для подключения антенны, а именно, разъем U.FL и разъем SMA. Они соединены через патч-корд.

Плата расширения обычно поставляется с GSM-антенной 3 дБи, что позволяет установить плату расширения внутри металлического корпуса (если антенна находится снаружи).

Разъем для SIM карты

На нижней стороне платы находится гнездо для SIM карты. Любая активированная полноразмерная 2G SIM карта будет работать отлично.

Держатель SIM карты на SIM900 GSM Shield
Рисунок 9 – Держатель SIM карты на SIM900 GSM Shield

Работа с держателем для SIM карты может потребовать некоторого привыкания. Чтобы разблокировать защелку, нажмите на верхнюю часть сборки, а затем поднимите её. Поместите SIM-карту в нижнюю часть держателя. Затем положите руку обратно в корпус держателя и осторожно протолкните его вперед в положение блокировки.

RTC (часы реального времени)

Плата расширения SIM900 GSM/GPRS Shield может быть настроена на сохранение времени. Таким образом, нет необходимости в отдельном RTC. Она сохранит время даже при выключенном питании.

Рисунок 10 Держатель батареи CR1220 RTC на SIM900 GSM Shield
Рисунок 10 – Держатель батареи CR1220 RTC на SIM900 GSM Shield

Если вы хотите использовать внутренний RTC, вам необходимо установить батарею CR1220 на задней стороне платы.

ПРИМЕЧАНИЕ

Ваш оператор сети может не поддерживать установку времени автоматически. В этом случае вы можете сделать это вручную, используя AT команду AT+CCLK.

Подключение платы расширения SIM900 GSM/GPRS Shield к Arduino UNO

Теперь, когда мы знаем всё о плате расширения, мы можем подключить её к нашей плате Arduino!

Для начала подключите контакты D7 (Tx) и D8 (Rx) на плате расширения к цифровым выводам 7 и 8 на Arduino. Поскольку для связи с платой расширения мы будем использовать программный последовательный порт, убедитесь, что перемычки установлены на выбор программного последовательного порта.

Подключение платы расширения SIM900 GSM/GPRS Shield к Arduino UNO
Рисунок 11 – Подключение платы расширения SIM900 GSM/GPRS Shield к Arduino UNO

Подключите плату расширения к внешнему источнику питания 5В 2A. Не поддавайтесь искушению подключить ее к источнику питания 5В на Arduino, так как плата расширения может не работать из-за недостатка тока источника питания. Также убедитесь, что вы выбрали внешний источник питания с помощью ползункового переключателя рядом с разъемом питания.

Теперь подключите все земли в схеме.

Наконец, подключите антенну, вставьте полностью активированную SIM карту в держатель.

Подключение платы расширения SIM900 GSM/GPRS Shield к компьютеру

Чтобы управлять платой расширения SIM900 GSM/GPRS Shield напрямую через компьютер, вам необходимо подключить её к ПК с помощью любого преобразователя USB в TTL.

На рисунке ниже показано, как SIM900 GSM Shield подключен к компьютеру через PL2303 конвертер USB в TTL.

Подключение SIM900 GSM Shield к ПК через преобразователь PL2303 USB-TTL
Рисунок 12 – Подключение SIM900 GSM Shield к ПК через преобразователь PL2303 USB↔TTL

Включение/выключение чипа SIM900

Даже если вы включите плату расширения, вам нужно еще включить чип SIM900, чтобы он заработал.

В соответствии с техническим описанием, установив на выводе PWRKEY чипа низкий логический уровень (лог. 0) в течение как минимум 1 секунды, можно включить/выключить чип. У нашей платы расширения есть два способа сделать это.

Аппаратный запуск

Кнопка включения/выключения чипа SIM900
Рисунок 13 – Кнопка включения/выключения чипа SIM900

Плата расширения снабжена тактильной кнопкой, расположенной под прямым углом рядом со светодиодным индикатором PWR. Вам нужно нажать и удерживать эту кнопку в течение примерно 2 секунд, чтобы включить или выключить плату расширения.

Программный запуск

Вместо того, чтобы каждый раз вручную нажимать PWRKEY, вы можете программно включать/выключать SIM900.

Во-первых, вам нужно запаять SMD перемычку, обозначенную как R13 на плате расширения, как показано на рисунке ниже.

Запаиваемая перемычка R13 на SIM900 GSM Shield для программного управления
Рисунок 14 – Запаиваемая перемычка R13 на SIM900 GSM Shield для программного управления

Затем вам нужно подключить вывод D9 на плате расширения к выводу D9 на Arduino.

Подключение SIM900 GSM Shield к Arduino для программного управления
Рисунок 15 – Подключение SIM900 GSM Shield к Arduino для программного управления

Наконец, вам нужно добавить следующую функцию в вашу программу.

void SIM900power()
{
  pinMode(9, OUTPUT);
  digitalWrite(9,LOW);
  delay(1000);
  digitalWrite(9,HIGH);
  delay(2000);
  digitalWrite(9,LOW);
  delay(3000);
}

Код Arduino – тестирование AT команд

Для отправки AT команд и взаимодействия с платой расширения SIM900 мы будем использовать монитор последовательного порта. Приведенный ниже скетч позволит Arduino связываться с платой расширения SIM900 в мониторе последовательного порта. Прежде чем приступить к подробному разбору кода, подключите Arduino к компьютеру, скомпилируйте приведенный ниже код и загрузите его в Arduino.

Открыв монитор последовательного порта, убедитесь, что выбрана опция "NL & CR"!

#include <SoftwareSerial.h>

// Создать объект программного последовательного порта для связи с SIM900
// Tx и Rx SIM900 подключены к выводам 7 и 8 Arduino
SoftwareSerial mySerial(7, 8);

void setup()
{
  // Начать последовательную связь Arduino и Arduino IDE (монитор последовательного порта)
  Serial.begin(9600);
  
  // Начать последовательную связь Arduino и SIM900
  mySerial.begin(9600);

  Serial.println("Initializing...");
  delay(1000);

  // Рукопожатие с SIM900
  mySerial.println("AT");
  updateSerial();
  // Тест качества сигнала, диапазон значений 0-31, 31 - лучший
  mySerial.println("AT+CSQ");
  updateSerial();
  // Прочитать информацию о SIM карте, чтобы убедиться, что SIM карта подключена
  mySerial.println("AT+CCID");
  updateSerial();
  // Проверяем, зарегистрирован ли модуль в сети
  mySerial.println("AT+CREG?");
  updateSerial();
}

void loop()
{
  updateSerial();
}

void updateSerial()
{
  delay(500);
  while (Serial.available()) 
  {
    // Пересылка того, что было получено с аппаратного последовательного порта, 
    // на программный последовательный порт
    mySerial.write(Serial.read());
  }
  while(mySerial.available()) 
  {
    // Пересылка того, что было получено с программного последовательного порта, 
    // на аппаратный последовательный порт
    Serial.write(mySerial.read());
  }
}

Скетч начинается с включения библиотеки SoftwareSerial.h и ее инициализации выводами Arduino, к которым подключены Tx и Rx платы расширения SIM900.

#include <SoftwareSerial.h>

// Создать объект программного последовательного порта для связи с SIM900
// Tx и Rx SIM900 подключены к выводам 7 и 8 Arduino
SoftwareSerial mySerial(7, 8);

В функции setup() мы инициализируем последовательные каналы связи между Arduino и Arduino IDE, Arduino и платой расширения SIM900 со скоростью передачи 9600 бод.

// Начать последовательную связь Arduino и Arduino IDE (монитор последовательного порта)
Serial.begin(9600);
  
// Начать последовательную связь Arduino и SIM900
mySerial.begin(9600);

Теперь, когда мы установили базовое соединение, мы попытаемся установить связь с платой расширения SIM900, отправляя AT команды.

AT – это самая базовая AT команда. Она также инициализирует автоматическое определение скорости. Если всё работает, вы должны увидеть эхо символов AT, а затем ОК, сообщающее, что все в порядке, и модуль вас правильно понимает! Затем вы можете отправить несколько команд для запроса и получения информации о плате расширения, таких как:

AT+CSQ – проверить «уровень сигнала» - первое число – это уровень в дБ, он должен быть выше 5. Чем выше, тем лучше. Конечно, это зависит от вашей антенны и местоположения!

AT+CCID – получить номер SIM-карты – она проверяет, что SIM карта найдена, и вы можете сверить номер, записанный на карте.

AT+CREG? – убедиться, что вы зарегистрированы в сети. Второе число должно быть 1 или 5. 1 означает, что вы зарегистрированы в домашней сети, а 5 – в роуминге. Другие цифры, отличающиеся этих двух, означают, что вы не зарегистрированы ни в одной сети.

// Рукопожатие с SIM900
mySerial.println("AT");
updateSerial();
// Тест качества сигнала, диапазон значений 0-31, 31 - лучший
mySerial.println("AT+CSQ");
updateSerial();
// Прочитать информацию о SIM карте, чтобы убедиться, что SIM карта подключена
mySerial.println("AT+CCID");
updateSerial();
// Проверяем, зарегистрирован ли модуль в сети
mySerial.println("AT+CREG?");
updateSerial();

В основном цикле программы мы вызываем пользовательскую функцию updateSerial(), которая непрерывно ожидает любые входные данные от последовательного монитора и отправляет их на плату расширения SIM900 через вывод D8 (Rx платы расширения). Она также постоянно читает вывод D7 (Tx платы расширения) на случай, если плата расширения выдает какие-либо отклики.

void updateSerial()
{
  delay(500);
  while (Serial.available()) 
  {
    // Пересылка того, что было получено с аппаратного последовательного порта, 
    // на программный последовательный порт
    mySerial.write(Serial.read());
  }
  while(mySerial.available()) 
  {
    // Пересылка того, что было получено с программного последовательного порта, 
    // на аппаратный последовательный порт
    Serial.write(mySerial.read());
  }
}

В мониторе последовательного порта вы должны увидеть вывод, примерно такой как показан ниже.

Базовые AT команды SIM900 GSM Shield на Arduino
Рисунок 16 – Базовые AT команды SIM900 GSM Shield на Arduino

Теперь вы можете свободно отправлять любые команды через монитор последовательного порта, например, те, которые показаны ниже, и которые дает дополнительную информацию о подключении к сети и состоянии аккумулятора:

ATI – получить имя и версию платы расширения

AT+COPS? – проверить, что вы подключены к сети

AT+COPS=? – вернуть список операторов, присутствующих в сети

AT+CBC – вернуть состояние литий-полимерного аккумулятора. Второе число является процентом от полного заряда (в данном случае это 93%), а третье число является фактическим напряжением в мВ (в данном случае 3,877 В)

Получение дополнительной информации от SIM900 GSM Shield с помощью AT команд на Arduino
Рисунок 17 – Получение дополнительной информации от SIM900 GSM Shield с помощью AT команд на Arduino

Для получения дополнительной информации о AT командах SIM900 смотрите документ ниже.

Код Arduino – отправка SMS

Давайте перейдем к более интересным вещам. Запрограммируем нашу Arduino для отправки SMS на любой телефонный номер, который вы пожелаете. Прежде чем попробовать скетч, вам нужно ввести номер телефона. Найдите строку ZZxxxxxxxxxx и замените ZZ кодом страны, а xxxxxxxxxx – 10-значным номером телефона.

#include <SoftwareSerial.h>

// Создать объект программного последовательного порта для связи с SIM900
// Tx и Rx SIM900 подключены к выводам 7 и 8 Arduino
SoftwareSerial mySerial(7, 8);

void setup()
{
  // Начать последовательную связь Arduino и Arduino IDE (монитор последовательного порта)
  Serial.begin(9600);
  
  // Начать последовательную связь Arduino и SIM900
  mySerial.begin(9600);

  Serial.println("Initializing...");
  delay(1000);

  // Рукопожатие с SIM900
  mySerial.println("AT");
  updateSerial();
  // Настройка текствого режима
  mySerial.println("AT+CMGF=1");
  updateSerial();
  // замените ZZ кодом страны, а xxxxxxxxxxx номером телефона для отправки sms
  mySerial.println("AT+CMGS=\"+ZZxxxxxxxxxx\"");
  updateSerial();
  // текстовый контент
  mySerial.print("Last Minute Engineers | lastminuteengineers.com");
  updateSerial();
  mySerial.write(26);
}

void loop()
{
}

void updateSerial()
{
  delay(500);
  while (Serial.available()) 
  {
    // Пересылка того, что было получено с аппаратного последовательного порта, 
    // на программный последовательный порт
    mySerial.write(Serial.read());
  }
  while(mySerial.available()) 
  {
    // Пересылка того, что было получено с программного последовательного порта, 
    // на аппаратный последовательный порт
    Serial.write(mySerial.read());
  }
}

Скетч почти такой же, как и предыдущий, за исключением фрагмента кода, приведенного ниже. Как только соединение установлено, мы отправляем показанные ниже AT команды:

AT+CMGF=1 – выбирает формат SMS сообщения в виде текста. По умолчанию используется формат PDU (Protocol Data Unit).

AT+CMGS=+ZZxxxxxxxxxx – отправляет SMS на указанный номер телефона. Введенное текстовое сообщение, за которым следует символ Ctrl + z, рассматривается как SMS. Ctrl + z на самом деле является 26-м непечатным символом, описанным как «заменитель» в таблице ASCII. Итак, нам нужно отправить 26dec (1Ahex) сразу после отправим текста сообщения.

// Настройка текствого режима
mySerial.println("AT+CMGF=1");
updateSerial();
// замените ZZ кодом страны, а xxxxxxxxxxx номером телефона для отправки sms
mySerial.println("AT+CMGS=\"+ZZxxxxxxxxxx\"");
updateSerial();
// текстовый контент
mySerial.print("Last Minute Engineers | lastminuteengineers.com");
updateSerial();
mySerial.write(26);

Основной цикл программы остается пустым, так как мы хотим отправить SMS только один раз. Если вы хотите отправить SMS еще раз, просто нажмите клавишу RESET на вашей Arduino. На скриншоте ниже показано SMS сообщение, отправленное с платы расширения SIM900 GSM/GPRS Shield.

AT команды SIM900 GSM Shield для отправки SMS на Arduino
Рисунок 18 – AT команды SIM900 GSM Shield для отправки SMS на Arduino
Отправка SMS через SIM900 GSM Shield
Рисунок 19 – Отправка SMS через SIM900 GSM Shield

Код Arduino – чтение SMS

Теперь давайте запрограммируем нашу Arduino для чтения входящих сообщений. Этот скетч очень полезен, когда вам нужно инициировать действие при получении определенного SMS сообщения. Например, когда Arduino получает SMS, вы можете дать ей команду включить или выключить реле. Вы поняли идею!

#include <SoftwareSerial.h>

// Создать объект программного последовательного порта для связи с SIM900
// Tx и Rx SIM900 подключены к выводам 7 и 8 Arduino
SoftwareSerial mySerial(7, 8);

void setup()
{
  // Начать последовательную связь Arduino и Arduino IDE (монитор последовательного порта)
  Serial.begin(9600);
  
  // Начать последовательную связь Arduino и SIM900
  mySerial.begin(9600);

  Serial.println("Initializing...");
  delay(1000);

  // Рукопожатие с SIM900
  mySerial.println("AT");
  updateSerial();
  // Настройка текствого режима
  mySerial.println("AT+CMGF=1");
  updateSerial();
  // Решает, как следует обрабатывать новые входящие SMS сообщения
  mySerial.println("AT+CNMI=1,2,0,0,0");
  updateSerial();
}

void loop()
{
  updateSerial();
}

void updateSerial()
{
  delay(500);
  while (Serial.available()) 
  {
    // Пересылка того, что было получено с аппаратного последовательного порта, 
    // на программный последовательный порт
    mySerial.write(Serial.read());
  }
  while(mySerial.available()) 
  {
    // Пересылка того, что было получено с программного последовательного порта, 
    // на аппаратный последовательный порт
    Serial.write(mySerial.read());
  }
}

Данный скетч аналогичен предыдущему, за исключением приведенного ниже фрагмента кода. Как только соединение установлено, мы отправляем следующие AT команды:

AT+CMGF=1 – выбирает формат SMS сообщения в виде текста. По умолчанию используется формат PDU (Protocol Data Unit).

AT+CNMI=1,2,0,0,0 – указывает, как должны обрабатываться новые входящие SMS сообщения. Таким образом, вы можете указать плате расширения SIM900 либо пересылать новые входящие SMS сообщения непосредственно на компьютер, либо сохранять их в хранилище сообщений, а затем уведомлять компьютер об их расположении в хранилище сообщений.

Отклик на получение сообщения начинается с +CMT: все поля в ответе разделены запятыми. Первое поле является номером телефона. Второе поле – имя человека, отправившего SMS. Третье поле – это временная метка, а четвертое поле – само сообщение.

// Настройка текствого режима
mySerial.println("AT+CMGF=1");
updateSerial();
// Решает, как следует обрабатывать новые входящие SMS сообщения
mySerial.println("AT+CNMI=1,2,0,0,0");
updateSerial();

Обратите внимание, что на этот раз мы НЕ оставили функцию loop() пустой, так как запрашиваем новые входящие SMS сообщения. Как только вы отправите SMS на плату расширения SIM900 GSM/GPRS Shield, вы увидите следующий вывод на мониторе последовательного порта.

Чтение SMS через SIM900 GSM Shield
Рисунок 20 – Чтение SMS через SIM900 GSM Shield
AT команды SIM900 GSM Shield для чтения SMS на Arduino
Рисунок 21 – AT команды SIM900 GSM Shield для чтения SMS на Arduino

Расширение размера буфера SoftwareSerial на Arduino

Если ваше сообщение достаточно длинное, как и наше, вы, вероятно, получите его с пропущенными символами. Это не из-за неисправного кода. Ваш буфер приема SoftwareSerial заполняется и отбрасывает символы. А вы не читаете из буфера достаточно быстро.

Самое простое решение – увеличить размер буфера SoftwareSerial со стандартного размера с 64 до 256 байт (или меньше, в зависимости от того, что у вас заработает).

На компьютере с Windows перейдите в C:\Program Files (x86) → Arduino → hardware → Arduino → avr → libraries → SoftwareSerial (→ src для более новой версии Arduino IDE). Откройте SoftwareSerial.h и измените строку:

// RX buffer size
#define _SS_MAX_RX_BUFF 64

на

// RX buffer size
#define _SS_MAX_RX_BUFF 256

Сохраните файл и попробуйте скомпилировать скетч еще раз.

Расширение размера буфера SoftwareSerial на Arduino
Рисунок 22 – Расширение размера буфера SoftwareSerial на Arduino

Код Arduino – выполнение звонка

Теперь давайте запрограммируем нашу Arduino на выполнение вызова. Этот скетч очень полезен, если вы хотите, чтобы ваша Arduino совершила аварийный вызов (SOS) в случае чрезвычайной ситуации, например, при превышении температуры или при проникновении кого-либо в ваш дом. Вы поняли идею!

Прежде чем попробовать скетч, вам нужно ввести номер телефона. Найдите строку ZZxxxxxxxxxx и замените ZZ кодом страны, а xxxxxxxxxx – 10-значным номером телефона.

#include <SoftwareSerial.h>

// Создать объект программного последовательного порта для связи с SIM900
// Tx и Rx SIM900 подключены к выводам 7 и 8 Arduino
SoftwareSerial mySerial(7, 8);

void setup()
{
  // Начать последовательную связь Arduino и Arduino IDE (монитор последовательного порта)
  Serial.begin(9600);
  
  // Начать последовательную связь Arduino и SIM900
  mySerial.begin(9600);

  Serial.println("Initializing...");
  delay(1000);

  // Рукопожатие с SIM900
  mySerial.println("AT");
  updateSerial();
  
  // замените ZZ кодом страны, а xxxxxxxxxxx номером телефона для звонка
  mySerial.println("ATD+ +ZZxxxxxxxxxx;");
  updateSerial();
  delay(20000); // ждать 20 секунд...
  mySerial.println("ATH"); // повесить трубку
  updateSerial();
}

void loop()
{
}

void updateSerial()
{
  delay(500);
  while (Serial.available()) 
  {
    // Пересылка того, что было получено с аппаратного последовательного порта, 
    // на программный последовательный порт
    mySerial.write(Serial.read());
  }
  while(mySerial.available()) 
  {
    // Пересылка того, что было получено с программного последовательного порта, 
    // на аппаратный последовательный порт
    Serial.write(mySerial.read());
  }
}

Для осуществления вызова используются следующие AT команды:

ATD+ +ZZxxxxxxxxxx; - набрать указанный номер. Модификатор точка с запятой ; в конце разделяет строку набора на несколько команд набора. Все, кроме последней команды, должны заканчиваться модификатором точка с запятой ;.

ATH – повесить трубку

// замените ZZ кодом страны, а xxxxxxxxxxx номером телефона для звонка
mySerial.println("ATD+ +ZZxxxxxxxxxx;");
updateSerial();
delay(20000); // ждать 20 секунд...
mySerial.println("ATH"); // повесить трубку
updateSerial();

На скриншоте ниже показан звонок с платы расширения SIM900 GSM/GPRS Shield.

Рисунок 23 AT команды SIM900 GSM Shield для звонка на Arduino
Рисунок 23 – AT команды SIM900 GSM Shield для звонка на Arduino
Рисунок 24 Прием звонка от SIM900 GSM Shield
Рисунок 24 – Прием звонка от SIM900 GSM Shield

Код Arduino – прием вызова

Прием звонка не требует специального кода; вы просто должны продолжать слушать плату расширения SIM900. Тем не менее, вы можете найти этот скетч очень полезным, когда вам нужно инициировать действие при получении звонка с определенного номера телефона.

#include <SoftwareSerial.h>

// Создать объект программного последовательного порта для связи с SIM900
// Tx и Rx SIM900 подключены к выводам 7 и 8 Arduino
SoftwareSerial mySerial(7, 8);

void setup()
{
  // Начать последовательную связь Arduino и Arduino IDE (монитор последовательного порта)
  Serial.begin(9600);
  
  // Начать последовательную связь Arduino и SIM900
  mySerial.begin(9600);

  Serial.println("Initializing..."); 
}

void loop()
{
  updateSerial();
}

void updateSerial()
{
  delay(500);
  while (Serial.available()) 
  {
    // Пересылка того, что было получено с аппаратного последовательного порта, 
    // на программный последовательный порт
    mySerial.write(Serial.read());
  }
  while(mySerial.available()) 
  {
    // Пересылка того, что было получено с программного последовательного порта, 
    // на аппаратный последовательный порт
    Serial.write(mySerial.read());
  }
}

Входящий вызов обычно обозначается как "RING" в мониторе последовательного порта, за которым следуют номер телефона и идентификатор звонящего. Чтобы принять или сбросить вызов, используются следующие AT команды:

ATA – принимает входящий звонок.

ATH – сбрасывает звонок. При прекращении вызова в монитор последовательного порта отправляется сообщение NO CARRIER, указывающее, что вызов не может соединиться.

Ниже приведен вывод в мониторе последовательного порта, показывающий вызов, полученный платой расширения SIM900 GSM/GPRS Shield.

Рисунок 25 Звонок на SIM900 GSM Shield
Рисунок 25 – Звонок на SIM900 GSM Shield
Рисунок 26 AT команды SIM900 GSM Shield для приема вызова на Arduino
Рисунок 26 – AT команды SIM900 GSM Shield для приема вызова на Arduino

Теги

ArduinoArduino ShieldGSM модульMCUSIM900SIMcomМикроконтроллерПлата расширения

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.


  • 2021-11-25Алексей

    как определить что после выполнения звонка на телефоне снята трубка. (Ардуино и SIM 800L).

  • 2021-11-25Алексей

    Как определить после выполнения звонка, что на телефоне снята трубка.

  • 2021-04-15antzol

    Просто отслеживать в принимаемых данных по UART появление символов +CMT (подробнее описано под скетчем приема SMS), получать само сообщение, а потом вызывают соответствующую функцию-обработчик.

  • 2021-04-13Сергей

    Возможно ли реализовать в одном скетче и чтение смс, и отправку? Нужно как-то разделить, чтобы отправляемая смс не воспринималась как получаемая, или наоборот. Как это правильнее сделать?

  • 2021-04-10antzol

    Это пользовательская функция, которая просто пересылает данные между аппаратным и программным UART'ами. Чуть более подробно расписано над рисунком 16.

  • 2021-04-09Иван В

    updateSerial() что за строка а то негде не могу найти информацию по ней.

  • 2020-05-03radioprog

    Спасибо. Всё исправлено.

  • 2020-05-02Александр Абрамов

    В скетче Выполнение звонка ошибка. После 19 строки нужно добавить updateSerial();