Отправка и приём SMS и звонков с GSM-шилдом SIM900 и Arduino

Отправка и приём SMS и звонков с GSM-шилдом SIM900 и Arduino

Представьте, что вы можете следить за своим домом из любой точки, управлять поливом сада с помощью пропущенного звонка или получать текстовое сообщение сразу, когда кто-то входит в ваш дом — и всё это без дорогой системы безопасности. С GSM/GPRS-шилдом SIM900 вы можете воплотить эти идеи в реальность.

Шилд SIM900 — это GSM-модем, который добавляет сотовую связь к вашим проектам на Arduino. Как и ваш мобильный телефон, он может отправлять текстовые сообщения, совершать телефонные звонки и даже подключаться к интернету через GPRS. Независимо от того, создаёте ли вы систему домашней автоматизации, устройство экстренного оповещения или что-то, чем хотите управлять удалённо, этот шилд станет настоящей находкой.

В этом руководстве мы пошагово покажем, как подключить шилд SIM900 к Arduino. Вы узнаете, как правильно настроить и запитать шилд, чтобы он работал надёжно. Мы также покажем, как использовать шилд с Arduino для отправки и получения текстовых сообщений и даже как совершать и принимать телефонные звонки с помощью простого кода и команд.

Освоив эти навыки, вы будете готовы создавать собственные проекты с сотовой связью, удалённо управлять устройствами и максимально использовать возможности GSM-коммуникации. Давайте начнём!

Обзор оборудования

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

Давайте посмотрим, что умеет этот шилд:

Send Receive SMS & Call with SIM900 GSM Shield & Arduino Send Receive SMS & Call with SIM900 GSM Shield & Arduino

Шилд SIM900 обладает множеством полезных функций. Вот некоторые из важнейших:

  • Поддержка четырёх диапазонов: GSM850, EGSM900, DCS1800 и PCS1900

  • Подключение к любой глобальной GSM-сети с любой 2G SIM-картой

  • Совершение и приём голосовых вызовов через внешний наушник и электретный микрофон

  • Отправка и приём SMS-сообщений

  • Отправка и приём данных GPRS (TCP/IP, HTTP и т.д.)

  • Сканирование и приём FM-радиопередач

  • Мощность передачи: класс 4 (2 Вт) для GSM850

  • Класс 1 (1 Вт) для DCS1800

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

Шилд SIM900 имеет три полезных светодиода, показывающих, подключён ли он к сети и получает ли питание. Эти индикаторы помогают понять, что происходит с шилдом, просто взглянув на него.

Send Receive SMS & Call with SIM900 GSM Shield & Arduino

PWR LED: показывает, получает ли шилд питание.

Status LED: показывает рабочее состояние шилда. Когда этот индикатор горит, чип находится в рабочем режиме и функционирует нормально.

Netlight LED: мигает с разными паттернами, сообщая о подключении к сотовой сети:

  • ВЫКЛЮЧЕН: чип SIM900 только запускается (при условии наличия питания).

  • 64 мс вкл., 800 мс выкл.: чип SIM900 работает, но ещё не подключился к сотовой сети.

  • 64 мс вкл., 3 с выкл.: чип SIM900 успешно подключился к сотовой сети и может отправлять/принимать сообщения и звонки.

  • 64 мс вкл., 300 мс выкл.: GPRS-соединение для передачи данных активно и работает.

Обеспечение питания

Обеспечение достаточного питания шилда SIM900 — одна из самых важных составляющих его правильной работы.

SIM900 может потреблять значительную мощность в зависимости от режима работы. Например, ему нужно около 216 мА при звонке и около 80 мА при обычной сетевой связи. Но в определённые моменты, при передаче данных импульсами, ему может внезапно потребоваться до 2 А тока!

Эта таблица из технического описания показывает потребление мощности чипа в различных режимах.

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

Send Receive SMS & Call with SIM900 GSM Shield & Arduino

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

Предупреждение:

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

UART-связь

Шилд SIM900 общается с Arduino по протоколу UART. Он поддерживает скорость передачи данных от 1200 до 115200 бод. Однако вам не нужно беспокоиться о точной настройке скорости — SIM900 имеет функцию «автоопределения скорости передачи», то есть скорость первой команды «AT» после сброса установит скорость для всей последующей связи.

Send Receive SMS & Call with SIM900 GSM Shield & Arduino

На шилде есть перемычки выбора UART. Они позволяют выбрать, какие выводы шилд будет использовать для приёма (RX) и передачи (TX) данных. Два варианта:

  • Программный UART: выводы D8 и D7

  • Аппаратный UART: выводы D1 и D0

Send Receive SMS & Call with SIM900 GSM Shield & Arduino

Эта гибкость позволяет выбрать метод связи, наиболее подходящий для вашего проекта.

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

