Віримо в перемогу ЗСУ!
Магазин у відпустці до 01.06.2022


Привіт фанам GSM автоматики! Підпишіться, щоб нічого не пропустити, і почнемо черговий випуск роботи SIM800L і Arduino. На цей раз розглянемо тему Arduino SIM800 вхідний дзвінок. Пропрацюємо автоматичний підйом трубки по вхідному дзвінку, а також автоматично включатимемо реле по дзвінку з певного номера.



Ми тут використовуватимемо код із попереднього відео, модифікуємо його та наведемо марафет. Схема пристрою теж буде така, як у минулому відео, але додасться реле на дискретному виході контролера.


У загальному вигляді схема виглядатиме так. Тут все, як у попередніх відео, але додається реле, підключене до дискретного виходу D7 контролера Arduino Nano.


Для практичної роботи з мінімальним монтажем, я візьму одну з наших плат, на яку встановлюється SIM800 та Arduino Nano, і на якій передбачено два реле зі світлодіодною індикацією їх увімкнення. Тут на платі підписано, що одне реле керується піном D7, а друге від піна D8. Реле управляється від контролера не безпосередньо, а через транзистор. Ви також можете зібрати свою схему і без нашої плати, але підключайте реле або через транзистор, або візьміть готовий модуль реле з логікою 5В.


Моя плата живиться від зовнішнього джерела живлення 5В бо від USB-порту буде замало потужності для живлення SIM800.


Включаю живлення пристрою.


З'єдную Arduino з ноутбуком USB-кабелем і відкриваю програму Arduino IDE.


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

#include <SoftwareSerial.h>
SoftwareSerial SIM800serial (2, 3);
#define OK 1
#define NOTOK 2
#define TIMEOUT 3
void setup() {
  Serial.begin(9600);
  SIM800serial.begin(9600);
  delay(10000);
  SIM800command("AT", "OK", "ERROR", 500, 5);
  delay(1000);
  SIM800command("AT+CCLK?", "OK", "ERROR", 500, 1); //date time of SIM800
  delay(1000);
  SIM800command("AT+CCLK=\"21/12/12,16:25:33+02\"", "OK", "ERROR", 500, 1); //yy/mm/dd,hh:mm:ss+zz
}
void loop() {
  SIM800command("AT+CCLK?", "OK", "ERROR", 500, 1); //date time of SIM800
  delay(1000);
}
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;
}

Тому створимо нову вкладку, натиснувши кнопку зі стрілочкою. Далі New Tab і вводимо назву вкладки, яке першим спаде на думку. Клацаємо OK – вкладка з'явилася.


Тепер виріжу функції, які в першій вкладці будуть зайвими і вставлю в нову вкладку.


Ну ось, тепер основна вкладка буде вільнішою.


А тепер просто візьмемо та завантажимо цей старий скетч у контролер чисто для практичного експерименту.


Запускаю монітор порту і чекаю надходження команди із секції loop().


А зараз зателефоную з мобільного на номер сімки, вставленої в GSM-модуль.


І ось, завантажений скетч побічним ефектом показує нам, які повідомлення пише SIM800 під час вхідного виклику. Тобто RING, потім CLIP – це команда визначника номера, потім номер телефону. 145 – це формат номера. І, поки відбувається виклик, такі повідомлення модуль писати періодично в порт UART.


А коли дзвонить вішає трубку, приходить повідомлення NO CARRIER.


Дізнавшись цю інформацію, тепер накидаємо програму, яка автоматично включатиме реле при вхідному дзвінку і вішатиме трубку. При чому, реле включатиметься на одну секунду, і спрацьовуватиме воно лише на дзвінок від господаря. Дзвінки від інших номерів телефону ігноруватимуться.


Для початку налаштуємо дискретний пін D7 як вихід. Решту начинки секції Setup() чіпати не будемо.


Далі замінимо вміст секції loop() парою нових рядків.

#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("AT+CCLK?", "OK", "ERROR", 500, 1); //date time of SIM800
  delay(1000);
  SIM800command("AT+CCLK=\"21/12/12,16:25:33+02\"", "OK", "ERROR", 500, 1); //yy/mm/dd,hh:mm:ss+zz
}

void loop() {
  String txt;
  txt = SIM800read();
  if ((txt.indexOf("+CLIP: \"+380934158245") > -1)&&(txt.indexOf("NO CARRIER") == -1)){
    digitalWrite(7, HIGH);
    SIM800command("ATA", "NO CARRIER", "ERROR", 30000, 1);
//    SIM800command("ATH", "OK", "ERROR", 500, 5);
  }
  SIM800command("AT", "OK", "ERROR", 500, 1);
  delay(1000);
  digitalWrite(7, LOW);
}

Змінна txt зберігатиме текст прийнятого повідомлення від GSM-модуля.


У другому рядку задіяна функція SIM800read(), яку ми створили у попередньому відео. Вона перевіряє буфер UART порту та повертає текст повідомлення, якщо таке надійшло.


У операторі if містяться дві умови. Перше – це, що є дзвінок, і номер телефону такий, як у господаря. Другу умову треба пояснити трохи довше.


