面向初学者的Arduino编程:交通灯控制器项目教程

Arduino红绿灯是一个有趣的小项目,您可以在一个小时内完成构建。这是使用Arduino构建自己的方法,以及如何更改电路以实现高级变体。

如果您希望将其作为视频教程观看,我们将向您介绍:

构建Arduino交通灯控制器所需的条件

除了基本的Arduino,还需要:

  • 1个10k欧姆电阻器
  • 6个220欧姆电阻器
  • 面包板
  • 连接导线
  • 红色,黄色和绿色LEDs
  • 只要有足够的引脚,几乎任何Arduino都可以用于该项目。确保您阅读了我们的Arduino购买指南。

    Arduino Traffic Light:基础知识

    让我们从小处入手。一个基本的单一交通信号灯是一个不错的起点。电路如下:

    将每个LED的阳极(长脚)连接到数字引脚8、9和10(通过220欧姆电阻)。将阴极(短脚)连接到Arduino的地面。

    首先定义变量,以便您可以通过名称而不是数字来寻址灯。开始一个新的Arduino项目,并从以下几行开始

    让我们分解一下此代码。 changeLights 功能执行所有艰苦的工作。这样会将交通信号灯旋转通过黄色和红色,然后又变回绿色。当在 loop 函数内部调用该代码时,Arduino将永久运行该代码,每次暂停15秒。

    changeLights 函数由四个不同的步骤组成:

  • 绿色点亮,黄色熄灭
  • 黄色熄灭,红色点亮
  • 黄色点亮,红色点亮
  • 绿色开启,关闭红色,关闭黄色
  • 这四个步骤复制了实际交通信号灯中使用的过程。对于每个步骤,代码都非常相似。使用 digitalWrite 可以打开或关闭相应的LED。这是一个Arduino函数,用于将输出引脚设置为HIGH(高)(打开)或LOW(低)(关闭)。

    启用或禁用所需的LED后,延迟使Arduino等待给定的时间。在这种情况下,需要三秒钟。

    更深入:Arduino人行横道

    现在您已经了解了基础知识,请对其进行改进。添加一个按钮,方便行人随时改变灯光:

    注意交通信号灯与前面的示例完全相同。将按钮连接到数字引脚12。您会注意到该开关上连接了一个高阻10k欧姆电阻,您可能想知道为什么。这是一个下拉电阻。

    一个开关允许电流流过或不让电流流过。这似乎很简单,但是在逻辑电路中,电流应始终以高或低状态(请记住,1或0,HIGH或LOW)流动。您可能会假设没有被真正按下的按钮开关处于LOW状态,但实际上,它被称为“浮动"状态,因为根本没有消耗电流。

    在这种浮动状态状态下,由于电干扰而波动时,可能会出现错误的读数。换句话说,浮动开关既不能提供可靠的HIGH读数,也不能提供LOW读数。下拉电阻器在开关闭合时保持少量电流流动,从而确保了准确的低态读数。

    在其他逻辑电路中,您可能会找到一个上拉电阻器,而这

    现在,在代码的循环部分中,而不是每隔15秒更改一次灯,您将按照相同的原理工作,但要相反,请确保特定的逻辑门默认为高。而是读取按钮开关的状态,并且仅在激活按钮时才更改灯光。

    首先添加一个新变量来存储按钮销:

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

    现在,在设置功能,添加新行以将开关声明为输入。添加一行以将交通灯设置为绿色舞台。如果没有此初始设置,它们将一直关闭,直到第一次运行 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        }    }}

    做吧。您可能想知道为什么按钮检查会发生两次( digitalRead(button)),并间隔一小段时间。这在反跳。就像按钮的下拉电阻一样,这种简单的检查可以停止代码以检测按下按钮时是否受到干扰。

    if 语句中等待15秒钟,红绿灯至少在这段时间内不能改变。 15秒过后,循环将重新启动。每次循环重新启动时,它都会再次读取按钮的状态,但是如果不按下按钮, if 语句将永远不会激活,指示灯也不会改变,并且程序会再次重新启动。

    这是它的外观(加速):

    带有结点的Arduino交通灯

    让我们尝试一个更高级的模型。代替人行横道,将电路更改为具有两个交通信号灯:

    将第二个交通信号灯连接至数字引脚11、12和13。

    First, assign your new traffic light pins to variables, and configure them as outputs, like in the first example:

    // light oneint red1 = 10;int yellow1 = 9;int green1 = 8;// light twoint red2 = 13;int yellow2 = 12;int green2 = 11;void setup(){    // light one    pinMode(red1, OUTPUT);    pinMode(yellow1, OUTPUT);    pinMode(green1, OUTPUT);    // light two    pinMode(red2, OUTPUT);    pinMode(yellow2, OUTPUT);    pinMode(green2, OUTPUT);}

    现在,更新您的循环以使用第一个示例中的代码(而不是人行横道):

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

    再次,所有工作都在 changeLights 函数中进行。该代码不会代替红色>红色黄色>绿色,而是替换交通信号灯。当一个为绿色时,另一个为红色。这是代码:

    void changeLights(){    // turn both yellows on    digitalWrite(green1, LOW);    digitalWrite(yellow1, HIGH);    digitalWrite(yellow2, HIGH);    delay(5000);    // turn both yellows off, and opposite green and red    digitalWrite(yellow1, LOW);    digitalWrite(red1, HIGH);    digitalWrite(yellow2, LOW);    digitalWrite(red2, LOW);    digitalWrite(green2, HIGH);    delay(5000);    // both yellows on again    digitalWrite(yellow1, HIGH);    digitalWrite(yellow2, HIGH);    digitalWrite(green2, LOW);    delay(3000);    // turn both yellows off, and opposite green and red    digitalWrite(green1, HIGH);    digitalWrite(yellow1, LOW);    digitalWrite(red1, LOW);    digitalWrite(yellow2, LOW);    digitalWrite(red2, HIGH);    delay(5000);}

    这是(加快)的样子:

    Arduino Traffic Light下一步

    今天就这些。您对Arduino LED和按钮的新了解适用于各种不同的项目。如果您想扩展这些交通信号灯,为什么不建一个四通(或更多)路口,并配备许多行人过路处和行人交通信号灯呢?

    还是为什么不通过更大的扩展您的新技能DIY MIDI控制器或带有Xod的Arduino机器人等项目?您还可以看一下使用VS Code和PlatformIO的Arduino编码。

    图片来源:androsvector / Shutterstock

    标签: