Arduino交通灯控制器项目教程

电子说

1.3w人已加入

描述

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分