资讯详情

基于STM32设计的酒驾报警系统

1. 前言

随着社会的发展和人们生活水平的提高,汽车已成为人们旅行的主要交通工具。与此同时,酒后驾驶造成的事故越来越多,对人们的生命安全构成了威胁。为了控制酒后驾驶,本文设计了一个可安装在车辆驾驶室的酒后驾驶监控系统。

采用系统主控芯片STM32.用酒精传感器收集数据进行分析。如果发现酒精超标,将通过GPRS模块向指定的手机号码发送提醒短信;系统还带来了一个LCD可实时显示检测到的酒精含量。酒精超标后,当地蜂鸣器也会发出警报,提醒司机。

酒后驾驶测量标准如下:

(1)饮酒驾驶是指车辆驾驶员血液中酒精含量大于或等于20mg/100ml,小于80mg/100ml驾驶行为。(2)酒后驾驶是指车辆驾驶员血液中酒精含量大于或等于80mg/100ml驾驶行为。

(1)STM32系统板

(2)酒精检测传感器

(3)LCD显示屏

(4)供电模块

(5)SIM800C模块

(6)蜂鸣器模块

image-20220416132842388

喝几口来测试效果。

2. 硬件选型

2.1 STM32系统板

主控CPU采用STM32F103RCT6.这个芯片包括48 KB SRAM、256 KB Flash、2个基本定时器,4个通用定时器,2个高级定时器,51个通用定时器IO五串口,两串口DMA控制器、3个SPI、2个I2C、1个USB、1个CAN、3个12位ADC、1个12位DAC、1个SDIO接口,芯片容量大,配置高,整体符合硬件选型设计。目前选择的开发板有一个1.4寸的TFT-LCD可显示当前传感器数据和一些运行状态信息的彩屏。

2.2 酒精检测传感器

MQ-3 二氧化锡(SnO 2 )作为一种气敏材料, 当传感器处于酒精蒸汽环境中时, 随着空气中酒精气体浓度的增加,传感器的电导率会增加,电导率的变化可以通过简单的电路转化为与气体浓度相对应的信号。

(1)有信号输出指示。 (2)双通道信号(模拟量输出和 TTL 输出)。 (3)TTL 低电平输出有效信号。 (4)模拟输出电压为 0~5V, 高浓度电压高。 (5)对乙醇蒸汽灵敏度高,选择性好。 (6)使用寿命长,稳定性可靠。 (7)快速响应恢复特性。

2.3 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驱动例程

2.电源开始默认使用能量引脚

6.数据终端准备

7.内核音频输出引脚

8.内核音频输出引脚

9、锂电池输入引脚,DC 3.5 - 4.5V

10、电源地

13、RTC外部电池引脚

14内核振铃提示引脚

15内合音频输入引脚

16内核音频输入引脚

建议使用V_IN单独供电DC5-18V输入(推荐9V),或者VBAT锂电池的供电方式是最稳定的。如果只是简单的调试,也可以使用USB-TTL或开发板5V直接向模块供电。但是,一般计算机或开发板的功率有限,可能不稳定。请根据具体情况选择合适的电源。

模块本身支持自适应波特率,可以根据发送过去的指令自动计算相应的波特率,一般使用115200。

(1)供电电压5V也可以,用电脑USB电源(直接插电脑USB口)。正常供电后,模块上有电源指示灯。

(2)SIM800C的TX脚接单片机RX脚

(3)SIM800C的RX脚接单片机TX脚

(4)SIM800C的第11个引脚(PWK)和12个引脚(GND)短接在一起,才能开机。

电源正常后,右上角有黄色电源灯。

通过串口发送AT指示过去测试模块效果。

2.4 蜂鸣器模块

2.5 杜邦线(2排)

2.6 PCB板(2块)

3. STM32代码实现

酒精浓度传感器的预热时间为20秒~一分钟左右,这段时间后收集的数据会稳定。预热模块会发热烫手是正常的。

https://download.csdn.net/download/xiaolong1126626497/85896114

视频演示地址:

基于STM32设计的酒后驾驶报警系统

3.1 系统框图

3.2 系统原理图

3.3 keil工程布局

3.4 程序下载

软件包目录下载软件。

点击开始编程后,点击板上的复位键下载程序,如果失败,再试几次。正常效果如下。

3.5 字体取模

3.6 硬件连线

硬件连接方式: 1. TFT 1.44 寸彩屏接线 GND   电源地 VCC   接5V或3.3v电源 SCL   接PC8(SCL) SDA   接PC9(SDA) RST   接PC10 DC    接PB7 CS    接PB8 BL   接PB11  2. 蜂鸣器 VCC--->3.3V DAT--->PA6
GND--->GND

