Мигающая часть и дисплей работают правильно, за исключением того, что он повторяется на некоторое время, а затем останавливается. Пожалуйста, помогите мне узнать, что случилось. Является ли это проблемой цикла while или я допустил некоторые ошибки в части времени?Управление светофором на Arduino <looping
#include <stdio.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //declaring the Lcd display pins
//pins declarations for each Leds
int red1 = 13;
int yellow1 = 10;
int green1 = 9;
int red2 = 8;
int yellow2 = 7;
int green2 = A4;
const long ti = 0;
unsigned long interval4 = 60000UL;
unsigned long interval1 = 9;
unsigned long interval2 = 6000UL;
unsigned long interval3 = 3000UL;
// setting
void setup()
{
lcd.setCursor(0, 0);
lcd.print("\0");
lcd.setCursor(0, 1);
lcd.print("\0");
lcd.begin(16, 2);
delay(2000);
lcd.setCursor(0, 0);
lcd.print("HARIRI and JACOB\0");
lcd.setCursor(0, 1);
lcd.print("PROJECT\0");
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("traffic light\0");
lcd.setCursor(0, 1);
lcd.print("simulation\0");
delay(2000);
lcd.clear();
Serial.begin(9600);
delay(50);
pinMode(red1, OUTPUT);
pinMode(red2, OUTPUT);
pinMode(yellow1, OUTPUT);
pinMode(yellow2, OUTPUT);
pinMode(green1, OUTPUT);
pinMode(green2, OUTPUT);
}
//the main loop
void loop()
{
int ti = millis();
while((millis() - ti) < interval1)
{
digitalWrite(red1, HIGH);
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Way1: stop\0");
int ti = millis();
while((millis() - ti) < interval2)
{
digitalWrite(green2, HIGH);
lcd.setCursor(0, 1);
lcd.print("Way2: go\0");
}
digitalWrite(green2, LOW);
{
ti = millis();
while((millis() - ti) < interval3)
{
digitalWrite(yellow2, HIGH);
lcd.setCursor(0, 1);
lcd.print("Way2: wait\0");
}
digitalWrite(yellow2, LOW);
}
}
digitalWrite(red1, LOW);
ti = millis();
while((millis() - ti) < interval1)
{
digitalWrite(red2, HIGH);
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Way2: stop\0");
ti = millis();
while((millis() - ti) < interval2)
{
digitalWrite(green1, HIGH);
lcd.setCursor(0, 0);
lcd.print("Way1: go\0");
}
digitalWrite(green1, LOW);
while((millis() - ti) < interval3 + interval2)
{
digitalWrite(yellow1, HIGH);
lcd.setCursor(0, 0);
lcd.print("Way1: wait\0");
}
digitalWrite(yellow1, LOW);
}
digitalWrite(red2, LOW);
ti = millis();
}
}
Согласованные и условные отступы и пробелы обеспечивают читаемость и понятность кода. Это особенно важно, если вы просите других просмотреть ваш код - не делайте его излишне сложным, иначе никто не будет беспокоиться. Твое было повсюду - я исправил это для тебя. – Clifford
В 'loop()' у вас есть скошенный ('{...}') блок без инструкции управления; это действительно, но необычно; он «локализует» второе объявление 'int ti' - было бы лучше потерять блок и объявить переменную таймера с отдельным именем. – Clifford