0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32设计的酒后驾车监测报警系统(华为云IOT)

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2023-07-14 13:37 次阅读

1. 前言

酒后驾车是一种严重的交通违法行为,不仅危及驾驶人员自身的生命安全,还可能对其他道路使用者造成伤害甚至生命危险。为了提高道路交通安全水平,减少酒后驾车事故的发生,开发一种可靠的酒后驾车监测报警系统变得尤为重要。

传统的酒后驾车检测方法主要依赖于交警的抽血或呼气测试,这种方法存在着操作复杂、时间延迟、成本高昂等问题。为了解决这些问题,基于物联网嵌入式技术的酒后驾车监测报警系统应运而生。

当前设计一种酒后驾车监测报警系统,通过安装在驾驶室内的设备,能够准确检测酒精浓度,并在识别到酒驾行为时触发报警和通知功能。系统能将GPS数据上传到华为云物联网平台,并通过地图模块显示具体位置信息。主控芯片采用STM32单片机,GSM模块采用IM800C,系统还配备了LCD显示屏、供电模块、蜂鸣器模块和GPS模块。

功能特点:

  1. 酒精检测:系统能够准确测量驾驶人员血液中的酒精含量,并根据设定的标准判断是否酒驾或醉酒驾驶。
  2. 报警功能:当检测到酒驾行为时,系统会触发警报,通过本地蜂鸣器发出声音,提醒驾驶员。
  3. 短信通知:系统会发送短信给指定的紧急联系人,通知家人发生酒驾行为,以便他们能够及时采取行动。
  4. GPS定位:系统将获取到的GPS数据上传到华为云物联网平台,并调用地图模块显示具体位置信息,方便监督行车安全。
  5. LCD显示:系统配备了LCD显示屏,可以实时显示检测到的酒精含量,提供直观的信息展示。

硬件配置:

  1. STM32系统板:作为主控芯片,负责系统的控制和数据处理。
  2. 酒精检测传感器:用于测量驾驶人员血液中的酒精含量。
  3. LCD显示屏:提供实时的酒精含量显示和其他信息展示。
  4. 供电模块:为系统提供稳定的电源供应。
  5. SIM800C模块:用于发送短信通知给指定联系人。
  6. 蜂鸣器模块:当检测到酒驾行为时,通过发出声音进行警示。
  7. GPS模块:采用SIM800C内部的GPS功能获取GPS数据,用于定位和上传位置信息。

项目目标:
通过该酒后驾车监测报警系统,提高驾驶人员的安全意识,减少酒后驾驶行为的发生,保障交通安全。通过实时监测、报警和通知功能,有效地防止和遏制酒驾行为的发生,并提供准确的位置信息,以便相关人员能够及时采取措施。

image-20220416132842388

image-20220416142024166

image-20220416142138765

为了测试,搞了几口二锅头。

image-20220418112125021

上位机采用QT开发,调用华为云的应用侧接口获取设备上传的数据。再调用百度接口,获取GPS定位的位置。

image-20220418111126481

2. 登录华为云创建云端设备

2.1 创建产品

华为运官网: https://www.huaweicloud.com/

在这里可以查看接入的协议的端口号和地址。

MQTT (1883) a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com

我们设备接入的协议选择MQTT,端口对应是1883

接下来继续创建产品,点击产品页面,点击右上角创建产品:

image-20220418105309516

image-20220418105322907

2.2 创建设备

image-20220418105431921

image-20220418105452823

这是我的设备信息:

设备ID
 625cd29cecf9c41c38215ba5_1126626497
 ​
 设备密钥
 1126626497
     
 {
     "device_id": "625cd29cecf9c41c38215ba5_1126626497",
     "secret": "1126626497"
 }

2.3 产品模型定义

这一步就是设置上报设备的属性,也就是设备的数据类型定义。

image-20220418105604435

image-20220418105637800

image-20220418105649052

image-20220418111355804