3. 酒精检测传感器MQ3
VCC--->3.3V
GND--->GND
DAT--->PA1

4. 板载LED灯接线
LED1---PA8
LED2---PD2

5. 板载按键接线
K0---PA0 
K1---PC5 
K2---PA15

6. SIM800C--GSM模块
GND----GND
VCC--->3.3V
PA2----SIM800C_RXD
PA3----SIM800C_TXD

3.7 main.c代码

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include "oled.h"
#include "adc.h"
#include <string.h>
#include <stdlib.h>
#include "font.h"
#include "sim800c.h"

/* 硬件连接方式: 1. TFT 1.44 寸彩屏接线 GND 电源地 VCC 接5V或3.3v电源 SCL 接PC8(SCL) SDA 接PC9(SDA) RST 接PC10 DC 接PB7 CS 接PB8 BL 接PB11 2. 蜂鸣器 VCC--->3.3V DAT--->PA6 GND--->GND 3. 酒精检测传感器MQ3 VCC--->3.3V GND--->GND DAT--->PA1 4. 板载LED灯接线 LED1---PA8 LED2---PD2 5. 板载按键接线 K0---PA0 K1---PC5 K2---PA15 6. SIM800C--GSM模块 GND----GND VCC--->3.3V PA2----SIM800C_RXD PA3----SIM800C_TXD */

//JTAG模式设置,用于设置JTAG的模式
//mode:jtag,swd模式设置;00,全使能;01,使能SWD;10,全关闭; 
#define JTAG_SWD_DISABLE 0X02
#define SWD_ENABLE 0X01
#define JTAG_SWD_ENABLE 0X00 
void JTAG_Set(u8 mode)
{ 
        
	u32 temp;
	temp=mode;
	temp<<=25;
	RCC->APB2ENR|=1<<0;     //开启辅助时钟 
	AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
	AFIO->MAPR|=temp;       //设置jtag模式
}


u16 MQ3_data=0; //酒精浓度
float MQ3_data_float=0; //mg/l

char data_buff[100];
//酒精超标提示
u8 sim800c_buff[100]="Drunk driving reminder";