Шилд имеет два стандартных разъёма 3,5 мм — один для наушников, другой для микрофона. С их помощью можно совершать и принимать звонки, а также слушать FM-радио!

Send Receive SMS & Call with SIM900 GSM Shield & Arduino

Микрофон: Вы можете подключить любой внешний электретный микрофон напрямую в этот разъём. Никаких дополнительных деталей или схем не нужно — просто подключите, и он готов к работе.

Наушник: Любые наушники, работающие с iPhone или Android-телефонами, отлично подойдут. Их можно использовать для звонков или воспроизведения звука.

Антенна

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

Send Receive SMS & Call with SIM900 GSM Shield & Arduino

Шилд имеет два разъёма для антенны: U.FL и SMA. Они соединены между собой патч-кордом.

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

Слот для SIM-карты

На обратной стороне шилда находится разъём для SIM-карты. Подойдёт любая полноразмерная 2G SIM-карта.

Send Receive SMS & Call with SIM900 GSM Shield & Arduino

Использование слота для SIM-карты может показаться сложным, но вот как это сделать: чтобы разблокировать защёлку, сдвиньте верхнюю часть в положение «OPEN» и поднимите её. Поместите SIM-карту в подвижную часть. Опустите крышку обратно и аккуратно сдвиньте в положение «LOCK».

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

Кроме того, SIM900 имеет встроенные часы реального времени (RTC), поэтому отдельный модуль для отслеживания времени не нужен.

Send Receive SMS & Call with SIM900 GSM Shield & Arduino

Для использования этой функции нужно установить батарейку CR1220 на обратной стороне шилда. Эта батарейка обеспечивает работу часов даже при отсутствии основного питания.

Подключение GSM/GPRS-шилда SIM900 к Arduino

Теперь, когда вы знакомы с шилдом SIM900, пора подключить его к Arduino! Вот пошаговая инструкция.

Начните с установки шилда SIM900 поверх Arduino UNO.

Как вы знаете, SIM900 использует UART-связь. Здесь есть небольшая сложность: Arduino UNO имеет только один набор аппаратных UART-выводов (0 и 1), которые уже используются при подключении Arduino к компьютеру (при загрузке кода или просмотре сообщений в мониторе последовательного порта).

Для решения этой проблемы мы создадим второе UART-соединение с помощью обычных цифровых выводов (с использованием библиотеки SoftwareSerial). Найдите перемычку на шилде и установите её в положение «software serial port select». Это настраивает выводы 7 и 8 для работы как TX и RX для связи.

Это гарантирует, что SIM900 может общаться с Arduino, не мешая USB-соединению с компьютером.

Send Receive SMS & Call with SIM900 GSM Shield & Arduino

Важно отметить, что шилд SIM900 не будет работать правильно, если Arduino питается только через USB. SIM900 требует импульсы тока до 2 А, которые стандартное USB-подключение обеспечить не может. Если питание недостаточно, чип SIM900 будет перезагружаться каждый раз, когда ему нужно больше мощности.

Для предотвращения этого используйте внешний источник питания 5 В, способный обеспечить 2 А. Также убедитесь, что внешний источник выбран с помощью ползункового переключателя рядом с DC-разъёмом.

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

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

Важно отметить, что даже при наличии питания чип SIM900 не будет работать, пока его не включить. Это можно сделать двумя способами:

Вручную с помощью кнопки POWER

Send Receive SMS & Call with SIM900 GSM Shield & Arduino

Шилд имеет тактильную кнопку, подключённую к входу PWRKEY SIM900. Эта кнопка работает как кнопка питания на старых мобильных телефонах.

Если чип выключен, нажмите и удерживайте кнопку 1–2 секунды, затем отпустите для включения. Если чип включён, повторное нажатие и удержание 1–2 секунды выключит его.

Программно через код

Если вы не хотите каждый раз нажимать физическую кнопку, можно включать и выключать SIM900 через код Arduino.

Сначала нужно запаять SMD-перемычку с маркировкой «R13» на шилде. Это соединяет вывод D9 Arduino с кнопкой питания SIM900.

Send Receive SMS & Call with SIM900 GSM Shield & Arduino

После этого вы можете добавить код, который делает то же самое, что и нажатие физической кнопки:

digitalWrite(9,LOW);
delay(2000);
digitalWrite(9,HIGH);
delay(2000);

Код Arduino — Тестирование AT-команд

Настройка завершена, и ваш шилд SIM900 готов отправлять сообщения, совершать звонки или подключаться к интернету через сотовую сеть.

Начнём с тестирования AT-команд. Эти команды помогают общаться с шилдом и проверять его работоспособность. Для этого мы используем монитор последовательного порта в Arduino IDE.

