Arduino Как я могу сохранить последний ИК-код, чтобы проверить, нужно ли его повторять? - PullRequest
0 голосов
/ 13 мая 2019

Я только учусь Arduino, и у меня подключен двигатель постоянного тока и ИК-приемник. Это работает нормально, если я нажимаю кнопку один раз, но я не могу понять, как сохранить вращение двигателя, если удерживать кнопку нажатой, поскольку команда REPEAT имеет те же цифры.

Я решил, что сохраню последний отправленный код и проверим, соответствуют ли команда повтора и последний код, но, похоже, он не работает и не может понять, почему.

#include <IRremote.h>

int IRpin = 11;  // pin for the IR sensor
IRrecv irrecv(IRpin);
decode_results results;
int lastCode;

void setup() {
  // put your setup code here, to run once:
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  irrecv.enableIRIn(); // Enable IR Receiver.
}

void loop() {
  // put your main code here, to run repeatedly:


if

 (irrecv.decode(&results)) {
  Serial.println(results.value);
  irrecv.resume(); 
  Serial.println("Last Code is set to: ");
  Serial.write(lastCode);


  if(results.value== 16748655 || (results.value== 4294967295 && lastCode== 16748655)) // Your ON button value                                       
  {
      digitalWrite(8, HIGH);
      digitalWrite(7, LOW);
      analogWrite(9, 255);
      delay(1000);
      analogWrite(9, 0);
      lastCode= 16748655;

  }


  else if(results.value == 16769055 || (results.value== 4294967295 && lastCode== 16769055)) // Your OFF button value 
  {
      digitalWrite(8, LOW);
      digitalWrite(7, HIGH);
      analogWrite(9, 255);
      delay(1000);
      analogWrite(9, 0);
      lastCode= 16769055;

  }
}


}

1 Ответ

1 голос
/ 13 мая 2019

Более надежный подход к работе двигателя до отпускания кнопки - использовать тайм-аут без кода.То есть, если состояние «без кода» сохраняется в течение периода, превышающего период автоповтора, оно отменяется.

В вашем коде неясно, для чего предназначен 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 ;
        }
    }
}
...