Віримо в перемогу ЗСУ!
Працюємо з 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 размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Уроки Arduino для новачків 1.2.2 Програма IDE Arduino

Уроки Arduino для новачків 1.2.2 Програма IDE Arduino

На этом уроке мы продолжим знакомство с платой, микроконтроллером и его параметрами.Но для начала по..

Кінцевик з коліщатком для 3D принтера або CNC ramps 1.4

Кінцевик з коліщатком для 3D принтера або CNC ramps 1.4

Кінцевий вимикач для встановлення на 3D-принтер або CNC-верстат системи ramps 1.4В комплекті кабель ..

50.19грн.

SMD світлодіод 0603

SMD світлодіод 0603

SMD світлодіоди видимого діапазону для поверхневого монтажу на плату Типорозмір 0603 Червоний 619 ..

2.02грн.

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

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

Рідкі кристали - це речовина, що виявляється в широкому температурному інтервалі з властивостями рід..

ESP32 піаніно з фруктів

ESP32 піаніно з фруктів

Тема проекту: ESP32 піаніно з фруктів. Друзі, радий вас всіх сьогодні бачити знову. Хочу проде..