2016-09-30 2 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() в качестве государственной машины и не иметь в нем циклов синхронизации. Состояние-машина переключается в зависимости от пройденного времени, но не зацикливает ожидания на время прохождения.

Смежные вопросы