ARDUINO + GSM

24.04.2022 18:27
Поделиться:
ARDUINO + GSM

Ну что, друзья, наигрались светодиодиком в ардуине? Пора прилепить к вашей плате серьезный модуль, который несколько расширит горизонты использования базовой платы. Говоря о расширении горизонта, я вполне серьезно имею в виду охват территории планетного масштаба…. 

GSM модуль, который за 5-10 минут собирается из набора GSM KIT M590 нам в помощь.

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

sxem

Необходимо учесть, что модуль GSM потребляет от источника тока до 1,5 Ампера в режиме регистрации в сети. По этой причине, модуль нужно запитать от отдельного источника напряжением 5В. Разумеется, для обеспечения возможности управлять модулем, нам потребуется обеспечить замкнутую электрическую цепь, для этого подключим все наши устройства к общему минусу.

vid1

Маленькое замечание: для избегания «танцев с бубном» при запуске модуля GSM, я поставил SMD резистор 10кОм между ножками GND и BOOT разъема модуля. Это означает, что модуль будет включаться сразу при подаче питания.

Итак, слепили схему? Теперь зальем скетч:

#include <SoftwareSerial.h>

SoftwareSerial GsmSerial(2, 3);          // RX-2 pin, TX-3 pin

 

String AdminPhone="71234567890";              // Телефон админа

int pinLed=13;                                // Номер порта светодиода, который будем включать/выключать

 

void setup()

{

  pinMode(pinLed, OUTPUT);                       // Режим порта на вывод

  

  Serial.begin(9600);

  GsmSerial.begin(38400);                        // Устанавливаем скорость связи Ардуино и модема

  

  GsmSerial.println("ATE0");                // выключаем эхо

  delay(100);

  GsmSerial.println("AT+CLIP=1");                // Включаем АОН

  delay(100);

  GsmSerial.println("AT+CMGF=1");                // Формат СМС = ASCII текст

  delay(100);

  GsmSerial.println("AT+CSCS=\"GSM\"");          // Режим кодировки текста = GSM (только англ.)

  delay(100);

  GsmSerial.println("AT+CNMI=2,2");              // Текст смс выводится в com-порт

  delay(100);

  

  String str="";

  while(str.indexOf("+COPS: 0") == -1) {        // Ждем пока модем будет готов

    GsmSerial.println("AT+COPS?");

    str=ReadCom();

    delay(300);

  }

}

 

void loop()

{

  String strSms = ReadCom();                  // Читаем смс, если есть

  while (strSms.length()==0)                                  {

    delay(500);

    strSms = ReadCom();

  }

  

  // Если телефон админа, то читаем дальше

  if (strSms.indexOf(AdminPhone) > -1)   {

    if (strSms.indexOf("+CMT") > -1)     {    // Если смс

      // Кодовое слово "on"

      if (strSms.indexOf("on") > -1) {    // Если обнаружено ключевое слово на включение

        digitalWrite(pinLed,HIGH);             // Включаем светодиод

        SendSms("led=on", AdminPhone);       // Можем отправить смс, что включили

        Serial.println("led=on");

      }

      // Кодовое слово "off"

      if (strSms.indexOf("off") > -1){    // Если обнаружено ключевое слово на выключение

        digitalWrite(pinLed,LOW);             // Выключаем светодиод

        SendSms("led=off", AdminPhone);     // Можем отправить смс, что выключили

        Serial.println("led=off");

      }

    }

    if (strSms.indexOf("RING") > -1)     {    // Если звонят (выполняется на каждый гудок)

      // Можем, что нибудь выполнить

      Serial.println("start call");

    }

  }

  if (strSms.indexOf("NO CARRIER") > -1){   // Если звонок окончен

    //SendSms("called", AdminPhone);     // Можем отправить смс, что нам звонили

    Serial.println("end call");

  }

}

 

// Читает смс

String ReadCom()

{

  int chCode = 0;                              // Код символа

  String strSms = "";                          // Текст

  if (GsmSerial.available()) {                 // Есть данные от модема

    delay(300);

    // Считываем смс с com-порта модема

    while (GsmSerial.available()) {            // Если есть еще символы, то читаем

      chCode = GsmSerial.read();               // Считываем очередной символ

      strSms += char(chCode);                  // Добавляем к строке

      delay(10);

    }

  }

  if (strSms.length()>0) {

    Serial.println("++++++++++");

    //Serial.println();

    Serial.println(strSms.length());

    Serial.println(strSms);

  }

  return strSms;

}

 

// Отправляет текст смс на определенный номер

void SendSms(String text, String phone)

{

  phone="+"+phone;

  GsmSerial.println("AT+CMGS=\"" + phone + "\""); // Заголовок АТ команды и номер телефона

  delay(500);

  GsmSerial.print(text);                          // Текст смс

  delay(500);

  GsmSerial.print((char)26);                      // Конец сообщения и отправляем смс

  delay(500);

}

 

После заливки прошивки, подключите питание к GSM модулю и сбросьте кнопкой «ресет» Ардуинку. Вы должны заметить веселые перемигивания лампочек в дуинке и модуле, после чего модуль GSM станет мерно мигать светодиодом – это означает, что модуль успешно зарегистрировался в сети и ждет ваших указаний (вы ведь не забыли вставить SIM карту в слот модуля?).

Эти самые указания мы дадим нашему созданию с мобильного телефона:

Наберите SMS команду «on» (разумеется, без кавычек) и отправьте на номер симки устройства. Ничего?  Упс… мы забыли поправить скетч…

В строке   String AdminPhone="71234567890";  вместо 71234567890  вбейте свой номер телефона, с которого вы будете давать команды устройству в формате 7хххххххххх

Поправили скетч => заливаем => запускаем => отправляем команду «on»

О чудо электронное! Лампочка на плате зажглась! Можно начинать читать хвалебные молитвы богу Електрону… Простите, увлекся…

vid2

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

Дополнительный приятный бонус такой системы – подтверждение выполнения команды, устройство услужливо отрапортует вам в ответном SMS  о выполнении задачи!

vid3

Чтобы выключить светодиод – отправьте команду «off», и снова рапорт о выполнении…

Ну что, завертелась мысля? Что можно соорудить на таком функционале?

Предлагайте – обсудим!

tarip

0 оценок
0
0
0
0
0
4.93
Рейтинг
Мы используем файлы cookie. Продолжив использование сайта, Вы соглашаетесь с политикой использования файлов cookie, обработки персональных данных и конфиденциальности. Подробнее
radionet
Все для начинающего радиолюбителя