搜索代码

第98-3课:如何使用Arduino通过按钮开关控制LED灯的开关

第98-3课:如何使用Arduino通过按钮开关控制LED灯的开关

按钮无处不在——遥控器、家电和控制面板中都有——而一旦单个按钮需要承担多项功能,你就需要切换逻辑。本项目将向你展示如何让一个按钮在第一次按下时点亮 LED,再次按下时熄灭,从而使灯光保持在你离开时的状态。这种“按一次锁定,再按一次释放”的行为,是你将来构建的几乎每一个菜单按钮、电源开关和模式选择器的基础。

面包板上带电阻的 LED 与按钮连接到 Arduino
面包板上带电阻的 LED 与按钮连接到 Arduino

一旦你理解了切换逻辑,同样的代码模式就可以扩展到真实硬件。你可以用它来:

  • 通过单个面板按钮切换控制交流灯或台灯的继电器。
  • 用一个按钮而不是两个来启动和停止电机或水泵。
  • 在设备上循环切换工作模式(例如,慢速 / 快速 / 关闭)。
  • 构建一个锁定报警器,直到有人确认后才关闭。
  • 为音频项目创建一个能记住状态的静音按钮。
  • 作为电池供电小工具的软电源开关,替代机械开关。

讲师在视频中直接指出了这一点(视频 19:52 处):这个项目其实根本不在于 LED——而在于切换技术,你可以将其用于继电器、电机驱动器或任何其他输出。

LED-5mm-green

硬件与元件

元件清单刻意保持最少,所以如果你刚刚入门,这是一个很棒的项目。你需要:

  • 一块 Arduino 板——Uno、Nano 或 Mega 都可以。
  • 一个 LED,3 mm 或 5 mm,任意颜色。
  • 一个用于 LED 的电阻,阻值在 200 Ω 到 1000 Ω 之间均可。文字记录解释了其中的推理(视频 03:49 处):LED 大约有 2 V 的压降,并消耗约 10 mA 电流,因此在 5 V 供电下,剩余的 3 V 必须由电阻承担。欧姆定律给出 3 V ÷ 0.01 A = 300 Ω,从 300 Ω 到 1000 Ω 的任何值都可以——阻值越高,LED 越暗。
  • 一个按钮开关。视频展示了小型四脚轻触开关和长脚版本(视频 12:43 处)。如果你没有按钮,普通开关也可以——只需找到能够接通和断开电路的两个端子。
  • 一块面包板和一些杜邦跳线。

视频中的一个实用提示(视频 07:50 处):四脚轻触按钮有两对内部相连的引脚。使用万用表的通断模式找出哪两个引脚会一起蜂鸣——它们就是开关的一侧。将一侧连接到输入引脚,另一侧连接到地。

接线指南

带按钮开关的 LED 的 Arduino 原理图
带按钮开关的 LED 的 Arduino 原理图
带按钮开关的 LED 的 Arduino 接线
带按钮开关的 LED 的 Arduino 接线

接线与简单的 LED 和按钮电路相同,只是加上了按钮。LED 的阳极(较长的一脚)连接到引脚 3,其阴极(较短的一脚,位于元件主体平坦的一侧)通过电阻连接到地。按钮连接在引脚 2 和地之间——不需要其他东西,因为代码会启用 Arduino 的内部上拉电阻。

这个内部上拉值得理解:没有它,悬空的输入引脚会读取随机噪声。启用 INPUT_PULLUP 后,当按钮断开时,引脚会保持在 5 V;按下按钮会将其拉低到 0 V。这就是为什么代码将 LOW 读数视为“已按下”——与使用外部电阻的普通接地开关相比,逻辑是反的。

代码说明

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

在文件顶部,两个引脚分配被定义为常量。如果你将导线移到不同的引脚,这是你唯一需要编辑的地方:

const int pushButtonPin = 2;//define a pin number for push button
const int LEDPin = 3;//define a pin that is connected to LED

接下来是三个状态变量。通常你不需要更改它们,但了解它们的作用会有所帮助:

