当前位置: 首页 > news >正文

使用 ESP32 接收 MAX4466 模拟麦克风模块的数据,通过 DAC 转码成 PCM 格式,并通过 MQTT 发送给另一台设备,可以通过以下步骤实现。

硬件准备

  1. 两个 ESP32 开发板
  2. MAX4466 模拟麦克风模块
  3. MQTT 服务器(例如 Mosquitto)

接线

  1. MAX4466 模块输出(AO) -> ESP32 ADC 引脚(如 GPIO 34)

软件准备

  1. 音频采集
  2. DAC 转码
  3. MQTT 发送和接收

代码实现

发送端:采集音频并通过 MQTT 发送
#include <WiFi.h>
#include <PubSubClient.h>// Wi-Fi 设置信息
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";// MQTT 设置信息
const char* mqtt_server = "your_mqtt_broker_ip";
const int mqtt_port = 1883;
const char* mqtt_topic = "audio/pcm";// ADC 引脚
const int adcPin = 34;// Wi-Fi 客户端和 MQTT 客户端
WiFiClient espClient;
PubSubClient client(espClient);void setup_wifi() {delay(10);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("WiFi connected");
}void reconnect() {while (!client.connected()) {Serial.print("Connecting to MQTT...");if (client.connect("ESP32Client")) {Serial.println("connected");} else {Serial.print("failed, rc=");Serial.print(client.state());delay(5000);}}
}void setup() {Serial.begin(115200);setup_wifi();client.setServer(mqtt_server, mqtt_port);
}void loop() {if (!client.connected()) {reconnect();}client.loop();int adcValue = analogRead(adcPin); // 读取 ADC 值char msg[10];itoa(adcValue, msg, 10);client.publish(mqtt_topic, msg); // 发送 ADC 值作为 PCM 数据delay(10); // 控制采样率
}

 接收端:接收 MQTT 数据并播放音频

#include <WiFi.h>
#include <PubSubClient.h>
#include <driver/dac.h>// Wi-Fi 设置信息
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";// MQTT 设置信息
const char* mqtt_server = "your_mqtt_broker_ip";
const int mqtt_port = 1883;
const char* mqtt_topic = "audio/pcm";// DAC 引脚
const int dacPin = 25;// Wi-Fi 客户端和 MQTT 客户端
WiFiClient espClient;
PubSubClient client(espClient);void setup_wifi() {delay(10);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("WiFi connected");
}void callback(char* topic, byte* payload, unsigned int length) {payload[length] = '\0';int adcValue = atoi((char*)payload);// 将 ADC 值映射到 DAC 输出范围int dacValue = map(adcValue, 0, 4095, 0, 255);dacWrite(dacPin, dacValue); // 输出 DAC 值
}void reconnect() {while (!client.connected()) {Serial.print("Connecting to MQTT...");if (client.connect("ESP32Client")) {Serial.println("connected");client.subscribe(mqtt_topic);} else {Serial.print("failed, rc=");Serial.print(client.state());delay(5000);}}
}void setup() {Serial.begin(115200);setup_wifi();client.setServer(mqtt_server, mqtt_port);client.setCallback(callback);
}void loop() {if (!client.connected()) {reconnect();}client.loop();
}

 

解释

  1. Wi-Fi 连接:

    • 发送端和接收端都连接到同一个 Wi-Fi 网络。
    • 使用 WiFi.begin(ssid, password) 连接 Wi-Fi。
  2. MQTT 连接:

    • 使用 PubSubClient 库连接到 MQTT 服务器。
    • client.setServer(mqtt_server, mqtt_port) 设置 MQTT 服务器地址和端口。
    • client.connect("ESP32Client") 连接到 MQTT 服务器。
    • 发送端使用 client.publish(mqtt_topic, msg) 发送数据。
    • 接收端使用 client.subscribe(mqtt_topic) 订阅主题并接收数据。
  3. 音频采集和发送:

    • 发送端从 MAX4466 模块读取模拟音频信号,使用 analogRead(adcPin) 获取 ADC 值。
    • 将 ADC 值转换为字符串并通过 MQTT 发送。
  4. 接收和播放音频:

    • 接收端从 MQTT 接收音频数据,使用 callback 函数处理收到的消息。
    • 将接收到的 ADC 值映射到 DAC 输出范围,使用 dacWrite(dacPin, dacValue) 输出到扬声器。

