通过ESP32和INMP441麦克风模块实现音频数据传递
在现代物联网(IoT)项目中,音频数据的采集与传输成为了一个热门的应用领域。通过结合ESP32开发板和INMP441麦克风模块,我们可以实现一个低成本、高效率的音频数据传输系统。本文将详细介绍如何使用这两种硬件组件来构建和测试音频传输系统。
一、所需硬件
- ESP32开发板:ESP32是一款功能强大的微控制器,内置Wi-Fi和蓝牙功能,非常适合物联网应用。
- INMP441麦克风模块:INMP441是一款高性能的驻极体麦克风模块,具有灵敏度高、噪声低的特点,非常适合音频采集。
- 连接线:用于连接ESP32和INMP441模块。
- 电脑:用于接收和播放传输过来的音频数据。
二、硬件连接
硬件连接是构建音频传输系统的关键步骤。以下是连接方式的详细说明:
- INMP441 VCC → ESP32的3.3V
- INMP441 GND → ESP32的GND
- INMP441 SCK → ESP32的GPIO 17
- INMP441 WS → ESP32的GPIO 18
- INMP441 SD → ESP32的GPIO 16
请确保连接正确,以避免因接线错误导致的硬件损坏或传输问题。
三、软件设置与编程
为了实现音频数据的采集与传输,我们需要在ESP32上编写代码,并在电脑上设置接收端。
ESP32端代码
ESP32端代码主要使用Arduino IDE进行编写,并借助I2S(Inter-IC Sound)接口来实现音频数据的采集。以下是一个简单的代码示例:
cpp
#include <Arduino.h> | |
#include <WiFi.h> | |
#include <driver/i2s.h> | |
#include <WiFiUdp.h> | |
#define I2S_WS 18 | |
#define I2S_SD 16 | |
#define I2S_SCK 17 | |
#define I2S_PORT I2S_NUM_0 | |
#define bufferLen 1024 | |
const char* ssid = "你的wifi名称"; | |
const char* password = "你的wifi密码"; | |
const char* host = "接收音频端的IP地址"; // 电脑的IP地址 | |
const int port = 8888; // 监听的端口 | |
WiFiUDP udp; | |
int16_t sBuffer[bufferLen]; | |
void setup() { | |
Serial.begin(115200); | |
Serial.println("Setup I2S ..."); | |
setup_wifi(); | |
delay(1000); | |
i2s_install(); | |
i2s_setpin(); | |
i2s_start(I2S_PORT); | |
delay(500); | |
} | |
void loop() { | |
size_t bytesIn = 0; | |
esp_err_t result = i2s_read(I2S_PORT, &sBuffer, bufferLen * sizeof(int16_t), &bytesIn, portMAX_DELAY); | |
if (result == ESP_OK && bytesIn > 0) { | |
udp.beginPacket(host, port); | |
udp.write((uint8_t*)sBuffer, bytesIn); | |
udp.endPacket(); | |
} | |
} | |
// 其他函数定义,如setup_wifi(), i2s_install(), i2s_setpin()等,在此省略以保持简洁。 |
电脑端代码
电脑端代码使用Python编写,并借助socket库和pyaudio库来实现UDP接收和音频播放。以下是一个简单的代码示例:
python
import socket | |
import pyaudio | |
CHUNK = 1024 # 每个数据包的大小 | |
FORMAT = pyaudio.paInt16 # 数据格式为16位整型 | |
CHANNELS = 1 # 单声道 | |
RATE = 16000 # 采样率16kHz | |
p = pyaudio.PyAudio() | |
stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, output=True) | |
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
server_socket.bind(('0.0.0.0', 8888)) | |
print("等待音频数据流...") | |
try: | |
while True: | |
data, addr = server_socket.recvfrom(CHUNK * 2) # 接收数据包(每个int16占用2个字节) | |
if not data: | |
break | |
stream.write(data) | |
except KeyboardInterrupt: | |
pass | |
finally: | |
stream.stop_stream() | |
stream.close() | |
p.terminate() | |
server_socket.close() |
四、测试与调试
在硬件连接和软件设置完成后,我们可以开始测试音频传输系统。请确保ESP32和电脑连接在同一个Wi-Fi网络下,以便成功传输数据。
- 将ESP32开发板通过USB线连接到电脑,并上传代码到ESP32。
- 在电脑上运行Python接收端代码。
- 对着INMP441麦克风说话,观察电脑端是否能够实时接收到并播放音频数据。
如果在测试过程中遇到问题,可以检查以下几个方面:
- 硬件连接是否正确。
- ESP32和电脑的Wi-Fi连接是否稳定。
- 代码中的Wi-Fi名称、密码、IP地址和端口号是否正确。
- 麦克风模块是否工作正常(可以通过测试其他音频输入设备来验证)。
五、总结
通过结合ESP32开发板和INMP441麦克风模块,我们可以实现一个简单而高效的音频数据传输系统。该系统不仅适用于物联网项目中的音频采集与传输需求,还可以作为学习嵌入式系统和网络通信知识的一个有趣实践。希望本文能够帮助你更好地理解和实现这一应用。
相关文章:
通过ESP32和INMP441麦克风模块实现音频数据传递
在现代物联网(IoT)项目中,音频数据的采集与传输成为了一个热门的应用领域。通过结合ESP32开发板和INMP441麦克风模块,我们可以实现一个低成本、高效率的音频数据传输系统。本文将详细介绍如何使用这两种硬件组件来构建和测试音频传…...
Vue中nextTick实现原理
源码实现思路(面试高分回答) 面试官问我 Vue 的 nextTick 原理是怎么实现的,我这样回答: 在调用 this.$nextTick(cb) 之前: 存在一个 callbacks 数组,用于存放所有的 cb 回调函数。存在一个 flushCallbac…...
数据仓库基础常见面试题
1.数据仓库是什么 数据仓库(Data Warehouse)是一个面向主题的、集成的、非易失的、随时间变化的数据集合,用于支持企业的管理决策。它不同于传统的操作型数据库,后者主要用于处理日常业务交易和实时查询,而数据仓库…...
Java设计模式——单例模式(特性、各种实现、懒汉式、饿汉式、内部类实现、枚举方式、双重校验+锁)
文章目录 单例模式1️⃣特性💪单例模式的类型与实现:类型懒汉式实现(线程不安全)懒汉式实现(线程安全)双重锁校验懒汉式(线程安全)饿汉式实现(线程安全)使用类的内部类实现⭐枚举方式实现单例(推荐)👍 单例…...
数字普惠金融对新质生产力的影响研究(2015-2023年)
基于2015—2023年中国制造业上市公司数据,探讨了数字普惠金融对制造业企业新质生产力的影响及作用机理。研究发现,数字普惠金融有助于促进制造业企业新质生产力的发展,尤其是在数字普惠金融的使用深度较大的情况下,其对新质生产力…...
国产编辑器EverEdit - 扩展脚本:新建同类型文件(避免编程学习者反复新建保存练习文件)
1 扩展脚本:在当前文件目录下新建同类型文件 1.1 应用场景 用户在进行编程语言学习时,比如:Python,经常做完一个小练习后,又需要新建一个文件,在新建文件的时候,不但要选择文件类型,…...
jupyter notebook练手项目:线性回归——学习时间与成绩的关系
线性回归——学习时间与学习成绩的关系 第1步:导入工具库 pandas——数据分析库,提供了数据结构(如DataFrame和Series)和数据操作方法,方便对数据集进行读取、清洗、转换等操作。 matplotlib——绘图库,p…...
dockerfile2.0
dockerfile实现lnmp nginx centos7 mysql centos7 php centos7 自定义镜像来实现整个架构 cd /opt mkdir nginx mysql php cd nginx 拖入nginx和wordpress vim Dockerfile vim nginx.conf ↓ worker_processes 1; events {worker_connections 1024; } http {include …...
【spring mvc】文件上传、下载
文件上传,存储至本地目录中 一、代码1、工具类(敏感后缀过滤)2、文件上传,存储至本地3、文件下载 二、效果演示1、上传1.1、postMan 请求1.2、上传效果 2、下载2.1、下载效果 一、代码 1、工具类(敏感后缀过滤&#x…...
FPGA工程师成长四阶段
朋友,你有入行三年、五年、十年的职业规划吗?你知道你所做的岗位未来该如何成长吗? FPGA行业的发展近几年是蓬勃发展,有越来越多的人才想要或已经踏进了FPGA行业的大门。很多同学在入行FPGA之前,都会抱着满腹对职业发…...
java fastjson2 解析JSON用法解析
Fastjson2 是 Fastjson 的升级版本,提供了更好的性能和扩展性,同时也在 API 和功能上做了很多改进。使用 Fastjson2 解析 JSON 数据非常简单,支持多种方式来解析 JSON 字符串、嵌套 JSON 对象和数组、以及转换成 Java 对象。下面详细介绍 Fas…...
计算机视觉算法实战——步态识别(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 步态识别简介✨✨ 步态识别(Gait Recognition)是计算机视觉领域中的一个…...
LabVIEW水位监控系统
LabVIEW开发智能水位监控系统通过集成先进的传感技术与控制算法,为工业液体存储提供精确的水位调控,保证了生产过程的连续性与安全性。 项目背景 在化工和饮料生产等行业中,水位控制的准确性对保证生产安全和提高产品质量至关重要。传统的水…...
网络层协议-----IP协议
目录 1.认识IP地址 2.IP地址的分类 3.子网划分 4.公网IP和私网IP 5.IP协议 6.如何解决IP地址不够用 1.认识IP地址 IP 地址(Internet Protocol Address)是指互联网协议地址。 它是分配给连接到互联网的设备(如计算机、服务器、智能手机…...
计算机网络八股文学习笔记
总结来自于javaguide,本文章仅供个人学习复习 javaguide计算机网络八股 文章目录 计算机网络基础网络分层模型OSI七层模型TCP/IP四层模型 HTTP从输入URL到页面展示到底发生了什么?(非常重要)HTTP状态码HTTP Header中常见的字段有哪些?HTTP和HTTPS有什么区别?(重要)HTTP/1.0和…...
IntelliJ IDEA中Maven项目的配置、创建与导入全攻略
大家好,我是袁庭新。 IntelliJ IDEA是当前最流行的Java IDE(集成开发环境)之一,也是业界公认最好用的Java开发工具之一。IntelliJ IDEA支持Maven的全部功能,通过它我们可以很轻松地实现创建Maven项目、导入Maven项目、…...
如何在Jupyter中快速切换Anaconda里不同的虚拟环境
目录 介绍 操作步骤 1. 选择环境,安装内核 2. 注册内核 3. 完工。 视频教程 介绍 很多网友在使用Jupyter的时候会遇到各种各样的问题,其中一个比较麻烦的问题就是我在Anaconda有多个Python的环境里面,如何让jupyter快速切换不同的Pyt…...
stack和queue专题
文章目录 stack最小栈题目解析代码 栈的压入弹出序列题目解析代码 queue二叉树的层序遍历题目解析代码 stack stack和queue都是空间适配器 最小栈 最小栈的题目链接 题目解析 minst是空就进栈,或者是val < minst.top()就进栈 代码 class MinStack { public:M…...
【Vue】点击侧边导航栏,右侧main对应显示
需求:点击侧边导航栏,右侧main对应显示 通过v-if或v-show等指令来控制不同内容的显示隐藏来实现 注意: 使用v-if时候进行导航栏切换,右侧显示区域可能会出现样式错乱;使用v-show则不会出现此错误 <template>&…...
【Debug】django.db.utils.OperationalError: (1040, ‘Too many connections‘)
报错: django.db.utils.OperationalError: (1040, ‘Too many connections‘) 排查 可能是Mysql的连接数量超过了允许的最大连接数量; 查看Mysql允许最大连接数量: -- 查看允许连接的最大数量 SHOW VARIABLES LIKE %max_connections%;-- 查…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
