Мигание светодиода с разными временами выключения только один раз с millis

Так что у меня возникли проблемы, пытаясь понять это. Моему проекту нужен клапан, чтобы оставаться закрытым, и когда срабатывает событие, через 3 секунды после этого события клапан открывается на 2 секунды, а затем остается закрытым до тех пор, пока не сработает снова. Я просто рассматривал его как светодиод в коде. Я пытался закодировать его так, чтобы он переходил от одного оператора if к другому с соответствующими задержками, но он работает не так, как я думал. Любая помощь была бы очень кстати. Спасибо

//the event does ventGo0 = true;
     
 if(((millis() - previousVenting) > offoffDuration)&&(ventGo0==true)){ 
        previousVenting1 = millis();
        ventGo1=true;
        ventGo0=false;
       }

 

     if(((millis() - previousVenting1) > onDuration)&&(ventGo1==true)){ 
       digitalWrite(ventPin, HIGH);
       previousVenting2 = millis();
       ventGo2=true;
       ventGo1=false;
     }
       
    
      
       if(((millis() - previousVenting2) > offDuration)&&(ventGo2==true)){  
         digitalWrite(ventPin, LOW);
         ventGo2=false;
       }
      
      ```

, 👍1

Обсуждение

просто записка ... if (ventGo1==true) совпадает с if (ventGo1), @jsotola


1 ответ


Лучший ответ:

1

Вы можете использовать два таймера на основе millis ().

// Sketch uses 1066 bytes (3%) of program storage space.
// Global variables use 27 bytes (1%) of dynamic memory.
// Arduino Uno, IDE 1.8.9
class MillisTimer{

  private:

    unsigned long m_timeInMilliSeconds;
    unsigned long m_previousMillis;
    byte m_timerActive;

  public:

    MillisTimer(unsigned long timeInMilliSeconds):
      m_timeInMilliSeconds(timeInMilliSeconds){
      m_timerActive = 0;
      m_previousMillis = 0;
    }

    bool Update(){
      if(m_timerActive && (millis() - m_previousMillis >= m_timeInMilliSeconds)){
        m_previousMillis += m_timeInMilliSeconds;
        return 1;
      }
      else{
        return 0;
      }
    }

    void Start(){
      m_timerActive = 1;
    }

    void Stop(){
      m_timerActive = 0;
    }

    void ReStart(){
      m_timerActive = 1;
      m_previousMillis = millis();
    }

    byte IsActive(){
      return m_timerActive;
    }

};

// Make copies of the object to work with.
MillisTimer TwoSecondTimer(2000);
MillisTimer ThreeSecondTimer(3000);

void setup(){

  // Call this function when an event is triggered.
  ThreeSecondTimer.ReStart();

  // Timer status indicator.
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

}

void loop(){

  // Call the update function as fast as possible.
  if(ThreeSecondTimer.Update()){
    digitalWrite(LED_BUILTIN, HIGH);
    ThreeSecondTimer.Stop();
    TwoSecondTimer.ReStart();
  }

  // Call the update function as fast as possible.
  if(TwoSecondTimer.Update() && !ThreeSecondTimer.IsActive()){
    digitalWrite(LED_BUILTIN, LOW);
    TwoSecondTimer.Stop();
  }

}
,

Большое спасибо Ve7jro. Я включил ваш код в свой проект, и он отлично работает, как раз то, что мне было нужно. Когда arduino загружается в первый раз, он не включает светодиод или, в моем случае, клапан. Есть ли способ предотвратить это? Спасибо, @Jason8899

@Jason8899 _ Если вы обновите свой вопрос полным "скетчем", я взгляну на него для вас. Имейте в виду, что "три секунды".Перезагрузка (); "в" настройка () "немедленно запускает таймер, поэтому вам следует удалить его из" настройка () "и добавить в свой код, часть "управляемая событиями" вашего кода., @VE7JRO

Я нашел проблему, еще раз спасибо., @Jason8899