## 项目14 小台灯

**1. 项目介绍：**

你知道ESP32可以在你按下外接按键的时候点亮LED吗?

 在这个项目中，我们将使用ESP32，一个按键开关和一个LED来制作一个迷你台灯。

**2. 项目元件：**

|![Img](./media/afc52f6616725ba37e3b12a2e01685ad.png)|![Img](./media/a2aa343488c11843f13ae0413547c673.png)|![Img](./media/4c27c3e6c2224e12fd1bd298669f700c.png)|
| :--: | :--: | :--: |
|ESP32*1|面包板*1|按键*1|
|![Img](./media/b3484a63586f907a33f23fa001c874ee.png)|![Img](./media/e8726e55ebfb8e7520e615575ce89204.png)|![Img](./media/11f324f82f890b0691f134e1ea7a3765.png)|
|10KΩ电阻*1|红色 LED*1|220Ω电阻*1|
|![Img](./media/4214d58466508ada517d241d46485b7b.png)| ![Img](./media/8d920d12138bd3b4e62f02cecc2c63a3.png)|![Img](./media/b4421594adeb4676d63581a1047c6935.png)|
|按键帽*1|跳线若干|USB 线*1|

**3. 元件知识：**

![Img](./media/50b8a411811e86cb4204a2e0377282f4.png)

**按键：** 按键可以控制电路的通断，把按键接入电路中，不按下按键的时候电路是断开的，一按下按键电路就通啦，但是松开之后就又断了。可是为什么按下才通电呢？这得从按键的内部构造说起。没按下之前，电流从按键的一端过不去另一端；按下的时候，按键内部的金属片把两边连接起来让电流通过。

按键内部结构如图：![Img](./media/013b1897a0308c71d7e5ed0eaf64198d.png)，未按下按键之前，1、2就是导通的，3、4也是导通的，但是1、3或1、4或2、3或2、4是断开（不通）的；只有按下按键时，1、3或1、4或2、3或2、4才是导通的。

在设计电路时，按键开关是最常用的一种元件。

**按键的原理图:**

![Img](./media/00096ba2b3cb95b8d02e075261acb181.png)

**什么是按键抖动？**

我们想象的开关电路是“按下按键-立刻导通”“再次按下-立刻断开”，而实际上并非如此。按键通常采用机械弹性开关，而机械弹性开关在机械触点断开闭合的瞬间（通常 10ms左右），会由于弹性作用产生一系列的抖动，造成按键开关在闭合时不会立刻稳定的接通电路，在断开时也不会瞬时彻底断开。

![Img](./media/c4d829daa9d08e80d4538b901c700b8c.png)

**那又如何消除按键抖动呢？**

常用除抖动方法有两种：软件方法和硬件方法。这里重点讲讲方便简单的软件方法。

我们已经知道弹性惯性产生的抖动时间为10ms 左右，用延时命令推迟命令执行的时间就可以达到除抖动的效果。

所以我们在代码中加入了0.02秒的延时以实现按键防抖的功能。

![Img](./media/3591ca9171277a78bf782c32525e1812.png)

**4. 项目接线图：**

![Img](./media/79c310407b3091e58739fda1c916f412.png)

<span style="color: rgb(255, 76, 65);">注意: </span>

怎样连接LED 

![Img](./media/cbb16ef4d8cb62a4001d1a05ae3ac615.png)

怎样识别五色环220Ω电阻和五色环10KΩ电阻

![Img](./media/951ce7d7778b34bf8fbdb3de1b8c3116.png)

![Img](./media/2d3f0996515352c92c07d17e074e7308.png)

**5. 代码说明：**

![Img](./media/img-20241029162852.png)

从指定的数字管脚读取按键开关的数字信号(高/低电平)。

![Img](./media/img-20241115103741.png)

布尔型（bool）变量的值只有真 （true) 和假 （false）。 C++中如果值非零就为True,为零就是False。这里可以知道ledState初始值为0。

![Img](./media/img-20241115103826.png)

将ledState的当前值取反后再赋值给ledState本身。

![Img](./media/img-20241115103926.png)

这里延时的作用是软件方法消抖。按键机械触点断开、闭合时，由于触点的弹性作用，按键开关不会马上稳定接通或一下子断开，在闭合及断开的瞬间均伴随有一连串的抖动，为了不产生这种现象而作的措施就是按键消抖。代码中检测出键闭合后执行一个延时程序，10ms的延时，让前沿抖动消失后再一次检测键的状态，如果仍保持闭合状态电平，则确认为真正有键按下.

**6. 项目代码：**

你可以打开我们提供的代码，也可以自己编写代码，其如下：

1. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140106.png)”。

2. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241028153152.png) ” 放入 “![Img](./media/img-20241023140106.png)”，管脚为 4 ，设为 “低” 。

![Img](./media/img-20241028151723.png)

3. 先从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241028131724.png)” 放入 “![Img](./media/img-20241023140106.png)” 中，将 “ 整数 ” 改成 “布尔” ，“item” 改成 “ledState” ；再从 “![Img](./media/img-20241028132537.png)” 拖出 “![Img](./media/img-20241028132459.png)” 放入 “![Img](./media/img-20241028131724.png)”中，选择 “假”。

![Img](./media/img-20241028151759.png)

4. 先从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241028135641.png)” ；接着从 “![Img](./media/img-20241028132537.png)” 拖出 “![Img](./media/img-20241028135823.png)” 放入 “![Img](./media/img-20241028135641.png)” 中；再从 “![Img](./media/img-20241029163044.png)” 拖出 “ ![Img](./media/img-20241028153403.png) ” 放入 “ = ” 左侧，管脚为 15 ；最后从 “![Img](./media/img-20241028132016.png)” 拖出 “![Img](./media/img-20241028132058.png)” 放入 “ = ” 右侧。

![Img](./media/img-20241028151832.png)

5. 从 “![Img](./media/img-20241023140031.png)” 拖出 “![Img](./media/img-20241023140625.png)”，设置延时为10毫秒。

![Img](./media/img-20241028151859.png)

6. 先复制代码块 “ ![Img](./media/img-20241028153518.png) ” 1次，将延时10毫秒改成200毫秒；再复制代码块 “ ![Img](./media/img-20241028153541.png) ” 1次，将数字 0 改成 1.

![Img](./media/img-20241028151951.png)

7. 复制代码块 “![Img](./media/img-20241028153708.png) ” 1次，将延时10毫秒移除，接着从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241028142316.png)” ，再从 “ ![Img](./media/img-20241028132537.png) ” 拖出 “![Img](./media/img-20241028142433.png) ”，最后又从 “ ![Img](./media/img-20241024133608.png)” 拖出 “ ![Img](./media/img-20241028142618.png) ”。

![Img](./media/img-20241028152022.png)

8. 从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241028153152.png) ” ，管脚为 4 ，又从 “ ![Img](./media/img-20241024133608.png)” 拖出 “ ![Img](./media/img-20241028142618.png) ” 放入 “高” 处。

![Img](./media/img-20241028152103.png)

完整代码：

![Img](./media/img-20241029161821.png)

**7. 项目现象：**

代码上传成功后，利用USB线上电，你会看到的现象是：按下按钮，LED亮起；当按钮松开时，LED仍亮着。再次按下按钮，LED熄灭；当按钮释放时，LED保持关闭。是不是很像个小台灯？

![Img](./media/cba65f3e78fc23732983efae1f0441e4.png)