int main()
{ 
        
    u8 state=0;
    u8 key=0;
    u32 time_cnt=0;
    JTAG_Set(JTAG_SWD_DISABLE); //释放PA15
    LED_Init();  //LED灯初始化
    BEEP_Init(); //蜂鸣器初始化
    KEY_Init();  //按键初始化
    USART1_Init(115200); //串口1初始化-打印调试信息
    Lcd_Init();    //LCD初始化
    Lcd_Clear(0);  //清屏为黑色
    LCD_LED_SET;   //通过IO控制背光亮 
    AdcInit();     //ADC初始化--检测酒精传感器的值
    TIMER2_Init(72,20000);//辅助串口2接收,超时时间为20ms
    USART2_Init(115200); //可能的波特率(测试): 57600 、9600、115200
    
    //预热视频
    LCD_ShowChineseFont(0,16*3,16,HZ_FONT_16[20],RED,0);
    LCD_ShowChineseFont(16,16*3,16,HZ_FONT_16[21],RED,0);
    LCD_ShowChineseFont(16*2,16*3,16,HZ_FONT_16[22],RED,0);
    LCD_ShowChineseFont(16*3,16*3,16,HZ_FONT_16[23],RED,0);
    LCD_ShowChineseFont(16*4,16*3,16,HZ_FONT_16[24],RED,0);
    LCD_ShowChineseFont(16*5,16*3,16,HZ_FONT_16[25],RED,0);
    LCD_ShowChineseFont(16*6,16*3,16,HZ_FONT_16[26],RED,0);
    LCD_ShowChineseFont(16*7,16*3,16,HZ_FONT_16[27],RED,0);
    //delay_ms(30000); //初始化时间30秒
    delay_ms(5000); //初始化时间5秒
    Lcd_Clear(0);  //清屏为黑色
    
   //采集数据的真实数据
   LCD_ShowChineseFont(0,16*2,16,HZ_FONT_16[0],RED,0);
   LCD_ShowChineseFont(16,16*2,16,HZ_FONT_16[1],RED,0);
   LCD_ShowChineseFont(16*2,16*2,16,HZ_FONT_16[2],RED,0);
   LCD_ShowChineseFont(16*3,16*2,16,HZ_FONT_16[3],RED,0);
   
   //酒精含量计算结果
   LCD_ShowChineseFont(0,16*3,16,HZ_FONT_16[4],RED,0);
   LCD_ShowChineseFont(16,16*3,16,HZ_FONT_16[5],RED,0);
   LCD_ShowChineseFont(16*2,16*3,16,HZ_FONT_16[6],RED,0);
   LCD_ShowChineseFont(16*3,16*3,16,HZ_FONT_16[7],RED,0);

    //酒精超标显示
    Gui_DrawFont_GBK16(0,16*4,RED,0,(u8*)" ");
    LCD_ShowChineseFont(0,16*4,16,HZ_FONT_16[16],RED,0);
    LCD_ShowChineseFont(16,16*4,16,HZ_FONT_16[17],RED,0);
    LCD_ShowChineseFont(16*2,16*4,16,HZ_FONT_16[18],RED,0);
    LCD_ShowChineseFont(16*3,16*4,16,HZ_FONT_16[19],RED,0);

    //初始化SIM800C
    state=SIM800C_InitCheck();
    printf("SIM800C初始化状态:%d\r\n",state);
    DelayMs(1000);
    
    //设置文本模式
    state=SIM800C_SetNoteTextMode();
    printf("设置文本模式状态:%d\r\n",state);
    DelayMs(1000);
    
    //
    
   while(1)
   { 
        
        //按键可以手动控制开启窗帘和LED灯
        key=KEY_Scan();
        if(key)
        { 
        
            printf("key=%d\r\n",key);
        }
       
        //控制LED灯
        if(key==2)
        { 
        
            LED2=!LED2;
        }    
        
        //手动控制蜂鸣器测试
        //手动发送短信测试
        if(key==1)
        { 
        
            BEEP=1;
            delay_ms(100);
            BEEP=0;

            sprintf((char*)sim800c_buff,"Drunk driving reminder:%d",MQ3_data);
            //发送短信
            if(SIM800C_SendNote((u8*)"18171571217",sim800c_buff,strlen((char*)sim800c_buff))==0)
            printf("短信发送成功\r\n");
            else
            printf("短信发送失败\r\n");
        }
        
        //轮询时间到达
        if(time_cnt>300)
        { 
        
            time_cnt=0;
            LED1=!LED1;
            //获取空气质量
            MQ3_data=GetAdcCHxDATA(1);
            printf("采集MQ3数据:%d\r\n",MQ3_data);
          
            //LCD屏实时显示酒精浓度 
            //采集数据
            sprintf(data_buff,"%d",MQ3_data);
            Gui_DrawFont_GBK16(72,16*2,RED,0,(u8*)" ");
            Gui_DrawFont_GBK16(72,16*2,RED,0,(u8*)data_buff);
            
            //酒精含量
            //MQ3_data_float=((float)MQ3_data*(5.0/4096))*0.36-1.08;
            MQ3_data_float=((float)MQ3_data*(5.0/4096))*0.36;
            sprintf(data_buff,"%0.2f mg/L",MQ3_data_float);
            printf("计算酒精浓度:%s\r\n",data_buff);
            Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)" ");
            Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)data_buff);  
            
             //判断酒精浓度是否超标,设置阀值
            if(MQ3_data>2000)
            { 
        
                sprintf((char*)sim800c_buff," :%d",MQ3_data);
                //发送短信
                if(SIM800C_SendNote((u8*)"18171571217",sim800c_buff,strlen((char*)sim800c_buff))==0)
                printf("短信发送成功\r\n");
                else
                printf("短信发送失败\r\n");
            }
            
            //采集的值越小,表明酒精浓度越高。反之越大。
            //根据阀值显示不同的文字提示
            if(MQ3_data>2000)
            { 
        
                 //你已酒驾
                Gui_DrawFont_GBK16(0,16*4,RED,0,(u8*)" ");
                LCD_ShowChineseFont(0,16*4,16,HZ_FONT_16[8],RED,0);
                LCD_ShowChineseFont(16,16*4,16,HZ_FONT_16[9],RED,0);
                LCD_ShowChineseFont(16*2,16*4,16,HZ_FONT_16[10],RED,0);
                LCD_ShowChineseFont(16*3,16*4,16,HZ_FONT_16[11],RED,0);
            }
            //正常稳定范围采集的值是500左右
            else
            { 
        
                //安全范围
                Gui_DrawFont_GBK16(0,16*4,RED,0,(u8*)" ");
                LCD_ShowChineseFont(0,16*4,16,HZ_FONT_16[16],RED,0);
                LCD_ShowChineseFont(16,16*4,16,HZ_FONT_16[17],RED,0);
                LCD_ShowChineseFont(16*2,16*4,16,HZ_FONT_16[18],RED,0);
                LCD_ShowChineseFont(16*3,16*4,16,HZ_FONT_16[19],RED,0);
            }
        }
        
        DelayMs(10);
        time_cnt++;
	 }
}

标签: 300pa2pa传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台