初学者arduino编程:红绿灯控制器项目教程

建立一个Arduino交通灯控制器可以帮助你发展基本的编码技能!我们让你开始。...

Arduino红绿灯是一个有趣的小项目,你可以在一个小时内建成。下面介绍如何使用Arduino构建自己的电路,以及如何为高级变体更改电路。

arduino-traffic-light-featured

如果您愿意将本教程作为视频观看,我们将为您介绍:

你需要什么来建立一个arduino交通灯控制器

除了基本的Arduino,您还需要:

  • 1 x 10k欧姆电阻器
  • 1个按钮开关
  • 6 x 220欧姆电阻器
  • 试验板
  • 连接线
  • 红色、黄色和绿色LED

只要有足够的引脚,几乎所有的Arduino都会为这个项目工作。如果您不确定您需要什么型号,请务必阅读我们的Arduino购买指南。您的Arduino入门套件中可能已经有这些部件。

arduino红绿灯:基础

让我们从小事做起。一个基本的,单一的红绿灯是一个很好的开始。电路如下:

Circuit diagram for basic Arduino traffic light

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

arduino红绿灯代码

从定义变量开始,这样您就可以通过名称而不是数字来寻址灯光。开始一个新的Arduino项目,从以下几行开始:

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

接下来,让我们添加setup函数,您将在其中配置红色、黄色和绿色LED作为输出。由于您已经创建了表示管脚编号的变量,现在可以改为按名称引用管脚:

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

pinMode函数配置Arduino以使用给定的引脚作为输出。你必须这样做,你的发光二极管的工作。现在来看看红绿灯的实际逻辑。这是你需要的密码。在变量定义和设置函数下面添加以下内容:

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,然后运行(确保从Tools>board and Tools>port菜单中选择正确的板和端口)。你应该有一个每15秒改变一次的工作红绿灯,像这样(加速):

Arduino traffic light in action

我们来分解一下代码。changeLights函数执行所有的艰苦工作。这将使红绿灯旋转通过黄色和红色,然后返回绿色。在循环函数中调用时,Arduino将永远运行此代码,每次暂停15秒。

changeLights功能包括四个不同的步骤:

  • 绿色开,黄色关
  • 黄色关闭,红色打开
  • 黄色亮,红色亮
  • 绿色开,红色关,黄色关

这四个步骤复制了在实际交通信号灯中使用的过程。对于每个步骤,代码都非常相似。使用digitalWrite打开或关闭相应的LED。这是一个Arduino函数,用于将输出引脚设置为高(on)或低(off)。

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

更深入:arduino人行横道

既然你知道了基础知识,那就让我们改进一下吧。增加一个按钮,让行人随时可以改变灯光:

Circuit diagram for Arduino pedestrian crossing

请注意红绿灯与上一个示例完全相同。将按钮连接到数字针脚12。你会注意到开关上有一个高阻抗的10k欧姆电阻器,你可能想知道为什么。这是一个下拉电阻器。

开关可以让电流流动,也可以不让电流流动。这看起来很简单,但在逻辑电路中,电流应该总是以高或低的状态流动(记住,1或0,高或低)。你可以假设一个没有被按下的按钮开关会处于低电平状态,但事实上,它被称为“浮动”,因为根本没有电流被吸引。

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

在其他逻辑电路中,你可能会发现一个上拉电阻代替,这工作原理相同,但反过来,确保特定的逻辑门默认为高。

现在,在代码的循环部分,不是每15秒改变一次灯,而是读取按钮开关的状态,只在激活时改变灯。

arduino人行横道规范

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

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 } }}

应该可以了。您可能想知道为什么按钮检查会发生两次(digitalRead(button)),间隔很小的延迟。这是去抖动。就像按钮的下拉电阻一样,这个简单的检查可以阻止代码在按下按钮时检测到轻微的干扰。

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

下面是它的样子(加速):

Arduino pedestrian crossing in action

带交叉口的arduino红绿灯