2.4 生成MQTT登录密匙

创建完产品、设备之后,接下来就需要知道如何通过MQTT协议登陆华为云服务器。

官方的详细介绍在这里: https://support.huaweicloud.com/devg-iothub/iot_01_2127.html#ZH-CN_TOPIC_0240834853__zh-cn_topic_0251997880_li365284516112

MQTT设备登陆密匙生成地址: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

下面就得到了MQTT协议设备登录的参数

2.5 使用MQTT客户端软件登录

所有的参数已经得到,接下来采用MQTT客户端登录华为云进行测试。

华为云物联网平台的域名是: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com

华为云物联网平台的IP地址是: 121.36.42.100

在软件里参数填充正确之后,就看到设备已经连接成功了。

接下来打开设备页面,可以看到设备已经在线了。

2.6 上报数据

官方文档: https://support.huaweicloud.com/devg-iothub/iot_01_2127.html#ZH-CN_TOPIC_0240834853__zh-cn_topic_0251997880_li365284516112

在这个文档里介绍了MQTT上报数据的格式。

总结的格式:

//订阅主题: 平台下发消息给设备
 $oc/devices/625cd29cecf9c41c38215ba5_1126626497/sys/messages/down
 ​
 //设备上报数据
 $oc/devices/625cd29cecf9c41c38215ba5_1126626497/sys/properties/report
 ​
 //上报的属性消息 (一次可以上报多个属性,在json里增加就行了)
 {"services": [{"service_id": "MQ3","properties":{"MQ3":50}}]}

到此,设备数据已经上报成功,如果需要增加更多的属性,按照流程继续增加即可。

3. STM32代码实现

酒精浓度传感器的预热时间要20秒~1分钟左右,这段时间之后采集的数据才会稳定。预热模块会发热,烫手,这个是正常现象。

STM32连接华为云IOT的工程代码Get: https://download.csdn.net/download/xiaolong1126626497/81993720

3.1 系统原理图

image-20220412152110776

image-20220412155048985

3.2 程序下载

通过USB进行程序下载: 下载软件在软件包目录下。

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

image-20220416125527488

正常程序运行之后,打开串口调试助手看到的初始化信息如下:

image-20220416131945457

3.3 字体取模

image-20220416134432091

3.4 main.c代码

MQTT协议连接华为云IOT源码工程参考: https://download.csdn.net/download/xiaolong1126626497/81993720

