Остановить и продолжить цикл, используя логический флаг для светофора

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

Мой текущий проект также осуществляет последовательную связь между NodeMCU и Arduino.

#include <SoftwareSerial.h>

SoftwareSerial nodemcu(2,3);
long int data;

boolean start = true;        

void setup() {
  pinMode(7,OUTPUT);//зеленая лампочка
  pinMode(8,OUTPUT);//желтая лампочка
  pinMode(9,OUTPUT);//красная лампочка

Serial.begin(9600);
nodemcu.begin(9600);

}

void changeLights()
{
  digitalWrite(7,LOW);// зеленая лампочка
  digitalWrite(8,LOW); // желтая лампочка
  digitalWrite(9,HIGH);// красная лампочка
  delay(7000);

  digitalWrite(7,HIGH);// зеленая лампочка
  digitalWrite(8,LOW);// желтая лампочка
  digitalWrite(9,LOW);// красная лампочка
  delay(5000);

  digitalWrite(7,LOW);// зеленая лампочка
  digitalWrite(8,LOW);// желтая лампочка
  digitalWrite(9,LOW);// красная лампочка
  delay(1000);
  digitalWrite(7,HIGH);// зеленая лампочка
  digitalWrite(8,LOW);// желтая лампочка
  digitalWrite(9,LOW);// красная лампочка
  delay(1000);
  digitalWrite(7,LOW);// зеленая лампочка
  digitalWrite(8,LOW);// желтая лампочка
  digitalWrite(9,LOW);// красная лампочка
  delay(1000);
  digitalWrite(7,HIGH);// зеленая лампочка
  digitalWrite(8,LOW);// желтая лампочка
  digitalWrite(9,LOW);// красная лампочка
  delay(1000);

  digitalWrite(7,LOW);// зеленая лампочка
  digitalWrite(8,HIGH);// желтая лампочка
  digitalWrite(9,LOW);// красная лампочка
  delay(2000);
}

void loop() {

if ( nodemcu.available() > 0 )
{
  data = nodemcu.parseInt();
  delay(100);
  Serial.println(data);

      if (( data == 10) && (start == true)){           
           changeLights();
            start = false;
      }

      if (( data == 11) && (start == false)){           
      digitalWrite(7, HIGH);
      digitalWrite(9, LOW);
      digitalWrite(8, LOW);
            start = true;
      }
}  
}

, 👍-1

Обсуждение

см. пример BlinkWithoutDelay, @Juraj

подсказка: if (start) такое же, как if (start == true) ......... if (!start) такое же, как if (start == false) .. ............ меньше печатать и меньше избыточности, @jsotola

То, что вам *действительно* нужно, — это [Конечный автомат](https://majenko.co.uk/blog/finite-state-machine)., @Majenko

у вас есть куча бесполезного кода в вашей программе .... почему вы делаете вывод 8 НИЗКИМ несколько раз подряд? .... вам нужно сделать это только один раз .... то же самое касается других контактов, @jsotola


1 ответ


0

Это не ответ (который рассматривает BlinkWithoutDelay, как упоминал Юрадж), но я хочу предоставить способ значительно сократить вашу программу и использовать этот метод в будущем.

Вы повторяете

digitalWrite(7,LOW);// зеленая лампочка
digitalWrite(8,HIGH);// желтая лампочка
digitalWrite(9,LOW);// красная лампочка
delay(2000);

Много, с вариациями LOW/HIGH и временем задержки. Вместо этого используйте функцию с параметрами:

void changeLight(int green, int yellow, int red, int delayTime)
{
    digitalWrite(7, green);
    digitalWrite(8, yellow);
    digitalWrite(9, red);
    delay(delayTime);
}

И вы можете вызвать его

changeLight(НИЗКИЙ, ВЫСОКИЙ, НИЗКИЙ, 2000);

Вы можете сделать это для всех 4 повторений строки.

,