Ми бачили в моніторі порту повідомлення SIM800 при вхідному дзвінку, а також під час скидання виклику. Так ось у нашому випадку скидати виклик буде сторона, що приймає дзвінок, і те ж останнє повідомлення NO CARRIER, а перед ним і RING і номер телефону, що телефонує, з якоїсь причини приходить від оператора секунд через 20-30. І якщо не перевіряти повідомлення з номером телефону на наявність рядка NO CARRIER, то по кожному дзвінку господаря, реле спрацьовуватиме двічі. Один раз під час дзвінка, а вдруге через випадкову кількість секунд. А нам таке природно не потрібне. Адже у нас завдання – чітко клацнути реліжкою на одну секунду за дзвінком.


До речі, сюди можна додати ще номери телефонів, додаючи схожі умови через знак або. Наприклад, можете додати номер дружини, щоб її дзвінки теж спрацьовували.


Якщо умови виконуються, пін D7 піднімається в одиницю і реле спрацьовує.


Наступна функція надсилає ATH для скидання виклику на SIM800.


Далі йдуть рядки без умови, що активуються раз на секунду. Команда AT тут просто, щоб GSM-модуль не переходив у режим сну, а також щоб ми бачили у моніторі порту, що контролер живий.


Після паузи за одну секунду, вимикаємо реле, подаючи нуль на вихід D7 Arduino Nano.


Завантажую скетч у контролер.


І запускаю монітор порту.


Через 10 секунд очікування спостерігаємо за обміном повідомленнями.


Намагаюся дзвонити на номер сімки в GSM-модулі. Ось є повідомлення про дзвінок, реле спрацьовує та повідомлення ATH означає успішне скидання дзвінка. Приблизно за секунду реле вимикається.


Тепер для приколу я спробую зателефонувати з іншого номера телефону.


У моніторі порту бачимо додзвони, але реле мовчить і не скидається. Тобто, умови не виконуються. Як і було задумано.


Зараз знову наберу із заданого телефону. З першого разу не вийшло тому, що випадково надійшло повідомлення про трубку, про яку я довго розповідав.


А тепер із повторного дзвінка реле спрацьовує та виклик скидається. До речі, по першому гудку реле не спрацювало, тому що я потрапив на відправку команди AT, але по другому гудку все пройшло і це не критично по-моєму. Програму вважаємо повністю робочою та ставимо лайк.


Так ось ми вже познайомилися з командою ATH, яка лягає на трубку, якщо потрібно розірвати вхідний виклик, а тепер протестуємо команду підйому трубки. Сценарій такий: все та ж релешка буде включатися по вхідному дзвінку, але вимикатися вона буде тільки, коли господар, що дзвонить, повісить трубку.


Закоментуємо команду ATH та напишемо в межах оператора if відправку команди підняття трубки ATA. Функція SIM800command буде крутитися 30 секунд очікуючи повідомлення, що телефон повісив трубку. І весь цей час реле буде замкнено.


Завантажую скетч до Arduino Nano.


Запускаю монітор порту.


Після надходження команд AT набираю номер пристрою.


Після другого гудку контролер піднімає трубку та включає реле.


Скидаю виклик на мобілці, після чого видно повідомлення NO CARRIER, через секунду вимикається реле та програма продовжує свої цикли.


Дзвоню ще раз. Контролер по першому гудку включає реле та приймає виклик командою ATA. В принципі в цей час, якщо ви підключите до SIM800 мікрофон та динамік, то зможете послухати, що відбувається біля пристрою та навіть поговорити з присутніми.


Коли розриваю виклик, реле вимикається, як за сценарієм і було задумано.


У результаті ми розібрали дві основні AT-команди для роботи з вхідними дзвінками, а також спробували їх на практиці. Дещо закріпили використання функцій для управління GSM-модулем, які ми створили в попередньому відео. А в наступному ролику пропрацюємо вихідні дзвінки і так само, як і зараз налагодимо приклад практичного застосування.


Всім дякую за увагу! Буду вдячний за підписку та зворотний зв'язок!

<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Датчик рівня дискретний горизонтальний

Датчик рівня дискретний горизонтальний

Дискретний датчик, що спрацьовує при досягненні рідиною певного рівня та вище його. В спрацьованому ..

66.85грн.

Термостат з термопарою -60...+500°C 10А

Термостат з термопарою -60...+500°C 10А

Цікавий термостатик, для завдань, де не вистачає діапазону температур звичайних термостатів з резист..

392.65грн.

Набір перетинок (папа-папа) 40шт 10см

Набір перетинок (папа-папа) 40шт 10см

Набір з'єднувальних дротів для поєднання плат контролера з периферією без пайки. Підходять під станд..

34.68грн.

Отримання даних через UART Arduino Nano

Отримання даних через UART Arduino Nano

Усім користувачам контролерів Arduino відомо, що можна передавати дані через апаратний порт UART кон..

Датчик обертання енкодер KY-040

Датчик обертання енкодер KY-040

Енкодер обертання KY-040 - це обертальний датчик, який характеризує ступінь повороту вісі та в якому..

28.79грн.