Gsm relay sim800

Тема в разделе "Arduino & Shields", создана пользователем djkohr, 19 сен 2019.

  1. djkohr

    djkohr Нуб

    Всем доброго времени суток!
    На просторах интернета нашел проект управления блоком из 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);
         }
        }

       
       
     
     
    Печаль-беда в том, что при вызове админ-номера проходят гудки и не включается плеер с записями автоответчика. Пытаюсь понять что делаю не так.
    Схема ниже:
     

    Вложения: