🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 基于Stm32的酒驾检查系统设计与实现
🥇学长这里给一个题目综合评分(每项满分5分)
🧿 选题指导, 项目分享:
基于STM32单片机酒精浓度检测报警系统。
屏幕上会显示实时的酒精浓度
整体展示
酒精浓度超标是,指示灯变化,语音播报模块播报,风扇转动,蜂鸣器报警
简介
MQ-3气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(Sn02)。当传感器所处环境中存在酒精蒸汽时,传感器的电导率随空气中酒精气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。MQ-3气体传感器对酒精的灵敏度高,可以抵抗汽油、烟雾、水蒸气的干扰。这种传感器可检测多种浓度酒精气氛,是一款适合多种应用的低成本传感器
实物图
MQ-3气体传感器对酒精的灵敏度高,可以抵抗汽油、烟雾、水蒸气的干扰。这种传感器可检测多种浓度酒精气氛,是一款适合多种应用的低成本传感器。
该模块主要特点如下:
简介
STM32F103C8T6是一款基于ARM Cortex-M3内核(ARM公司在ARM11以后改用Cortex命名,并分成A、R和M三类,M系列有M0、M0+、M3、M4、M7)的32位的微控制器,采用LQFP48封装,由意法半导体公司(ST)推出,属于STM32系列(ST公司还有SPC5X系列微控制器)。其程序存储器FLASH容量是64KB (64K x 8bit),RAM容量是20KB(20K x 8bit),2个12bit ADC合计12路通道(外部通道只有PA0到PA7、PB0到PB1,并不是18通道),37个通用I/O口(PA0-PA15、PB0-PB15、PC13-PC15、PD0-PD1),4个16bit定时器(TIM1(高级控制定时器,带死区插入,常用于产生PWM控制电机)、TIM2、TIM3、TIM4),2IIC,2SPI,3USART,1CAN,工作电压2V~3.6V,工作温度为-40°C ~ 85°C,系统时钟最高可到72MHz(一般是由8MHz的外部时钟经锁相环9倍频到72MHz)。
相关引脚分布
本项目中STM32主要通过ADC采集MQ-3模块的值转换为酒精浓度值显示在LCD屏幕上。同时,驱动语音播报模块、风扇和蜂鸣器。
/* USER CODE BEGIN PV */
uint32_t adc_value=0;
uint32_t Alcohol=0;
uint8_t a=1;
/* USER CODE END PV */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_ADC_Start_DMA(&hadc1,&adc_value,1);
Alcohol=((float)adc_value*3.3/4096*0.36-1.08)*10000;//电压数据转换(此处由于还未找到相关公式,暂时这样代替,如有了解的大佬可以在评论区补充一下)
printf("Alcohol=%d\r\n",Alcohol);
HAL_Delay(1000);
}
/* USER CODE END 3 */
}
//中断回调函数,当有酒精时,DO口电平由高电平边低电平,PA4触发外部中断,进入中断函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if(GPIO_Pin==Alcohol_DO_Pin){
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,1);
}
//设置一个按键中断,为了把酒精触发的LED点亮之后熄灭(实际项目中可改为关闭蜂鸣器等)
if(GPIO_Pin==KEY1_Pin){
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,0);
}
}
/* USER CODE END 4 */
//显示提示信息
POINT_COLOR=BLACK;//设置字体为蓝色
LCD_ShowString(10,100,136,16,16,"Alcohol: . mg/L");
LCD_ShowString(10,120,120,16,16,"Threshol1: . ");
LCD_ShowString(10,140,120,16,16,"Threshol2:0.500");
while(1)
{
adcx=Get_Adc_Average(ADC_Channel_1,10);
//LCD_ShowxNum(156,130,adcx,4,16,0);//显示ADC的值
temp=((float)adcx*(5.0/4096))*0.36-1.08;
printf("value:%f",temp);
t=KEY_Scan(0); //得到键值
if(t==KEY0_PRES)
{
threshol1+=0.01;
}else if(t==KEY1_PRES)
{
threshol1-=0.01;
}
threshol_1=threshol1;
LCD_ShowxNum(90,120,threshol_1,1,16,0);//显示浓度值
threshol_2=(threshol1-threshol_1)*1000;
LCD_ShowxNum(106,120,threshol_2,3,16,0);
if(temp > threshol1 && temp < threshol2) //如果浓度大于阈值
{
PB9=0; //开启蜂鸣器
delay_ms(1000);
delay_ms(1000);
PB9=1; //蜂鸣器关闭
delay_ms(1000);
LCD_Fill(70,200,170,300,RED);
}else if(temp > threshol2){ //急促
PB9=0; //开启蜂鸣器
delay_ms(300);
PB9=1; //蜂鸣器关闭
delay_ms(50);
LCD_Fill(70,200,170,300,BROWN);
}else
{
PB9=1; //蜂鸣器关闭
LCD_Fill(70,200,170,300,GREEN);
}
adcx=temp;
LCD_ShowxNum(74,100,adcx,1,16,0);//显示浓度值
temp-=adcx;
temp*=1000;
LCD_ShowxNum(90,100,temp,3,16,0);
LED0=!LED0;
delay_ms(250);
}