电子说
Arduino红绿灯是一个有趣的小项目,您可以在一个小时内完成构建。这是使用Arduino构建自己的方法,以及如何更改电路以实现高级变体。
如果您希望将其作为视频教程观看,我们将向您介绍:
构建Arduino交通灯控制器所需的条件
除了基本的Arduino,还需要:
1个10k欧姆电阻器
1个按钮开关
6个220欧姆电阻器
一块面包板
连接导线
红色,黄色和绿色LEDs
只要有足够的引脚,几乎任何Arduino都可以用于该项目。如果不确定所需的型号,请确保阅读我们的Arduino购买指南。您可能已经在Arduino入门套件中包含了这些零件。
Arduino交通灯:基础知识
让我们从小处入手。一个基本的单一交通信号灯是一个不错的起点。这是电路:
将每个LED的阳极(长脚)连接到数字引脚8、9和10(通过220欧姆电阻器) )。将阴极(短腿)连接到Arduino的地面。
Arduino交通灯的代码
首先定义变量,以便您可以通过名称而不是数字来寻址灯。开始一个新的Arduino项目,并从以下几行开始:
int red = 10;
int yellow = 9;
int green = 8;
接下来,让我们添加设置功能,在其中将红色,黄色和绿色LED配置为输出。由于您已经创建了表示引脚号的变量,因此现在可以按名称引用引脚了:
void setup(){
pinMode(red, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(green, OUTPUT);
}
pinMode 函数可配置Arduino使用给定的引脚作为输出。您必须这样做才能使LED完全正常工作。现在了解交通信号灯的实际逻辑。这是您需要的代码。在您的变量定义和设置函数下面添加此代码:
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);
}
将此代码上传到Arduino,然后运行(确保从选择正确的板卡和端口工具》 面板和工具》 端口菜单)。您应该有一个每15秒更改一次的工作红绿灯,如下所示(加快):
让我们分解一下此代码。 changeLights 功能执行所有艰苦的工作。这样会将交通信号灯旋转通过黄色和红色,然后又变回绿色。当在 loop 函数内部调用该代码时,Arduino将永久运行该代码,每次暂停15秒。
changeLights 函数由四个不同的步骤组成:
绿色点亮,黄色熄灭
黄色熄灭,红色点亮
黄色点亮,红色点亮
绿色点亮,红色熄灭,黄色熄灭
这四个步骤复制了实际交通信号灯中使用的过程。对于每个步骤,代码都非常相似。使用 digitalWrite 可以打开或关闭相应的LED。这是一个Arduino函数,用于将输出引脚设置为HIGH(高)(打开)或LOW(低)(关闭)。
启用或禁用所需的LED后,延迟使Arduino等待给定的时间。在这种情况下,需要三秒钟。
更深入:Arduino人行横道
现在您已经了解了基础知识,请对其进行改进。添加一个按钮,方便行人在需要时改变灯光:
注意交通信号灯与上一个示例完全相同。将按钮连接到数字引脚12。您会注意到该开关上连接了一个高阻10k欧姆电阻,您可能想知道为什么。这是一个下拉电阻。
一个开关允许电流流过或不让电流流过。这似乎很简单,但是在逻辑电路中,电流应始终以高或低状态(请记住,1或0,HIGH或LOW)流动。您可能会假设没有被真正按下的按钮开关处于LOW状态,但实际上,它被称为“浮动”状态,因为根本没有消耗电流。
在这种浮动状态状态下,由于电干扰而波动时,可能会出现错误的读数。换句话说,浮动开关既不能提供可靠的HIGH读数,也不能提供LOW读数。下拉电阻器在开关闭合时保持少量电流流动,从而确保了准确的低态读数。
在其他逻辑电路中,您可能会找到一个上拉电阻器,而这
现在,在代码的循环部分中,而不是每隔15秒更改一次灯,您将按照相同的原理工作,但要相反,请确保特定的逻辑门默认为高。而是改为读取按钮开关的状态,并且仅在激活时更改灯光。
Arduino人行横道代码
首先添加一个新变量来存储按钮销:
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。
带有连接点的Arduino交通灯的代码
首先,将新的交通灯引脚分配给变量,并将其配置为输出,如第一个示例所示:
// light one
int red1 = 10;
int yellow1 = 9;
int green1 = 8;
// light two
int 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红绿灯的后续步骤
今天就这些。您对Arduino LED和按钮的新了解适用于各种不同的项目。如果您想扩展这些交通信号灯,为什么不建一个四通(或更多)路口,并配备许多行人过路处和行人交通信号灯呢?
还是为什么不通过更大的扩展您的新技能DIY MIDI控制器或带有Xod的Arduino机器人之类的项目?您也可以看看使用VS Code和PlatformIO的Arduino编码。
责任编辑:wv
全部0条评论
快来发表一下你的评论吧 !