int pushButtonStatus = 0; // push value from pin 2
int lightStatus = 0;//light status
int pushed = 0;//push status

pushButtonStatus 在每次循环中存储按钮引脚的原始读数。lightStatus 记住上一次循环时按钮引脚的读数,这样草图就能检测到新按下的瞬间,而不是持续做出反应。pushed 是实际的切换标志 —— 它在 0 和 1 之间翻转,并决定 LED 应该亮起还是熄灭。

切换本身通过一个巧妙的算术技巧完成(视频 18:30 处)。用 1 减去该标志即可将其反转:1 - 0 得到 1,1 - 1 得到 0。因此,每当检测到一次新的按下时,一行代码就能翻转状态:

pushed = 1-pushed;//toggle the pushed value
delay(100);//give some time for finger to press

100 ms 的延迟是为了让你的手指从按钮上移开。没有它,一次物理按下可能会被计数多次。如果你的按钮感觉不可靠或手指抖动,请增大这个值(视频 40:39 处)。

触发切换的条件是整个草图的关键。它只在按钮按下(HIGH,因为上拉电阻)上一次读数为 LOW 时触发 —— 这意味着按钮刚刚在按下后被释放:

if(pushButtonStatus == HIGH && lightStatus == LOW){
  pushed = 1-pushed;//toggle the pushed value
  delay(100);//give some time for finger to press
}

最后,LED 由切换标志驱动,并且当前按钮读数会被保存以供下一次比较:

lightStatus = pushButtonStatus;
if(pushed == HIGH){
  Serial.println("Light ON");
  digitalWrite(LEDPin, HIGH); //turn the LED ON
}else{
  Serial.println("Light OFF");
  digitalWrite(LEDPin, LOW);//turn the LED OFF
}

你还可以以 9600 波特率打开串口监视器,在按下按钮时查看“Light ON”和“Light OFF”消息。

实时演示

在视频中(视频 19:41 处),你可以看到实际行为:第一次按下会点亮 LED,并且在手指松开后它仍保持亮起。下一次按下会将其熄灭,并且它保持熄灭。无需一直按住按钮,这正是本项目与 Lesson 98-2: How to Turn On and Off an LED Using a Push Button with Arduino 中介绍的更简单的“按住点亮”版本之间的区别。

视频还指出,你可以将 LED 替换为继电器模块,以切换市电供电设备,或替换为电机驱动器来启动和停止电机。切换逻辑不会改变 —— 只有输出设备会改变。

同一视频中展示的其他变体 —— LED 渐隐、跷跷板模式、走马灯、电压条仪表和交通灯 —— 都在各自的教程中介绍,链接如下。

本视频中的相关项目

章节

  • [00:00] 10 个 LED 项目概述
  • [01:00] Arduino 分步课程介绍
  • [02:29] LED 基础:符号、阳极、阴极和电阻计算
  • [05:53] 项目 1:点亮和熄灭 LED
  • [12:43] 项目 2:按钮控制 LED
  • [17:13] 项目 3:按钮切换 LED 开和关
  • [20:12] 项目 4:LED 渐隐
  • [23:20] 项目 5:用按钮使 LED 渐隐
  • [27:32] 项目 6:两个 LED 的跷跷板
  • [30:47] 项目 7:五个 LED 的走马灯
  • [36:41] 项目 8:用按钮推进的走马灯
  • [42:25] 项目 9:用电位器的 LED 电压电平表
  • [49:25] 项目 10:Arduino 交通灯

图像

push-button-and-finger
push-button-and-finger
Arduino schematic for LED
Arduino schematic for LED
Arduino wiring for LED with a push button switch
Arduino wiring for LED with a push button switch
Arduino schematic for LED with a push button switch
Arduino schematic for LED with a push button switch
LED-5mm-green
LED-5mm-green
面包板上带电阻的LED通过按钮连接到Arduino
面包板上带电阻的LED通过按钮连接到Arduino
935-Lessson 98-LED-3: Arduino code push button toggles LED ON/OFF
语言: C++
This code has not been parsed yet. Please return to the admin panel to parse it.

文件📁

Arduino 库(zip 格式)

用户手册