Como usar o sensor ultrassônico e sensor IR com controle

Olá pessoal gostaria de saber se tem alguém que pode me ajuda no meu projeto... estou utilizando sensor ultrasônico e sensor infravermelho.
No meu projeto eu quero ligar um robô, ele se move através do sensor ultrassônico e quando eu pressionar o botão de Ligar no controle remoto é acionado o movimento através do controle remoto, permitindo que eu possa fazer uma pausa, avançar ou recuar, por exemplo.
E quando quiser retornar a movimentação através do sensor ultrassônico, apertar um botão e retorna para a função de sensor ultrassônico.
O meu código está quase funcionando corretamente, porém se dou uma pausa, fica bem pouco e já gira os motores para frente novamente, ou seja, está funcionando mas não de forma adequada e não estou conseguindo resolver esse problema.

Segue meu código:

#include <Servo.h>
#include <SPI.h>
#include <IRremote.h>

float num = 0;

Servo servo1;
Servo servo2;
Servo servo3;

int cm;
int st;
int trig = 6;
int echo = 7;
long microseconds;

/* =================== Declaração do IR ===================*/

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
long infraredvalue;


/* ========================== // ==========================*/

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // Iniciando op receptor
  st=2;
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
  servo1.attach(8);
  servo2.attach(9);
  servo3.attach(10);
  servo1.write(110);
  servo2.write(70); 
  servo3.write(100);
  delay(1000);

}

void loop() {

  static boolean IRMode = true;  // Iniciando o modo IR
    sensor();

  if (irrecv.decode(&results)) {
    infraredvalue = results.value; //Recebe o valor lido pelo IR
    Serial.println(infraredvalue, HEX);
    if (infraredvalue == 0x1FE708F){
      IRMode = false;
      //sensor();
    }
    if (infraredvalue == 0x1FE48B7){
      IRMode = true;
      //controle();
    }
    if (IRMode == true){
      controle();
    }
    if (!IRMode) { 
      sensor();
    }
    irrecv.resume(); // Recebe o próximo valor
  }
}


long microsecondsToCentimeters(long microseconds) { 
  return microseconds / 29 / 2;
}

void sensor(){
  long duration, cm;
  digitalWrite(trig, LOW);
  delayMicroseconds(2);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  delayMicroseconds(2);
  duration = pulseIn(echo, HIGH);
  cm = microsecondsToCentimeters(duration);
  if (cm > 10 and st==1){ //Se a distância do obstáculo for maior que 10 cm alinha o sensor com os servomotores
    alinha();
  }
  if (cm <= 10 and st==1){ //Se a distância atender à condição o servomotor para para 180 graus
    sonar2();
  }
  if (cm <= 10 and st==2){ //Se a distância atender à condição os servomotores param
    stop1();
  }
  if (cm > 10 and st==2){ //Se a distância atender à condição os sermotores avançam
    frente();
  }
  if (cm > 10 and st==3){ //Se a distância atender à condição os sermotores avançam
    frente();
  }
  if (cm <= 10 and st==3){ //Se a distância do obstáculo for maior que 10 cm alinha o sensor com os servomotores
    alinha();
  }
}

void controle(){
  switch (infraredvalue) {
  case 0x1FEA05F: //Se o botão com código 1FEA05F for pressionados servomotores param
    stop2();
    //break;
  case 0x1FE609F: //Se o botão com código 1FE609F for pressionado o sensor com os servomotores
    alinha();
    //break;
  case 0x1FE20DF: //Se o botão com código 1FE20DF for pressionado os sermotores avançam
    frente();
    //break;
  case 0x1FE8877: //Se o botão com código 1FE8877 for pressionado deixa a função do controle() e volta a função sensor()
    sensor();
    //break;
  }
}
/* BLOCO DE TESTE ALTERNATIVO
void controle(){
 
 if (infraredvalue == 0x1FEA05F) //Verifica se a tecla 1FEA05F foi acionada 
 { 
 pare2();
 }
 if (infraredvalue == 0x1FE609F) //Verifica se a tecla 1FE609F foi acionada 
 { 
 alinha();
 }
 if (infraredvalue == 0x1FE20DF) //Verifica se a tecla 1FE20DF foi acionada 
 { 
 frente();
 }
 // Voltar para o sensor
 if (infraredvalue == 0x1FE8877) //Verifica se a tecla 1FE8877 foi acionada 
 { 
 sensor();
 }
 }
 
 */

//OS SERVOMOTORES FORAM MODIFICADOS PARA GIRAR 360 GRAUS
void frente() {
  servo1.write(110); //enviando um ângulo de 110 graus para o sensor se alinhar com os servomotores
  servo2.write (70); //enviando um ângulo de 70 graus que é o ponto em que o servo1 avança
  servo3.write (100); //enviando um ângulo de 100 graus que é o ponto em que o servo2 avança
  delay(15); 
}

void stop2() {
  servo2.write(94); //enviando um ângulo de 94 graus que é o ponto em que os servomotores param
  servo3.write(94); //enviando um ângulo de 94 graus que é o ponto em que os servomotores param
  st = 1;
  delay(200);
  //sonar();
}

void stop1() {
  servo2.write(94); //enviando um ângulo de 94 graus que é o ponto em que os servomotores param
  servo3.write(94); //enviando um ângulo de 94 graus que é o ponto em que os servomotores param
  st = 1;
  delay(200);
  sonar();
}
void sonar() {
  servo1.write(0); //enviando um ângulo de 0 grau para verificar se existe algum obstáculo à direita
  delay(2000); 
}
void sonar2() {
  servo1.write(180); //enviando um ângulo de 0 grau para verificar se existe algum obstáculo à esquerda
  st=3;
  delay(2000);
}
void alinha() { //alinhar o sonar com os servomotores
  servo1.write(110);
  for(int i=0;i<=10;i++) {
    servo2.writeMicroseconds (1000);
    servo3.writeMicroseconds (1000);
    st = 2;
    delay(30);
  }
}

Obrigado.