STM32入门必看 简单几步用cubeMX模拟声控灯

一、为什么叫模拟声控灯?

生活中我们可以在很多场所看见声控灯,那么声控灯的原理究竟是什么呢?
了解其原理后,我们自己也可以动手做一个声控灯。本文我将用声音传感模块和单片机(STM32F103)来模拟我们常见的声控灯的工作过程。

二、操作步骤

1.声音传感模块

我使用的是高感度麦克风传感器模块,淘宝链接 点击这里

在这里插入图片描述

2.硬件连接

传感器共有四个IO口,分别为两个电源口,两个输出口
AO:模拟量输出,实时输出麦克风的电压信号
DO:当声音强度到达某个阈值时,输出高低电平信号[阈值灵敏度可以通过电位器调节]。
我们不需要太高精度的声音检测,只需要检测声音强度够大就可以实现声控灯的效果,所以我们只需要一个DO口就可以。所以DO口要连接单片机上的读入引脚,这里我使用的是PC0

传感器单片机
GGND
+VCC5
DOC0
AO什么都不用连

硬件连接图如下
在这里插入图片描述

3.在cubeMX中配置

(1)使用cubeMX新建一个工程
在这里插入图片描述
(2)根据使用的单片机选择芯片,我使用的是STM32F103mini开发板,它的芯片是STM32F103RCTx
在这里插入图片描述
(3)配置时钟
在这里插入图片描述
在这里插入图片描述
(4)我们还需要一个PC0输入引脚和一个输出引脚,输出引脚来控制LED灯模拟我们需要控制的灯,查板子原理图可以知道单片机上的LED0连接的引脚是PA8,所以要把PC0设置为读入引脚,PA8设置为输出引脚
在这里插入图片描述
在这里插入图片描述
(5)其他保持默认,保存工程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里勾选方便后面代码编写调试
在这里插入图片描述
(6)生成代码
在这里插入图片描述

4.主函数

当有声音时,传感器的DO口输出高电平,也就是代码中的1,其他时候为0,所以只需要判断PC0读入的是高还是低电平,就可以知道什么时候灯该亮
代码如下(示例):

/* USER CODE BEGIN 0 */
int a=0;//定义一个变量
/* USER CODE END 0 */
while (1)
 {
   /* USER CODE END WHILE */

   /* USER CODE BEGIN 3 */
	a = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_0);//将a赋值为对应的高低电平,也就是0或者1
	if(a==1)//如果为高电平,也就是有声音
	{
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);//灯亮
		HAL_Delay(2000);//延时一段时间让灯亮
	}
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);//没有声音后灯灭			
 }
 /* USER CODE END 3 */

三、效果展示

没有声音时,单片机上的红灯保持熄灭,当手拍桌子时有声音,单片机上的红灯亮起

基于STM32和声音传感器的声控灯


基于STC15W4K32S4这种单片机设计麦克风传感器模块的代码会涉及到硬件连接、中断管理以及数据采集和处理部分。由于STC15系列单片机的IO口并不直接支持ADC(模数转换器),你需要外部ADC芯片来转换音频信号。这里是一个简化版的示例: 首先,硬件上: 1. 将灵敏麦克风连接到单片机的P0口或P2口,通常是模拟输入。 2. 连接ADC芯片,如INA128或MAX4466,其数据线接到STC15的指定GPIO口。 然后,简单的代码片段可能如下: ```c #include "stm8s.h" // 使用STC15的头文件 // 定义ADC配置结构体和中断服务函数 typedef struct ADCConf { uint16_t channel; uint16_t prescaler; } ADCConf; void ADC_IRQHandler(void) { // 在这里处理ADC中断,获取并保存音频样本 ADC_Read(&adcConfig); } void setup_ADC(ADCConf adcConfig) { // 初始化ADC,设置通道、采样率等参数 ADC_Init(adcConfig.channel, adcConfig.prescaler); EnableGlobalInterrupt(); // 开启全局中断 ADC_ITConfig(ADC_IT_conv完成, ENABLE); // 开启转换完成中断 ADC_Cmd(ENABLE); // 启动ADC转换 } uint16_t ADC_Read(ADCConf *adcConfig) { // 等待转换完成,然后读取结果 while (!ADC_GetFlagStatus(ADC_FLAG_EOC)) {} return ADC_GetConversionValue(); } int main(void) { ADCConf adcConfig = {ADC_CHANNEL microphonePin, ADC_PRESCALER_128}; // 根据实际情况配置 setup_ADC(adcConfig); // 循环读取并处理音频样本 while (1) { uint16_t sample = ADC_Read(&adcConfig); // 对音频数据做进一步处理,例如A/D转换,滤波等 process_audio_sample(sample); } } ``` 注意这只是一个基础框架,实际应用中还需要考虑噪声抑制、信号放大(如果有需要)、以及如何将数字信号转化为有用的音频信息。具体的代码会依赖于你的ADC芯片的具体文档和库。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值