0 前言
? 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
? 基于stm32单片机的酒精浓度酒驾检测系统
?学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:2分
1 简介
为了控制酒后驾车,本项目基于STM32平台设计了一套酒后驾车监测系统。
2 主要器件
-
STM32系统板
-
酒精检测传感器
-
LCD显示屏
-
供电模块
-
SIM800C模块
-
蜂鸣器模块
3 实现效果
主要功能
采用酒精传感器采集数据进行分析,发现酒精超标,会通过GPRS模块向指定的手机号码发送提醒短信LCD显示屏可实时显示检测的酒精含量,超标后,本地蜂鸣器也会发出警报,提醒驾驶员。
4 硬件设计
MQ-3酒精乙醇传感器模块
简介
MQ-3气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(Sn02)。当传感器所处环境中存在酒精蒸汽时,传感器的电导率随空气中酒精气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。MQ-3气体传感器对酒精的灵敏度高,可以抵抗汽油、烟雾、水蒸气的干扰。这种传感器可检测多种浓度酒精气氛,是一款适合多种应用的低成本传感器
实物图
MQ-3气体传感器对酒精的灵敏度高,可以抵抗汽油、烟雾、水蒸气的干扰。这种传感器可检测多种浓度酒精气氛,是一款适合多种应用的低成本传感器。
该模块主要特点如下:
- 具有信号输出指示。
- 输出的双通道信号(模拟量输出与 TTL 输出)。
- TTL 输出有效信号为低电平。
- 模拟输出电压为 0~5V, 浓度高则电压高。
- 对乙醇蒸汽拥有很高的灵敏度和不错的选择性。
- 它具有较长的使用寿命和可靠的稳定性。
- 快速的响应恢复特性。
SIM800C模块
SIM800C模块是一款高性能高性价比工业级的GSM/GPRS模块。本模块采用SIMCOM公司的工业级四频850/900/ 1800/1900MHz SM800芯片,可以低功耗实现语音、SMS、数据和传真信息的传输。
模块特点:
1、支持极限DC5V-18V宽电压输入
2、有电源使能开关引脚EN
3、支持锂电池供电接口VBAT3.5-4.5V
4、输入支持移动和联通手机卡Micro SIM卡
5、送51/STM32/ARDUINO驱动例程
5 软件说明
系统框图
系统原理图
6 部分核心代码
/* 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
评论记录:
回复评论: