#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);
}
В любом случае кнопка не должна реагировать во время задержки. Если он отвечает, вы можете случайно обойти реле на макете.