Более надежный подход к работе двигателя до отпускания кнопки - использовать тайм-аут без кода.То есть, если состояние «без кода» сохраняется в течение периода, превышающего период автоповтора, оно отменяется.
В вашем коде неясно, для чего предназначен 1-секундный аналоговый импульс,но длительные задержки в функции loop()
делают вашу систему намного менее отзывчивой.Лучше опрашивать системную галочку и «делать вещи», когда пришло время делать это.Также следует избегать магических чисел, если вы хотите, чтобы кто-нибудь понял ваш код и не допускал ошибок при обслуживании.
В следующем примере используется системный тик-опрос для реализации тайм-аута «без кода».Я пропустил код включения / выключения двигателя, потому что неясно, что вы там делаете с задержками в 1 секунду.
#define NO_CODE 0xFFFFFFFFul
#define MOTOR_ON_CODE 0xFF906Ful
#define MOTOR_OFF_CODE 0xFFE01Ful
#define STOP_TIME_MS 250ul // stop after button release for 250ms
void loop( )
{
static unsigned long last_on_time = 0 ;
if( irrecv.decode( &results ) )
{
irrecv.resume() ;
unsigned long code = results.value ;
// If motor off code or no code timeout...
if( code == MOTOR_OFF_CODE ||
(code == NO_CODE && millis() - last_on_time > STOP_TIME_MS) )
{
// Motor off
...
}
else if( code == MOTOR_ON_CODE )
{
// Continuously update last on time while button is held
last_on_time = millis() ;
// Motor on
...
}
}
}
Я включил ответ на код отключения двигателя, но это может быть не такнеобходимо, поскольку двигатель будет отключен через 250 мс (или в любое другое время) после отпускания кнопки ON в любом случае.Вместо этого у вас может быть кнопка «вперед / назад» и отпустите любую, чтобы остановить:
#define NO_CODE 0xFFFFFFFFul
#define MOTOR_FWD_CODE 0xFF906Ful
#define MOTOR_REV_CODE 0xFFE01Ful
#define STOP_TIME_MS 250ul // stop after button release for 250ms
void loop( )
{
static unsigned long last_on_time = 0 ;
if( irrecv.decode( &results ) )
{
irrecv.resume() ;
unsigned long code = results.value ;
switch( code )
{
case NO_CODE :
{
if( millis() - last_on_time > STOP_TIME_MS )
{
// Motor off
...
}
}
break ;
case MOTOR_FWD_CODE :
{
// Continuously update last on time while button is held
last_on_time = millis() ;
// Motor forward
...
}
break ;
case MOTOR_FWD_CODE :
{
// Continuously update last on time while button is held
last_on_time = millis() ;
// Motor reverse
...
}
break ;
}
}
}