Мигание светодиода с разными временами выключения только один раз с 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;
}
```
@Jason8899, 👍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
- Как справиться с rollover millis()?
- Использование millis() и micros() внутри процедуры прерывания
- ардуино - миллисекунды ()
- Кнопка с таймером переключения и функцией сброса времени + светодиод обратной связи
- Использовать timer0, не влияя на millis() и micros().
- Торговый автомат Arduino для мониторинга ввода монет в слот во время ожидания ввода пользователя
- Влияет ли `millis()` на длинные ISR?
- nodeMCU — Millis() — Простой счетчик — Как долго горит светодиод?
просто записка ...
if (ventGo1==true)
совпадает сif (ventGo1)
, @jsotola