Хочу оптимизировать этот код и добавить цикл
Поэтому я хочу оптимизировать этот код и добавить петлю к двум красным светодиодам. Процесс заключается в том, что зеленый светодиод мигает, нажмите кнопку, желтый светодиод мигает в течение 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
@Gavin McLeod, 👍1
Обсуждение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
,
@Gerben
Смотрите также:
- Как повторить другое действие внутри цикла?
- Как добавить задержку, закрыть сервопривод и снова перейти к началу?
- Мигните светодиодом 5 раз с помощью цикла for
- Как быстро и без задержки переместить сервопривод?
- Почему циклы Do While не останавливаются?
- Как Arduino может выполнять несколько действий параллельно, не мешая друг другу?
- в то время как (1) внутри, если условно
- Выход из цикла while с помощью ИК-пульта для neopixel
какой у вас вопрос?, @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