Есть код,который будет представлен ниже, смысл в том чтобы происходила смена режима по нажатию кнопки в любой момент. Когда программа переключается на task_1(); то переключение на следующий режим становится возможным после прохода цикла и на смену есть несколько секунд( прерывания пробовал вставлять, эффекта не замечал). Замечал что цикл в принципе не любит быструю смену но так и не нашел как это решить.
Ещё раз (на всякий). Задача в том чтобы по нажатию на кнопку(она одна ) происходило переключение режима независимо где находится программа ( в середине цикла или в начале).
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
								Ещё раз (на всякий). Задача в том чтобы по нажатию на кнопку(она одна ) происходило переключение режима независимо где находится программа ( в середине цикла или в начале).
			
				C++:
			
		
		
		/*
   Люстра
*/
#define PIN 3        // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define MODE_AM 5    // количество режимов (от 0 до указанного)
#include "GyverButton.h"
byte diod_1 = 4;  //Диоды и их расположение на пинах
byte diod_2 = 5;  //Шим порт
byte diod_3 = 6;    //Шим порт
byte diod_4 = 7;
byte diod_5 = 9;
#define LEDS              diod_1,diod_2,diod_3,diod_4,diod_5 //массив диодов
#define STEP_TIME         500 // Время на рандоме
uint8_t leds[] = { LEDS };
GButton butt1(PIN);  // создаём нашу "кнопку"
int mode = 0;       // переменная режима
void setup() {
  Serial.begin(9600);
  pinMode(3, INPUT_PULLUP);
 
  for (uint8_t o = 0; o <  sizeof(leds); o++)
    pinMode(leds[o], OUTPUT);
}
void loop() {
  butt1.tick();             // обязательная функция отработки. Должна постоянно опрашиваться
  if (butt1.isPress()) {    // правильная отработка нажатия с защитой от дребезга
    // увеличиваем переменную номера режима. Если вышла за количество режимов - обнуляем
    if (++mode >= MODE_AM) mode = 0;
    switch (mode) {
      case 1:
      task_0();
      break; // Режим 1. включение всех диодов сразу
      
      case 2:
      task_1();
      break; // Режим 2. Включение диодов по очереди плавно в цикле
      case 3:
      task_2();   
      break;// Режим 3. Рандомное загорание диодов
      case 4:
      task_3();  break;// Режим 4. Включение диодов как во 2-ом режиме и + включается лишний диод
    }
  }
}
// наши задачи, внутри функций понятное дело может быть всё что угодно
void task_0() {
  Serial.println("task_0");
  digitalWrite(diod_1, HIGH);
  digitalWrite(diod_2, HIGH);
  digitalWrite(diod_3, HIGH);
  digitalWrite(diod_4, HIGH);
  digitalWrite(diod_5, HIGH);
}
void task_1() {
  Serial.println("task_1");
  // плавное включение светодиода
  // начальное значение на Pin6 i=0, если i<=255, то прибавляем к i единицу
  digitalWrite(diod_1, HIGH);
  digitalWrite(diod_2, HIGH);
  digitalWrite(diod_3, HIGH);
  digitalWrite(diod_4, HIGH);
  for (int i = 255; i >= 0; i--) {  //i--
    analogWrite(diod_3, i);
    delay(30); // ставим задержку для эффекта 30
    if (i == 5) {
      digitalWrite(diod_1, LOW);
    }
  }
  if (digitalRead(diod_1) == LOW) {
    for (int i = 255; i >= 0; i--) {  // i++
      analogWrite(diod_2, i);
      delay(30); // ставим задержку для эффекта 30
      if (i == 5) {
        digitalWrite(diod_4, LOW);
      }
    }
  }
  delay(1000);  //Задержка между разгоранием и затуханием
  //плавное затухание светодиода
  // начальное значение на Pin6 i=255, если i>=255, то вычитаем от i единицу
  for (int i = 0; i <= 255; i++) {
    analogWrite(diod_3, i);
    delay(30); // ставим задержку для эффекта 30
    if (i == 250) { // Загорнется лишний диод и остается гореть
      digitalWrite(diod_1, HIGH);
    }
  }
  if (digitalRead(diod_1) == HIGH) {
    for (int i = 0; i <= 255; i++) { 
      analogWrite(diod_2, i);
      delay(30); // ставим задержку для эффекта 30
      if (i == 250) {
        digitalWrite(diod_4, HIGH);
      }
    }
  }
  delay(1000);
}
void task_2() {
  Serial.println("task_2");
    digitalWrite(diod_1, LOW);
  digitalWrite(diod_2, LOW);
  digitalWrite(diod_3, LOW);
  digitalWrite(diod_4, LOW);
  digitalWrite(diod_5, LOW);
  static bool back;
  for (uint8_t j = 0; j < sizeof(leds); j++) {
    uint8_t o;
    do
      o = random(0, sizeof(leds));
    while (digitalRead(leds[o]) != back);
    digitalWrite(leds[o], !back);
    delay(STEP_TIME);
  }
  back = !back;
}
void task_3() {
  Serial.println("task_3");
  digitalWrite(diod_1, HIGH);
  digitalWrite(diod_2, HIGH);
  digitalWrite(diod_3, HIGH);
  digitalWrite(diod_4, HIGH);
  digitalWrite(diod_5, HIGH);
  if (digitalRead(diod_5) == HIGH) {
    delay(1000);
    digitalWrite(diod_5, LOW);
    for (int i = 255; i >= 0; i--) {  //i--
      analogWrite(diod_3, i);
      delay(10); // ставим задержку для эффекта 30
      if (i == 1) {
        digitalWrite(diod_1, LOW);
      }
    }
    if (digitalRead(diod_1) == LOW) {
      for (int i = 255; i >= 0; i--) {  // i++
        analogWrite(diod_2, i);
        delay(10); // ставим задержку для эффекта 30
        if (i == 1) {
          digitalWrite(diod_4, LOW);
        }
      }
    }
    delay(1000);
  }
  if (digitalRead(diod_5) == LOW) {
    digitalWrite(diod_5, HIGH);
    delay(1000);
    for (int i = 0; i <= 255; i++) {  // i++
      analogWrite(diod_3, i);
      delay(10); // ставим задержку для эффекта 30
      if (i == 250) { // Загорнется лишний диод и остается гореть
        digitalWrite(diod_1, HIGH);
      }
    }
    if (digitalRead(diod_1) == HIGH) {
      for (int i = 0; i <= 255; i++) {  // i++
        analogWrite(diod_2, i);
        delay(10); // ставим задержку для эффекта 30
        if (i == 250) {
          digitalWrite(diod_4, HIGH);
        }
      }
    }
  }
  delay(2000);  //Задержка между разгоранием и затуханием
} 
				
		 
 
		