Сначала подключите Arduino к компьютеру, скомпилируйте и загрузите код. Затем откройте монитор последовательного порта и выберите опцию «Both NL and CR».

#include <SoftwareSerial.h>

//Create software serial object to communicate with SIM900
SoftwareSerial mySerial(7, 8);  //SIM900 Tx & Rx is connected to Arduino #7 & #8

void setup() {
  //Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(9600);

  //Begin serial communication with Arduino and SIM900
  mySerial.begin(9600);

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

  mySerial.println("AT");  //Handshaking with SIM900
  updateSerial();
  mySerial.println("AT+CSQ");  //Signal quality test, value range is 0-31 , 31 is the best
  updateSerial();
  mySerial.println("AT+CCID");  //Read SIM information to confirm whether the SIM is plugged
  updateSerial();
  mySerial.println("AT+CREG?");  //Check whether it has registered in the network
  updateSerial();
}

void loop() {
  updateSerial();
}

void updateSerial() {
  delay(500);
  while (Serial.available()) {
    mySerial.write(Serial.read());  //Forward what Serial received to Software Serial Port
  }
  while (mySerial.available()) {
    Serial.write(mySerial.read());  //Forward what Software Serial received to Serial Port
  }
}

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

Send Receive SMS & Call with SIM900 GSM Shield & Arduino

Объяснение кода:

Мы начинаем с подключения библиотеки SoftwareSerial. Здесь Tx SIM900 подключён к выводу 7 Arduino, а Rx — к выводу 8.

#include <SoftwareSerial.h>

//Create software serial object to communicate with SIM900
SoftwareSerial mySerial(7, 8); //SIM900 Tx & Rx is connected to Arduino #7 & #8

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

//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);

//Begin serial communication with Arduino and SIM900
mySerial.begin(9600);

После инициализации отправляем AT-команды для проверки отклика шилда.

AT — тестовая команда. Ответ «OK» означает, что всё работает. Также помогает с автоопределением скорости передачи.

AT+CSQ — проверка уровня сигнала (0–31, чем выше, тем лучше).

AT+CCID — проверка наличия SIM-карты и отображение её идентификатора.

AT+CREG? — проверка регистрации в сети (1 — домашняя сеть, 5 — роуминг).

mySerial.println("AT");       //Handshaking with SIM900
updateSerial();
mySerial.println("AT+CSQ");   //Signal quality test, value range is 0-31 , 31 is the best
updateSerial();
mySerial.println("AT+CCID");  //Read SIM information to confirm whether the SIM is plugged
updateSerial();
mySerial.println("AT+CREG?"); //Check whether it has registered in the network
updateSerial();

В функции loop() вызываем updateSerial(), которая прослушивает команды и ответы.

void updateSerial() {
  delay(500);
  while (Serial.available()) {
    mySerial.write(Serial.read());  //Forward what Serial received to Software Serial Port
  }
  while (mySerial.available()) {
    Serial.write(mySerial.read());  //Forward what Software Serial received to Serial Port
  }
}

Попробуйте другие AT-команды

ATI — название и версия прошивки шилда.

AT+COPS? — текущая мобильная сеть.

AT+COPS=? — все доступные сети в вашем районе.

AT+CBC — состояние батареи шилда SIM900.

Send Receive SMS & Call with SIM900 GSM Shield & Arduino

Код Arduino — Отправка текстового сообщения

Перед загрузкой замените ZZxxxxxxxxxx на код страны и номер телефона.

#include <SoftwareSerial.h>

//Create software serial object to communicate with SIM900
SoftwareSerial mySerial(7, 8);  //SIM900 Tx & Rx is connected to Arduino #7 & #8

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);

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

  mySerial.println("AT");  //Handshaking with SIM900
  updateSerial();

  mySerial.println("AT+CMGF=1");  // Configuring TEXT mode
  updateSerial();
  mySerial.println("AT+CMGS=\"+ZZxxxxxxxxxx\"");  //change ZZ with country code and xxxxxxxxxxx with phone number to sms
  updateSerial();
  mySerial.print("Last Minute Engineers | lastminuteengineers.com");  //text content
  updateSerial();
  mySerial.write(26);
}

void loop() {
}

void updateSerial() {
  delay(500);
  while (Serial.available()) {
    mySerial.write(Serial.read());
  }
  while (mySerial.available()) {
    Serial.write(mySerial.read());
  }
}

После загрузки откройте монитор последовательного порта и дождитесь отправки сообщения.

Send Receive SMS & Call with SIM900 GSM Shield & Arduino Send Receive SMS & Call with SIM900 GSM Shield & Arduino

Объяснение кода:

Скетч аналогичен первому, за исключением AT-команд для отправки SMS:

AT+CMGF=1 — переключение в текстовый режим SMS (по умолчанию — режим PDU).

