一个基于ESP32S3和INMP441麦克风实现音频强度控制RGB灯带律动的代码及效果展示

news2025/2/11 12:49:40

一个基于ESP32S3和INMP441麦克风实现音频强度控制RGB灯带律动的代码示例,使用Arduino语言:

硬件连接

  • INMP441 VCC → ESP32的3.3V
  • INMP441 GND → ESP32的GND
  • INMP441 SCK → ESP32的GPIO 17
  • INMP441 WS → ESP32的GPIO 18
  • INMP441 SD → ESP32的GPIO 16
  • RGB LED灯带 → ESP32的GPIO 2

代码示例

#include <Arduino.h>
#include <driver/i2s.h>
#include <Adafruit_NeoPixel.h>  // RGB灯带库

// 定义I2S引脚
#define I2S_WS 18
#define I2S_SD 16
#define I2S_SCK 17
#define I2S_LED_BCK I2S_SCK
#define I2S_LED_WS I2S_WS
#define I2S_LED_SD I2S_SD
#define I2S_PORT I2S_NUM_0
// 灯带定义
#define LED_PIN    2       // 灯带连接的GPIO引脚
#define LED_COUNT  30     // 灯带LED数量

Adafruit_NeoPixel pixels(LED_COUNT, LED_PIN, NEO_RGB + NEO_KHZ800);  // 初始化灯带

// I2S配置
const i2s_port_t i2s_port = I2S_PORT;  // 使用I2S端口0
#define I2S_SAMPLE_RATE (48000)        // 采样率
#define I2S_DMA_BUF_LEN (100)          // DMA缓冲区长度
#define I2S_DMA_BUF_CNT (16)           // DMA缓冲区计数

// 变量声明
int16_t audioBuffer[100];  // 音频缓冲区
uint32_t audioStrength = 0;  // 音频强度

// 初始化I2S
void initI2S() {
  i2s_config_t i2s_config = {
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
    .sample_rate = I2S_SAMPLE_RATE,
    .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
    .communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_I2S_MSB),
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
    .dma_buf_count = I2S_DMA_BUF_CNT,
    .dma_buf_len = I2S_DMA_BUF_LEN,
    .use_apll = false,
    .tx_desc_auto_clear = false,
    .fixed_mclk = 0
  };

  i2s_pin_config_t pin_config = {
    .bck_io_num = I2S_LED_BCK,
    .ws_io_num = I2S_LED_WS,
    .data_out_num = I2S_PIN_NO_CHANGE,
    .data_in_num = I2S_LED_SD
  };

  i2s_driver_install(i2s_port, &i2s_config, 0, NULL);
  i2s_set_pin(i2s_port, &pin_config);
  i2s_start(i2s_port);
}

// 获取音频强度
void getAudioStrength() {
  size_t bytes_read;
  i2s_read(i2s_port, (void*)&audioBuffer, 50 * sizeof(int16_t), &bytes_read, portMAX_DELAY);

  // 计算音频强度
  audioStrength = 0;
  for (size_t i = 0; i < 50; i++) {
    audioStrength += abs(audioBuffer[i]);
  }
  audioStrength /= 50;  // 取平均值
}

// 控制灯带根据音频强度律动
void controlPixels() {
  static uint32_t lastUpdate = 0;
  uint32_t currentMillis = millis();

  // 每100毫秒更新一次
  if (currentMillis - lastUpdate >= 1) {
    lastUpdate = currentMillis;

    getAudioStrength();  // 获取音频强度

    // 根据音频强度点亮灯带
    for (int i = 0; i < LED_COUNT; i++) {
      if (i < (audioStrength / 20)) {  // 根据音频强度调整点亮范围
        //pixels.setPixelColor(i, pixels.Color(255, 0, 0));  // 红色
        // 设置所有LED为彩虹色
        uint8_t r, g, b;
        // 计算当前LED在颜色轮盘中的位置
        int wheelPos = (i * 256 / pixels.numPixels()); // 获得0-255的值
        Wheel(wheelPos, r, g, b); // 转换为RGB值
        pixels.setPixelColor(i, pixels.Color(r, g, b)); // 设置颜色
      } else {
        pixels.setPixelColor(i, pixels.Color(0, 0, 0));  // 关闭
      }
    }
    pixels.show();  // 更新灯带
  }
}

