首页 / 行业
在Arduino IDE环境下用ESP32控制多路LED调光
2022-03-17 11:04:00
本项目将在Arduino IDE环境下,利用ESP32产生的PWM信号控制多个LED。项目所需物料如下:
ESP32 DOIT DEVKIT V1板
3x 5mm LED
3x 330欧姆电阻器
面包板
跳线若干
ESP32带一个包含16通道LED PWM控制器,可配置以产生不同特性的PWM信号。项目开始之前需要先安装Arduino IDE,连接妥当后就可以把ESP32 DOIT DEVKIT V1板用作LED PWM控制器了。
使用Arduino IDE进行LED调光的步骤如下:
1. 从0 to 15选择PWM channel。
2. 设置PWM频率,LED频率选择5000Hz较好。
3. 选择信号的占空比:,其分表率范围1-16bits。本项目使用8bit,这样可控制的LED亮度等级值为0-255。
4. 指定信号出现的GPIO or GPIOs:其函数为ledcAttachPin(GPIO, channel)。该函数具有两个变量,第一个GPIO用来输出信号,第二个表示产生信号的通道。
5. 使用PWM控制LED亮度,函数为ledcWrite(channel, dutycycle)。其中,第一个变量产生PWM信号,第一个变量是占空比。
一个LED调光控制
点亮一个LED并调光时,应将LED连接于GPIO 16引脚。
ESP32 DEVKIT V1模块有30个GPIOs,只要能用作输出,就可用作PWM引脚以连接LED。
请打开并拷入如下代码:
const int ledPin = 16;
const int freq = 5000;
const int ledChannel = 0;
const int resoluTIon = 8;
void setup(){
ledcSetup(ledChannel, freq, resoluTIon);
ledcAttachPin(ledPin, ledChannel);}
void loop(){
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
ledcWrite(ledChannel, dutyCycle);
delay(15);
}}
这些代码的含义是,设定的PWM信号频率为5000Hz,选择通道 0 来产生信号,信号的分辨率为8bits。
当然,也可以设置为其他参数,获得不同的PWM信号,例如:
const int freq = 5000;
const int ledChannel = 0;
const int resoluTIon = 8;
接下来,选择信号的GPIO引脚,函数为ledcAttachPin(ledPin, ledChannel); 增加LED亮度的占空比为0-255,
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
然后,从255-0自减,就降低了LED的亮度。
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
调节LED亮度,须使用 ledcWrite() 函数。该函数有两个参数:产生信号的通道、duty cycle。注意,这里的 ledcWrite() 函数中产生信号的变量是通道,而不是GPIO。
把代码上传到 ESP32,确定板子和COM端口选择正确,再对照下单路,就可以测试调光效果了。
多个LED调光控制
也可以从相同通道的不同GPIO取得同样的信号,这需要将这些GPIOs连接到 setup() 的相同通道。以下我们对上述操作稍作改动,来通过相同通道的相同PWN信号对3个LED进行调光控制。
我们的目标是通过30 GPIOs的ESP32 DEVKIT V1模块来控制三个LED。
首先,将下列代码拷贝到Arduino IDE中。
// the number of the LED pin
const int ledPin = 16;
const int ledPin2 = 17;
const int ledPin3 = 5;
// setTIng PWM properties
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
void setup(){
// configure LED PWM functionalitites
ledcSetup(ledChannel, freq, resolution);
// attach the channel to the GPIO to be controlled
ledcAttachPin(ledPin, ledChannel);
ledcAttachPin(ledPin2, ledChannel);
ledcAttachPin(ledPin3, ledChannel);
}
void loop(){
// increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
// decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
}
这些代码在前面基础上有一些改动:为两个新的LED增加了多个变量,具体参考 GPIO 17 和 GPIO 5。
const int ledPin2 = 17; // 17 corresponds to GPIO17
const int ledPin3 = 5; // 5 corresponds to GPIO5
然后,在 setup() 中,添加如下两行代码,将这两个 GPIOs 指派给通道0。这表示,在两个GPIO的通道0上产生了相同个信号。
ledcAttachPin(ledPin2, ledChannel);
ledcAttachPin(ledPin3, ledChannel);
把修改后的代码上传到 ESP32,确定板子和COM端口选择正确后,就可以测试者三个LED调光效果了。
由于所有GPIOs 输出了相同PWM信号,所有三个LED亮度的增加与减少是同时进行的,这样就产生了一个非常美妙的同步效果。
本项目演示了如何在Arduino IDE环境下,使用ESP32的LED PWM控制器进行调光控制。通过设置正确的信号属性,这种方法可用来控制其他PWM输出,如马达、LED 呼吸灯等。
审核编辑:汤梓红
最新内容
手机 |
相关内容
射频连接器使用技巧与注意事项
射频连接器使用技巧与注意事项,连接器,选择,频率,类型,连接,传输,射频连接器是一种用于连接射频电路的电子元件,常用于无线通信系统电流互感器作用 电流互感器为什么
电流互感器作用 电流互感器为什么一端要接地?,作用,误差,原因,连接,测量,短路故障,电流互感器(Current Transformer,简称CT)是一种用于低耗能,小安派-LRW-TH1传感器通用板
低耗能,小安派-LRW-TH1传感器通用板,一块板即可连接多种传感器!,传感器,多种,连接,一块,通用,接口,小安派-LRW-TH1传感器通用板是一款人形机器人风起,连接器待势乘时
人形机器人风起,连接器待势乘时,连接器,人形机器人,工作效率,性强,研发,光纤,近年来,人形机器人在人工智能领域取得了巨大的进展。随Efuse是什么?聊聊芯片级的eFuse
Efuse是什么?聊聊芯片级的eFuse,状态,编码器,故障,加密,芯片,配置信息,Efuse是一种可编程的电子熔断器,用于在芯片级别实现非易失性存应用在阀门控制中的直流有刷驱动芯
应用在阀门控制中的直流有刷驱动芯片,芯片,控制,支持,远程控制,电动,调节,直流有刷驱动芯片是一种用于控制直流电机的IPB072N15N3G振弦传感器智能化:电子标签模块
振弦传感器智能化:电子标签模块,模块,传感器,操作,连接,安装,控制,mbrs360t3g振弦传感器是一种常用的测量设备,用于检测物体的振动。智能家居中的MEMS传感器
智能家居中的MEMS传感器,传感器,智能家居,控制,用户,温度传感器,系统,MEMS(微机电系统)传感器是智能家居中的关键技术之一。它们是一