ESP32和inmp441实现录音和播放

本文介绍了如何使用ESP32最小板实现录音和播放功能,并通过MQTT协议将数据发送至服务器,支持远程控制。模块化设计使其适用于各种小型设备,同时展示了WiFi连接和I2S音频处理的详细步骤。
摘要由CSDN通过智能技术生成

使用 ESP32 最小板实现录音和播放功能,该方案设计为模块化,能够集成到任何小型设备中。通过 MQTT 协议将录音数据发送到服务器,并支持在手机和电脑上进行录音和播放。
在这里插入图片描述

#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <driver/i2s.h>

// WiFi和MQTT服务器详情
const char* ssid = "your_SSID";            // WiFi名称
const char* password = "your_PASSWORD";    // WiFi密码
const char* mqtt_server = "your_MQTT_SERVER"; // MQTT服务器地址
const char* mqtt_topic = "audio/data";     // MQTT主题

// MQTT客户端设置
WiFiClient espClient;
PubSubClient client(espClient);

// 音频缓冲区大小
const size_t bufferSize = 1024;
uint8_t buffer[bufferSize];

// 函数原型
void setup_wifi();
void connect();
void mqttCallback(char* topic, byte* payload, unsigned int length);
void i2s_init();
size_t i2s_read(uint8_t* data, size_t size);

void setup() {
    Serial.begin(115200);
    // 连接WiFi
    setup_wifi();
    // 设置MQTT客户端
    client.setServer(mqtt_server, 9983);
    client.setCallback(mqttCallback);
    // 初始化I2S以进行音频处理
    i2s_init();
}

void loop() {
    // 如果需要,重新连接MQTT
    if (!client.connected()) {
        connect();
    }
    client.loop();
    // 记录并发送音频数据
    size_t bytesRead = i2s_read(buffer, bufferSize);
    if (bytesRead > 0) {
    	//把录音数据发送到mqtt服务器
        client.publish(mqtt_topic, buffer, bytesRead);
    }
}

void setup_wifi() {
    delay(10);
    Serial.println();
    Serial.print("正在连接到WIFI ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(600);
        Serial.print("-");
    }
    Serial.println("WiFi 已连接");
    Serial.println("IP 地址: ");
    Serial.println(WiFi.localIP());
}

void connect() {
    while (!client.connected()) {
        Serial.print("尝试MQTT连接...");
        if (client.connect("ESP32Client")) {
            Serial.println("已连接");
            client.subscribe(mqtt_topic);
        } else {
            Serial.print("连接失败, 错误代码=");
            Serial.print(client.state());
            Serial.println(" 5秒后重试");
            delay(5000);
        }
    }
}

void mqttCallback(char* topic, byte* payload, unsigned int length) {
    // 处理收到的MQTT消息 可扩展开发,收到不同指令执行相应动作*** 设置休眠,执行命令等
    Serial.print("消息到达 [");
    Serial.print(topic);
    Serial.print("] ");
    for (unsigned int i = 0; i < length; i++) {
        Serial.print((char)payload[i]);
    }
    Serial.println();
}

void i2s_init() {
    // 配置I2S
    i2s_config_t i2s_config = {
        .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_RX),
        .sample_rate = 16000,
        .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
        .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 = 1024,
        .use_apll = false
    };
    i2s_pin_config_t pin_config = {
        .bck_io_num = 26,
        .ws_io_num = 25,
        .data_out_num = I2S_PIN_NO_CHANGE,
        .data_in_num = 22
    };
    i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
    i2s_set_pin(I2S_NUM_0, &pin_config);
}

size_t i2s_read(uint8_t* data, size_t size) {
    size_t bytesRead;
    i2s_read(I2S_NUM_0, data, size, &bytesRead, portMAX_DELAY);
    return bytesRead;
}

更详细到我仓库查看演示视频: 添加链接描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶Summer℡ 念~

你的鼓励是我最大的创作力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值