玩转ESP32 PWM输出,制作炫酷呼吸灯效果

news2024/12/26 11:45:30

文章目录

  • 什么是PWM
  • 软硬件使用
  • ESP32实现PWM输出
  • 代码讲解
  • 结语

什么是PWM

PWM(Pulse Width Modulation)是一种常用的模拟信号产生技术,它通过对一个定时器的计数值进行调整来改变输出信号的占空比,从而控制输出信号的平均电压值,实现对电子元件的精确控制。

ESP32共拥有16个PWM通道,每个通道都可以设置不同的频率和分辨率。在使用PWM功能之前,需要先对相应的GPIO引脚进行初始化,并选择相应的PWM通道进行配置,然后才能通过修改PWM占空比来控制引脚输出的电信号。
在这里插入图片描述

软硬件使用

软件:arduino2.0.4
硬件:ESP32-WROOM-32E

ESP32实现PWM输出

呼吸灯是一种常见的LED特效,它可以让LED的亮度逐渐增加和减少,营造出一种类似于人呼吸的效果。下面是一个使用ESP32 PWM实现呼吸灯效果的示例代码

#include "esp32-hal-timer.h"

#define LED_PIN 18          // 设置LED连接的GPIO引脚
#define LED_CHANNEL 0      // 设置PWM通道号
#define LED_RESOLUTION 8   // 设置PWM分辨率(位数)
#define delay_time 3       // 延时时间

void setup() {
  Serial.begin(115200);
  ledcSetup(LED_CHANNEL, 5000, LED_RESOLUTION);   // 配置PWM通道
  ledcAttachPin(LED_PIN, LED_CHANNEL);             // 将PWM通道连接到LED引脚
  Serial.println("初始化完成");
}

void loop() {
  // 呼吸灯效果:逐渐增加和减少占空比
  for (int duty = 0; duty < 255; duty++) {
    ledcWrite(LED_CHANNEL, duty);          // 增加亮度
    delay(delay_time);
  }
  for (int duty = 255; duty > 0; duty--) {
    ledcWrite(LED_CHANNEL, duty);          // 减少亮度
    delay(delay_time);
  }
}

示例中使用 ledcSetup 函数配置了一个 PWM 通道(LED_CHANNEL),并将它连接到一个GPIO引脚(LED_PIN)。然后,我们在 loop() 中使用循环来逐渐增加和减少PWM占空比,从而实现呼吸灯的效果。

除了基本的呼吸灯效果外,我们还可以制作更炫酷的呼吸灯效果。下面是一个使用ESP32的定时器和中断功能制作呼吸灯效果的示例代码:

#include "esp32-hal-timer.h"

#define LED_PIN 12          // 设置LED1连接的GPIO18引脚
#define LED_PIN2 13          // 设置LED2连接的GPIO19引脚
#define LED_CHANNEL 0      // 设置LED1 PWM通道号
#define LED_CHANNEL2 1      // 设置LED2 PWM通道号
#define LED_RESOLUTION 8   // 设置PWM分辨率(位数)
#define delay_time 3
#define set_time   3
hw_timer_t *timer = NULL;

void IRAM_ATTR onTimer() {
  static uint32_t duty = 255;
  static bool isIncreasing = false;
  // 更新占空比
  if (isIncreasing) {
    duty++;
    if (duty >= 255) {
      isIncreasing = false;
    }
  } else {
    duty--;
    if (duty <= 0) {
      isIncreasing = true;
    }
  }
  // 更改PWM占空比
  ledcWrite(LED_CHANNEL, duty);
}

void setup() {
  Serial.begin(115200);
  ledcSetup(LED_CHANNEL, 5000, LED_RESOLUTION);           // 配置PWM通道0
  ledcSetup(LED_CHANNEL2, 5000, LED_RESOLUTION);           // 配置PWM通道1
  ledcAttachPin(LED_PIN, LED_CHANNEL);                     // 将PWM通道连接到LED引脚
  ledcAttachPin(LED_PIN2, LED_CHANNEL2);

  timer = timerBegin(0, 80, true);            // 设置计时器0,预分频80,countUp为true
  timerAttachInterrupt(timer, onTimer, true);             // 将定时器0连接到onTimer函数
  timerAlarmWrite(timer, set_time * 1000, true);                        // 设置定时器报警时间为 set_time ms,重复报警
  timerAlarmEnable(timer);     
  Serial.println("初始化完成");                       
}

void loop() {
  // 呼吸灯效果:逐渐增加和减少占空比
  for (int duty = 0; duty < 255; duty++) {
    ledcWrite(LED_CHANNEL2, duty);         // 增加亮度
    delay(delay_time);
  }
  for (int duty = 255; duty > 0; duty--) {
    ledcWrite(LED_CHANNEL2, duty);         // 减少亮度
    delay(delay_time);
  }
}

代码讲解

ledcSetup(channel, frequency, resolution)
该函数用于设置一个 PWM 通道的频率和分辨率。
channel:PWM 通道号,0~15
frequency:PWM 信号的频率,单位为赫兹(Hz)
resolution:PWM 信号的分辨率,即占空比的位数

ledcAttachPin(pin, channel)
该函数用于将指定引脚连接到指定 PWM 通道。
pin:要连接的引脚编号
channel:要连接到该引脚的 PWM 通道号

因此,上述代码的作用如下:
ledcSetup(LED_CHANNEL, 5000, LED_RESOLUTION)配置 PWM 通道 0 的频率为 5 kHz,分辨率为 8 位;

ledcSetup(LED_CHANNEL2, 5000, LED_RESOLUTION)配置 PWM 通道 1 的频率为 5 kHz,分辨率为 8 位;

ledcAttachPin(LED_PIN, LED_CHANNEL)将 PWM 通道 0 连接到 LED 引脚;

ledcAttachPin(LED_PIN2, LED_CHANNEL2)将 PWM 通道 1 连接到 LED2 引脚。

结语

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/462953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea使用 ( 二 ) 创建java项目并导入依赖jar

3.创建java项目 3.1.创建普通java项目 3.1.1.打开创建向导 接 2.3.1.创建新的项目 也可以 从菜单选择建立项目 会打开下面的选择界面 3.1.2.不使用模板 3.1.3.设置项目名 Project name : 项目名 Project location : 项目存放的位置 确认创建 3.1.4.关闭tips 将 Dont s…

Spring Boot集成ShardingSphere实现数据分片(一) | Spring Cloud 40

一、背景 传统的将数据集中存储至单一节点的解决方案&#xff0c;在性能、可用性和运维成本这三方面已经难于满足海量数据的场景。 从性能方面来说&#xff0c;由于关系型数据库大多采用 B 树类型的索引&#xff0c;在数据量超过阈值的情况下&#xff0c;索引深度的增加也将使…

Mail 邮件服务

~ Postfix ~ sdskill.com 的邮件发送服务器 ~~ 支持smtps(465)协议连接,使用Rserver颁发的证书,证书路径/CA/cacert.pem ~ 创建邮箱账户“user1~user99”(共99个用户),密码为Chinaskill20!; ~ Dovecot ~ sdskill.com 的邮件接收服务器; ~ 支持imap…

6.微服务项目实战---Sleuth--链路追踪

6.1 链路追踪介绍 在大型系统的微服务化构建中&#xff0c;一个系统被拆分成了许多模块。这些模块负责不同的功能&#xff0c;组合成 系统&#xff0c;最终可以提供丰富的功能。在这种架构中&#xff0c;一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上…

Docker compose-实现多服务、nginx负载均衡、--scale参数解决端口冲突问题

Docker compose-实现多服务、nginx负载均衡、--scale参数解决端口冲突问题 问题&#xff1a;scale参数端口冲突解决方法&#xff1a;nginx实现多服务、负载均衡修改docker-compose.yml配置新增nginx本地配置文件验证启动容器查看容器状态访问web应用 问题&#xff1a;scale参数…

《二》HTTP 请求报文和响应报文、请求方法、状态码

请求报文和响应报文&#xff1a; 请求报文: 客户端向服务器发送的请求信息&#xff0c;就叫做请求报文。 客户端发送一个 HTTP 请求到服务器&#xff0c;请求信息包含四部分&#xff1a;请求行、请求头、空行、请求体。 请求行&#xff1a;包含三部分&#xff0c;分别是请…

查看库文件是32位还是64位|查看lib是静态库还是导入库|判断是debug模式还是release模式

文章目录 dll位数查看lib位数查看查看lib库是静态库还是导入库dll库文件信息查看lib库文件内容查看dll库查看编译模式是debug还是release方法一方法二方法三 lib静态库查看编译模式是debug还是release方法一方法二 lib导入库查看编译模式是debug还是release查看Linux下的.a库&a…

ROS学习第十五节——常用API(C++)

由于时间问题&#xff0c;从这一节开始只记录C实现效果&#xff0c;加油 以下附上这一节调试用的程序 https://download.csdn.net/download/qq_45685327/87708069 1.初始化函数 void init(int &argc, char **argv, const std::string& name, uint32_t options 0); …

openEuler NFS+协议全新发布:实现NAS存储性能与可靠性倍增

