Как прервать цикл, если он не закончился за 10 секунд?

В настоящее время я использую OneButton.h библиотека для кодирования моего кнопочного проекта.

Когда я нажимаю кнопку 1, она делает цикл в течение 10 секунд и печатает триггер, а после этого разрывает цикл.

Однако теперь я хочу запрограммировать его так, чтобы при нажатии кнопки button1 он перескочил в функцию void(singleclick), но прямо сейчас, в течение 4-й секунды (в любое время до 10-й секунды) , я нажал другую кнопку, таким образом Arduino разорвет цикл 10 секунд и запустит другую функцию.

Таким образом, мне нужна помощь, как убедиться, что Arduino активно читает другую кнопку и при нажатии она разорвет текущий цикл/функцию на другие связанные функции.

#include <OneButton.h>

OneButton button1(2, true);
OneButton button2(3, true);
OneButton button3(4, true);
OneButton button4(5, true);

int led1=12;
int led2=11;
int led3=10;
int led4=9;

int flag;

unsigned long mode;

void setup()
{

  Serial.begin(9600);
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(led3,OUTPUT);
  pinMode(led4,OUTPUT);

  button1.attachClick(singleclick1);
  button1.attachLongPressStop(longclick);

  button2.attachClick(singleclick2);
  button3.attachClick(singleclick3);
  button4.attachClick(singleclick4);

   digitalWrite(led1,HIGH);
   digitalWrite(led2,HIGH);
   digitalWrite(led3,HIGH);
   digitalWrite(led4,HIGH);
  
}

void loop()
{
  button1.tick();
  delay(20);

  button2.tick();
  delay(20);

  button3.tick();
  delay(20);

  button4.tick();
  delay(20);

  Serial.println("No button");

}

void singleclick1()
{
   mode=millis();

   flag=1;

   while(flag==1)
   {
     Serial.println("button1");
     digitalWrite(led1,HIGH);
     digitalWrite(led2,LOW);
     digitalWrite(led3,LOW);
     digitalWrite(led4,LOW);
  
     if(millis()-mode>5000)
     {
      Serial.println("TRIG");
      flag=0;

      button2.tick();
      delay(20);
      
      button3.tick();
      delay(20);
      
      button4.tick();
      delay(20);
      
      return;
     }
   }
}

void singleclick2()
{
   Serial.println("button2");
   digitalWrite(led1,LOW);
   digitalWrite(led2,HIGH);
   digitalWrite(led3,LOW);
   digitalWrite(led4,LOW);
}
 

, 👍1

Обсуждение

Вы можете запустить таймер, который переключает флаг через 10 секунд. Затем цикл будет проверять этот флаг на каждой итерации., @Kwasmich


1 ответ


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

3

Это всего лишь грубый, неполный и непроверенный код.

void singleclick1() { startTimer = true; }      // это только устанавливает флаг

void singleclick2() { runTimer   = false;}      // это только очищает фла


void loop() {

   button1.tick();
   button2.tick();

   if startTimer {                 // это происходит один раз при каждом щелчке 1

      mode        = millis();
      runTimer    = true;
      startTimer  = false;         // запускайте этот блок только один раз при каждом клике 1

      digitalWrite(led1, HIGH);
      digitalWrite(led2, LOW );
      digitalWrite(led3, LOW );
      digitalWrite(led4, LOW );
   }

   unsigned long currentMillis = millis();

   if (currentMillis - mode > 10000) {
      runTimer = false;                      // истек срок действия 10-секундного таймера
   }

   if (runTimer) {

      Serial.println("TRIG");
         
   }
   else {
      // необязательные вещи, которые нужно сделать
   }
}
,

Большое вам спасибо!, @Peterhan123