Нужна помощь в кодировании «таймера» в операторе if else

Я хочу запрограммировать что-то вроде «таймера» (не знаю, как его назвать) в операторе if else в моем Arduino Uno.

По сути у меня есть 2 кнопки. Если кнопка 1 нажата, а кнопка 2 также нажата в течение определенного времени (скажем, 3 секунд), код выполнится. Если кнопка 1 нажата, но кнопка 2 не нажата в течение 3 секунд, произойдет возврат в исходное состояние. Как мне написать этот код?

Я включил блок-схему, чтобы прояснить мой вопрос.

Всем спасибо :)

if(digitalRead(button1) == LOW)       // здесь мне нужна помощь
{
  if(digitalRead(selectbutton) == LOW)
  { 
    for(x=1; x<=30; x++)
    {
      digitalWrite(dir, HIGH);
      delayMicroseconds(10);
      time_now = millis();
      digitalWrite(led, HIGH);
      while(millis() < time_now + 50)
      {
      }

      time_now = millis();
      digitalWrite(led, LOW);
      while(millis() < time_now + 50)
      {
      }
    }
    x=0;
  }
}


else if(digitalRead(button2) == LOW)    //то же самое здесь >_<
{
  if(digitalRead(selectbutton) == LOW)
  {
    for(x=1; x<=10; x++)
    {
      digitalWrite(dir, LOW);
      delayMicroseconds(10); 
      time_now = millis();
      digitalWrite(led, HIGH);
      while(millis() < time_now + 150)
      {
      }

      time_now = millis();
      digitalWrite(led, LOW);
      while(millis() < time_now + 150)
      {
      }
    }
    x=0;
  }
}

, 👍1

Обсуждение

Привет, я отредактировал свое сообщение. Надеюсь, вы сможете помочь. :), @BreadPig


2 ответа


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

2

Похоже, ваша блок-схема противоречит коду. button1 и button2 говорят сами за себя, но что такое selectButton?

Вот код, который может выполнить то, что вы пытаетесь сделать:

uint8_t bool_waitforbutton2 = 0;
uint32_t num_timeatbutton1 = 0;
void loop() {
  //ваш другой код цикла здесь
  if(digitalRead(button1) == LOW) {
    num_timeatbutton1 = millis();
    bool_waitforbutton2 = 1;
  }
  if(bool_waitforbutton2 == 1 && digitalRead(button2) == LOW){
    bool_waitforbutton2 = 0;
    //Ваш код здесь
  }
  if (millis() > (num_timeatbutton1 + 3000)) {
    bool_waitforbutton2 = 0;
  }
}

Это даст вам 3000 мс для нажатия button2 после того, как вы отпустите button1 для выполнения вашего кода, в противном случае «флаг готовности» bool_waitforbutton2 сбрасывается.

,

извините за неясность, «кнопка 1» предназначена для выбора первой функции, а «кнопка выбора» — для подтверждения запуска функции 1. Аналогично для «кнопки 2» — для выбора функции 2, а «кнопка выбора» — для подтверждения., @BreadPig


3

Блок-схема — это неплохо, но это не самый подходящий вариант. диаграмма для такого рода задач. Вам следует попытаться мыслить с точки зрения Вместо этого конечные автоматы, что является очень полезной концепцией. всякий раз, когда вы пытаетесь реализовать «реактивные» системы, то есть системы, которые реагировать на какой-либо ввод.

Вот ваша проблема, я так понимаю, переведенная в состояние диаграмма:

диаграмма состояний

Эта система имеет два состояния:

  • «ожидание», когда он ожидает нажатия первой кнопки
  • «режим ожидания», когда была нажата первая кнопка, и он ожидает второй.

Нажатие кнопки 1 переключает режим ожидания в режим ожидания. переход обратно в исходное состояние «ожидания» может быть инициирован двумя отдельные события:

  • 3 секунды в режиме ожидания.
  • пользователь нажимает кнопку 2.

Обратите внимание, что во втором случае система запускает ваш код, одновременно создавая переход.

После того, как у вас есть диаграмма состояний и вы прочитали (и понял) учебник по конечному автомату, на который я ссылался, перевод преобразование диаграммы в код почти тривиально.

,