注意事项

  • 采样率: 上述代码的采样率较低,实际应用中可能需要优化采样率和数据传输速率。
  • 网络延迟: 确保网络连接稳定,避免因网络延迟导致的音频失真。
  • 音质: 音频信号的质量取决于硬件配置和软件处理。可以使用更高级的音频处理算法和硬件提高音质。

通过上述步骤,你可以使用 ESP32 实现通过 MQTT 传输的无线对讲机功能。实际应用中可能需要根据具体需求进行优化和调整。

相关文章:

使用 ESP32 接收 MAX4466 模拟麦克风模块的数据,通过 DAC 转码成 PCM 格式,并通过 MQTT 发送给另一台设备,可以通过以下步骤实现。

硬件准备 两个 ESP32 开发板MAX4466 模拟麦克风模块MQTT 服务器&#xff08;例如 Mosquitto&#xff09; 接线 MAX4466 模块输出&#xff08;AO&#xff09; -> ESP32 ADC 引脚&#xff08;如 GPIO 34&#xff09; 软件准备 音频采集DAC 转码MQTT 发送和接收 代码实现…...

SQL二次注入原理分析

二次注入在测试的时候比较少见&#xff0c;或者说很难被测出来&#xff0c;因为测的时候首先要去找注入的位置&#xff0c;其次是去判断第一次执行的SQL语句&#xff0c;然后还要去判断第二次进行调用的 SQL 语句。而关键问题就出在第二次的调用上面。 下面以一个常用过滤方法…...

在线签约如何选择?2024年10款顶级app大比拼

支持电子合同签约的10大app&#xff1a;e签宝、上上签、DocuSign、契约锁、Adobe Sign、法大大、SignNow、安心签、HelloSign、PandaDoc。 无论是企业之间的交易还是个人服务合同&#xff0c;线上电子合同签约提供了一种便捷、高效且安全的方式来处理法律文档。本文将介绍几款优…...

gcc: warning: -Wunused-function;加了选项,为什么就不报警告呢?

