Віримо в перемогу ЗСУ!
Працюємо з 09:00 до 18: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 разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Датчик звука

Датчик звука

Интеллектуальный дискретный датчик звука. Рабочее напряжение питания 4...6 В постоянного тока. Чувст..

30.77грн.

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

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

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

41.98грн.

Стерео усилитель мощности 15Втх2 на TDA7297

Стерео усилитель мощности 15Втх2 на TDA7297

Двухканальный усилитель звуковой частоты на основе микросхемы TDA7297Имеет защиту от перегрузки..

120.18грн.

Arduino SIM800 CBC уровень заряда

Arduino SIM800 CBC уровень заряда

Привет друзья! У полюбившегося нам SIM800L есть аналого-цифровой преобразователь, который предназнач..

Бокс для аккумуляторов 3 х 18650 3,7В

Бокс для аккумуляторов 3 х 18650 3,7В

Держатель для трёх аккумуляторов типа 18650 по 3,7 В каждыйОбщее напряжение получится 3,7 В х 3..

72.27грн.