#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"
 #include "mqtt.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
 *///华为物联网服务器的设备信息
 #define MQTT_ClientID "62381267575fb713ee164ad2_xl_1_0_0_2022032106"
 #define MQTT_UserName "62381267575fb713ee164ad2_xl_1"
 #define MQTT_PassWord "124344feff3e3d96ff6af13cf36af36766619ff1eeee40e99cbae9b7b9739fe4"//订阅与发布的主题
 #define SET_TOPIC  "$oc/devices/62381267575fb713ee164ad2_xl_1/sys/messages/down"  //订阅
 #define POST_TOPIC "$oc/devices/62381267575fb713ee164ad2_xl_1/sys/properties/report"  //发布
 //设置连接的路由器信息
 #define CONNECT_WIFI  "Xiaomi_meizi6"   //将要连接的路由器名称 --不要出现中文、空格等特殊字符
 #define CONNECT_PASS "12170307yu"       //将要连接的路由器密码#define CONNECT_SERVER_IP "a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com"   //服务器IP地址
 #define CONNECT_SERVER_PORT 1883            //服务器端口//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/lchar 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
     USART3_Init(115200);//串口-WIFI
     TIMER3_Init(72,20000); //超时时间20ms
     
     //预热视频
     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初始化状态:%drn",state);
     DelayMs(1000);
     
     //设置文本模式
     state=SIM800C_SetNoteTextMode();
     printf("设置文本模式状态:%drn",state);
     DelayMs(1000);
     
     //
     
       printf("正在初始化WIFI请稍等.rn");
     
     for(i=0;i< 5;i++)
     {
         if(ESP8266_Init()==0)
         {
             esp8266_state=1;
             break;
         }
         else
         {
             esp8266_state=0;
             printf("ESP8266硬件检测错误.n");  
         }
     }
   
    if(esp8266_state)
    {
        printf("准备连接服务器....rn");
         //非加密端口
         printf("WIFI:%dn",ESP8266_STA_TCP_Client_Mode(CONNECT_WIFI,CONNECT_PASS,CONNECT_SERVER_IP,CONNECT_SERVER_PORT,1));
          
         //2. MQTT协议初始化  
         MQTT_Init(); 
 ​
         //3. 连接服务器  
         for(i=0;i< 5;i++)
         {
             if(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord)==0)
             {
                 esp8266_state=1;
                 break;
             }
             esp8266_state=0;
             printf("服务器连接失败,正在重试...n");
             delay_ms(500);
         }
         printf("服务器连接成功.n");
 ​
         //3. 订阅主题
         if(MQTT_SubscribeTopic(SET_TOPIC,0,1))
         {
            printf("主题订阅失败.n");
         }
         else
         {
            printf("主题订阅成功.n");
         } 
    }
     
    while(1)
    {
         key=KEY_Scan();
         if(key)
         {
             printf("key=%drn",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*)"13800138000",sim800c_buff,strlen((char*)sim800c_buff))==0)
             printf("短信发送成功rn");
             else
             printf("短信发送失败rn");
         }
         
         //轮询时间到达
         if(time_cnt >300)
         {
             time_cnt=0;
             LED1=!LED1;
             //获取空气质量
             MQ3_data=GetAdcCHxDATA(1);
             printf("采集MQ3数据:%drn",MQ3_data);
           
              //上报数据
             sprintf(data_buff,"{"services": [{"service_id":"STM32","properties":{"MQ3":%d}]}",
             MQ3_data);
             
             MQTT_PublishData(POST_TOPIC,data_buff,0);
             
                //上报数据
             sprintf(data_buff,"{"services": [{"service_id":"STM32","properties":{"MQ3":%d}]}",
             MQ3_data);
             
             MQTT_PublishData(POST_TOPIC,data_buff,0);
             
             //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("计算酒精浓度:%srn",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("短信发送成功rn");
                 else
                 printf("短信发送失败rn");
             }
             
             //采集的值越小,表明酒精浓度越高。反之越大。
             //根据阀值显示不同的文字提示
             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++;
      }
 }

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 物联网
    +关注

    关注

    2905

    文章

    44361

    浏览量

    371842
  • 报警系统
    +关注

    关注

    5

    文章

    647

    浏览量

    75170
  • STM32
    +关注

    关注

    2266

    文章

    10880

    浏览量

    355086
  • IOT
    IOT
    +关注

    关注

    186

    文章

    4188

    浏览量

    196386
  • 华为云
    +关注

    关注

    3

    文章

    2440

    浏览量

    17341
