Декодирование DTMF сигнала GSM модемом SIM800L, код из видео

Схема подключения модема и код из видео.

Так всё было подключено:

Без имени-1

Код:

Парсинг требует доработки, в таком виде работает не так, как хотелось бы (


// 
#include <SoftwareSerial.h>

SoftwareSerial gsm(7, 6); // RX, TX

void setup() {
  Serial.begin(9600);
  gsm.begin(9600);

  pinMode(13, OUTPUT);
  gsm.setTimeout(100);                    // задаем задержку для  Serial.parseInt()
}

void loop() {
    gsm.println("AT");                       // иначе модем засыпает
    
    if(gsm.find("RING")){                    // если нашли RING
      Serial.println("RING!");
      gsm.println("AT+DDET=1");              // включаем DTMF
      delay(10);
      gsm.println("ATA");                    // поднимаем трубку
       
      while(1){                               // в цикле
       if (gsm.find("+DTMF:")){              // ищим DTMF
        int cmd = gsm.parseInt();             // читаем команду 
//       gsm.flush();      
        
         switch(cmd){                         // и в зависимости 
          case 0:                             // выполняем действие, отправляем в Serial, 
            Serial.println("0");
            break;
          case 1:
            Serial.println("1");
            break; 
          case 2:
            Serial.println("2");
            break;
          case 3:
            Serial.println("3");
            break;
          case 4:
            Serial.println("4");
            break;
          case 5:
            Serial.println("5");
            break;
          case 6:
            Serial.println("6");
            break;
          case 7:
            Serial.println("7");
            break;
          case 8:
            Serial.println("8");
            break;
          case 9:
            Serial.println("9");
            break;  
           default:     
            Serial.println("error");
            break;                
         }
 
       }  
       else{                                 // иначе 
         gsm.println("AT+CPAS");             // спрашиваем состояние модема   
         delay(100);
         if (gsm.find("+CPAS: 0")) break;    // и если он в "готовности", выходим из цикла
       }                                     // если звонок в процессе, возвращает +CPAS: 3
        
      }      
      Serial.println("OK!");
    }

}