Светофор

Nailoren
Offline
Зарегистрирован: 30.10.2018

Я новичок в среде разработки ардуино. Вчера написал светофор с кнопкой. Как мне сделать так, чтобы если кнопка не была нажата в первые 4 секунды, то выполняется цикл redyellow()? Вот сам код:

int buttonState; void setup() { pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); pinMode(2, INPUT); redyellow(); } void loop(){ buttonState = digitalRead(2); if (buttonState == HIGH){ changelight(); } } void redyellow(){ digitalWrite(10, HIGH); delay(4000); digitalWrite(11, HIGH); delay(2000); digitalWrite(10, LOW); digitalWrite(11, LOW); green(); } void green(){ digitalWrite(12, HIGH); loop(); } void changelight() { digitalWrite(12, LOW); delay(500); digitalWrite(12, HIGH); delay(500); digitalWrite(12, LOW); delay(500); digitalWrite(12, HIGH); delay(500); digitalWrite(12, LOW); delay(500); digitalWrite(12, HIGH); delay(500); digitalWrite(12, LOW); delay(500); digitalWrite(12, HIGH); delay(500); digitalWrite(12, LOW); digitalWrite(11, HIGH); delay(2000); digitalWrite(11, LOW); redyellow(); }

Nailoren
Offline
Зарегистрирован: 30.10.2018

Извиняюсь за кривой код)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Nailoren пишет:

Извиняюсь за кривой код)

Не извиняйтесь, а вставьте код как положено на этом флруме. В таком виде его, скорее всего, никто и читать не станет.

Nailoren
Offline
Зарегистрирован: 30.10.2018
int buttonState;
void setup() {
pinMode(10, OUTPUT); // Красный
pinMode(11, OUTPUT); // Желтый
pinMode(12, OUTPUT); // Зеленый
pinMode(2, INPUT);
redyellow();
}
void loop(){
  buttonState = digitalRead(2);
  if (buttonState == HIGH){
    changelight();
  }
}
void redyellow(){
  digitalWrite(10, HIGH);
  delay(4000);
  digitalWrite(11, HIGH);
  delay(2000);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  green();
}
void green(){
  digitalWrite(12, HIGH);
  loop();
}
void changelight()
{
  digitalWrite(12, LOW);
  delay(500);
  digitalWrite(12, HIGH);
  delay(500);
  digitalWrite(12, LOW);
  delay(500);
  digitalWrite(12, HIGH);
  delay(500);
  digitalWrite(12, LOW);
  delay(500);
  digitalWrite(12, HIGH);
  delay(500);
  digitalWrite(12, LOW);
  delay(500);
  digitalWrite(12, HIGH);
  delay(500);
  digitalWrite(12, LOW);
  digitalWrite(11, HIGH);
  delay(2000);
  digitalWrite(11, LOW);
  redyellow();
}

готово

nik182
Онлайн
Зарегистрирован: 04.05.2015

В подпрограмме(п/п) setup нужно проверять условия значение функции millis() < 4000 и нажатия кнопки. Если хотя бы одно из условий выполняется , то выставить флаг "мигающий желтый" и выйти, иначе просто выйти. В п/п loop проверять флаг "мигающий желтый" и если он выставлен то вызывать его п/п, иначе вызывать п/п смены цветов.  

Nailoren
Offline
Зарегистрирован: 30.10.2018

Можете пожалуйста прикрепить готовый код?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Nailoren пишет:

Можете пожалуйста прикрепить готовый код?

Нет. 

b707
Offline
Зарегистрирован: 26.05.2017

Nailoren - - начните с того, что тот код, что вы выложили - работать не будет. Во всяком случае долго.

Смотрите - у вас сначала запускается setup(). из него - redyellow(), из него green(), потом  loop(), потом changelight(). а из него снова redyellow() Все, круг замкнулся. Это называется бесконечная рекурсия и она быстро и гарантировано приводит к зависанию программы даже на больших ПК с тысячами мегабайт RAM. А тут микроконтроллер всего с  2 кбайт.

Так программы не пишутся. Если хотите бесконечный цикл -вызывайте все ваши подпрограммы из loop - собственно, ЛУП для того и нужен, чтобы бесконечно выполнять программу "по кругу"

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Nailoren пишет:

Можете пожалуйста прикрепить готовый код?

Готовые коды прикрепляют в другом разделе форума.

Nailoren
Offline
Зарегистрирован: 30.10.2018

Ок