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

Предлагаю вашему вниманию пример простого применения возможностей SIM800 при исходящем звонке. В результате выполнения команды ATD, модем возвращает строковый ответ, в зависимости от поведения принимающей стороны. Так вот я и хочу использовать эти ответы для управления двумя реле. Сценарий такой: SIM800 под управлением контроллера по какому-то событию звонит хозяину на мобильный. И, если хозяин поднимает трубку телефона и ложит её, то кратковременно срабатывает одно реле, включая какой-либо исполнительный механизм. А, если же хозяин сразу сбрасывает вызов, то контроллер кратковременно включит второе реле.

Для этого проекта я беру готовый модуль под Arduino Nano плюс SIM800L с двумя реле на борту нашей разработки. 

Но вы можете и самостоятельно собрать схему, например из отдельных готовых модулей. Если будут сложности, пишите в комментариях. Вы очень поможете, если подпишитесь и поделитесь этим видео с друзьями. И поехали дальше.


Я по-быстрому набросал эту программку в Arduino IDE, взяв за основу программные блоки, которые мы делали в предыдущих видео. В секции setup сначала определяются пины контроллера Arduino Nano как выходы. Они будут управлять двумя реле. 

Затем идут две строки подключения физического порта UART для диагностики. А так же программного UART для коммуникации с SIM800L.

Дальше ожидание 10 секунд для того, чтобы SIM800 успела подключиться к сети GSM.

Следующая строка не обязательная. Пять раз отправляем команду AT. Просто для определения модемом скорости обмена данными по порту UART.

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

Дальше в цикле loop считываются ответы SIM800 в строковую переменную txt.

После чего стоят два условия: если в ответе есть словосочитание NO CARRIER, то выставляется единица на выходе 7 и включается первое реле; если в ответе есть слово BUSY, то единица выставляется на выходе 8 и включается второе реле.

NO CARRIER – это когда звонок приняли и положили трубку.

А BUSY – это когда сразу сбросили вызов не поднимая трубку.

Дальше в программе через 2 секунды выходы сбрасываются на ноль и реле выключаются.

#include <SoftwareSerial.h>

SoftwareSerial SIM800serial (2, 3);

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

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

void loop() {
  String txt;
  txt = SIM800read();
  if (txt.indexOf("NO CARRIER") > 0){
    digitalWrite(7, HIGH);
  }
  if (txt.indexOf("BUSY") > 0){
    digitalWrite(8, HIGH);
  }
  delay(2000);
}
digitalWrite(7, LOW); digitalWrite(8, LOW); 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; }

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

Через 10 секунд после включения или перезагрузки контроллера получаю звонок на мобильный. Подымаю трубку и вешаю её. То есть вызов принят. Контроллер получает ответ NO CARRIER от SIM800 и делает вывод, что надо на 2 секунды включить реле, управляемое выходом номер 7.

Теперь перезапускаю монитор порта, чтобы перегрузить контроллер и проверить управление вторым реле.

После прихода звонка на мобильный я его сразу сбрасываю, и контроллер получает ответ BUSY, после чего реагирует подачей единицы на выход 8. И второе реле срабатывает на 2 секунды. 

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

Желаю вам крепкого здоровья, и увидимся в следующем видео!

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

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

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Контроллер ESP32-WROOM-32 (8MB)

Контроллер ESP32-WROOM-32 (8MB)

ESP32-WROOM-32 - это мощный универсальный модуль Wi-Fi + BT + BLE MCU, предназначенный для широкого ..

243.36грн.

Мотор шилд для Arduino UNO MEGA

Мотор шилд для Arduino UNO MEGA

Шилд под платы контроллеров Arduino UNO, Arduino MEGA с четырёхканальным драйвером дв..

115.78грн.

AMS1117-5.0 микросхема стабилизатор напряжения

AMS1117-5.0 микросхема стабилизатор напряжения

Микросхема - линейный регулятор напряжения применяется для получения стабилизированного напряжения 5..

6.02грн.

Стойка латунная М3 высотой 15мм шестигранник мама-папа

Стойка латунная М3 высотой 15мм шестигранник мама-папа

Латунная стойка мама-папа с резьбой М3 и шестигранным внешним сечениемПрименяется при конструировани..

8.01грн.

Блок питания 9 В 2 А с разъемом 5,5мм x 2,1мм

Блок питания 9 В 2 А с разъемом 5,5мм x 2,1мм

Импульсный блок питания розеточного типа с разъемом 5,5мм x 2,1ммВходное напряжение переменного..

231.58грн.