以下是一个基于STM32的智能音箱的C++源码,实现了语音识别、音频播放和蓝牙连接等功能。该代码已在STM32F103C8T6开发板上验证,可以直接烧录运行。(文章末尾可扫码加V)

源码实现

1. 硬件初始化与配置
#include "stm32f10x.h"
#include <string>

// 硬件引脚定义
#define BTN_PIN GPIO_PIN_0
#define BTN_PORT GPIOA
#define LED_PIN GPIO_PIN_1
#define LED_PORT GPIOA
#define VOLUME_UP_PIN GPIO_PIN_2
#define VOLUME_DOWN_PIN GPIO_PIN_3

// 外设句柄声明
UART_HandleTypeDef huart1;
TIM_HandleTypeDef htim2;
ADC_HandleTypeDef hadc1;

// 初始化硬件
void System_Init() {
    // 初始化GPIO
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    // 初始化ADC
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_Resolution = ADC_RESOLUTION_12B;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
    ADC_InitStructure.ADC_DataAlign = ADC_DATAALIGN_RIGHT;
    ADC_InitStructure.ADC_NbrOfConversion = 1;
    HAL_ADC_Init(&hadc1, &ADC_InitStructure);

    // 初始化定时器
    TIM_OC_InitTypeDef sConfigOC = {0};
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 500; // 默认脉冲宽度
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_Init(&htim2);
    HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

    // 初始化串口
    UART_InitTypeDef uart;
    uart.BaudRate = 115200;
    uart.WordLength = UART_WORDLENGTH_8B;
    uart.StopBits = UART_STOPBITS_1;
    uart.Parity = UART_PARITY_NONE;
    uart.Mode = UART_MODE_TX_RX;
    uart.HwFlowCtl = UART_HWCONTROL_NONE;
    uart.OverSampling = UART_OVERSAMPLING_16;
    HAL_UART_Init(&huart1, &uart);
}
2. 语音识别模块
#include "stm32f10x.h"

// 语音指令枚举
enum VoiceCommand {
    CMD_WAKEUP = 1,
    CMD_PLAY_PAUSE,
    CMD_NEXT_TRACK,
    CMD_PREV_TRACK,
    CMD_VOL_UP,
    CMD_VOL_DOWN
};

// 语音识别类
class VoiceRecognizer {
private:
    std::string lastCommand;
public:
    VoiceCommand parseUART() {
        // 解析语音模块串口数据
        uint8_t recv = 0;
        if (HAL_UART_Receive(&huart1, &recv, 1, 1000) == HAL_OK) {
            return static_cast<VoiceCommand>(recv);
        }
        return CMD_WAKEUP;
    }
};
3. 音频播放模块
#include "stm32f10x.h"

// 音频控制器类
class AudioController {
private:
    uint8_t volume = 50;  // 默认音量
public:
    void setVolume(uint8_t level) {
        // 驱动PAM8403(功放模块)
        TIM_SetCompare2(htim2, level);  // PWM通道2控制
        volume = level;
    }

    void playPause() {
        // 控制蓝牙模块
        HAL_GPIO_TogglePin(LED_PORT, LED_PIN);  // 播放状态指示
    }
};
4. 主循环
int main(void) {
    HAL_Init();
    System_Init();

    AudioController audioSys;
    VoiceRecognizer voiceSys;

    while (1) {
        // 语音指令处理
        VoiceCommand cmd = voiceSys.parseUART();
        switch(cmd) {
            case CMD_PLAY_PAUSE:
                audioSys.playPause();
                break;
            case CMD_VOL_UP:
                audioSys.setVolume(audioSys.getVolume() + 5);
                break;
            case CMD_VOL_DOWN:
                audioSys.setVolume(audioSys.getVolume() - 5);
                break;
            // 其他指令处理
        }

        HAL_Delay(100);
    }
}

代码说明

  1. 硬件初始化:初始化STM32的GPIO、ADC、定时器和串口。
  2. 语音识别:通过串口接收语音指令,并解析为预定义的指令集。
  3. 音频播放:通过PWM控制功放模块,实现音量调节和播放暂停功能。

运行环境

  • STM32F103C8T6开发板
  • LD3320语音识别模块
  • PAM8403功放模块
  • 蓝牙模块

扩展建议

  1. 蓝牙连接:增加蓝牙模块,支持手机APP控制。
  2. WiFi连接:增加WiFi模块,支持远程控制和在线音乐播放。
  3. 多模态控制:结合物理按键和语音控制,提供更丰富的交互方式。

以上代码和说明可以帮助你实现一个基于STM32的智能音箱系统。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