Выполнение функции через 1 минуту, если кнопки остаются нетронутыми в Arduino Uno

Я делаю калькулятор с Arduino Uno. Я использую клавиатуру 4x4 и ЖК-дисплей 16x2 для дисплея. Вот мой вопрос: если кнопки на клавиатуре остаются нетронутыми в течение 1 минуты, программа выполнит функцию. Как я могу это сделать?


person Kayahan Albayrak    schedule 05.05.2015    source источник


Ответы (1)


Вы можете использовать millis() для измерения времени и простой флаг boolean с digitalRead() для определения того, была ли нажата кнопка. Должно быть что-то вроде этого (еще не проверял):

unsigned long previousMillis = 0;
long interval = 60000;
int buttonPin = 4;
boolean buttonReleased=false;

void setup(){
}

void loop(){
  unsigned long currentMillis = millis();

  // edit, thanks to frarugi87
  if (digitalRead(buttonPin) == LOW){
    buttonReleased = true; 
    previousMillis = currentMillis; 
  } 

  if((currentMillis - previousMillis > interval)&&buttonReleased ) {
    previousMillis = currentMillis;  
    buttonReleased =false;
    // execute a function
  }
}

РЕДАКТИРОВАТЬ: исправьте состояние клавиатуры.

person user3704293    schedule 05.05.2015
comment
в кнопках клавиатуры это не ВЫСОКИЙ или НИЗКИЙ, я немного отредактировал код, но он не работает. - person Kayahan Albayrak; 05.05.2015
comment
Часть currentMillis - previousMillis > interval — это хорошо зарекомендовавший себя фрагмент кода для Arduino, и он должен работать. Вы можете протестировать его отдельно с более низким интервалом (например, interval=1000;). То, как вы активируете код, зависит от кода вашей клавиатуры. Я предполагал, что вы используете простые тактильные кнопки или подобное оборудование, которое вы можете адаптировать к приведенному выше примеру кода. - person user3704293; 05.05.2015
comment
Это не может работать. Правильный код — if (digitalRead(buttonPin) == LOW) { buttonReleased = true; previousMillis = currentMillis; }, потому что вы должны сбрасывать previousMillis каждый раз, когда нажимаете кнопку. buttonReleased теперь должно называться executeFunction или что-то в этом роде, потому что это просто используется, чтобы избежать двойного запуска функции. - person frarugi87; 06.05.2015