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

一个基于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)打印音频强度值,观察效果并调整参数。
  • 可以进一步优化音频强度计算和灯带控制,实现更复杂的律动效果。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

零基础学习书生.浦语大模型--基础岛

第二关:玩转书生[多模态对话]和[AI搜索]产品 任务一&#xff1a;使用MindSearch 任务二&#xff1a;尝试使用书生.浦语 尝试让其写一段Self-Attention网络模块代码 import torch import torch.nn as nn import torch.nn.functional as Fclass SelfAttention(nn.Module):def _…

AWS Fargate

AWS Fargate 是一个由 Amazon Web Services (AWS) 提供的无服务器容器计算引擎。它使开发者能够运行容器化应用程序&#xff0c;而无需管理底层的服务器或虚拟机。简而言之&#xff0c;AWS Fargate 让你只需关注应用的容器本身&#xff0c;而不需要管理运行容器的基础设施&…

启明星辰发布MAF大模型应用防火墙产品,提升DeepSeek类企业用户安全

2月7日&#xff0c;启明星辰面向DeepSeek等企业级大模型业务服务者提供的安全防护产品——天清MAF&#xff08;Model Application Firewall&#xff09;大模型应用防火墙产品正式发布。 一个新赛道将被开启…… DeepSeek的低成本引爆赛道规模 随着DeepSeek成为当前最热的现象级…

Excel大数据量导入导出

github源码 地址&#xff08;更详细&#xff09; : https://github.com/alibaba/easyexcel 文档&#xff1a;读Excel&#xff08;文档已经迁移&#xff09; B 站视频 : https://www.bilibili.com/video/BV1Ff4y1U7Qc 一、JAVA解析EXCEL工具EasyExcel Java解析、生成Excel比较…

Coze(扣子)+ Deepseek:多Agents智能体协作开发新范式

前言 在当今数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技术的迅猛发展正深刻改变着我们的生活和工作方式。从智能语音助手到自动化流程机器人&#xff0c;AI 的应用无处不在&#xff0c;为我们提供了更加便捷、高效的服务。然而&#xff0c;对于非专业人士来…

Spring AI -使用Spring快速开发ChatGPT应用

前言 Spring在Java生态中一直占据大半江山。最近我发现Spring社区推出了一个Spring AI项目&#xff0c;目前该项目还属于Spring实验性项目&#xff0c;但是我们可以通过该项目&#xff0c;可以非常快速的开发出GPT对话应用。 本篇文章将会对SpringAI进行简单的介绍和使用&#…

Unity项目接入xLua的一种流程

1. 导入xlua 首先导入xlua&#xff0c;这个不用多说 2. 编写C#和Lua交互脚本 基础版本&#xff0c;即xlua自带的版本 using System.Collections; using System.Collections.Generic; using UnityEngine; using XLua; using System; using System.IO;[Serializable] public…

LM Studio 部署本地大语言模型

一、下载安装 1.搜索&#xff1a;lm studio LM Studio - Discover, download, and run local LLMs 2.下载 3.安装 4.更改成中文 二、下载模型(软件内下载) 1.选择使用代理&#xff0c;否则无法下载 2.更改模型下载目录 默认下载位置 C:\Users\用户名\.lmstudio\models 3.搜…

route 与 router 之间的差别

简述&#xff1a; router&#xff1a;主要用于处理一些动作&#xff0c; route&#xff1a;主要获得或处理一些数据&#xff0c;比如地址、参数等 例&#xff1a; videoInfo1.vue&#xff1a; <template><div class"video-info"><h3>二级组件…

DeepSeek-V2 论文解读:混合专家架构的新突破

论文链接&#xff1a;DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model 目录 一、引言二、模型架构&#xff08;一&#xff09;多头部潜在注意力&#xff08;MLA&#xff09;&#xff1a;重塑推理效率&#xff08;二&#xff09;DeepSeekM…

Android修行手册-五种比较图片相似或相同

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材…

力扣--链表

相交链表 法一&#xff1a; 把A链表的节点都存HashSet里&#xff0c;遍历B链表找相同的节点 法二&#xff1a; 把A、B指针都移到末尾&#xff0c;再同时往回走&#xff0c;每次往回走都比较 当前节点的下一节点&#xff08;a.next b.next ?)是否相同&#xff0c;当不相同…

只需两步,使用ollama即可在本地部署DeepSeek等常见的AI大模型

只需两步&#xff0c;使用ollama即可在本地部署DeepSeek等常见的AI大模型 1.下载ollama,进入ollama官网即可将ollama下载到本地&#xff0c;之后按照提示安装ollama。 https://ollama.com/download/windows 2.安装大模型 进入ollama官网模型页面&#xff0c;找到所需的模型及版…

Qt修仙之路2-1 仿QQ登入 法宝初成

widget.cpp #include "widget.h" #include<QDebug> //实现槽函数 void Widget::login1() {QString userusername_input->text();QString passpassword_input->text();//如果不勾选无法登入if(!check->isChecked()){qDebug()<<"xxx"&…

大模型deepseek-r1 本地Open WebUI部署详解

一、Open WebUI简介 Open WebUI是一个用户友好的Web界面&#xff0c;专为本地大语言模型&#xff08;LLMs&#xff09;设计。它支持多种模型&#xff0c;包括Ollama和OpenAI兼容的API&#xff0c;并允许用户通过图形界面轻松调试和调用模型。Open WebUI的功能丰富&#xff0c;…

免费windows pdf编辑工具Epdf

Epdf&#xff08;完全免费&#xff09; 作者&#xff1a;不染心 时间&#xff1a;2025/2/6 Github: https://github.com/dog-tired/Epdf Epdf Epdf 是一款使用 Rust 编写的 PDF 编辑器&#xff0c;目前仍在开发中。它提供了一系列实用的命令行选项&#xff0c;方便用户对 PDF …

大模型训练(7):集合通信与通信原语

0 背景 分布式训练过程中设计到许多通信上的操作&#xff0c; 每个操作有其不同的术语并且有所区别&#xff0c;这里将其用简单的例子和描述总结一下&#xff0c;方便理解。 集合通信&#xff08;Collective Communications&#xff09;是一个进程组的所有进程都参与的全局通…

线程上下文-ThreadLocal原理

ThreadLocal主要作用&#xff1a;为每个线程提供独立的变量副本&#xff0c;实现线程间的数据隔离&#xff0c;从而避免多线程环境下的资源共享冲突。 原理 ThreadLocal有个内部类 ThreadLocalMap&#xff0c;顾名思义是个Map结构&#xff1a;key为 ThreadLocal实例&#xff0…

第31周:文献阅读

目录 摘要 Abstract 文献阅读 问题引入 研究背景 研究动机 创新点 动态预训练方法&#xff08;DynPT&#xff09; 深度循环神经网络&#xff08;DRNN&#xff09; 传感器选择 方法论 时间序列的动态预训练 异构传感器数据的DRNN 基于稀疏度的传感器过滤 实验研…

Yolo图片标注的一些问题

1.标注工具的选择 在img.net和瑞芯微的双重加持下&#xff0c;现在的计算机视觉识别已经在各行业快速推进。进行自行标注时&#xff0c;首先遇到的问题就是标注工具的选择问题&#xff0c;标注工具不需要自己手工完成——也没有必要。类似这样的通用需求&#xff0c;交给专业…