4月21日&#xff0c;在openEuler Developer Day 2023上&#xff0c;openEuler发布NFS协议&#xff0c;实现单客户端访问NAS存储可靠性提升3倍、性能提升6倍&#xff0c;助力NAS存储全面满足新型生产核心场景下苛刻要求。 传统NFS面临挑战 网络文件系统&#xff08;NFS&#xf…

vue打包如何开启gzip压缩

文章目录 场景gzip压缩有两种方案&#xff1a;个人实践 场景 本人前端打包的js达到了6.9M,导致网站加载很慢&#xff0c;想了下可以用gzip的方式压缩&#xff0c;减少文件大小。 “前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c…

什么蓝牙耳机好?测评达人精选五款性价比高蓝牙耳机推荐

用蓝牙耳机听歌、刷视频、玩游戏已经成为趋势&#xff0c;有线耳机已经逐渐被取代&#xff0c;但蓝牙耳机价格跨度大&#xff0c;品牌和型号也非常多&#xff0c;究竟什么蓝牙耳机好&#xff1f;我作为测评员这几年已经体验过五十款蓝牙耳机&#xff0c;今天就来总结五款性价比…

模仿网易云音乐黑胶唱片的交互实现

今天在 .NET MAUI 中我们来实现这个交互效果&#xff0c;先来看看效果&#xff1a; 使用.NET MAU实现跨平台支持&#xff0c;本项目可运行于Android、iOS平台。 创建页面布局 项目模拟了网易云音乐的播放主界面&#xff0c;可播放本地音乐文件。使用MatoMusic.Core作为播放内…

ChatGLM ptuning predict(预测)为空值的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

html学习(布局方式(layout)、浮动(float)、定位(position)、弹性盒(flex))

布局方式(layout) 文档流 文档流&#xff08;normal flow&#xff09; 文档流通俗的讲&#xff0c;就是一个web页面中&#xff0c;每一个模块只能从上到下从左往右的方式排列在页面上。 将窗口自下而上分成一行一行&#xff0c;应在每行中按从左至右的依次排放元素&#xff0…

[ZJCTF 2019]EasyHeap-patchlibc-调试

1,三连 主要功能&#xff1a; 1、malloc申请chunk 2、修改chunk内容 3、free chunk 4、exit 堆题多看一个libc信息&#xff1a; 2,IDA分析 2.1、malloc申请chunk heaparray[i]&#xff1a;存放 chunk 的地址。read_input(heaparray[i], size)&#xff1a;向 chunk 写入 s…

亚马逊云科技宣布四大举措,全方位赋能创新成长企业

4月13日&#xff0c;以“加速创新&#xff0c;成就未来”为主题的亚马逊云科技创新成长中国行深圳论坛圆满举行。会上亚马逊云科技宣布&#xff0c;将围绕创新成长企业的三大业务需求——云上创新、出海拓展、业务加速&#xff0c;提供行业聚焦、技术支撑、伙伴扶持、人才培养四…

ENVI5.3 自动配准流程化工具(Image Registration Workflow)配准方法流程

ENVI5.3 自动配准流程化工具&#xff08;Image Registration Workflow&#xff09;配准方法流程。 打开 ENVI软件中的Image Registration Workflow工具&#xff0c;分辨打开参考图像和待校正的图像。 Base Image File是参考图像&#xff0c;参考图像的范围应比待校正图像的范围…

LaTeX论文自动化排版

本文介绍了一些论文写作的在线课程&#xff0c;方便读者朋友们自学&#xff0c;提高论文写作的能力。论文写作的在线课程非常多&#xff0c;读者朋友们也可以在网上自行搜索&#xff0c;选择适合自己的在线课程进行学习。如需要打开课程的网站&#xff0c;请复制课程的网址到浏…

威胁行为者针对云中的常见漏洞

Palo Alto Networks 已发布其第 42 单元云威胁报告的第 7 卷。该报告调查了 1300 多家组织。它分析了所有主要云服务提供商 (CSP) 的 210000 个云帐户、订阅和项目中的工作负载&#xff0c;为安全领导者和从业者提供了云安全的多方面视图。 云迁移的速度从 2021 年的 3700 亿…

Codeforces Round 867 (Div. 3) (E-G)

Problem - E - Codeforces &#xff08;1&#xff09;题目大意 给你一个字符串&#xff0c;问你让字符串每一对相对应位置都不同的最小操作数是多少&#xff1f;&#xff08;A[i]和A[n - i],A[i 1]和A[n - i - 1]&#xff09; &#xff08;2&#xff09;解题思路 1.首…