// Wheel函数根据颜色轮盘的位置返回对应的颜色
void Wheel(byte pos, byte &r, byte &g, byte &b) {
    if (pos < 85) {
        r = 255 - pos * 3;
        g = pos * 3;
        b = 0;
    } else if (pos < 170) {
        pos -= 85;
        r = 0;
        g = 255 - pos * 3;
        b = pos * 3;
    } else {
        pos -= 170;
        r = pos * 3;
        g = 0;
        b = 255 - pos * 3;
    }
}

void setup() {
  Serial.begin(115200);
  pixels.begin();  // 初始化灯带
  initI2S();  // 初始化I2S
}

void loop() {
  controlPixels();  // 控制灯带律动
}

代码说明

  1. I2S初始化

    • 配置I2S以读取麦克风音频数据。
    • 采样率为48000Hz,16位深度,单声道。
  2. 音频强度计算

    • 使用麦克风采集的音频数据计算平均强度。
    • 通过绝对值平均法计算音频强度。
  3. 灯带控制

    • 根据音频强度动态调整点亮的LED数量。
    • 音频强度越高,点亮的LED越多。

可调参数

  • LED_COUNT:灯带的LED数量,根据实际硬件调整。
  • LED_PIN:灯带连接的GPIO引脚。
  • 音频强度映射公式(audioStrength / 50)可以根据实际情况调整,以达到最佳效果。

注意事项

  • 确保RGB灯带连接到ESP32的正确GPIO引脚,并供电充足。
  • 调试时可通过Serial.println(audioStrength)打印音频强度值,观察效果并调整参数。
  • 可以进一步优化音频强度计算和灯带控制,实现更复杂的律动效果。

实验结果:
视频效果
在这里插入图片描述

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

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

相关文章

利用二分法进行 SQL 时间盲注

什么是时间盲注&#xff1f; SQL 盲注&#xff08;Blind SQL Injection&#xff09;是一种常见的 Web 安全漏洞&#xff0c;其中时间盲注是基于查询延迟的 SQL 注入方式。当服务器不返回可见的错误信息时&#xff0c;我们可以利用 SLEEP() 函数来判断查询结果是否符合预期。 …

基于STM32的声纹识别智能门锁

一、项目背景与意义 行业痛点&#xff1a;传统指纹锁存在表皮磨损识别失败风险&#xff0c;声纹具备活体检测特性 技术优势&#xff1a; - 采用MFCC&#xff08;梅尔频率倒谱系数&#xff09;替代传统FFT&#xff0c;提升说话人特征区分度 - 动态时间规整(DTW)算法解决语…

在CT107D单片机综合训练平台上实现外部中断控制LED闪烁

引言 在单片机开发中&#xff0c;外部中断是一个非常重要的功能&#xff0c;它可以让单片机在检测到外部信号变化时立即做出响应。本文将详细介绍如何在CT107D单片机综合训练平台上使用外部中断来控制LED灯的闪烁。我们将使用两种不同的方式来实现这一功能&#xff1a;一种是在…

C++ Primer 类型转换

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

Visual Studio Code中文出现黄色框子的解决办法

Visual Studio Code中文出现黄色框子的解决办法 一、vsCode中文出现黄色框子-如图二、解决办法 一、vsCode中文出现黄色框子-如图 二、解决办法 点击 “文件”点击 “首选项”点击 “设置” 搜索框直接搜索unicode选择“文本编辑器”&#xff0c;往下滑动&#xff0c;找到“Un…

“可通过HTTP获取远端WWW服务信息”漏洞修复

环境说明&#xff1a;①操作系统&#xff1a;windows server&#xff1b;②nginx&#xff1a;1.27.1。 1.漏洞说明 “可通过HTTP获取远端WWW服务信息”。 修复前&#xff0c;在“响应标头”能看到Server信息&#xff0c;如下图所示&#xff1a; 修复后&#xff0c;“响应标头…

CAD 屏幕进度条

参考鸿视频实现&#xff0c;代码如下&#xff1a; 主类 using System.IO.Ports; using System.Threading; using System.Windows.Controls; using static IFoxDemo.进度条class; using static System.Windows.Forms.VisualStyles.VisualStyleElement.TrackBar;//[assembly: C…

小红书爬虫: 获取所需数据

小红书&#xff0c;又名 “小红书 ”或简称 “红”&#xff0c;已迅速成为中国社交和电子商务领域的重要参与者&#xff0c;成为一个不可或缺的平台。对于企业、营销人员和数据分析师来说&#xff0c;从小红书收集数据可以获得宝贵的洞察力&#xff0c;从而推动业务增长。虽然这…

使用sunshine和moonlight串流时的音频输出问题

