Robô controle IR

Boa noite pessoal, fiz um codigo para um robô controlado por controle IR, bem o codigo “esta correto”, o robô funciona mas com um detalhe,
Por exemplo, quando aperto o botão MODE do controle que faz o robô ir para frente ele vai indo ate eu apertar outro botão, ou seja a função fica ativa mesmo depois de soltar o botão MODE.

O que eu quero e não estou conseguindo fazer, é fazer com que o robô so obedeça o comando enquanto o botão esteja apertado, quando não houver nem um botão pressionado o robô fique parado.

o meu codigo é este:

#include <IRremote.h> 
 
int motor1pin1 = 3; 
int motor1pin2 = 4; 
int motor2pin1 = 5;
int motor2pin2 = 6;
int led1 = 8; 
int led2 = 9; 
int receiver = A0; 

IRrecv irrecv(receiver); 
decode_results results; 

void setup(){ 
  pinMode(motor1pin1, OUTPUT);
  pinMode(motor1pin2, OUTPUT);
  pinMode(motor2pin1, OUTPUT);
  pinMode(motor2pin2, OUTPUT);
  pinMode(led1, OUTPUT);  
  pinMode(led2, OUTPUT);
  pinMode(receiver, INPUT); 
  Serial.begin(9600); 
  irrecv.enableIRIn(); 
} 

void loop(){ 
  
if (irrecv.decode(&results)){  
switch(results.value){ 
    
            //CONTROLE 
  
case 16736925:{ //  Mode
  digitalWrite(motor1pin1,HIGH); 
  digitalWrite(motor1pin2,LOW);
  digitalWrite(motor2pin1,HIGH);
  digitalWrite(motor2pin2,LOW);
  Serial.println("IR - FRENTE"); 
   break; 
} 
case 16761405:{ //  >>/
  digitalWrite(motor1pin1,HIGH); 
  digitalWrite(motor1pin2,LOW);
  digitalWrite(motor2pin1,LOW);
  digitalWrite(motor2pin2,HIGH);
  Serial.println(" GIRAR HORARIO "); 
  break; 
} 
case 16720605:{ //      >//
  digitalWrite(motor1pin1,LOW); 
  digitalWrite(motor1pin2,HIGH);
  digitalWrite(motor2pin1,HIGH);
  digitalWrite(motor2pin2,LOW); 
  Serial.println("GIRAR ANTI-HORARIO"); 
  break; 
} 
case 16754775:{ //     VOL -
  digitalWrite(motor1pin1,LOW); 
  digitalWrite(motor1pin2,HIGH);
  digitalWrite(motor2pin1,LOW);
  digitalWrite(motor2pin2,HIGH); 
  Serial.println("IR - TRAS"); 
  break; 
} 
case 16712445:{ //     /<<
  digitalWrite(led1, HIGH); 
  digitalWrite(led2, HIGH);
  Serial.println("LIGAR LEDs"); 
  break; 
} 
case 16753245:{ //   on/off
  digitalWrite(led1, LOW); 
  digitalWrite(led2, LOW);
  Serial.println("APAGAR LEDs"); 
  break; 
  } 

} 
  delay(100); 
  irrecv.resume(); 
  } 
}

E aqui um vídeo do robô caso não tenha ficado claro o meu problema

Você deve colocar algum “contador” para desligar o acionamento do motor, após algumas interações do loop sem receber sinal do controle.

#include <IRremote.h> 

int SemSinal = 0; // Controla quantas vezes rodou sem sinal
int motor1pin1 = 3; 
int motor1pin2 = 4; 
int motor2pin1 = 5;
int motor2pin2 = 6;
int led1 = 8; 
int led2 = 9; 
int receiver = A0; 

IRrecv irrecv(receiver); 
decode_results results; 

void setup(){ 
  pinMode(motor1pin1, OUTPUT);
  pinMode(motor1pin2, OUTPUT);
  pinMode(motor2pin1, OUTPUT);
  pinMode(motor2pin2, OUTPUT);
  pinMode(led1, OUTPUT);  
  pinMode(led2, OUTPUT);
  pinMode(receiver, INPUT); 
  Serial.begin(9600); 
  irrecv.enableIRIn(); 
} 

void loop(){ 
  
if (irrecv.decode(&results)){  
SemSinal = 0;
switch(results.value){ 
    
            //CONTROLE 
  
case 16736925:{ //  Mode
  digitalWrite(motor1pin1,HIGH); 
  digitalWrite(motor1pin2,LOW);
  digitalWrite(motor2pin1,HIGH);
  digitalWrite(motor2pin2,LOW);
  Serial.println("IR - FRENTE"); 
   break; 
} 
case 16761405:{ //  >>/
  digitalWrite(motor1pin1,HIGH); 
  digitalWrite(motor1pin2,LOW);
  digitalWrite(motor2pin1,LOW);
  digitalWrite(motor2pin2,HIGH);
  Serial.println(" GIRAR HORARIO "); 
  break; 
} 
case 16720605:{ //      >//
  digitalWrite(motor1pin1,LOW); 
  digitalWrite(motor1pin2,HIGH);
  digitalWrite(motor2pin1,HIGH);
  digitalWrite(motor2pin2,LOW); 
  Serial.println("GIRAR ANTI-HORARIO"); 
  break; 
} 
case 16754775:{ //     VOL -
  digitalWrite(motor1pin1,LOW); 
  digitalWrite(motor1pin2,HIGH);
  digitalWrite(motor2pin1,LOW);
  digitalWrite(motor2pin2,HIGH); 
  Serial.println("IR - TRAS"); 
  break; 
} 
case 16712445:{ //     /<<
  digitalWrite(led1, HIGH); 
  digitalWrite(led2, HIGH);
  Serial.println("LIGAR LEDs"); 
  break; 
} 
case 16753245:{ //   on/off
  digitalWrite(led1, LOW); 
  digitalWrite(led2, LOW);
  Serial.println("APAGAR LEDs"); 
  break; 
  } 

} 
  delay(100); 
  irrecv.resume(); 
  } 
  SemSinal++;
  if (SemSinal == 100) // Se passou 100 vezes e não teve sinal, desliga os motores.
{
  digitalWrite(motor1pin1,LOW); 
  digitalWrite(motor1pin2,LOW);
  digitalWrite(motor2pin1,LOW);
  digitalWrite(motor2pin2,LOW); 
}

}

Obrigado mmoscz pela ajuda, mas ao testa vi que ainda não é exatamente o que eu quero, no seu codigo o robô so da um pulso assim que aperta o botão, eu quero que o robô execute a função enquanto o botão estiver pressionado, ou seja se eu segurar o botão que manda ele ir para frente ele vai enquanto eu segurar o botão e ao soltar o botão ele para.

Desculpe se não expliquei direito o que queria e obrigado novamente pela ajuda

lucaslimaduarte: Obrigado mmoscz pela ajuda, mas ao testa vi que ainda não é exatamente o que eu quero, no seu codigo o robô so da um pulso assim que aperta o botão, eu quero que o robô execute a função enquanto o botão estiver pressionado, ou seja se eu segurar o botão que manda ele ir para frente ele vai enquanto eu segurar o botão e ao soltar o botão ele para.

Desculpe se não expliquei direito o que queria e obrigado novamente pela ajuda

O exemplo que dei é bem simplificado, tipo, ir aumentando o valor do contador, pois ele está parando entre os intervalos que o controle remoto envia os comandos. muda para unsigned long o tipo e coloca algo como 400000. e vai abaixando ou aumentando, até ter um valor que se adeque ao intervalo entre os pulsos e não fique acionado muito tempo após você ter desacionado o botão.