文章目录 问题clang的编译而使用gcc是就不报问题分析原因如果是非static的函数问题 下面这个代码段,其中这个函数hton_ext_2byte,在整个程序里就没有使用。 static inline uint16_t hton_ext_2byte(uint8_t **p) {uint16_t v;******return v;...

系统提示我未定义与 ‘double‘ 类型的输入参数相对应的函数 ‘finverse‘,如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…...

【电路笔记】-B类放大器

B类放大器 文章目录 B类放大器1、概述2、B类放大器介绍3、推挽式配置4、限制交叉失真5、B类放大器效率6、总结1、概述 我们在之前的文章中已经知道,A 类放大器的特点是导通角为 360,理论最大效率为 50%。 在本文中,我们将详细介绍另一类放大器,称为B类放大器,它是为解决A…...

Ubuntu 22.04 安装中文字体

笔者在用OpenCV4.9处理图片加水印时&#xff0c;中文乱码。原来是Ubuntu 22.04发行版缺少中文字体支持&#xff0c;因此&#xff0c;笔者就找资料安装了需要的中文字体&#xff0c;特此记录&#xff0c;以备后查。 1、打开终端&#xff1a; 2、更新软件包列表&#xff1a; su…...

「树莓派入门」树莓派进阶04-直流电机控制与PWM应用

直流电机控制是树莓派硬件项目中的一项重要技能。通过PWM技术,你可以实现对电机速度的精确控制。在实验过程中,请注意电机的电源匹配和GPIO引脚的保护。 一、直流电机基本原理 直流电机通过直流电源供电,其工作原理基于洛伦兹力定律,即电流通过线圈时,会在磁场中受到力的…...

利用数据集,用机器学习模型对股市预测,聊聊看!

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…...

015-GeoGebra基础篇-定点旋转物体、动态显示数值并显示运动轨迹

这可能是我能想到的最大概率可以被你搜索到的标题了&#xff0c;容我先喘口气~ 目录 一、成品展示二、涉及内容三、做图步骤&#xff08;1&#xff09;绘制三角形t&#xff08;2&#xff09;建立定点D&#xff08;3&#xff09;制作角度滑动条&#xff08;4&#xff09;图形绕点…...

2024年6月份找工作和面试总结

转眼间6月份已经过完了&#xff0c;2024年已经过了一半&#xff0c;希望大家都找到了合适的工作。 本人前段时间写了5月份找工作的情况&#xff0c;请查看2024年5月份面试总结-CSDN博客 但是后续写的总结被和谐了&#xff0c;不知道这篇文章能不能发出来。 1、6月份面试机会依…...

同步时钟:北斗/GPS卫星、电信基站、NTP以太网校时方式的区别

同步时钟是保证各设备时间统一的重要装置&#xff0c;广泛应用于电力、通信、金融、学校、医院、地铁等多个领域。目前&#xff0c;常用的同步时钟方式包括&#xff1a;北斗/GPS卫星、电信基站、NTP以太网等。 下面跟着小编来看一下这些校时方式及他们的区别吧。 1. 北斗/GP…...

实现Java应用的快速开发与迭代

实现Java应用的快速开发与迭代 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 引言 随着软件开发周期的不断缩短和市场竞争的加剧&#xff0c;快速开发和…...

利用redis数据库管理代理库爬取cosplay网站-cnblog

爬取cos猎人 数据库管理主要分为4个模块&#xff0c;代理获取模块&#xff0c;代理储存模块&#xff0c;代理测试模块&#xff0c;爬取模块 cos猎人已经倒闭&#xff0c;所以放出爬虫源码 api.py 为爬虫评分提供接口支持 import requests import concurrent.futures import …...

数据仓库建模基础理论-01-为什么需要数据建模?

一、什么是数据模型&#xff1f; 数据模型是数据库的基础结构&#xff0c;用于描述和组织数据的方式。 它不仅是数据库的底层结构&#xff0c;还是一个概念性工具&#xff0c;帮助理解数据的含义和关系。 数据模型包括数据本身、数据之间的关系、数据的语义&#xff08;含义和…...

中序遍历的两种实现——二叉树专题复习

递归实现&#xff1a; /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right)…...

python 基础综合应用——小开发

#python 基础综合应用——小开发 综合复习 变量- 循环- 函数- 模块 开发 名片管理系统 名片管理系统介绍 名片管理系统可以理解成花名册软件&#xff0c;通过个人新建人的信息后可以进行查询等简单操作的程序 名片管理系统有三个作用&#xff0c; 1.新建名片 2.显示全部名…...

算法金 | 我最常用的两个数据可视化软件,强烈推荐

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 抱个拳&#xff0c;送个礼 预警&#xff1a;今天文章的描述可能会让你有点别扭&#xff1b;如感到不适&#xff0c;请及时停止 在我行…...

【机器学习实战】Baseline精读笔记

比赛用到的库 numpy&#xff1a;提供&#xff08;多维&#xff09;数组操作 pandas&#xff1a;提供数据结构、数据分析 catboost&#xff1a;用于机器学习的库&#xff0c;特别是分类和回归任务 sklearn.model_selection&#xff1a;包含模型选择的多种方法&#xff0c;如交…...

Redis 缓存问题及解决

所有问题解决的关键就是尽少的访问数据库&#xff0c;或者避免太集中的访问。 一&#xff0c;缓存穿透&#xff08;key在数据库不存在&#xff09; 当数据既不在缓存中&#xff0c;也不在数据库中&#xff0c;导致请求访问缓存没数据&#xff0c;访问数据库也没数据&#xff0c…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器

一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下&#xff0c;音视频内容犹如璀璨繁星&#xff0c;点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频&#xff0c;到在线课堂中知识渊博的专家授课&#xff0c;再到影视平台上扣人心弦的高清大片&#xff0c;音…...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…...