设备&#xff1a;电脑和平板串流&#xff0c;把平板当副屏使用 1.如果启用安装steam音频驱动程序&#xff0c;则平板有声&#xff0c;电脑无声&#xff0c;在moonlight端可以设置平板和电脑同时发声&#xff0c;但是有点卡 2.只想电脑发声&#xff0c;平板无声 禁用安装steam…

活动预告 |【Part 2】Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁

课程介绍 通过 Microsoft Learn 免费参加 Microsoft 安全在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft Cloud 技术的了解。参加我们举办的“通过扩展检测和响应抵御威胁”技术公开课活动&#xff0c;了解如何更好地在 Microsoft 365 Defen…

网络工程师 (26)TCP/IP体系结构

一、层次 四层&#xff1a; 网络接口层&#xff1a;TCP/IP协议的最底层&#xff0c;负责网络层与硬件设备间的联系。该层协议非常多&#xff0c;包括逻辑链路和媒体访问控制&#xff0c;负责与物理传输的连接媒介打交道&#xff0c;主要功能是接收数据报&#xff0c;并把接收到…

GIS笔记之Shapefile与KML相互转换

在GIS应用中&#xff0c;各种不同类型数据的转换与使用是一个重要的环节。在这其中&#xff0c;Shapefile和KML是两种常见的数据形式&#xff0c;两者间的相互转换也是日常工作和学习绕不开的话题。在这里&#xff0c;我们将常用的几种数据转换方法整理如下。 1.Shapefile和KM…

【UVM】寄存器模型

寄存器模型的优势 sequence复用性高&#xff0c;方便对 DUT 中寄存器进行读写&#xff1b;提供了后门访问方式&#xff0c;可以不耗时的获取寄存器的值&#xff1b;可以很方便的对寄存器的 coverage 验证点的收集 寄存器模型基本概念 寄存器模型概念作用uvm_reg_field寄存器模…

WordPress博客在fnOS环境下的极简搭建与公网地址配置指南

文章目录 前言1. Docker下载源设置2. Docker下载WordPress3. Docker部署Mysql数据库4. WordPress 参数设置5. 飞牛云安装Cpolar工具6. 固定Cpolar公网地址7. 修改WordPress配置文件8. 公网域名访问WordPress 前言 你是否曾经为搭建自己的网站而头疼不已&#xff1f;是不是觉得…

计算机毕业设计SpringBoot校园二手交易小程序 校园二手交易平台(websocket消息推送+云存储+双端+数据统计)(源码+文档+运行视频+讲解视频)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

2025年前端面试题~ 【前端面试】更新

前言 金三银四的招聘季即将来临&#xff0c;对于怀揣前端梦想的求职者而言&#xff0c;这是机遇与挑战并存的黄金时段。前端面试可不只是简单的问答&#xff0c;它是一场对综合能力的深度检验。面试官会从多个维度考量&#xff0c;比如扎实的 HTML、CSS 和 JavaScript 基础&…

从基础到人脸识别与目标检测

前言 从本文开始&#xff0c;我们将开始学习ROS机器视觉处理&#xff0c;刚开始先学习一部分外围的知识&#xff0c;为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本&#xff0c;系统采用Ubuntu20.04&#xff0c;ROS采用noetic。 颜…

Photoshop自定义键盘快捷键

编辑 - 键盘快捷键 CtrlShiftAltK 把画笔工具改成Q , 橡皮擦改成W , 涂抹工具改成E , 增加和减小画笔大小A和S 偏好设置 - 透明度和色域 设置一样颜色 套索工具 可以自定义套选一片区域 Shiftf5 填充 CtrlU 可以改颜色/色相/饱和度 CtrlE 合并图层 CtrlShiftS 另存…

LSTM的介绍

网上一些描述LSTM文章看的云里雾里&#xff0c;只是介绍LSTM 的结构&#xff0c;并没有说明原理。我这里用通俗易懂的话来描述一下。 我们先来复习一些RNN的核心公式&#xff1a; h t t a n h ( W h h t − 1 W x x t b h ) h_t tanh(W_h h_{t-1} W_x x_t b_h) ht​tan…

C++ ——从C到C++

1、C的学习方法 &#xff08;1&#xff09;C知识点概念内容比较多&#xff0c;需要反复复习 &#xff08;2&#xff09;偏理论&#xff0c;有的内容不理解&#xff0c;可以先背下来&#xff0c;后续可能会理解更深 &#xff08;3&#xff09;学好编程要多练习&#xff0c;简…