1、项目描述
最近在Bilibili刷到大佬“树莓好倒霉”用ESP32实现了公网对讲的功能,同时大佬“小孩康”已是成功做出了此公网对讲机,在此我想复刻一下2位大佬的作品,留下保姆级别的教程,再次感谢两位大佬的帮助。
树莓好倒霉大佬Bilibili地址:
https://space.bilibili.com/1025274077
树莓好倒霉大佬博客地址:
使用ESP32做一个实时语音对讲机(局域网)–对应gitlab工程
小孩康大佬Bilibili地址:
自制ESP32 IIS公网对讲机 对讲机是不是已经成为过去式?
小孩康大佬嘉立创工程文件地址:
2、项目说明
2.1、描述
在本教程中,我们将展示如何使用ESP-NOW通信协议在两个ESP32板之间建立双向通信。
ESP-NOW是乐鑫开发的无连接通信协议,具有短数据包传输的功能。此协议使多个设备无需使用Wi-Fi即可相互通信。这是一种快速的通信协议,可用于在ESP32板之间交换小消息(最大250字节)。 ESP-NOW具有多种用途,您可以采用不同的安排进行单向或双向通信。
在此项目中我们将使用ESP32+INMP441+MAX98357通过MQTT协议实现公网对讲功能,主要框架图如下图所示:

2.2、MQTT协议
本项目中使用MQTT协议;MQTT协议是TCP协议的应用,是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT使用的发布/订阅消息模式,提供了一对多的消息分发机制,从而实现与应用程序的解耦。这是一种消息传递模式,消息不是直接从发送器发送到接收器(即点对点),而是由MQTT server(或称为 MQTT Broker)分发的。
MQTT可以运行在几乎所有的设备上,例如公网服务器(Linux、Windows系统等)、树莓派、局域网电脑等,当然,如果MQTT服务运行在局域网中,那就只能实现局域网的消息转发。如果你没有公网服务器,可以使用MQTT地址,实现互联网转发。如果没有公网条件的朋友,我的MQTT服务器将会免费开放,需要的朋友请私信我,我会在服务器上新建个只属于你账号和密码进行使用。
后续我会专门出一节讲解如何塔基MQTT服务器
2.3、使用的软件
开发环境使用的是Arduino IDE,后期我会专门出一期Arduino IDE环境的搭建教程:
2.4、使用的硬件
2.4.1、麦克风:INMP441(随便找家买就行,只要型号准确)

2.4.2、功放:MAX98357(随便找家买就行,只要型号准确)

2.4.3、主控:ESP32*2(可直接使用嘉立创工程的BOM中选的芯片)


备注:
2.4.4、充电模块:TP4056充电模块(随便找家买就行,只要型号准确)

2.4.5、外放喇叭(只要尺寸合适就行,顺便找家买)

2.4.6、内置电池(只要尺寸合适就行,顺便找家买,我买的这家可作为参考)

2.5、编程思路:
2.5.1、基本流程
发送:初始化I2S采集后,数据会源源不断的存放在DMAbuf中,按下按键,将数据取出,转换成需要的格式,最终转换成8bit数据发送出去。
接收:在ESP-NOW接受回调函数中,将接收到的数据重新转换为16位, 发送到I2S中的DMA去。注意,在没有接收到消息的是否,需清空dambuf,要不然会重复播放上一帧的音频,发出很大的噪音。
数据流向:I2S采集->原始32bit->16bit->8bit->esp-now发送->MQTT服务器(中转)->接收到数据8bit->转换为16bit->I2S播放
2.5.2、具体配置:
麦克风采集配置
const i2s_config_t rec_i2s_config = {
.mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_RX),
.sample_rate = SAMPLE_RATE,
.bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,
.channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT,
.communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_I2S| I2S_COMM_FORMAT_I2S_MSB),
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
.dma_buf_count = 2,
.dma_buf_len = 256,
}
扬声器采集配置:
const i2s_config_t spk_i2s_config = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX),
.sample_rate = SAMPLE_RATE,
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, //2-channels
.communication_format =(i2s_comm_format_t)(I2S_COMM_FORMAT_I2S),
.intr_alloc_flags = 0,
.dma_buf_count = 2,
.dma_buf_len = 256,
};
2.6、硬件连接:
2.6.1、麦克风:INMP441:
购买麦克风硬件中标识 | ESP芯片中对应引脚 | 嘉立创PCB板中对应标识 |
BCK | IO4 | SCK |
WS | IO15 | WS |
data | IO18 | SD |
2.6.2、麦克风对应的程序代码:

2.6.3、功放:MAX98357:
购买麦克风硬件中标识 | ESP芯片中对应引脚 | 嘉立创PCB板中对应标识 |
BCK | IO23 | BLCK |
WS | IO22 | LRC |
data | IO25 | DIN |
2.6.4、功放对应的程序代码:

近期评论