收藏 人收藏

    评论

    相关推荐

    学校宿舍用电安全短信监测报警系统方案

    有关学校学生用电的相关规范规则。禁止学生宿舍使用热得快,电炉子等大功率用电设备,并要求学校对学生宿舍加装安全用电监测系统。九纯健科技应北京某高校要求开发出了准们针对学校用电情况短信监测报警系统
    发表于 12-03 18:13

    基于stm32的温湿度监测报警系统设计

    基于stm32的温湿度监测报警系统设计最后要做这个毕业设计 但没学过这方面的知识 也不知道这个设计所涉及到哪些知识请知道的给点帮助呗 给点学习资料也好 指点指点我吧
    发表于 01-05 12:09

    鸿蒙软、硬件综合小案例——环境监测报警系统

    环境监测报警系统,该系统主要实现对环境的监测报警功能,。系统共包含以下三部分:鸿蒙智能手表:实
    发表于 04-14 10:32

    请问怎样去设计一种基于51单片机的温度监测报警系统

    基于51单片机的温度监测报警系统主要由哪几大模块组成?怎样去设计一种基于51单片机的温度监测报警系统
    发表于 07-06 10:51

    怎样去设计一种基于51单片机的温度监测报警系统

    基于51单片机的温度监测报警系统是由哪些部分组成的?怎样去设计一种基于51单片机的温度监测报警系统呢?
    发表于 10-28 09:29

    水位监测报警系统电路图

    水位监测报警系统电路图 上面的
    的头像 发表于 08-02 08:30 5518次阅读
    水位<b class='flag-5'>监测报警</b><b class='flag-5'>系统</b>电路图

    指纹式酒后禁驾系统问世 可监控酒后驾车

    指纹式酒后禁驾系统问世 可监控酒后驾车 驾车前,司机须将中指放在方向盘下的检测器内,系统会自
    发表于 11-27 09:51 632次阅读

    酒后驾车监测追踪车载系统硬件设计

    为了减少酒驾所造成的交通事故的发生,提出了一种基于GSM-GPS的酒后驾车监测追踪车载系统。设计实现了该系统主控模块、酒精浓度检测模块、GP
    发表于 01-31 17:06 79次下载
    <b class='flag-5'>酒后</b><b class='flag-5'>驾车</b><b class='flag-5'>监测</b>追踪车载<b class='flag-5'>系统</b>硬件设计

    世界预防酒后驾车新技术

    近年来,国内外酒后驾车引发的重大伤亡事故有呈愈演愈烈之势!除了严格执法外,推行预防酒驾的新技术,也是减少和杜绝酒后驾车的有力手段!
    发表于 07-12 15:00 828次阅读

    酒后驾车监测追踪车载系统硬件设计

    酒后驾车监测追踪车载系统硬件设计
    发表于 01-13 21:58 14次下载

    基于GSM-GPS的酒后驾车监测追踪车载系统的设计

    为了减少酒驾所造成的交通事故的发生,提出了一种基于 GSM-GPS 的酒后驾车监测追踪车载系统。设计实现了该系统主控模块、酒精浓度检测模块、
    发表于 11-04 10:23 9次下载
    基于GSM-GPS的<b class='flag-5'>酒后</b><b class='flag-5'>驾车</b><b class='flag-5'>监测</b>追踪车载<b class='flag-5'>系统</b>的设计

    ESD实时监测报警系统的构成

    ESD实时监测报警系统(Emergency Shutdown System Real-time Monitoring and Alarm System)是一种用于监测报警
    的头像 发表于 07-11 09:37 630次阅读
    ESD实时<b class='flag-5'>监测报警</b><b class='flag-5'>系统</b>的构成

    ESD实时监测报警系统的组成

    ESD实时监测报警系统是一种用于监测报警系统,主要用于防止静电放电引起的设备损坏或事故。ESD是指Electrostatic Disch
    的头像 发表于 08-08 09:28 726次阅读
    ESD实时<b class='flag-5'>监测报警</b><b class='flag-5'>系统</b>的组成

    配电箱监测报警系统

    配电箱监测报警系统是一种用于监测报警配电箱的电气设备。它可以通过智能电力探测器和监控软件来检测配电箱内部的电气参数和运行状态,并在发生故障或异常时发出
    的头像 发表于 09-06 17:46 1204次阅读
    配电箱<b class='flag-5'>监测报警</b><b class='flag-5'>系统</b>

    基于Zigbee的煤气监测报警系统设计与实现

    电子发烧友网站提供《基于Zigbee的煤气监测报警系统设计与实现.pdf》资料免费下载
    发表于 11-07 09:33 0次下载
    基于Zigbee的煤气<b class='flag-5'>监测报警</b><b class='flag-5'>系统</b>设计与实现