基于Arduino的红绿灯控制原理

  • 内容
  • ....
  • 相关

基于Arduino的红绿灯是一个很简单的项目,通过它有助于我们更加深入的了解Arduino的硬件连接,同时掌握如何使用Arduino制作一些简单的项目。

红绿灯项目需要的元件

  1. Arduino开发板;
  2. 红色、黄色和绿色的LED;
  3. 面包板;
  4. 6个220欧姆电阻;
  5. 按键开关;
  6. 1个10K电阻;
  7. 连接线若干。

这个项目支持几乎所有的Arduino开发板,关键在于需要使用多少接口。常见的Arduino开发板可查阅: Arduino主流开发板

红绿灯项目

让我们从最简单的红绿灯做起。单一的红绿灯电路如下:

Arduino红绿灯电路连接图

连接方法很简单,将每个LED的正极(长脚)通过220欧姆电阻连接到Arduino的数字引脚8、9和10脚。将负极(短脚)连接到Arduino的地。

Arduino代码解析

我们从定义变量开始,用具体名称来配置每个灯的针脚。启动Arduino IDE创建一个新的Arduino项目:

int red = 10;
int yellow = 9;
int green = 8;

接下来,添加setup函数,在函数中配置红色、黄色和绿色led作为输出。由于前面已经创建了表示引脚编号的变量,现在可以通过灯的具体名称来直接引用引脚。

void setup(){
    pinMode(red, OUTPUT);
    pinMode(yellow, OUTPUT);
    pinMode(green, OUTPUT);
}

现在是代码中相对困难的一部分,红绿灯的控制逻辑。需要创建一个独立的函数来控制灯光。下面是余下的代码:

void loop(){
    changeLights();
    delay(15000);
}

void changeLights(){
    // green off, yellow on for 3 seconds
    digitalWrite(green, LOW);
    digitalWrite(yellow, HIGH);
    delay(3000);

    // turn off yellow, then turn red on for 5 seconds
    digitalWrite(yellow, LOW);
    digitalWrite(red, HIGH);
    delay(5000);

    // red and yellow on for 2 seconds (red is already on though)
    digitalWrite(yellow, HIGH);
    delay(2000);

    // turn off red and yellow, then turn on green
    digitalWrite(yellow, LOW);
    digitalWrite(red, LOW);
    digitalWrite(green, HIGH);
    delay(3000);
}

现在,上传代码至控制板,(确保选择正确的Arduin0控制板型号和正确的端口号)。选择红绿灯应该可以正常工作了,它每15秒改变一次亮灯颜色。

人行道场景下的红绿灯

如果你已经成功实现了上面的基础版的红绿灯,现在我们可以进入相对复杂的红绿灯,即模拟现实场景。电路中增加一个按钮开关,让行人随时可以启动红绿灯。

带按钮开关的Arduino红绿灯电路图

红绿灯电路与前面的例子几乎完全相同。只是新增了按钮开关,并将它连接到Arduino的数字引脚12。你可能已经注意到按钮开关接有一个10k电阻,你知道为什么吗?这叫做下拉电阻。

下拉电阻的概念:在电路中,开关要么让电流通过,要么截断电流。我们知道在逻辑电路中,开关如何区分高电平或低电平状态( 1或0)呢?也许大家可能误认为按钮开关如果没有被按下,它处于低电平状态,但实际上,如果没有按下按钮开关,它根本不存在电流,是悬空的。在这种悬空状态下,当它受电流干扰时,可能会出现错误的读数。不是很好理解,那么我们这样解释,当开关悬空时,它既不能提供可靠的高电平状态读数,也不能提供低电平状态读数。所以,引入下拉电阻,当开关关闭时,下拉电阻有少量电流流过,从而确保电路可以准确的获得低电平状态的读数。在其他项目的逻辑电路中,你可能会发现还有一个上拉电阻的概念,两者的原理是基本相同的,上来电阻的加入,也只是为了确保特定的逻辑电平为高电平状态。

下面,我们要修改代码的循环部分,将代码修改为读取按钮开关的状态,而不是每15秒改变灯的颜色。

首先在程序的开头添加一个新变量:

int button = 12; // switch is on pin 12

现在,在setup函数中,添加一个行,将开关设置为输入,同时设置绿灯为高电平。如果没有这个初始设置,直到函数运行到changeLights()前,灯都是关闭的。

pinMode(button, INPUT);
digitalWrite(green, HIGH);

将整个循环函数改为:

void loop() {
    if (digitalRead(button) == HIGH){
        delay(15); // software debounce
        if (digitalRead(button) == HIGH) {
            // if the switch is HIGH, ie. pushed down - change the lights!
            changeLights();
            delay(15000); // wait for 15 seconds
        }
    }
}

手控红绿灯实物图