Время выполнения действия

Тема в разделе "Arduino & Shields", создана пользователем Vasai, 17 май 2016.

  1. Vasai

    Vasai Нуб

    Добрый вечер, можете подсказать советом, мне необходимо, при получении сигнала с пульта ДУ, действие выполнялось определенное время, пытаюсь разобраться с millis, но возникли затруднения, почему-то действие не завершается после пройденного интервала времени
    Код (C++):
    #include <IRremote.h>

    int RECV_PIN = 2;
    IRrecv irrecv(RECV_PIN);
    decode_results results;
    int IN1 = 8;
    int IN2 = 7;
    int engineStartMoment = 0;  
    int engineWrokingPeriod = 5000;  

    void setup()
    {
      Serial.begin(9600);
      irrecv.enableIRIn();
      pinMode (IN2, OUTPUT);
      pinMode (IN1, OUTPUT);
    }


    void loop() {
       
       
      if (irrecv.decode(&results)) {
        Serial.println(results.value);
        if (results.value == 2246090081)
        {
          digitalWrite (IN2, HIGH);
          digitalWrite (IN1, LOW);
          engineStartMoment = millis();  
        }

        if (results.value == 3419589885)
        {
          digitalWrite (IN2, LOW);
          digitalWrite (IN1, HIGH);
          engineStartMoment = millis();  
        }
        irrecv.resume();

        if (engineStartMoment) {  
            if (millis() - engineStartMoment >= engineWrokingPeriod) {
              digitalWrite (IN2, LOW);
              digitalWrite (IN1, LOW);
              engineStartMoment = 0;  
            }
        }
      }
    }
     
  2. AlexU

    AlexU Гуру

    Попробуйте изменить код функции loop() -- вынести проверку if (engineStartMoment) за пределы проверки if (irrecv.decode(&results)):
    Код (C++):
    void loop() {
     
     
      if (irrecv.decode(&results)) {
        Serial.println(results.value);
        if (results.value == 2246090081)
        {
          digitalWrite (IN2, HIGH);
          digitalWrite (IN1, LOW);
          engineStartMoment = millis();
        }

        if (results.value == 3419589885)
        {
          digitalWrite (IN2, LOW);
          digitalWrite (IN1, HIGH);
          engineStartMoment = millis();
        }
        irrecv.resume();
      }
     
      if (engineStartMoment) {
          if (millis() - engineStartMoment >= engineWrokingPeriod) {
            digitalWrite (IN2, LOW);
            digitalWrite (IN1, LOW);
             engineStartMoment = 0;
          }
      }
    }
     
    Vasai нравится это.
  3. ostrov

    ostrov Гуру

    Вот это действие что должно делать? У вас оно отнимает от кол-ва миллисекунд прошедших с начала запуска программы ноль и сравнивает с 5000. То есть условие выполнится после 5 сек после начала запуска программы и будет постоянно выполнятся далее. В чем смысл?
     
  4. AlexU

    AlexU Гуру

    Ноль не отнимет, предыдущее условие 'if (engineStartMoment)' проверяет, что бы не было нуля.
     
  5. ostrov

    ostrov Гуру

    Блин как заморочено то!
     
  6. Vasai

    Vasai Нуб

    Спасибо, и в правду в этом была проблема, все работает.