Предлагаю вашему вниманию пример простого применения возможностей 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 секунды.
Вот так работает задуманный мною проект. Активацию звонков можно запрограммировать на какое-либо событие, реакцию контроллера на которое надо уточнять у хозяина. Например, умный дом может звонить хозяину каждый день в определённое время во время поездки с работы домой. И если трубка поднималась, то у хозяина хорошее настроение. А, если сразу идет сброс звонка, то плохое. И дальше умный дом перестраивает цветовые решения и музыкальные под настроение владельца, или же устройство может переспрашивать перед приездом хозяина включать ли кондиционер в доме, или бойлер, или нагреватель. Напишите в комментариях ваши соображения по поводу подобных сценариев.
Желаю вам крепкого здоровья, и увидимся в следующем видео!
Таймеры Arduino UNO — Часть 4. Применение таймеров для управления сервоприводами
Таймеры Arduino UNO — Часть 4. Применение таймеров для управления сервоприводами Теория ..
Светодиод ультраяркий 3мм
Сверхяркий светодиод диаметром 3 ммКорпус прозрачный у светодиодов разного цвета свечения. То есть р..
0.99грн.
Управление servo-мотором через COM-порт Arduino
Опишем программу управления серво-мотором командами с COM-порта на примере контроллера Arduino Leona..
Преобразование Char в Integer и обратно
Преобразование целочисленных переменных int в символьные переменные char в Arduino IDE - довольно пр..
Клапан электромагнитный 24 В 100 мА
Электромагнитный клапан нормально закрытыйВнешний диаметр короткой трубки 6 ммВнешний диаметр боково..
190.56грн.





