Всем доброго времени суток! На просторах интернета нашел проект управления блоком из 4 реле посредством dtmf. Повторил в точности проект, но корректно он не заработал. С автором связь неустойчивая. Решил спросить помощи здесь. Собственно, сам скетч: Код (C++): /// УПРАВЛЕНИЕ КОМАНДАМИ ДТМФ #include <SoftwareSerial.h> #include <DFPlayer_Mini_Mp3.h> SoftwareSerial mySerial(10, 11); // RX, TX unsigned long currentTime; unsigned long loopTime1; unsigned long loopTime2; boolean m=0; // переменная сброс таймера #define TELEFONNACH "79211234567" //// НАШ НОМЕР УПРАВЛЕНИЯ void setup() { Serial.begin(9600); mySerial.begin(9600); /////////////////////////// Serial.begin (9600); mp3_set_serial (Serial); mp3_set_volume (29);/// громкость то 0 до 30 ///////////////////////// delay(500); unsigned long currentTime; unsigned long loopTime1; unsigned long loopTime2; pinMode(A0, OUTPUT ); // pinMode(A1, OUTPUT); // pinMode(A2, OUTPUT); // pinMode(A3, OUTPUT); // digitalWrite(A0, HIGH); // ПОДТЯГИВАЕМ + digitalWrite(A1, HIGH); digitalWrite(A2, HIGH); digitalWrite(A3, HIGH); pinMode(13, OUTPUT); // } void loop() { digitalWrite(13, HIGH); currentTime = millis(); // считываем время, прошедшее с момента запуска программы if (currentTime >= (loopTime1 + 2000)) { while (1) // ПРИ ВКЛ ИЩЕМ ТЕЛЕФОН { mySerial.println("AT"); // РЕГИСТАЦИЯ СЕТИ delay(200); if ( mySerial.find("OK")) // ОТВЕТ ОК { Serial.println("SOEDINENIE OK"); digitalWrite(13, LOW); delay(200); break; } else {Serial.println("SOEDINENIE NO"); digitalWrite(13,HIGH); break;} } } /////////////ИЩЕМ ЗВОНОК///////////// if (mySerial.find("CLIP:")) // если нашли RING { Serial.println("RING!"); delay(200); mySerial.println("AT+CLIP=1"); // ВКЛ ОПРЕДЕЛИТЕЛЬ НОМЕРА delay(300); while (1) // в цикле { if (mySerial.find(TELEFONNACH)) //ищим номер телефона, если нашли { mySerial.println("ATA"); /// ПОДНИМАЕМ ТРУБКУ delay(200); mySerial.println("ATE0"); //ОТКЛ ЭХО delay(200); mySerial.println("AT+DDET=1"); // включаем DTMF delay(200); Serial.println("V CIKLE"); //// ПРИВЕТСТВИЕ/////////////////////////// delay(1500); mp3_play (11); // delay(6500); loopTime2 = currentTime; // СБРОС ТАЙМЕРАS //////ПЕРЕХОД К УПРАВЛЕНИЮ//////////// while (1) { currentTime = millis(); // считываем время, прошедшее с момента запуска программы if (currentTime >= (loopTime2 + 35000)) // сравниваем текущий таймер МИН { Serial.println("VIXOD IZ UPRAVLENIIA"); loopTime2 = currentTime; // в loopTime2 записываем новое } break; // ВЫХОДИМ ИЗ ЦИКЛА ЕСЛИ НИЧЕГО НЕ ДЕЛАЕМ 15 СЕК } ///// НАШИ КОМАНДЫ КЛАВИШ ТЕЛЕФОНА if (mySerial.find("+DTMF:")) { int gsm = mySerial.parseInt(); switch(gsm) { case 1: // { loopTime2 = currentTime; // СБРОС ТАЙМЕРА mySerial.println("AT+DDET=0"); // ОТКЛ DTMF delay(200); digitalWrite(A0, !digitalRead(A0)); // инвертируем A0 выход delay(500); Serial.println("INVERSIA RELE1"); delay(300); if ( digitalRead(A0) == LOW ) mp3_play (1); /// else mp3_play (5); loopTime2 = currentTime; // СБРОС ТАЙМЕРА mySerial.println("AT+DDET=1"); // включаем DTMF break;} ///////////2////////////////////////// case 2: { loopTime2 = currentTime; // СБРОС ТАЙМЕРАSerial.println("1"); mySerial.println("AT+DDET=0"); // ОТКЛ DTMF delay(200); digitalWrite(A1, !digitalRead(A1)); // инвертируем A0 выход delay(300); Serial.println("INVERSIA RELE2"); delay(500); if ( digitalRead(A1) == LOW ) mp3_play (2); /// else mp3_play (6); loopTime2 = currentTime; // СБРОС ТАЙМЕРА mySerial.println("AT+DDET=1"); // включаем DTMF break;} ////////////3/////////////////////// case 3: { loopTime2 = currentTime; // СБРОС ТАЙМЕРАSerial.println("1"); mySerial.println("AT+DDET=0"); // ОТКЛ DTMF delay(200); digitalWrite(A2, !digitalRead(A2)); // инвертируем A0 выход delay(300); Serial.println("INVERSIA RELE3"); delay(700); if ( digitalRead(A2) == LOW ) mp3_play (3); /// else mp3_play (7); loopTime2 = currentTime; // СБРОС ТАЙМЕРА mySerial.println("AT+DDET=1"); // включаем DTMF break;} //////4/////////////////////// case 4: { loopTime2 = currentTime; // СБРОС ТАЙМЕРАSerial.println("1"); mySerial.println("AT+DDET=0"); // ОТКЛ DTMF delay(200); digitalWrite(A3, !digitalRead(A3)); // инвертируем A0 выход delay(300); Serial.println("INVERSIA RELE4"); delay(700); if ( digitalRead(A3) == LOW ) mp3_play (4); /// else mp3_play (8); loopTime2 = currentTime; // СБРОС ТАЙМЕРА mySerial.println("AT+DDET=1"); // включаем DTMF break;} //////8 вкл всех//////////////////// case 8: { loopTime2 = currentTime; // СБРОС ТАЙМЕРАSerial.println("1"); mySerial.println("AT+DDET=0"); // ОТКЛ DTMF delay(300); digitalWrite(A0, LOW); digitalWrite(A1, LOW); digitalWrite(A2, LOW); digitalWrite(A3, LOW); delay(100); Serial.println("VSE VKL"); mp3_play (9); delay(600); loopTime2 = currentTime; // СБРОС ТАЙМЕРА mySerial.println("AT+DDET=1"); // включаем DTMF break;} //////9 МЕНЮ/////////////////////// case 9: { loopTime2 = currentTime; // СБРОС ТАЙМЕРАSerial.println("1"); mySerial.println("AT+DDET=0"); // ОТКЛ DTMF delay(200); mp3_play (13); /// loopTime2 = currentTime; // СБРОС ТАЙМЕРА mySerial.println("AT+DDET=1"); // включаем DTMF break;} //////0 откл всех//////////////// case 0: { loopTime2 = currentTime; // СБРОС ТАЙМЕРАSerial.println("1"); mySerial.println("AT+DDET=0"); // ОТКЛ DTMF delay(200); digitalWrite(A0, HIGH); digitalWrite(A1, HIGH); digitalWrite(A2, HIGH); digitalWrite(A3, HIGH); delay(100); Serial.println("VSE OTKL"); delay(600); mp3_play (10); loopTime2 = currentTime; // СБРОС ТАЙМЕРА mySerial.println("AT+DDET=1"); // включаем DTMF break;} ///////////7////////////////////////// /////ПРОВЕРКА НА ВКЛ УСТРОЙСТВ////////////////////////// case 7: { loopTime2 = currentTime; // СБРОС ТАЙМЕРА mySerial.println("AT+DDET=0"); // ОТКЛ DTMF delay(200); mp3_play (14); delay(3500); //////////// ВСЕ ВКЛ////////// if ((digitalRead(A0) == LOW&&digitalRead(A1) == LOW&&digitalRead(A2) == LOW&&digitalRead(A3) == LOW)) { mp3_play (9); delay(3500); } else { if( digitalRead(A0) == LOW) { mp3_play (1); delay(4000); loopTime2 = currentTime; } // СБРОС ТАЙМЕРАS if (digitalRead(A1) == LOW) { mp3_play (2); delay(4000); loopTime2 = currentTime;} if (digitalRead(A2) == LOW) { mp3_play (3); delay(4000); loopTime2 = currentTime;} if (digitalRead(A3) == LOW) { mp3_play (4); delay(4000); loopTime2 = currentTime;} } //// НА ОТКЛ ВСЕХ УСТРОЙСТВ ///// if ((digitalRead(A0) == HIGH&&digitalRead(A1) == HIGH&&digitalRead(A2) == HIGH&&digitalRead(A3) == HIGH)) { mp3_play (10); delay(4000); } else delay(1); mp3_play (12); delay(3000); loopTime2 = currentTime; // СБРОС ТАЙМЕРА mySerial.println("AT+DDET=1"); // включаем DTMF break;} } } } } else { // иначе mySerial.println("AT"); // спрашиваем состояние модема delay(200); if (mySerial.find("OK")) break; // и если он в "готовности", выходим из цикла } // если звонок в процессе, возвращает } // и крутимся дальше mySerial.println("AT+CHUP;"); // сбрасываем вызов delay(200); } } Печаль-беда в том, что при вызове админ-номера проходят гудки и не включается плеер с записями автоответчика. Пытаюсь понять что делаю не так. Схема ниже: