Как разделить режимы с использованием flag с одной кнопки на три кнопки

Здравствуйте, не понимаю, как разделить режимы с одной кнопки на три разные. Пытался прописывать идентично, как для кнопки один, собственно поэтому переменные остались. Но кнопки не реагируют. Как правильно это оформить при функции flag?

int R_LedPin = 2;             // Подключаем красный светодиод к порту 2
int Y_LedPin = 3;             // Подключаем зеленый светодиод к порту 3
int ButPin = 7;               // Подключаем кнопку 1 к выходу 7
int ButPin2 = 8;              // Подключаем кнопку 2 к выходу 8
int ButPin3 = 6;              // Подключаем кнопку 3 к выходу 6
int flag = 0;                  // флаг состояния
int regim = 0;                 // Переключалка

void setup()
{
  pinMode(R_LedPin, OUTPUT);   
  pinMode(Y_LedPin, OUTPUT);
  // Установили тип пина
  pinMode(ButPin, INPUT_PULLUP);
  pinMode(ButPin2, INPUT_PULLUP);
  pinMode(ButPin3, INPUT_PULLUP);
 
}  

void loop()
{ 

  if(digitalRead(ButPin) == HIGH && flag == 0)      
    {                                              
      regim++;
      flag = 1;
      
      if(regim > 3)                     // Если номер режима превышает требуемого
        {                               // то отсчет начинается с нуля
          regim = 0;
        }
    }
  
  if(digitalRead(ButPin) == LOW && flag == 1)
    {
      flag = 0;
    }  
   
// ======= Вполняем задачу при выборе режима =======
// РЕЖИМ 0: OFF
  if(regim == 0)
    {
      digitalWrite(R_LedPin, LOW);
      digitalWrite(Y_LedPin, LOW);
    }
    
// РЕЖИМ 1: R
  if(regim == 1)
    {
      digitalWrite(R_LedPin, HIGH);
      digitalWrite(Y_LedPin, LOW);
      delay(1000);
      digitalWrite(R_LedPin, LOW);
      digitalWrite(Y_LedPin, HIGH);
      delay(1000);  
    }

// РЕЖИМ 2: Y
  if(regim == 2)
    {
      digitalWrite(R_LedPin, HIGH);
      delay(1000);
      digitalWrite(R_LedPin, LOW);
      delay(1000);
      digitalWrite(Y_LedPin, HIGH);
      delay(100);
      digitalWrite(Y_LedPin, LOW);
      delay(100);

    }
    // РЕЖИМ 3: RY
  if(regim == 3)
    {
      digitalWrite(R_LedPin, HIGH);
      digitalWrite(Y_LedPin, LOW);
      delay(100);
      digitalWrite(R_LedPin, LOW);
      digitalWrite(Y_LedPin, HIGH);
      delay(100);
    }
  }`Текст "как есть" (без применения форматирования)`

Тема перенесена в раздел “Песочница”

Что означают эти слова. Может изъясняться по-русски?

В Вашем коде нет функции flag. Объясните толком, что Вы имеете в виду.

Старайтесь не употреблять слов, смысла которых Вы не понимаете. Тогда, возможно, Вас можно будет понять.

Смотрите, попробую объяснить, что у меня получилось. У меня на данный момент переключение режимов для 2-ух светодиодов происходит лишь по одной тактовой кнопке на макетной плате. Я хочу добавить еще 2 кнопки и переключать режимы 2 и 3 через кнопку 2 и 3 соответственно. Т.е. чтобы я нажимал на кнопку 1 - светодиоды загорались и мерцали, затем нажимал на кнопку 2 - один из светодиодов мерцал быстрее другого, а по 3-ей кнопке сделать так, чтобы второй светодиод начал мерцать с такой же частотой, как и переключенный до этого. Пытался разъяснить подробнее.

создай переменную KnopkaN (или подобную) ну и в зависимости от нажатой кнопки присваивай значение… а потом выполняй if (KnopkaN == 1){…} и Т.п.

Так, а как тогда сохранять состояние нажатой кнопки. Чтобы не удерживать ее, а именно нажал и светодиоды мерцают?

так ты и будешь хранить значение в переменной, а потом кнопками его менять

Сейчас попробую так реализовать.

строки 23-32 3 раза перепиши правильно и в 27 поставь delay (100)

Под правильностью написания Вы вот так имели ввиду?

if(digitalRead(ButPin) == HIGH && flag == 0)      
    {                                              
      regim++;
      flag = 1;
      delay(100);
      if(regim > 3)                     // Если номер режима превышает требуемого
        {                               // то отсчет начинается с нуля
          regim = 0;
        }
    }
    if(digitalRead(ButPin2) == HIGH && flag == 0)      
    {                                              
      regim++;
      flag = 1;
      delay(100);
      if(regim > 3)                     // Если номер режима превышает требуемого
        {                               // то отсчет начинается с нуля
          regim = 0;
        }
    }
    if(digitalRead(ButPin3) == HIGH && flag == 0)      
    {                                              
      regim++;
      flag = 1;
      delay(100);
      if(regim > 3)                     // Если номер режима превышает требуемого
        {                               // то отсчет начинается с нуля
          regim = 0;
        }
    }

Задержка от дребезга, пойдет, а где переменная какая кнопка нажата?

Вернее в первом случае режим =0 во втором 1 в третьем 2. Ну и if никакой не нужен

В этой задаче дребезгом можно смело принебречь. Все равно ничего не изменится - одни раз на кнопку нажали и сотню за 1 сек.

Согласен, не доглядел цикл петли…

Попробуй использовать

switch (var) {
 case Knopka1:
    // код для выполнения
    break;
 case Knopka2:
    // код для выполнения
    break;
 case Knopka3:
    // код для выполнения
    break;
 default:

Так, я запутался, вы говорили изначально, что if нужен, а в каком месте именно не требуется? Если перед digitalWrite программа выдает ошибку с требованием if,а если перед режимом (regim>3), поведение идентичное. Уточните пожалуйста, что вы конкретно имели ввиду.

Давайте попробую, что получиться постараюсь показать.

regim++; меняем на regim=0; для 1
flag = 1;
delay(100); - можно удалить, выше написали, а я ошибся , немного
if(regim > 3) - на кой этот if теперь? Можно удалить …
// Если номер режима превышает требуемого
{ // то отсчет начинается с нуля
regim = 0;
}

@Гриша , установи аватарку пожалуйста ))) А то я сейчас немного офигел - «Аватарка с буковой Г» печатает…

Делать нечего, сижу с телефона время убиваю… Буду за ПК если вспомню, поменяю.