• 【毕业设计】Stm32酒驾检查系统 - 单片机 嵌入式 物联网



    0 前言

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

    为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

    🚩 基于Stm32的酒驾检查系统设计与实现

    🥇学长这里给一个题目综合评分(每项满分5分)

    • 难度系数:3分
    • 工作量:3分
    • 创新点:3分

    🧿 选题指导, 项目分享:

    https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md


    1 简介

    基于STM32单片机酒精浓度检测报警系统。

    2 主要器件

    • STM32F103C8T6,主控芯片
    • MQ-3传感器,检测酒精浓度数据
    • 蜂鸣器
    • 案件
    • 语音播报模块
    • 风扇

    3 实现效果

    屏幕上会显示实时的酒精浓度

    整体展示
    在这里插入图片描述

    酒精浓度超标是,指示灯变化,语音播报模块播报,风扇转动,蜂鸣器报警

    在这里插入图片描述

    4 设计原理

    4.1 MQ-3酒精乙醇传感器模块

    简介

    MQ-3气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(Sn02)。当传感器所处环境中存在酒精蒸汽时,传感器的电导率随空气中酒精气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。MQ-3气体传感器对酒精的灵敏度高,可以抵抗汽油、烟雾、水蒸气的干扰。这种传感器可检测多种浓度酒精气氛,是一款适合多种应用的低成本传感器

    实物图

    在这里插入图片描述
    MQ-3气体传感器对酒精的灵敏度高,可以抵抗汽油、烟雾、水蒸气的干扰。这种传感器可检测多种浓度酒精气氛,是一款适合多种应用的低成本传感器。

    该模块主要特点如下:

    • 具有信号输出指示。
    • 输出的双通道信号(模拟量输出与 TTL 输出)。
    • TTL 输出有效信号为低电平。
    • 模拟输出电压为 0~5V, 浓度高则电压高。
    • 对乙醇蒸汽拥有很高的灵敏度和不错的选择性。
    • 它具有较长的使用寿命和可靠的稳定性。
    • 快速的响应恢复特性。

    4.2 STM32F103C8T6

    简介
    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屏幕上。同时,驱动语音播报模块、风扇和蜂鸣器。

    5 部分核心代码

    /* 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 */
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    //显示提示信息
    	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);	
    		
    	}			
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    6 最后

  • 相关阅读:
    next项目部署到GitHub模板
    2022河南萌新联赛第(七)场:南阳理工学院 G - 小明不希望太简单
    最新版k8s 1.25版本安装
    HTTP 协商缓存 Last-Modified,If-Modified-Since
    Java面向对象10——内部类知识点总结
    安装SSL证书对于APP的重要意义
    电子电路设计基本概念100问(四)【学习目标:原理图、PCB、阻抗设计、电子设计基本原则、基本原器件等】
    Spring Data JPA 之 多数据源配置
    基于Go语言的网盘开发(GloudDisk)
    K8s二进制安装部署
  • 原文地址:https://blog.csdn.net/m0_71572576/article/details/126477847