AT+CMGS=+ZZxxxxxxxxxx — указание номера для отправки. Символ Ctrl+Z (ASCII 26) завершает ввод и отправляет сообщение.

mySerial.println("AT+CMGF=1");  // Configuring TEXT mode
updateSerial();
mySerial.println("AT+CMGS=\"+ZZxxxxxxxxxx\"");
updateSerial();
mySerial.print("Last Minute Engineers | lastminuteengineers.com");
updateSerial();
mySerial.write(26);

Функция loop() пуста — сообщение отправляется один раз при запуске. Для повторной отправки нажмите RESET.

Код Arduino — Чтение текстового сообщения

#include <SoftwareSerial.h>

SoftwareSerial mySerial(7, 8);

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);

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

  mySerial.println("AT");
  updateSerial();

  mySerial.println("AT+CMGF=1");  // Configuring TEXT mode
  updateSerial();
  mySerial.println("AT+CNMI=1,2,0,0,0");  // Decides how newly arrived SMS messages should be handled
  updateSerial();
}

void loop() {
  updateSerial();
}

void updateSerial() {
  delay(500);
  while (Serial.available()) {
    mySerial.write(Serial.read());
  }
  while (mySerial.available()) {
    Serial.write(mySerial.read());
  }
}

После загрузки отправьте SMS на шилд с телефона. Вы увидите входящее сообщение на экране.

Send Receive SMS & Call with SIM900 GSM Shield & Arduino Send Receive SMS & Call with SIM900 GSM Shield & Arduino

Ответ начинается с +CMT: с данными через запятую: номер отправителя, имя (если есть), временная метка и текст сообщения.

Объяснение кода:

AT+CMGF=1 — текстовый режим SMS.

AT+CNMI=1,2,0,0,0 — управление обработкой входящих SMS: пересылка в монитор или сохранение в хранилище.

mySerial.println("AT+CMGF=1");  // Configuring TEXT mode
updateSerial();
mySerial.println("AT+CNMI=1,2,0,0,0");  // Decides how newly arrived SMS messages should be handled
updateSerial();

В отличие от предыдущего скетча, функция loop() не пуста — код непрерывно прослушивает входящие сообщения.

void loop() {
  updateSerial();
}

Обработка длинных сообщений

Если длинные сообщения обрезаются, увеличьте буфер SoftwareSerial до 256 байт. На Windows:

Откройте C:Program Files (x86)ArduinohardwarearduinoavrlibrariesSoftwareSerialsrcSoftwareSerial.h и измените:

// RX buffer size
#define _SS_MAX_RX_BUFF 64

на:

// RX buffer size
#define _SS_MAX_RX_BUFF 256

Сохраните и перезагрузите код.

Send Receive SMS & Call with SIM900 GSM Shield & Arduino

Код Arduino — Совершение звонка

Замените ZZxxxxxxxxxx на код страны и номер телефона.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(7, 8);

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);

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

  mySerial.println("AT");
  updateSerial();

  mySerial.println("ATD+ +ZZxxxxxxxxxx;");  //  change ZZ with country code and xxxxxxxxxxx with phone number to dial
  updateSerial();
  delay(20000);             // wait for 20 seconds...
  mySerial.println("ATH");  //hang up
  updateSerial();
}

void loop() {
}

void updateSerial() {
  delay(500);
  while (Serial.available()) {
    mySerial.write(Serial.read());
  }
  while (mySerial.available()) {
    Serial.write(mySerial.read());
  }
}
Send Receive SMS & Call with SIM900 GSM Shield & Arduino Send Receive SMS & Call with SIM900 GSM Shield & Arduino

Объяснение кода:

ATD+ +ZZxxxxxxxxxx; — набор номера. Точка с запятой обязательна для голосового вызова.

ATH — завершение вызова.

mySerial.println("ATD+ +ZZxxxxxxxxxx;");
updateSerial();
delay(20000);
mySerial.println("ATH");
updateSerial();

Задержка 20 секунд даёт время на звонок. Функция loop() пуста.

Код Arduino — Приём звонка

Для приёма звонка специального кода не требуется.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(7, 8);

void setup() {
  Serial.begin(9600);
  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());
  }
}

При звонке на SIM-карту шилда в мониторе появится «RING» и номер звонящего.

Send Receive SMS & Call with SIM900 GSM Shield & Arduino Send Receive SMS & Call with SIM900 GSM Shield & Arduino

Объяснение кода:

Код прост — приём звонка не требует AT-команд. Функция loop() непрерывно выполняет updateSerial(), прослушивая данные от шилда.

Полезные AT-команды:

ATA — ответить на звонок.

ATH — завершить звонок. После завершения в мониторе появится «NO CARRIER».