2016-09-30 23 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()作爲狀態機,並且不會在其中有時序環。狀態機根據經過的時間切換狀態,但不會循環等待時間。