2016-09-30 24 views
-1

闪烁的部分和显示屏正常工作,除了重复一段时间然后停止。请帮我弄清楚什么是错的。这是一个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(); 
    } 
} 
+1

一致的和常规的缩进和空格帮助您读取代码的可读性和可理解性。如果您要求他人审核您的代码,这一点尤其重要 - 不要让它变得不必要的困难,否则没有人会打扰。你的全是这个地方 - 我已经为你修好了。 – Clifford

+0

在'loop()'中,你有一个没有控制语句的支撑('{...}')块;这是有效的但不寻常的;它将“int ti”的第二个声明“本地化” - 最好松开块并声明具有不同名称的计时器变量。 – Clifford

回答

0

我不清楚外部循环是什么,但它打破了Ardunio框架。

您的外部循环的间隔为9毫秒,但循环内的操作需要比这更长的时间。在任何情况下,循环结束时都会更新ti,所以循环将永远不会存在 - 打破Arduino框架,期望loop()存在并重复调用它。

通常最好(或者至少同情Arduino框架)实现loop()作为状态机,并且不会在其中有时序环。状态机根据经过的时间切换状态,但不会循环等待时间。