搜索代码

第98-8课:使用Arduino的按钮和LED制作行走灯

第98-8课:使用Arduino的按钮和LED制作行走灯

本项目将向您展示如何制作一个“走马灯”,每次按下按钮时它都会前进一位。与依靠自身定时器运行的光效不同,您可以获得直接、可触控的控制:每次按下都会将点亮的LED向前移动一个位置,在最后一个LED之后会回绕到第一个。这是Arduino学习中最有用的构建模块之一,因为它教会您如何将数字输入(按钮)与循环状态机(当前点亮的是哪个LED)结合起来——这是您会不断重复使用的模式。

面包板上的5个LED以及按钮,展示连接到Arduino UNO
面包板上的5个LED以及按钮,展示连接到Arduino UNO

一旦您理解了这种模式,同样的逻辑就能驱动大量实际项目。以下是一些您可以用它构建的实用想法:

  • 设备上的菜单选择器,每次按下都会高亮下一个选项。
  • 用于机器或流程的顺序步骤指示器(步骤1、步骤2、步骤3……)。
  • 通过按钮手动推进的分数或等级显示。
  • 照明控制器的“下一频道”或“下一模式”指示器。
  • 一个简单的游戏或问答蜂鸣器,玩家轮流点亮下一盏灯。
  • 继电器或负载序列器,每次按下都会按顺序激活下一个输出。

与自动运行灯相比,关键优势在于控制:在您按下之前什么都不会发生,因此灯光只在决定时前进。视频还指出,同样的切换和顺序控制思路不仅可以驱动LED,还可以驱动继电器来开关交流灯或控制电机(视频19:52处)。

硬件与元件

元件清单很短,而且成本不高:

  • 一块Arduino板(Uno、Nano、Mega或任何兼容板)。
  • 五个LED——5 mm或3 mm,颜色随意。
  • 五个限流电阻,200 Ω到1000 Ω(视频中使用1 kΩ)。
  • 一个按钮开关(瞬时轻触开关最理想)。
  • 一块面包板和一些杜邦跳线。

关于LED的快速说明:阴极是较短的引脚以及带有平边的一侧,而阳极是较长的引脚(视频03:13处)。电阻值并不关键——电阻越大,LED只是越暗,因此大约300 Ω到1000 Ω之间的任何值都可以正常工作(视频05:33处)。

接线指南

Arduino走马灯LED的原理图
Arduino走马灯LED的原理图
带按钮的Arduino走马灯LED接线
带按钮的Arduino走马灯LED接线

接线基本上与标准的五LED走马灯相同,只是增加了一个按钮。每个LED的阳极连接到各自的Arduino引脚,每个阴极通过各自的电阻连接到面包板上共享的接地轨。在此构建中,LED连接到引脚3、4、5、6和7(视频31:37处)。按钮放置在面包板上,一只脚接地,另一只脚连接到引脚2——也就是代码用于按钮的同一个引脚(视频37:04处)。

由于代码启用了Arduino的内部上拉电阻,因此按钮不需要外部电阻。当按钮未按下时,引脚读取为HIGH;当您按下它时,引脚被拉低并读取为LOW(视频14:02处)。

代码说明

完整程序可在本文下方获取。这里我们重点介绍您实际会想要更改的部分。

在草图顶部,每个LED和按钮都分配到一个引脚。您可以在这里根据自己的接线来自定义构建:

const int pushButtonPin = 2; // push button pin
const int LED1 = 3;
const int LED2 = 4;
const int LED3 = 5;
const int LED4 = 6;
const int LED5 = 7;

int LED_ON = LED1; // which LED is currently lit

LED_ON变量是本项目的核心。它记住当前点亮的是哪个LED,初始为LED1。每次按下按钮时,代码都会将LED_ON推进到序列中的下一个LED,并关闭前一个LED,因此同一时间始终只有一个LED点亮。

每次按下后还有一个小延迟:

delay(200); // debounce / give the user time between presses

这200 毫秒的暂停可防止一次物理按下被记录为多次按下。如果您的手指抖动,或者按钮感觉过于灵敏,请增大此数值;如果您想要更快响应,请减小它。请注意,将其设置得太低可能会导致灯光意外跳进(视频41:20处)。

主要逻辑位于 loop() 中。它读取按钮,只有当按钮被按下(读取为 LOW)时,才会推进灯光。该序列使用一连串 if / else if 检查,从 LED1 移动到 LED2 再到 LED3,依此类推,并在最后一个之后回绕到 LED1。如果你想改变方向或 LED 的顺序,这就是需要编辑的代码块 — 只需重新分配哪个引脚跟随哪个引脚。

实时项目与演示

上传代码后,按下按钮会点亮第一个 LED;松开按钮会让该 LED 保持点亮。下一次按下会将灯光移动到第二个 LED,然后是第三个、第四个和第五个,再下一次按下会回到第一个 — 形成连续旋转(视频中 40:22 处)。

200 毫秒延迟的一个不错副作用是,如果你按住按钮,灯光会每 200 毫秒自行继续推进,实际上在按钮被按住时将项目变成自动走灯(视频中 42:07 处)。松开按钮,它就会停在当前 LED 上。这让你可以用一个按钮同时实现手动步进和免手操作运行。

如果你更希望灯光完全不需要按钮就自动运行,那是另一个独立项目。自动版本已在 第 98-7 课:使用 Arduino 和 5 个 LED 的走灯 中介绍。

本视频中的相关项目

章节

  • [00:00] 10 个 Arduino LED 项目概述
  • [01:22] Arduino 分步课程介绍
  • [02:29] 理解 LED:符号、极性和引脚
  • [03:49] 计算 LED 限流电阻
  • [30:47] 使用 5 个 LED 的走灯:接线和原理
  • [32:52] 走灯代码:引脚、时序和循环
  • [36:41] 使用按钮推进灯光
  • [37:44] 使用按钮的走灯:代码讲解
  • [40:22] 演示和调整按下延迟
  • [57:16] 结束语和课程结尾

图像

wiring for Arduino walking light LEDs with push button
wiring for Arduino walking light LEDs with push button
Schematic for Arduino walking light LEDs with push button
Schematic for Arduino walking light LEDs with push button
Schematic for Arduino walking light LEDs
Schematic for Arduino walking light LEDs
面包板上5个LED与按钮连接到Arduino UNO
面包板上5个LED与按钮连接到Arduino UNO
940-Lessson 98-LED-8: Arduino code walking LED light with push button
语言: C++
This code has not been parsed yet. Please return to the admin panel to parse it.

文件📁

Arduino 库(zip 格式)

用户手册