原创 用ESP32在Arduino IDE环境下控制多路LED调光

2022-3-17 10:58 3399 16 6 分类: MCU/ 嵌入式 文集: 技术
本项目将在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通道。
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 呼吸灯等。

作者: 硬之城Allchips, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3975615.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论2条评论)

登录后参与讨论

硬之城Allchips 2022-3-19 18:29

yzw92: 谢谢楼主分享
共勉

yzw92 2022-3-19 08:29

谢谢楼主分享
相关推荐阅读
硬之城Allchips 2024-02-14 13:05
压电技术将使智能手机屏幕变成沉浸式交互扬声器
时至今日,包括手机在内的移动设备话筒(扬声器和触觉发生器)依然存在几个问题,而压电技术有望改变这一切,让显示器能够提供高质量的沉浸音频和交互触摸体验。首先是组件本身。智能手机中的扬声器和当你触摸虚拟按...
硬之城Allchips 2023-02-15 17:25
工程师为笔电、便携式工具和电动自行车开发出频率超过MHz的无线充电器
尽管目前手机等小型设备在无线充电方面取得了成功,但在我们完全实现无线充电之前,仍有几个技术挑战需要解决,特别是在耗电量更大的电子产品方面。在《IEEE电力电子新兴和精选主题期刊》中,专家们概述了克服这...
硬之城Allchips 2022-08-29 10:30
霍尔传感器原理、典型应用及与Arduino的接口
霍尔传感器(Hall Effect Sensor)是根据霍尔效应制作的一种磁场传感器,当恒定电流通过内部的霍尔半导体片时,将在垂直方向产生电位差即霍尔电压。这个霍尔电压随磁场强度的变化而变化,磁场越强...
硬之城Allchips 2022-08-26 08:59
传感器到云应用中的超低功耗Sub-1GHz RF收发方案
在ISM和SRD(短距离无线电设备)应用中,高性能和长电池寿命至关重要。本方案采用S2-LP sub-1GHz超低功耗的低数据率,可实现+27dBm(500mW)的输出功率,可使电池寿命从几个月延长为...
硬之城Allchips 2022-08-25 09:58
用IR传感器和Arduino制作一个数字转速计(附代码)
本项目采用IR传感器和Arduino开发板制作了一个数字转速计,以RPM为单位测量马达的转数。项目黑简单,只需将IR传感器和Arduino板子与16*2 LCD连接即可。BOM表及电路图本转速计可连续...
硬之城Allchips 2022-08-24 10:27
基于AP33772的家电及电动工具USB-C PD3.0/PPS接收方案
Type-C PD3.0适配器已经大量上市,这要求Type-C接口设备(TCD)配备灵活、精简且具成本效益的充电解决方案。本设计采用AP33772高效能USB Type-C PD3.0/PPS接收控制...
我要评论
2
16
关闭 站长推荐上一条 /2 下一条