Спойлер
Код: Выделить всё
#include <SoftwareSerial.h>
String numberCall_1 = "ХХХХХХХХХХХХ"; // Номер абонента №1 для звонка
const int RX = 2; // назначаем Rx Arduino на pin 2
const int TX = 3; // назначаем Тx Arduino на pin 3
SoftwareSerial MySerial(RX, TX);
#define pinSensor_0 8 // объявляем pin 8 Arduino входом для концевика
const int RELAY_1 = 6; // назначаем управление реле на pin 6
//Переменные для хранения входящих данных
String buff;
String dtmf;
boolean relay1_st = false; // Выставляем высокий уровень(выключаем реле)т.к. кнопка PULL-UP
boolean is_call = false; // Звонок (Логический (булевый) тип данных)
uint8_t flagSensor_0 = 0;
void setup()
{
pinMode(pinSensor_0, INPUT); // назначаем 8 пин на вход сигнала
pinMode(RELAY_1, OUTPUT); // назначаем 6 пин на выход сигнала
digitalWrite(RELAY_1, LOW); // устанавливаем реле в выкл сотояние
Serial.begin(9600);
MySerial.begin(9600);
Serial.println(F("Подключение GSM модуля SIM800L")); // вывод в монитор порта
delay(5000); // Задержка в 5 секунд
MySerial.println(F("AT")); // вывод в монитор порта Подключаемся к режиму AT для настройки скорости обмена данными
delay(500);
MySerial.println(F("AT+DDET=1")); // вывод в монитор порта Включение DTMF(тонального набора)
delay(500);
}
void loop()
{
while (MySerial.available())
{
buff = MySerial.readString();
Serial.println(buff);
if (is_call = true) // Если вызов прошёл
{
if (int index = buff.indexOf("+DTMF:") > -1 ) // Ищем первое совпадение. Если не -1 значит нашли.
{
index = buff.indexOf(":"); // Ищем :
dtmf = buff.substring(index + 1, buff.length()); // Возвращает подстроку в строке
dtmf.trim(); // обрезает все пробелы в начале и конце указанной строки.
Serial.println("dtmf: " + dtmf); // Выводит полученное значение
State();
}
if (buff.indexOf("NO CARRIER") > -1)
{
MySerial.println(F("ATH")); // вывод в монитор порта Повесить трубку/ разорвать соединение
is_call = false;
}
}
if (buff.indexOf("RING") > -1) // Входящий звонок
{
delay(2000);
MySerial.println(F("ATA")); // вывод в монитор порта Ответ на звонок
is_call = true;
}
}
while (Serial.available())
{
MySerial.println(Serial.readString());
}
if (flagSensor_0 == 0 && digitalRead(pinSensor_0) == 0) flagSensor_0 = 1;
if (flagSensor_0 == 1)
{
String command;
command = "ATD+" + numberCall_1 + ";";
MySerial.println(command);
delay(20000);
MySerial.println("ATH");
delay(180000);
asm volatile ("jmp 0x0000");
}
if (flagSensor_0 == 2 && digitalRead(pinSensor_0) != 0) flagSensor_0 = 0;
}
void State() {
if (dtmf == "1") {
relay1_st = !relay1_st;
digitalWrite(RELAY_1, relay1_st); // Включаем или выключаем реле 1
}
}