第2课 呼吸灯#
2.1 项目介绍#
在之前的研究中,我们知道LED有亮/灭状态,那么如何进入中间状态呢?如何输出一个中间状态让LED“半亮”?这就是我们将要学习的。呼吸灯,即LED由灭到亮,再由亮到灭,就像“呼吸”一样。那么,如何控制LED的亮度呢?我们将使用ESP32的PWM来实现这个目标。
2.2 模块相关资料#

工作电压: |
DC 3.3-5V |
|---|---|
工作电流: |
20mA |
最大功率: |
0.1W |
控制接口: |
数字口(数字输入) |
工作温度: |
-10°C ~ +50°C |
LED显示颜色: |
黄色 |
2.3 元件知识#

Analog & Digital
模拟信号在时间和数值上都是连续的信号。相反,数字信号或离散时间信号是由一系列数字组成的时间序列。生活中的大多数信号都是模拟信号。一个熟悉的模拟信号的例子是,全天的温度是如何不断变化的,而不是突然从0到10的瞬间变化。然而,数字信号的值可以瞬间改变。这个变化用数字表示为1和0(二进制代码的基础)。如下图所示,我们可以更容易地看出它们的差异。

在实际应用中,我们经常使用二进制作为数字信号,即一系列的0和1。由于二进制信号只有两个值(0或1),因此具有很大的稳定性和可靠性。最后,可以将模拟信号和数字信号相互转换。
PWM:
脉宽调制(PWM)是一种利用数字信号控制模拟电路的有效方法。普通处理器不能直接输出模拟信号。PWM技术使这种转换(将数字信号转换为模拟信号)非常方便。PWM技术利用数字引脚发送一定频率的方波,即高电平和低电平的输出,交替持续一段时间。每一组高电平和低电平的总时间一般是固定的,称为周期(注:周期的倒数是频率)。高电平输出的时间通常称为脉宽,占空比是脉宽(PW)与波形总周期(T)之比的百分比。高电平输出持续时间越长,占空比越长,模拟信号中相应的电压也就越高。下图显示了对应于脉冲宽度0%-100%的模拟信号电压在0V-3.3V(高电平为3.3V)之间的变化情况.

PWM占空比越长,输出功率越高。既然我们了解了这种关系,我们就可以用PWM来控制LED的亮度或直流电机的速度等等。从上面可以看出,PWM并不是真实的模拟信号,电压的有效值等于相应的模拟信号。因此,我们可以控制LED和其他输出模块的输出功率,以达到不同的效果。
ESP32 与 PWM
在ESP32上,LEDC(PWM)控制器有16个独立通道,每个通道可以独立控制频率,占空比,甚至精度。与传统的PWM引脚不同,ESP32的PWM输出引脚是可配置的,每个通道有一个或多个PWM输出引脚。最大频率与比特精度的关系如下公式所示:

其中比特的最大值为31。例如,生成PWM的8位精度(2的8次方 = 256。取值范围为0 ~ 255),最大频率为80,000,000/255 = 312,500Hz。)
2.4 实验组件#
|
|
|
|
|---|---|---|---|
ESP32 Plus主板 *1 |
黄色LED模块 *1 |
3P线 *1 |
USB线 *1 |
2.5 模块接线图#
黄色LED的控制引脚:
黄色LED灯(S引脚)io12
⚠️ 特别注意:智能家居已经组装好了,这里不需要把LED模块拆下来又重新组装和接线,这里再次提供接线图,是为了方便您编写代码!

2.6 实验代码#
/*
* 项目: breath_led
* 描述: LED渐亮渐暗,实现呼吸灯的效果
* 编译IDE:ARDUINO IDE
* 作者: http//www.keyes-robot.com
*/
#include <Arduino.h>
#define led_y 12 // 定义LED引脚
void setup()
{
pinMode(led_y, OUTPUT); // 设置引脚为输出模式
}
void loop()
{
for(int i = 0; i < 255; i++) // For循环:增加变量i到255
{
analogWrite(led_y, i); // PWM输出控制LED亮度
delay(3);
}
for(int i = 255; i > 0; i--) // For循环:递减变量i到0
{
analogWrite(led_y, i);
delay(3);
}
}
2.7 实验结果#
按照接线图接好线,外接电源,选择好正确的开发板板型(ESP32 Dev Module)和 适当的串口端口(COMxx),然后单击按钮
上传示例代码至ESP32主控板。示例代码上传成功后,可以看到黄色LED灯渐亮渐暗,似乎在呼吸。

2.8 代码说明#
pinMode(LED, OUTPUT); |
设置引脚为输出模式 |
|---|---|
int i = 0; 255; i ++ |
i从0到255,每次加1 |
analogWrite (led_y, i); |
Led_y为PWM口,i是要输出的PWM值(0~255) |



