Arduino红绿灯是一个有趣的小项目,您可以在一个小时内完成构建。这是使用Arduino构建自己的方法,以及如何更改电路以实现高级变体。
如果您希望将其作为视频教程观看,我们将向您介绍:
构建Arduino交通灯控制器所需的条件
除了基本的Arduino,还需要:
只要有足够的引脚,几乎任何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
标签: