## 项目15 模拟沙漏

**1. 项目介绍：**

古代人没有电子时钟，就发明了沙漏来测时间，沙漏两边的容量比较大，在一边装了细沙，中间有个很小的通道，将沙漏直立，有细沙的一边在上方，由于重力的作用，细沙就会往下流通过通道到沙漏的另一边，当细沙都流到下边了，就倒过来，把一天反复的次数记录下来，第二天就可以通过沙漏反复流动的次数而知道这一天大概的时间了。

这一课我们将利用ESP32控制倾斜开关和LED灯来模拟沙漏，制作一个电子沙漏。

**2. 项目元件：**

|![Img](./media/afc52f6616725ba37e3b12a2e01685ad.png)|![Img](./media/a2aa343488c11843f13ae0413547c673.png)|![Img](./media/01c1502f7cc76c09d4d77410dcdd31a6.png)|![Img](./media/b3484a63586f907a33f23fa001c874ee.png)|
| :--: | :--: | :--: | :--: |
|ESP32*1|面包板*1|倾斜开关*1|10KΩ电阻*1|
|![Img](./media/e8726e55ebfb8e7520e615575ce89204.png)|![Img](./media/11f324f82f890b0691f134e1ea7a3765.png)| ![Img](./media/8d920d12138bd3b4e62f02cecc2c63a3.png)|![Img](./media/b4421594adeb4676d63581a1047c6935.png)|
|红色 LED*4|220Ω电阻*1|跳线若干|USB 线*1|

**3. 元件知识：**

![Img](./media/966683cc81a185103df1862a16d7a844.png)

倾斜开关也叫数字开关或球形开关，里面有一个金属球。它用于检测小角度的倾斜。

原理很简单：当开关倾斜一定角度时，里面的球会向下滚动，接触到连接到外面引脚的两个触点，从而触发电路。否则，球将远离触点，从而断开电路。

这里用倾斜开关的内部结构来说明它是如何工作的，显示如下图：

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

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

![Img](./media/02d5f7df75aa8062f7b9399a47ae4285.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-20241030141328.png)

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

**6. 项目代码：**

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

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

2. 从 “![Img](./media/img-20241023140218.png)” 拖出 “![Img](./media/img-20241023140243.png)” 放入 “![Img](./media/img-20241023140106.png)”。

3. 先从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241028131724.png)” 放入 “![Img](./media/img-20241023140106.png)” 中；再从 “![Img](./media/img-20241024143857.png)” 拖出 “![Img](./media/img-20241028132058.png)” 放入 “![Img](./media/img-20241028131724.png)”中，将 “ 整数 ” 改成 “字节” ，将 “item” 改成 “switch_state” 。

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

4. 先从 “![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241030141123.png)” ，再从 “![Img](./media/img-20241029163044.png)” 拖出 “ ![Img](./media/img-20241030141504.png) ” ，管脚为 15 。

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

5. 先从 “![Img](./media/img-20241023140218.png)” 拖出 “ ![Img](./media/img-20241030141723.png) ”，再从 “ ![Img](./media/img-20241024133608.png)” 拖出 “![Img](./media/img-20241030141816.png) ” 。

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

6. 先从 “![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-20241024133608.png)” 拖出 “![Img](./media/img-20241030141816.png) ”  放入 “ = ” 左侧 ；最后从 “![Img](./media/img-20241028132016.png)” 拖出 “![Img](./media/img-20241028132058.png)” 放入 “ = ” 右侧。

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

7. 先从 “![Img](./media/img-20241023140031.png)” 拖出 “ ![Img](./media/img-20241030142241.png) ” 放入 “ ![Img](./media/img-20241030142341.png) ”
，将从 1 到 10 步长为 1 改成从 16 到 19 步长为 1；又从 “![Img](./media/img-20241024131848.png)” 拖出 “ ![Img](./media/img-20241029171029.png) ” 放入 “ ![Img](./media/img-20241030142609.png) ”；再从 “ ![Img](./media/img-20241024133608.png)” 拖出 “ ![Img](./media/img-20241024133651.png) ” 放入 “管脚 <span style="color: rgb(255, 76, 65);">0</span> ” 处 ；添加延时500毫秒。

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

8. 复制代码块 “ ![Img](./media/img-20241030142718.png) ” 1次，将 “ = ” 右侧的数字 <span style="color: rgb(0, 209, 0);">0</span> 改成 <span style="color: rgb(255, 169, 0);">1</span>，从 16 到 19 步长为 1 改成从 19 到 16 步长为 -1 ，“ 高 ” 改成 “ 低 ” 。

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

完整代码：

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

**7. 项目现象：**

代码上传成功后，利用USB线上电，你会看到的现象是：将面包板倾斜到一定角度，led就会一个一个地亮起来。当回到上一个角度时，led会一个一个关闭。就像沙漏一样，随着时间的推移，沙子漏了出来。

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





