SIM800C и Arduino. Подключаем и разбираемся с принципом работы

SIM800C — это компактный gsm/gprs модуль. Помимо GSM, модуль так же поддерживает Bluetooth версии 3.0. А ещё SIM800C может воспроизводить аудио и поддерживает протоколы POP3, SMTP, MMS, FTP, HTTP, SSL и др.

Несмотря на плюсы, у данного модуля есть и минусы:

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

Первый минус — питание. Запитать данный модуль от Arduino не получится, т.к. для его работы потребуется источник питания с напряжением 5 В и 2 А (при пиковой нагрузке).

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

Второй минус — это избирательность по операторам. Не со всеми операторами модуль может стабильно работать. Теряет сеть или не получается авторизоваться в сети.

У модуля, который мы будем подключать, выведен необходимый минимум для доступа к подавляющему большинству функций, включая голосовые (выходы для подключения микрофона и динамика):

GSM модуль SIM800C

И обратная сторона.

GSM модуль SIM800C (обратная сторона)

Назначение выводов модуля

  • GND — пин земли

  • VCC_IN — пин источника питания от 5В до 20В

  • RI — пин для звонка

  • DTR — пин вывода модуля из спящего режима

  • RXD и TXD — пины UART

  • U2_R и U2_T — пины второго UART

  • V_M — пин преобразования UART в TTL логику

  • ADC — пин АЦП

  • SPN и SPP — пины подключения динамика

  • PWR — пин включения или выключения модуля

  • MC- и MC+ пин подключения микрофона

  • BAT — пин подключения аккумулятора напряжением от 3.3В до 4.4В

Схема подключения

Теперь соберем простую схему.

Схема сборки для настройки модема

Схема сборки для настройки модема

Собранная схема SIM800C и Arduino

После сборки схемы, загрузим тестовый скетч для настройки модема.

#include <SoftwareSerial.h>

SoftwareSerial SIM800(8, 9);        // 8 - RX Arduino (TX SIM800), 9 - TX Arduino (RX SIM800L)

void setup() {
  Serial.begin(9600);               // Скорость обмена данными с компьютером
  Serial.println("Start!");
  SIM800.begin(9600);               // Скорость обмена данными с модемом
  SIM800.println("AT");
}

void loop() {
  if (SIM800.available()) // Ожидаем прихода данных (ответа) от модема…
    Serial.write(SIM800.read()); // …и выводим их в Serial
  if (Serial.available()) // Ожидаем команды по Serial…
    SIM800.write(Serial.read()); // …и отправляем полученную команду модему
}

После загрузки скетча, запускаем Serial Monitor и видим ответ от модема.

Ответ модема в Serial Monitor

После, по очереди вводим команды для настройки модема. После каждой команды нажимаем «Отправить»:

AT+CLTS=1   автоматическое определение времени по сети
AT+IPR=9600 задаем скорость работы модуля
AT&W        сохранение настроек

После введенных команд, перезагружаем модуль и повторно через «монитор порта» проверяем настройки модуля.

AT+IPR?    - команда проверки скорости обмена.
AT+CLTS?   - команда проверки определения времени.

Полезные AT-команды для диагностики

Существует ряд команд при помощи которых можно определить состояние GSM-модуля и совершать конкретные действия, также получить полезную информацию при диагностике модуля. Некоторые из них представлены ниже:

  • команда AT — ответ модуля при ее вводе, покажет готовность модуля (ОК)

  • команда ATI — ответ модуля при ее вводе, покажет модель и версия модуля (SIM800 R14.18)

  • команда AT+CGMR — ответ модуля при ее вводе, покажет модель и версия ПО (Revision:1348B04SIM800L36)

  • команда AT+CCALR? — ответ модуля при ее вводе, говорит о готовности модуля совершать звонки (+CCALR: 1)

  • команда AT+CSQ — ответ модуля при ее вводе, говорит о уровне качества связи (+CSQ: 8,0)

  • команда AT+GSN — ответ модуля при ее вводе, покажет IMEI-модуля (664813735230592)

  • команда AT+GSV — ответ модуля при ее вводе, покажет идентификационные данные модуля (SIMCOM_Ltd SIMCOM_SIM800L Revision:1418B04SIM800L24)

  • команда AT+CBC — ответ модуля при ее вводе, покажет напряжение питания модуля (+CBC: 0,72,3963)

  • команда AT+CREG? — ответ модуля при ее вводе, покажет тип регистрации в сети (+CREG: 0,1). Где 0 это незапрашиваемый код регистрации в сети отключен, а 1 это зарегистрирован в домашней сети.

  • команда AT+COPS? — ответ модуля при ее вводе, покажет информацию об операторе (+COPS: 0,0,»MegaFon»)

  • команда AT+COPN — ответ модуля при ее вводе, покажет список всех доступных операторов (+COPN: «24201»,»TELENOR»)

  • команда AT+CPAS — ответ модуля при ее вводе, покажет статус модуля +CPAS: 4 — где цифра 4 означает, что модуль готов к работе.

Практическое применение

Для примера, попробуем поуправлять светодиодом, подключенным к Arduino Nano, посылая с помощью SMS команды «1» и «0». Аналогичным образом можно управлять и любой другой нагрузкой, используя вместо светодиода реле.

Схема со светодиодом

Добавлен светодиод

Загрузим несложный скетч для управления светодиодом или реле с помощью СМС сообщений.

#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(8, 9);
int LedPin = 10;
void setup(){
  gprsSerial.begin(9600);
  pinMode(LedPin, OUTPUT);
  gprsSerial.print("AT+CMGF=1\r");
  delay(500);
  gprsSerial.print("AT+IFC=1, 1\r");
  delay(500);
  gprsSerial.print("AT+CPBS=\"SM\"\r");
  delay(500);
  gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
  delay(700);
}

String currStr = "";
boolean isStringMessage = false;
void loop(){
  if (!gprsSerial.available())
    return;
  char currSymb = gprsSerial.read();
  if ('\r' == currSymb) {
    if (isStringMessage) {
      if (!currStr.compareTo("1")) {
        digitalWrite(LedPin, HIGH);
      } else if (!currStr.compareTo("0")) {
        digitalWrite(LedPin, LOW);
    }
    isStringMessage = false;
  } else {
    if (currStr.startsWith("+CMT")) {
      isStringMessage = true;
    }
  }
  currStr = "";
  } else if ('\n' != currSymb) {
    currStr += String(currSymb);
  }
}

Совет

Теперь проверим работу схемы: отправляем на номер SIM карты, которая вставлена в SIM800L модуль СМС с «1» и в течении 10 секунд загорится светодиод, а чтобы его выключить отсылаем сообщение с «0».

Таким образом мы управляем любой нагрузкой с помощью модуля SIM800L и Arduino. Разумеется, вместо светодиода можно подключить, например, реле и контактор, что позволит управлять более или менее серьезной нагрузкой дома и в саду.

Примечание

Материал подготовлен для AlashEd Wiki — образовательной платформы Alash Electronics по Arduino, ESP32 и робототехнике.