让我们试试更高级的型号。将电路改为有两个红绿灯,而不是人行横道:

Cricuit diagram for Arduino traffic lights with junction

将第二个红绿灯连接到数字针脚11、12和13。

带交叉口的arduino红绿灯代码

首先,将新的红绿灯管脚分配给变量,并将其配置为输出,如第一个示例中所示:

// 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 with junction in action

arduino红绿灯下一步

今天就这些。您对Arduino LED和按钮的新理解适用于各种不同的项目。如果你想扩大这些交通灯,为什么不建立一个四路(或更多)交叉口,完成许多人行横道,行人交通灯?你可以编程许多不同的Arduino板容易!

或者为什么不扩展一个更大的项目,如这个DIY MIDI控制器或与Xod的Arduino机器人你的新技能?您还可以使用VS代码和PlatformIO查看Arduino编码。

图片来源:androsvector/Shutterstock

  • 发表于 2021-03-18 03:37
  • 阅读 ( 263 )
  • 分类:IT

你可能感兴趣的文章

如何用python编程和控制arduino

...Arduino IDE。如果你对微控制器世界是完全陌生的,我们的初学者指南Arduino将帮助你把一切都做好。 ...

  • 发布于 2021-03-11 16:20
  • 阅读 ( 890 )

6个最佳arduino替代微控制器

今天,Arduino被广泛认为是DIY电子和编程的最佳途径,初学者的教程到新手项目的想法丰富多彩。 ...

  • 发布于 2021-03-11 16:53
  • 阅读 ( 494 )

今年你能做的7个arduino圣诞项目

也许你最近收到了一个Arduino初学者工具包作为礼物,或者你一直听说修补匠有一个很棒的爱好,你想尝试一下,或者你是一个Arduino专业人士,只是需要一些有趣的想法来度过假期。如果是这样,你来对地方了。 ...

  • 发布于 2021-03-12 03:34
  • 阅读 ( 319 )

你现在可以做10个预算的arduino星球大战项目

... 压电蜂鸣器包括在许多Arduino初学者工具包,是一个伟大的方式来添加声音的项目,我们使用了一个在我们的Buzz Wire游戏与Arduino教程。指导员用户埃塞拉用一个玩总是不祥的帝国死亡进行曲。该项目...

  • 发布于 2021-03-12 05:05
  • 阅读 ( 278 )

6个显示器从arduino输出数据

...个Arduino。你已经学会了一些基础知识,也许你已经按照初学者指南开始了。接下来呢? ...

  • 发布于 2021-03-12 19:42
  • 阅读 ( 262 )

6种将arduino连接到android的简单方法

...完全相同的,而且这些部件的可用性使它成为一个优秀的初学者项目。 ...

  • 发布于 2021-03-12 23:13
  • 阅读 ( 356 )

关于arduino你一直想知道的10件事

... 但是如果你是第一次,不要只买一个Arduino,而是带一个初学者工具包。这些都是你需要开始的。请参阅我们推荐的Arduino入门套件。 ...

  • 发布于 2021-03-13 02:49
  • 阅读 ( 239 )

作为一个arduino初学者不要犯的10个错误

...总是在增长。我们之前讨论过Arduino入门,有很多优秀的初学者项目可以让你熟悉,所以没有理由不直接加入! ...

  • 发布于 2021-03-13 03:20
  • 阅读 ( 252 )

arduino nano利弊:最便宜的arduino值得吗?

... 初学者的好平台。 小巧的尺寸使它非常适合紧凑型项目。 在功能上与较大的同类产品相同。 安装在试验板上,使原型**更容易...

  • 发布于 2021-03-13 04:51
  • 阅读 ( 312 )

如何用arduino遥控你的家,5个diy项目

... 如果您以前从未使用过Arduino,请不要担心--我们的初学者指南涵盖了您需要了解的所有内容。 ...

  • 发布于 2021-03-13 11:21
  • 阅读 ( 285 )