Помогите разобраться с delay();

GmDen

✩✩✩✩✩✩✩
25 Фев 2022
1
0
Здравствуйте. Помогите разобраться с функцией delay();
Делаю герлянду из обычных светодиодов. Сделал несколько режимов, сделал кнопку для переключения этих режимов. Но изза функции delay(); кнопка не переключает режимы, 100/500 раз нужно нажать чтобы переглючился. Без delay(); все работает отлично.


код:
#include <EncButton.h>
EncButton<EB_TICK, 2> btn(INPUT_PULLUP);

int led3 = 3;
int led4 = 4;
int led5 = 5;
int led6 = 6;
int led7 = 7;
int led8 = 8;
int led9 = 9;
int led10 = 10;
int led11 = 11;
int led2 = 12;

void setup() {
  Serial.begin(9600);
   pinMode(led2,OUTPUT);
   pinMode(led3,OUTPUT);
   pinMode(led4,OUTPUT);
   pinMode(led5,OUTPUT);
   pinMode(led6,OUTPUT);
   pinMode(led7,OUTPUT);
   pinMode(led8,OUTPUT);
   pinMode(led9,OUTPUT);
   pinMode(led10,OUTPUT);
   pinMode(led11,OUTPUT);
}

void loop()
{
    static byte mode = 0;
    btn.tick();
    if (btn.isClick()) {
          if (++mode >= 15) mode = 0;
          Serial.println(mode);
    }
            switch (mode) {
          case 0: task1(); break;
          case 1: task2(); break;
          case 2: task3(); break;
          case 3: task4(); break;
          case 4: task5(); break;
          case 5: task6(); break;
          case 6: task7(); break;
          case 7: task8(); break;
          case 8: task9(); break;
          case 9: task10(); break;
          case 10: task11(); break;
          case 11: task12(); break;
          case 12: task13(); break;
          case 13: task14(); break;
          case 14: task15(); break;
      }   
}

void task1(){
Serial.println("1-Раз");
}

void task2(){
  Serial.println("2-Раз");
 
    int t = 100;

  digitalWrite(led5,HIGH);
  delay(t);
  digitalWrite(led6,HIGH);
  delay(t);
  digitalWrite(led7,HIGH);
  delay(t);
  digitalWrite(led8,HIGH);
  delay(t);
  digitalWrite(led9,HIGH);
  delay(t);
  digitalWrite(led10,HIGH);
  delay(t);
  digitalWrite(led11,HIGH);
  delay(t);
  digitalWrite(led2,LOW);
  delay(t);
  digitalWrite(led3,LOW);
  delay(t);
  digitalWrite(led4,LOW);
  delay(t);
  digitalWrite(led5,LOW);
  delay(t);
  digitalWrite(led6,LOW);
  delay(t);
  digitalWrite(led7,LOW);
  delay(t);
  digitalWrite(led8,LOW);
  delay(t);
  digitalWrite(led9,LOW);
  delay(t);
  digitalWrite(led10,LOW);
  delay(t);
  digitalWrite(led11,LOW);
  delay(t);
}

void task3(){
  Serial.println("3-Раз");
}

void task4(){
  Serial.println("4-Раз");
}

void task5(){
  Serial.println("5-Раз");
}

void task6(){
  Serial.println("6-Раз");
}

void task7(){
  Serial.println("7-Раз");
}

void task8(){
  Serial.println("8-Раз");
}

void task9(){
  Serial.println("9-Раз");
}

void task10(){
  Serial.println("10-Раз");
}

void task11(){
  Serial.println("11-Раз");
}

void task12(){
  Serial.println("12-Раз");
}

void task13(){
  Serial.println("13-Раз");
}

void task14(){
  Serial.println("14-Раз");
}

void task15(){
  Serial.println("15-Раз");
}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Помогаю.
От delay надо избавляться.
Возьмем для примера функцию task2
там этих delay аж 17 штук. по 100мс это 1.7 секунды и на это время кнопка будет мертва.
Как надо делать
Запускается task2
В начале функции проверяется прошло ли 100 мс с последнего запуска. Если нет - то выйти из функции.
Если прошло , то надо включить нужный сделать 1 шаг из этой функции. Либо включить нужный светодиод , либо выключить.
Увеличить шаг на 1 и выйти из функции.

Но при этом функцию task2 (или любую текущую ) надо вызывать в цикле loop постоянно.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@Старик Похабыч, собстна, в данном случае можно и прерывания по таймеру заюзать библиотекой <MsTimer2.h>. Вот только не знаю, не будет ли конфликта с <EncButton.h>?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Можно и по таймеру. Ведь предлагается тик энкодера/кнопки внести ? Я новую библиотеку не смотрел совсем.
Надо ли ? вопрос.
Сложнее это или проще автору ? тоже не знаю.
 
  • Лойс +1
Реакции: PiratFox