Embedded Arduino上的交通灯控制<;循环

Embedded Arduino上的交通灯控制<;循环,embedded,arduino-uno,Embedded,Arduino Uno,闪烁部分和显示器工作正常,但会重复一段时间然后停止。请帮我找出毛病所在。这是一个while循环问题还是我在计时部分犯了一些错误 #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

闪烁部分和显示器工作正常,但会重复一段时间然后停止。请帮我找出毛病所在。这是一个while循环问题还是我在计时部分犯了一些错误

#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();
    }
}
#包括
#包括
液晶显示器(12,11,5,4,3,2)//声明Lcd显示管脚
//每个LED的引脚声明
int red1=13;
int黄色1=10;
int green1=9;
int red2=8;
int黄色2=7;
int green2=A4;
常数长ti=0;
无符号长间隔4=60000UL;
无符号长间隔1=9;
无符号长间隔2=6000UL;
无符号长间隔3=3000UL;
//背景
无效设置()
{
lcd.setCursor(0,0);
lcd.打印(“\0”);
lcd.setCursor(0,1);
lcd.打印(“\0”);
lcd.begin(16,2);
延迟(2000年);
lcd.setCursor(0,0);
lcd.print(“HARIRI and JACOB\0”);
lcd.setCursor(0,1);
lcd.print(“项目\0”);
延迟(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.打印(“交通灯\0”);
lcd.setCursor(0,1);
lcd.print(“模拟\0”);
延迟(2000年);
lcd.clear();
Serial.begin(9600);
延迟(50);
引脚模式(红色1,输出);
引脚模式(红色2,输出);
引脚模式(黄色1,输出);
pinMode(黄色2,输出);
pinMode(绿色1,输出);
pinMode(绿色2,输出);
}
//主回路
void循环()
{
int ti=millis();
而((毫秒()-ti)
我不清楚外部循环的用途,但它破坏了Ardunio框架

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


通常最好(或者至少支持Arduino框架)将
loop()
实现为一个状态机,而不是在其中包含计时循环。状态机根据所经过的时间切换状态,但不会循环等待时间的流逝。

一致的常规缩进和空白有助于代码的可读性和可理解性。如果您要求其他人检查您的代码,这一点尤其重要-不要让它变得不必要的困难,否则没有人会打扰您。你的代码到处都是-我已经为你解决了这个问题。在
loop()
中,你有一个大括号(
{…}
)块,没有控制语句;这是有效的,但不寻常;它“本地化”了
int ti的第二个声明
——最好松开该块并声明一个具有不同名称的计时器变量。