Віримо в перемогу ЗСУ!
Працюємо з 09:00 до 18:00 Пн-Пт

Привет друзья! Это продолжение серии статей о работе с SIM800. Всех их можно найти на этом канале. 

Исходящий звонок при помощи GSM-модуля – это как бы простейшая тема. Но мы не можем упустить её из виду. В ней тоже при ближайшем рассмотрении есть свои нюансы. Давайте протестируем исходящие звонки и обговорим зачем они вообще нужны в наших будущих устройствах.

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

Но для использования в наших автоматических устройствах для народного хозяйства мне интересна возможность просто совершить звонок по заданному номеру телефона. 

Для каких задач это будет интересно? Мне приходит в голову только максимально быстрое сообщение хозяину устройства о какой-либо аварийной ситуации. У меня даже есть реализация по аварийным звонкам. 

SMS-это хорошо, информативно. Но они могут приходить не сразу, а через часы после отправки. Так же многие люди не читают их или оперативно не будут бежать к мобильному, чтобы прочитать новое сообщение. 

А вот на звонок от своего устройства будет самая быстрая реакция. Исходящий звонок хорошо делать и на удаленную сигнализацию.

Кстати о проводных телефонах, ведь SMS на стационарный телефон не отправиш. И при необходимости оповещения на проводной телефон, остаются только звонки с нашего GSM-устройства.

Какие же AT-команды нам понадобятся для звонков по заданному номеру телефона? Для звонка - это команда ATD.

А для того, чтобы повесить трубку есть команда ATH. Но в принципе, она для задач оповещения хозяина и не понадобится, так как хозяин сам будет сбрасывать звонок или оператор его сбросит по истечении времени, если трубку на том конце провода не поднимут. 

Схему устройства на основе Arduino Nano и SIM800L берем из предыдущих видео. 


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

Открываем программу Arduino IDE и скетч из прошлого видео. Здесь убираем лишние строки. И очищаем секцию loop.

Убираем команду установки времени. И вставляем команду ATD с номером телефона в конце секции setup.

По истечении 10 секунд после включения или перезагрузки контроллера, должна передаваться команда ATD на SIM800. И GSM-модуль должен сделать попытку позвонить по заданному номеру.

Загружаю скетч в контроллер и открываю монитор порта.

#include <SoftwareSerial.h>

SoftwareSerial SIM800serial (2, 3);

#define OK 1
#define NOTOK 2
#define TIMEOUT 3

void setup() {
  pinMode(7, OUTPUT); //relay1
  
  Serial.begin(9600);
  SIM800serial.begin(9600);
  delay(10000);
  SIM800command("AT", "OK", "ERROR", 500, 5);
  delay(1000);
  SIM800command("ATD+380683609382;", "OK", "ERROR", 1000, 1);
  delay(5000);
  SIM800command("ATH", "OK", "ERROR", 500, 5);
}

void loop() {
  delay(500);
  SIM800read();
  delay(1000);
  SIM800command("AT", "OK", "ERROR", 500, 5);
}
byte SIM800command(String command, String response1, String response2, uint16_t timeOut, uint16_t repetitions) {
  byte returnValue = NOTOK;
  byte countt = 0;
  
  while (countt < repetitions && returnValue != OK) {
    SIM800serial.println(command);
    
    if (SIM800waitFor(response1, response2, timeOut) == OK) {
      returnValue = OK;
    } else {returnValue = NOTOK;}
    countt++;
  }
  
  return returnValue;
}

byte SIM800waitFor(String response1, String response2, uint16_t timeOut) {
  uint16_t entry = 0;
  uint16_t count = 0;
  String reply = SIM800read();
  byte retVal = 99;

  do {
    reply = SIM800read();
    delay(1);
    entry ++;
  } while ((reply.indexOf(response1) + reply.indexOf(response2) == -2) && entry < timeOut );

  if (entry >= timeOut) {
    retVal = TIMEOUT;
  } else {
    if (reply.indexOf(response1) + reply.indexOf(response2) > -2) retVal = OK;
    else retVal = NOTOK;
  }

  return retVal;
}

String SIM800read() {
  String reply = "";

  if (SIM800serial.available())  {
    reply = SIM800serial.readString();
  }

  if (reply!=""){
    Serial.print("Reply: ");
    Serial.println(reply);
  }
  
  return reply;
}

Исходящий звонок приходит мне на мобильный. Я поднимаю трубку. Потом ложу её, но в мониторе порта желательно увидеть ответы SIM800.

Для этого добавлю в цикл loop функцию чтения SIM800read с периодичностью 500 миллисекунд при помощи функции delay.

Загружаю программу в контроллер и запускаю монитор порта.

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

Теперь снова перезагружу контроллер перезапуском монитора порта.

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

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

В результате получаем третий вариант реакции GSM-модуля NO ANSWER. По этим ответам можно будет контролировать результаты дозвонов и при необходимости прописывать в программе реакцию на эти ответы.

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

Ещё хочу вам продемонстрировать интересный нюанс, насчет того, что делает SIM800 и контроллер во время исходящего звонка. 

Добавлю в цикл loop периодическую отправку команды AT. И загружу изменения в Arduino Nano.

Во время дозвона и во время, когда трубка хозяина поднята, контроллер и SIM800 не замирают – они продолжают свои программные циклы. Так что во время звонка можно спокойно посылать запросы GSM-модулю. Такие как AT и другие.

А что, если хозяин устройства не любит, когда ему долго звонят? Для этого можно автоматически сбрасывать набор номера через определённое время. Воспользуемся командой ATH.

Через 5 секунд после начала звонка будем сбрасывать его.

Загружаю новую программу в контроллер.

В результате звонок прозвучал где-то с секунду и сбросился.



Теперь можно утверждать, что мы ознакомились с командой ATD в полной мере. Дозвон происходит очень быстро и не останавливает работу контроллера с остальной периферией. Команда довольно простая и может возвращать разные ответы, по которым можно судить об успешности дозвона. Всем спасибо за внимание и увидимся в следующем видео.


<< Проекты << Все товары >> Статьи, уроки >>

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Цифро-знаковые жидкокристаллические индикаторы

Цифро-знаковые жидкокристаллические индикаторы

Жидкие кристаллы — это вещества, проявляющие в определенном температурном интервале свойства как жид..

Ремень зубчатый 6 мм 300 мм

Ремень зубчатый 6 мм 300 мм

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

47.50грн.

Концевой выключатель или концевик

Концевой выключатель или концевик

Имеет одну группу переключающихся контактов. На кончике рычага установлен подвижный ролик.Максимальн..

22.63грн.

3-осевой акселерометр ADXL346Z

3-осевой акселерометр ADXL346Z

Акселерометр - это датчик ускорения. Данный датчик показывает статическое (гравитацию - наклон к зем..

160.78грн.

Arduino 4-20 мА подключение датчика уровня

Arduino 4-20 мА подключение датчика уровня

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