Хочу оптимизировать этот код и добавить цикл

Поэтому я хочу оптимизировать этот код и добавить петлю к двум красным светодиодам. Процесс заключается в том, что зеленый светодиод мигает, нажмите кнопку, желтый светодиод мигает в течение 3 секунд, а затем попеременно мигает между двумя красными светодиодами, пока кнопка не будет отпущена.

 int switchState = 0;
    int green = 3;
    int yellow = 4;
    int red1 = 5;
    int red2 = 6;
    int button = 2;
    
    void setup()
    {
      pinMode(green, OUTPUT) ;
      pinMode(yellow, OUTPUT) ;
      pinMode(red1, OUTPUT) ;
      pinMode(red2, OUTPUT) ;
      pinMode(button, INPUT) ;
    }
    
    void loop()
    
    { //start void loop 1
      switchState = digitalRead(button);
    
      if (switchState == LOW)         //кнопка не нажата
      {
        digitalWrite(green, HIGH);      //зеленый светодиод вкл
        digitalWrite(yellow, LOW);
        digitalWrite(red1, LOW);
        digitalWrite(red2, LOW);
    
        delay(500);
    
        digitalWrite(green, LOW);     //зеленый светодиод выкл
    
        delay(500);
      }//end if
    
      else        //Button pressed
      {
    
        digitalWrite(green, LOW);
        digitalWrite(yellow, HIGH);   //Мигает желтый светодиод в течение 3 секунд
        digitalWrite(red1, LOW);
        digitalWrite(red2, LOW);
    
        delay(250);
    
        digitalWrite(yellow, LOW);
    
        delay(250);
    
        digitalWrite(yellow, HIGH);
    
        delay(250);
    
        digitalWrite(yellow, LOW);
    
        delay(250);
    
        digitalWrite(yellow, HIGH);
    
        delay(250);
    
        digitalWrite(yellow, LOW);
    
        delay(250);
    
        digitalWrite(yellow, HIGH);
    
        delay(250);
    
        digitalWrite(yellow, LOW);
    
        delay(250);
    
        digitalWrite(yellow, HIGH);
    
        delay(250);
    
        digitalWrite(yellow, LOW);
    
        delay(250);
    
        digitalWrite(yellow, HIGH);
    
        delay(250);
    
        digitalWrite(yellow, LOW);
    
        delay(250);
    
        digitalWrite(yellow, HIGH);
    
        delay(250);
    
        digitalWrite(yellow, LOW);
    
        void loop()
        {
    
          digitalWrite(red1, HIGH);
          digitalWrite(red2, LOW);
    
          delay(250);
    
          digitalWrite(red1, LOW);
          digitalWrite(red2, HIGH);
    
          delay(250);
    
        }     //end void loop 2
    
      }     //end button press
    
    }     //end void loop 1

, 👍1

Обсуждение

какой у вас вопрос?, @jsotola

с какими проблемами вы сталкиваетесь?, @jsotola

какова цель цикла, который вы хотите добавить?, @jsotola

почему существует две пустые петли ?, @xbox gamer

Хорошо, у меня есть зеленый светодиод, который мигает, когда моя кнопка не нажата, но когда вы нажимаете кнопку, я хочу, чтобы желтый светодиод мигал в течение 3 секунд, а затем чередовал мигание между двумя красными светодиодами., @Gavin McLeod

есть две пустые петли, потому что я думал, что он может сделать то, что я хотел, но это не так, поэтому я пришел сюда из какой-то помощи или руководства, @Gavin McLeod

У меня есть два обучающих предложения, которые облегчат это программирование, если вы будете следовать им (если вы хотите идти в ногу с программированием, вы должны изучить их в любом случае, поскольку они являются мощными принципами): 1. Научитесь писать неблокирующий код, как в примере "BlinkWIthoutDelay", который поставляется с Arduino IDE. Он использует функцию `millis ()'. 2. Узнайте, как написать код для конечного автомата (FSM), чтобы облегчить связь между различными кодами для разных случаев., @chrisl

Я уже написал более длинный ответ о FSMs hereХотя для обоих предложений вы можете найти тонны учебных пособий в Интернете, когда ищете их., @chrisl

пожалуйста, пройдите курс кодирования, @Juraj

This, возможно, имеет отношение., @Nick Gammon

Просто мысль, что вы хотите, чтобы произошло, когда кнопка отпущена 1) после того, как она вошла в мигающую красную петлю 2) преждевременно. Хотя я никогда не видел вложенных "петель" в скетче Arduino, я сильно подозреваю, что код будет постоянно находиться во внутреннем цикле, выхода из него нет., @Peter Jennings

сложность вашего кода может быть уменьшена с помощью *тикового счетчика* ... *счетчик тиков* - это просто переменная, которая меняет свое значение на фиксированном интервале времени ... в вашем случае *tick* может чередоваться между true и false каждые 500 мс ... код мигания светодиода будет использовать состояние *tick* и состояние переменной *enable* для освещения светодиода .... нажатие кнопки установит *enable* в true, и светодиод начнет мигать без какого-либо кода времени, @jsotola


1 ответ


0

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

Чтобы красные светодиоды чередовались, используйте цикл "Время".

int switchState = 0;
int green = 3;
int yellow = 4;
int red1 = 5;
int red2 = 6;
int button = 2;

void setup()
{
  pinMode(green, OUTPUT) ;
  pinMode(yellow, OUTPUT) ;
  pinMode(red1, OUTPUT) ;
  pinMode(red2, OUTPUT) ;
  pinMode(button, INPUT) ;
}

void loop()

{ //start void loop 1
  switchState = digitalRead(button);

  if (switchState == LOW)         //кнопка не нажата
  {
    digitalWrite(green, HIGH);      //зеленый светодиод вкл
    digitalWrite(yellow, LOW);
    digitalWrite(red1, LOW);
    digitalWrite(red2, LOW);

    delay(500);

    digitalWrite(green, LOW);     //мигает зеленый светодиод

    delay(500);
  }//end if

  else        //Кнопка нажата
  {

    digitalWrite(green, LOW);
    digitalWrite(red1, LOW);
    digitalWrite(red2, LOW);

    //Мигает желтый светодиод в течение 3 секунд
    for (byte i=0; i<7; i++)
    {
      digitalWrite(yellow, HIGH);   
      delay(250);
      digitalWrite(yellow, LOW);
      delay(250);
    }


    // чередуйте два красных светодиода, пока кнопка нажата
    while (digitalRead(button) == HIGH) 
    {
      digitalWrite(red1, HIGH);
      digitalWrite(red2, LOW);
      delay(250);

      digitalWrite(red1, LOW);
      digitalWrite(red2, HIGH);
      delay(250);

    }     //end while loop

  }     //end button press

}     //end void loop
,