Предлагаю вашему вниманию пример простого применения возможностей 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 секунды.
Вот так работает задуманный мною проект. Активацию звонков можно запрограммировать на какое-либо событие, реакцию контроллера на которое надо уточнять у хозяина. Например, умный дом может звонить хозяину каждый день в определённое время во время поездки с работы домой. И если трубка поднималась, то у хозяина хорошее настроение. А, если сразу идет сброс звонка, то плохое. И дальше умный дом перестраивает цветовые решения и музыкальные под настроение владельца, или же устройство может переспрашивать перед приездом хозяина включать ли кондиционер в доме, или бойлер, или нагреватель. Напишите в комментариях ваши соображения по поводу подобных сценариев.
Желаю вам крепкого здоровья, и увидимся в следующем видео!
Контроллер ESP32-WROOM-32 (8MB)
ESP32-WROOM-32 - это мощный универсальный модуль Wi-Fi + BT + BLE MCU, предназначенный для широкого ..
243.36грн.
Мотор шилд для Arduino UNO MEGA
Шилд под платы контроллеров Arduino UNO, Arduino MEGA с четырёхканальным драйвером дв..
115.78грн.
AMS1117-5.0 микросхема стабилизатор напряжения
Микросхема - линейный регулятор напряжения применяется для получения стабилизированного напряжения 5..
6.02грн.
Стойка латунная М3 высотой 15мм шестигранник мама-папа
Латунная стойка мама-папа с резьбой М3 и шестигранным внешним сечениемПрименяется при конструировани..
8.01грн.
Блок питания 9 В 2 А с разъемом 5,5мм x 2,1мм
Импульсный блок питания розеточного типа с разъемом 5,5мм x 2,1ммВходное напряжение переменного..
231.58грн.