【已验证】STM32采集声音传感器实现环境声实时监测

1. 引言

声音传感器模块这玩意一般在什么环境检测类的课设毕设用的比较多,什么工地环境检测,声控灯、噪音监测、安防报警等场景。

本文将详细介绍硬件连接、STM32CubeMX配置以及完整的HAL库驱动代码,最终通过串口打印实时噪声值(ADC原始值、电压值、声音强度等级)。

2. 硬件准备

  • STM32F103C8T6开发板(核心板或最小系统板均可)

  • 高感度声音传感器模块(带AO模拟输出引脚)

  • USB转TTL模块(用于串口打印调试)

  • 杜邦线若干

声音传感器模块引脚说明

引脚 功能
VCC 3.3V/5V电源(本文使用3.3V)
GND
AO 模拟信号输出(接STM32 ADC)
DO 数字信号输出(本文未使用)

3. 硬件连接

传感器引脚 STM32引脚
VCC 3.3V
GND GND
AO PA3 (ADC1通道3)
DO 未使用

将USB转TTL模块的TX、RX分别连接STM32的PA9(TX)、PA10(RX),用于串口输出。

4. STM32CubeMX配置

4.1 时钟配置

  • HSE:外部晶振8MHz

  • 系统时钟:72MHz

  • APB2外设时钟:72MHz

4.2 ADC1配置

  • 开启ADC1,选择IN3(对应PA3)

  • 模式:独立模式,单次转换,软件触发

  • 采样时间:55.5周期(保证稳定读数)

  • ADC分辨率:12位

4.3 USART1配置

  • 模式:异步

  • 波特率:115200

  • 数据位:8位

  • 停止位:1位

  • 无校验

4.4 生成代码

选择HAL库,生成MDK-ARM工程。

5. 代码实现

5.1 关键代码 (main.c)

复制代码
/* 根据ADC值判断噪声等级 */
void Display_Noise_Level(uint16_t adc_val)
{
    float voltage = adc_val * 3.3f / 4095.0f;
    
    if (adc_val < 800) {
        sprintf(msg_buffer, "Noise Level: ADC=%d, Voltage=%.2fV, Level=Quiet\r\n", adc_val, voltage);
    }
    else if (adc_val < 1600) {
        sprintf(msg_buffer, "Noise Level: ADC=%d, Voltage=%.2fV, Level=Normal\r\n", adc_val, voltage);
    }
    else if (adc_val < 2400) {
        sprintf(msg_buffer, "Noise Level: ADC=%d, Voltage=%.2fV, Level=Loud\r\n", adc_val, voltage);
    }
    else if (adc_val < 3200) {
        sprintf(msg_buffer, "Noise Level: ADC=%d, Voltage=%.2fV, Level=Very Loud\r\n", adc_val, voltage);
    }
    else {
        sprintf(msg_buffer, "Noise Level: ADC=%d, Voltage=%.2fV, Level=!DANGER!\r\n", adc_val, voltage);
    }
    printf("%s", msg_buffer);
}

int main(void)
{
    HAL_ADC_Start(&hadc1);
    
    printf("\r\nNoise Sensor Test Start!\r\n");
    printf("Sampling every 500ms...\r\n\r\n");
    
    while (1)
    {
        if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)
        {
            adc_value = HAL_ADC_GetValue(&hadc1);
            Display_Noise_Level(adc_value);
        }
        HAL_Delay(500);
    }
}

5.2 代码说明

  • ADC读取 :使用HAL_ADC_PollForConversion等待转换完成,然后读取12位采样值。

  • 电压换算:参考电压3.3V,分辨率4096,公式:电压 = 采样值 × 3.3 / 4095。

  • 噪声分级:根据ADC值将声音分为"安静""正常""响亮""非常响亮""危险"五个等级,阈值可根据实际环境调整。

  • 串口输出 :重定向printf到USART1,每500ms输出一次噪声数据。

6. 测试结果

将程序下载到开发板后,打开串口助手(115200-8-1-N),这里我放了一首歌,可以看到如下输出:

这一章节比较简单,就不放代码了,主要还是一个ADC转换

相关推荐
csdn杰哥2 小时前
瑞萨单片机AI教程【六】导入外部电机状态数据训练模型
人工智能·单片机·嵌入式硬件·瑞萨·ra6m5
深念Y2 小时前
ZTE_UZ901_NVRAM经验总结
linux·服务器·网络·嵌入式硬件·嵌入式·随身wifi
远翔调光芯片^138287988723 小时前
高效驱动!FP7153赋能3A大电流手电筒,单节锂电 / 5V 供电也能迸发强劲照明力
科技·单片机·嵌入式硬件·智能家居·能源
wuyk5553 小时前
89.嵌入式内存管理的“稳定利器”:内存池原理与C语言实现
c语言·开发语言·stm32·单片机·嵌入式硬件
芯片设计-曾工3 小时前
远乐YL1628 SSOP28驱动芯片详解
驱动开发·单片机·51单片机·硬件工程
芸翳&Camellia3 小时前
2026年电赛H题钢珠识别——基于深度学习的视觉目标检测与实时速度估计系统技术分析
嵌入式硬件·深度学习·目标检测·电赛
ACP广源盛139246256734 小时前
2026 PCIe互连芯片@ACP#国产替代格局解析:芯动科技领跑高端交换芯片赛道
大数据·网络·数据库·人工智能·分布式·嵌入式硬件
碧海银沙音频科技研究院4 小时前
8基于BES2700IHC数字助听器系统开发
嵌入式硬件·算法
Run_Teenage4 小时前
嵌入式:深刻理解GPIO的通用/复用推挽输出、开漏输出
单片机·嵌入式硬件
zcmodeltech5 小时前
智慧城市沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的园区-城市-数字孪生联动方案
服务器·数据库·人工智能·stm32·嵌入式硬件·信息可视化·智慧城市