Остановить и продолжить цикл, используя логический флаг для светофора
С помощью логического значения и флага я теперь могу управлять зеленым светом, но программа не может повторять или зацикливать последовательность сигналов светофора от красного к желтому и зеленому. Если я не использую флаг, последовательность красно-желто-зеленого светодиода может быть зациклена, но я не могу контролировать и активировать зеленый свет в приложении.
Мой текущий проект также осуществляет последовательную связь между 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;
}
}
}
@riky danieal, 👍-1
Обсуждение1 ответ
Это не ответ (который рассматривает 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 повторений строки.
- NodeMCU - Vin контакт как выход 5V?
- Как заставить 5-вольтовое реле работать с NodeMCU
- ESP8266 не подключается к Wi-Fi
- Разве в узле MCU v3 (LoLin) нет встроенного светодиода?
- Разница между этими двумя платами NodeMCU?
- NodeMCU - использовать кнопку flash в качестве входного сигнала в loop()
- Как определить размер Flash?
- Использование датчика рН 5В с узлом 3,3В
см. пример BlinkWithoutDelay, @Juraj
подсказка:
if (start)
такое же, какif (start == true)
.........if (!start)
такое же, какif (start == false)
.. ............ меньше печатать и меньше избыточности, @jsotolaТо, что вам *действительно* нужно, — это [Конечный автомат](https://majenko.co.uk/blog/finite-state-machine)., @Majenko
у вас есть куча бесполезного кода в вашей программе .... почему вы делаете вывод 8 НИЗКИМ несколько раз подряд? .... вам нужно сделать это только один раз .... то же самое касается других контактов, @jsotola