搜索代码

第98-10课:Arduino交通信号灯

第98-10课:Arduino交通信号灯

交通灯是我们很少会去思考的日常系统之一——直到我们亲手搭建一个。在这个项目中,你将使用 Arduino 来模拟真实的交通灯序列:绿灯亮,然后黄灯,然后红灯,每个灯都有各自可配置的持续时间,并无限循环。这是一个完美的初学者项目,因为它教会你顺序定时逻辑、多输出控制,以及你编写的代码与你所看到的物理世界之间的关系。

现实生活中的三色交通灯

除了课堂演示之外,你在这里学到的定时逻辑随处可见:

  • 为模型铁路或立体模型搭建逼真的交通灯模型
  • 为车间或车库创建定时指示系统(例如“可以进入”/“等待”信号)
  • 学习带按钮触发阶段的人行横道信号灯的基础知识
  • 为工业或家庭自动化任务制作定时继电器序列原型
  • 用一个熟悉、易识别的物体教孩子们了解顺序、定时和电子学

最棒的是:上传之后,整个装置就能独立运行。你只需从电脑上对 Arduino 编程一次,然后用电池或适配器供电,它就能永远工作——无需电脑(视频 12:27 处)。

用于交通灯项目的面包板上的红、绿、黄 LED
用于交通灯项目的面包板上的红、绿、黄 LED

交通灯的工作原理

交通灯实际上只是三个输出的定时序列。Arduino 一次点亮一个 LED,等待设定的秒数,将其关闭,然后切换到下一个。之后循环重复。在视频的示例定时中,绿灯亮 3 秒,黄灯亮 1 秒,红灯亮 3 秒——但所有这些都可以在代码中调整(视频 49:44 处)。

交通灯定时:红灯
交通灯定时:红灯
交通灯定时:黄灯
交通灯定时:黄灯
交通灯定时:绿灯
交通灯定时:绿灯

这个序列之所以感觉逼真,是因为这些持续时间反映了现实世界的交通流:绿灯和红灯较长,因为车辆需要时间通过路口,而黄灯较短,因为它只是一个过渡警告。你可以调整这些时间以匹配你喜欢的任何场景。

硬件与组件

这个项目的零件清单很少:

  • 1 × Arduino 板(Uno、Nano 或 Mega——任何至少有 3 个数字引脚的板子)
  • 3 × LED(红色、黄色/橙色和绿色——不同颜色能让效果更明显)
  • 3 × 电阻(300 Ω 到 1 kΩ 都可以;视频中使用的是 1 kΩ)
  • 1 × 面包板
  • 跳线
  • 可选:锂离子电池或 5 V 电源适配器,用于独立运行

视频建议使用三种颜色明显不同的 LED,这样交通灯效果会立刻显现——否则你就得给它们贴标签(视频 02:04 处)。

理解 LED 限流

每个 LED 都需要串联一个限流电阻。原因如下:LED 具有几乎固定的正向电压(标准 5 mm LED 通常约为 2 V),如果你将它直接连接到 5 V,电流会激增并烧毁它。电阻会吸收多余的电压。

使用欧姆定律,如果 LED 压降为 2 V,电源为 5 V,那么电阻上必须压降 3 V。以约 10 mA 的目标电流计算,电阻值大约为 300 Ω(视频 04:41 处)。实际上,从 300 Ω 到 1 kΩ 的任何值都可以——更高的值只会让 LED 更暗。

接线指南

Arduino 交通灯原理图
Arduino 交通灯原理图
Arduino LED 交通灯接线
Arduino LED 交通灯接线

每个 LED 的接线方式都相同:阳极(较长的引脚)连接到 Arduino 数字引脚,阴极(较短的引脚,LED 本体平坦的一侧)通过电阻连接到地。

在视频的接线中,红色 LED 连接到引脚 2,黄色/橙色 LED 连接到引脚 3,绿色 LED 连接到引脚 4(视频 50:50 处)。三个电阻共用面包板上的公共接地轨。面包板上颜色的顺序无关紧要——重要的是代码中的引脚编号与你实际使用的引脚一致。

视频中的一个实用小贴士:电阻可以放在LED的任意一侧。你可以把它放在Arduino引脚和LED阳极之间,或者放在LED阴极和地之间 —— 从电气角度来说是一样的(视频51:52处)。

代码讲解

完整程序可在文章下方获取。这里我们将重点介绍你需要自定义的部分。

在草图顶部,三个引脚定义将每个LED映射到一个数字引脚。如果你将LED连接到了不同的引脚,请修改这些值:

const int greenLED = 4;
const int yellowLED = 3;
const int redLED = 2;

接下来是时间常量。它们以毫秒为单位控制每盏灯保持点亮的时间。视频中默认使用绿灯5000毫秒、黄灯1000毫秒、红灯5000毫秒 —— 但在演示过程中,这些值被改为3秒/1秒/3秒,后来又改为10秒/3秒/10秒(视频56:27处):

const int greenOnTime = 5000;
const int yellowOnTime = 1000;
const int redOnTime = 5000;

要改变交通灯的节奏,只需编辑这三个值。想要一个缓慢、逼真的十字路口?试试10000、3000、10000。想要快速演示?试试1000、300、1000。

loop()内部,顺序很直接:打开绿灯,等待,关闭绿灯;打开黄灯,等待,关闭黄灯;打开红灯,等待,关闭红灯;然后循环回到绿灯。串口监视器会打印每次状态变化,以便你验证时序是否符合预期。

现场演示

代码上传后,Arduino会自动运行这个循环。在视频中,绿色LED首先点亮,然后在其持续时间结束后黄灯短暂亮起,接着是红灯,循环立即重新开始(视频55:20处)。

串口监视器以文本形式同步显示 —— “green LED on”、“green off”、“yellow on”等等 —— 这是确认时序值是否按预期工作的好方法。当你准备脱机运行时,断开USB并连接锂离子电池或5V适配器;Arduino将在没有电脑的情况下继续循环运行(视频56:11处)。

本视频的相关项目

章节

  • [00:00] 10个Arduino LED项目概述
  • [01:22] Arduino逐步课程介绍
  • [02:29] 什么是LED:符号、阳极和阴极
  • [03:49] 计算LED限流电阻
  • [49:25] 交通灯项目介绍
  • [49:44] 交通灯时序讲解
  • [50:34] 交通灯接线图
  • [52:13] 交通灯代码讲解
  • [54:32] 使用串口监视器的现场演示
  • [55:30] 修改时序值
  • [56:11] 使用电池供电运行交通灯

图像

traffic light timing: green light
traffic light timing: green light
交通灯时序:黄灯
交通灯时序:黄灯
交通灯时序:红灯
交通灯时序:红灯
Arduino交通灯原理图
Arduino交通灯原理图
traffic_lights
traffic_lights
Arduino LED交通灯接线
Arduino LED交通灯接线
交通灯项目面包板上的红、绿、黄LED
交通灯项目面包板上的红、绿、黄LED
942-Lessson 98-LED-10: Arduino code traffic light
语言: C++
This code has not been parsed yet. Please return to the admin panel to parse it.

文件📁

Arduino 库(zip 格式)

用户手册