接下来我们在上一节的基础上增加一个蜂鸣器,当按下开机按钮时蜂鸣器滴响一声,关机时蜂鸣器滴滴滴响三声,并且通过ADC方式读取一下电压值。于此同时,我们发现线路变的越来越复杂了,线再怎么改,原理图都显得比较杂乱,因此我们需要调整一下原理图,通过Proteus的标签功能整理一下原理图,让它显得整洁一些。
蜂鸣器:https://zh.wikipedia.org/zh-cn/%E8%9C%82%E9%B3%B4%E5%99%A8
https://blog.csdn.net/m0_69455439/article/details/124932955?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-124932955-blog-92814535.235v39pc_relevant_3m_sort_dl_base3&spm=1001.2101.3001.4242.1&utm_relevant_index=3
https://blog.51cto.com/u_15909288/5928372
ADC:https://zh.wikipedia.org/zh-cn/%E9%A1%9E%E6%AF%94%E6%95%B8%E4%BD%8D%E8%BD%89%E6%8F%9B%E5%99%A8
https://blog.csdn.net/qq_50652615/article/details/123644039
https://blog.csdn.net/qq_41873311/article/details/119078754
Proteus标签相关:
https://www.labcenter.com/downloads/
https://labcenter.s3.amazonaws.com/downloads/vsmTutorialSpanish89.pdf
http://www.51hei.com/bbs/dpj-111690-1.html
https://blog.csdn.net/haigear/article/details/121029243
PA11引脚会接蜂鸣器三极管及电阻,蜂鸣器使用有源蜂鸣器(有源蜂鸣器控制较简单,一般的场景够用了),因此PA11默认拉高,当按下开关后设置对应IO拉低使蜂鸣器响一段时间再拉高就会让蜂鸣器发出’滴‘的一声;
打开ADC1,我这里使用IN8,对应PB0,配置使用默认配置即可:
之后生成代码即可。
按键、日志等代码不变,不清楚的可以看上一节,这节新增加的内容就是在pwr.c中增加控制蜂鸣器和adc读取电压即可。
#include "pwr.h"
#include "log.h"
#include "gpio.h"
#include "adc.h"
void TurnOnLED(int flag) {
switch (flag) {
case 1:
HAL_GPIO_WritePin(GPIOA, LED_1_Pin, GPIO_PIN_RESET);
break;
case 2:
HAL_GPIO_WritePin(GPIOA, LED_2_Pin, GPIO_PIN_RESET);
break;
case 3:
HAL_GPIO_WritePin(GPIOA, LED_3_Pin, GPIO_PIN_RESET);
break;
case 4:
HAL_GPIO_WritePin(GPIOA, LED_4_Pin, GPIO_PIN_RESET);
break;
case 5:
HAL_GPIO_WritePin(GPIOA, LED_5_Pin, GPIO_PIN_RESET);
break;
}
}
void TurnOffLED(int flag) {
switch (flag) {
case 1 :
HAL_GPIO_WritePin(GPIOA, LED_1_Pin, GPIO_PIN_SET);
break;
case 2 :
HAL_GPIO_WritePin(GPIOA, LED_2_Pin, GPIO_PIN_SET);
break;
case 3 :
HAL_GPIO_WritePin(GPIOA, LED_3_Pin, GPIO_PIN_SET);
break;
case 4 :
HAL_GPIO_WritePin(GPIOA, LED_4_Pin, GPIO_PIN_SET);
break;
case 5 :
HAL_GPIO_WritePin(GPIOA, LED_5_Pin, GPIO_PIN_SET);
break;
}
}
void ADC_TO_VOL() {
HAL_ADC_Start(&hadc1);
int ADC_Value;
if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {
ADC_Value = HAL_ADC_GetValue(&hadc1);
}
LOG(LOG_DEBUG, "ADC Sample value:%d,voltage value:%.4fV", ADC_Value, ADC_Value * 3.3f / 4096);
}
void PWROn(void) {
LOG(LOG_DEBUG, "set buzzer one");
HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_RESET);
HAL_Delay(200);
HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);
LOG(LOG_DEBUG, "PWROn LED blink...");
for (int i = 1; i < 6; i++) {
HAL_Delay(100);
TurnOnLED(i);
}
LOG(LOG_DEBUG, "read volume...");
ADC_TO_VOL();
}
void PWROff(void) {
LOG(LOG_DEBUG, "PWROn LED off...");
for (int i = 1; i < 6; i++) {
HAL_Delay(100);
TurnOffLED(i);
}
LOG(LOG_DEBUG, "set buzzer three");
for (int i = 0; i < 3; i++) {
HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_RESET);
HAL_Delay(200);
HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);
HAL_Delay(200);
}
LOG(LOG_DEBUG, "read volume...");
ADC_TO_VOL();
}
#ifndef __PWR_H
#define __PWR_H
#include "main.h"
void PWROn(void);
void PWROff(void);
#endif
除了之前的按钮、LED-RED、COMPIM、虚拟终端外,这节新增三极管PNP、蜂鸣器BUZZER、滑动电阻POT-HG(调整精度为1%):
于此同时,我们发现线路变的越来越复杂了,线再怎么改,原理图都显得比较杂乱,因此我们需要调整一下原理图,查了一下发现通过Proteus的标签功能就可以很方便的实现原理图美化,通过标签可以减少接线,将本身要接线的位置通过标签关联起来,操作也很简单,引入一段线后选中这段线然后右键选择添加网络标号即可:
比如我这里给要连接button按钮的线添加了标号BUTTON,然后在另一个位置放入按钮,按钮右侧连线的部分也添加线并添加网络标号,这个标号也设置为BUTTON就相当于这两端引脚接到一起了,相当于通过标签把这两端关联起来了,不需要像原来那样实线连接起来了。
其它的接口都这么去设置一下,最终布局如下,看起来没有那么多线,要整洁很多:
滑动变阻器和一般的电阻接入比较相似,只不过滑动部分加入stm32的IO口即可,其余两端一段接电源,一端接地。
蜂鸣器器件一般都是一个统一的模块,和三极管是结合起来的,这块具体三极管驱动蜂鸣器发出声音的原理不做深入说明,感兴趣的可以去了解一下,我们暂时记住这么去配置给IO口拉低就可以让蜂鸣器发出声音,有源直流蜂鸣器需要的电压为3.3-5v,涉及到压电效应等很多东西,简单讲也讲不明白。
因此,还需要双击蜂鸣器后配置电压为3.3-5V,否则接线正常,拉低IO口也还是可能不响。
然后和之前一样双击单片机导入编译好的hex文件,然后运行仿真即可,可以发现按下按键后日志打印出来了,LED灯亮灭变化,电脑也会发出”滴“的声音,滑动滑动变阻器后电压的打印值也会发生变化:
接下来学习一下I2C总线,利用其控制一下显示屏,就可以做一些带屏的项目了。