Как мне запрограммировать Arduino на игнорирование последующих нажатий кнопки в течение 5 минут после нажатия указанной кнопки?

#arduino

#arduino

Вопрос:

Я использую кнопку для запуска реле; код для этого приведен ниже.

Я хочу запрограммировать свой Arduino на игнорирование любых последующих нажатий кнопки в течение 5 минут. Как мне включить эту функцию в мой эскиз Arduino?

Цель этого состоит в том, чтобы лишить пользователя возможности повторно запускать реле, многократно нажимая кнопку, пока не пройдет 5-минутный интервал. Это для произведения общественного искусства, и, как следует, такие ограничения должны быть наложены, чтобы гарантировать надлежащее использование произведения.

 int pinButton = 8;
int Relay = 2;
int stateRelay = LOW;
int stateButton;
int previous = LOW;
long time = 0;
long debounce = 500;
int stayON = 5000; //stay on for 5000 ms

void setup() {
  pinMode(pinButton, INPUT);
  pinMode(Relay, OUTPUT);
}

void loop() {
  stateButton = digitalRead(pinButton);  
  if(stateButton == HIGH amp;amp; previous == LOW amp;amp; millis() - time > debounce) {
    if(stateRelay == HIGH){
      digitalWrite(Relay, LOW);
    } else {
       digitalWrite(Relay, HIGH);
       delay(stayON);
       digitalWrite(Relay, LOW);
    }
    time = millis();
  }
  previous == stateButton;
}
  

Ответ №1:

Вы можете добавить переменную для хранения последнего времени, когда дисплей был активирован. Затем вы можете изменить свой оператор else на оператор elseif, в котором вы сравниваете текущее время выполнения с последним разом, когда оно было активировано. Это будет работать аналогично методу debounce, который вы использовали.

 long lastActivated = 0; //last time display was activated
long myDelay = 300000; //5 minutes in millis


  if(stateButton == HIGH amp;amp; previous == LOW amp;amp; millis() - time > debounce) {
    if(stateRelay == HIGH){
      digitalWrite(Relay, LOW);
    } else if (millis() - lastActivated > myDelay) { //verifies it's been 5 minutes
       digitalWrite(Relay, HIGH);
       delay(stayON);
       digitalWrite(Relay, LOW);
       lastActivated = millis(); //resets lastActivated when display is allowed to activate
    }
    time = millis();
  }
  

Комментарии:

1.Обратите внимание, что millis() переполнение происходит примерно через 50 дней, и поэтому нажатие кнопки через 50 дней и от 0 до 5 минут после предыдущего также будет проигнорировано. Это маловероятный крайний случай, хотя, поскольку Arduino обычно не работают 50 раз подряд.

Ответ №2:

Это зависит от поведения устройства, на котором работает реле. Если реле должно быть включено в течение всего времени работы произведения искусства, используйте простой delay() :

 int waitFiveMinutes = 300000;
// ... other stuff ...

void loop() {
  if (digitalRead(pinButton) == LOW)
  {
    digitalWrite(Relay, HIGH);
    delay(waitFiveMinutes);
    digitalWrite(Relay, LOW);
  }
}
  

Если вам нужно только один раз запустить реле, например, для открывания гаражных ворот, тогда вы задерживаете нажатие кнопки:

 void loop() {
  if (digitalRead(pinButton) == LOW)
  {
    triggerRelay();
    delay(waitFiveMinutes);
  }
}

void triggerRelay() {
  digitalWrite(Relay, HIGH);
  delay(200);  // you might not need this
  digitalWrite(Relay, LOW);
}

  

В любом случае кнопка не должна реагировать во время задержки. Если он отвечает, вы можете случайно обойти реле на макете.