1. 前言
酒后駕車是一種嚴(yán)重的交通違法行為,不僅危及駕駛?cè)藛T自身的生命安全,還可能對(duì)其他道路使用者造成傷害甚至生命危險(xiǎn)。為了提高道路交通安全水平,減少酒后駕車事故的發(fā)生,開(kāi)發(fā)一種可靠的酒后駕車監(jiān)測(cè)報(bào)警系統(tǒng)變得尤為重要。
傳統(tǒng)的酒后駕車檢測(cè)方法主要依賴于交警的抽血或呼氣測(cè)試,這種方法存在著操作復(fù)雜、時(shí)間延遲、成本高昂等問(wèn)題。為了解決這些問(wèn)題,基于物聯(lián)網(wǎng)和嵌入式技術(shù)的酒后駕車監(jiān)測(cè)報(bào)警系統(tǒng)應(yīng)運(yùn)而生。
當(dāng)前設(shè)計(jì)一種酒后駕車監(jiān)測(cè)報(bào)警系統(tǒng),通過(guò)安裝在駕駛室內(nèi)的設(shè)備,能夠準(zhǔn)確檢測(cè)酒精濃度,并在識(shí)別到酒駕行為時(shí)觸發(fā)報(bào)警和通知功能。系統(tǒng)能將GPS數(shù)據(jù)上傳到華為云物聯(lián)網(wǎng)平臺(tái),并通過(guò)地圖模塊顯示具體位置信息。主控芯片采用STM32單片機(jī),GSM模塊采用IM800C,系統(tǒng)還配備了LCD顯示屏、供電模塊、蜂鳴器模塊和GPS模塊。
功能特點(diǎn):
- 酒精檢測(cè):系統(tǒng)能夠準(zhǔn)確測(cè)量駕駛?cè)藛T血液中的酒精含量,并根據(jù)設(shè)定的標(biāo)準(zhǔn)判斷是否酒駕或醉酒駕駛。
- 報(bào)警功能:當(dāng)檢測(cè)到酒駕行為時(shí),系統(tǒng)會(huì)觸發(fā)警報(bào),通過(guò)本地蜂鳴器發(fā)出聲音,提醒駕駛員。
- 短信通知:系統(tǒng)會(huì)發(fā)送短信給指定的緊急聯(lián)系人,通知家人發(fā)生酒駕行為,以便他們能夠及時(shí)采取行動(dòng)。
- GPS定位:系統(tǒng)將獲取到的GPS數(shù)據(jù)上傳到華為云物聯(lián)網(wǎng)平臺(tái),并調(diào)用地圖模塊顯示具體位置信息,方便監(jiān)督行車安全。
- LCD顯示:系統(tǒng)配備了LCD顯示屏,可以實(shí)時(shí)顯示檢測(cè)到的酒精含量,提供直觀的信息展示。
硬件配置:
- STM32系統(tǒng)板:作為主控芯片,負(fù)責(zé)系統(tǒng)的控制和數(shù)據(jù)處理。
- 酒精檢測(cè)傳感器:用于測(cè)量駕駛?cè)藛T血液中的酒精含量。
- LCD顯示屏:提供實(shí)時(shí)的酒精含量顯示和其他信息展示。
- 供電模塊:為系統(tǒng)提供穩(wěn)定的電源供應(yīng)。
- SIM800C模塊:用于發(fā)送短信通知給指定聯(lián)系人。
- 蜂鳴器模塊:當(dāng)檢測(cè)到酒駕行為時(shí),通過(guò)發(fā)出聲音進(jìn)行警示。
- GPS模塊:采用SIM800C內(nèi)部的GPS功能獲取GPS數(shù)據(jù),用于定位和上傳位置信息。
項(xiàng)目目標(biāo):
通過(guò)該酒后駕車監(jiān)測(cè)報(bào)警系統(tǒng),提高駕駛?cè)藛T的安全意識(shí),減少酒后駕駛行為的發(fā)生,保障交通安全。通過(guò)實(shí)時(shí)監(jiān)測(cè)、報(bào)警和通知功能,有效地防止和遏制酒駕行為的發(fā)生,并提供準(zhǔn)確的位置信息,以便相關(guān)人員能夠及時(shí)采取措施。
為了測(cè)試,搞了幾口二鍋頭。
上位機(jī)采用QT開(kāi)發(fā),調(diào)用華為云的應(yīng)用側(cè)接口獲取設(shè)備上傳的數(shù)據(jù)。再調(diào)用百度接口,獲取GPS定位的位置。
2. 登錄華為云創(chuàng)建云端設(shè)備
2.1 創(chuàng)建產(chǎn)品
華為運(yùn)官網(wǎng): https://www.huaweicloud.com/
在這里可以查看接入的協(xié)議的端口號(hào)和地址。
MQTT (1883) a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
我們?cè)O(shè)備接入的協(xié)議選擇MQTT,端口對(duì)應(yīng)是1883
接下來(lái)繼續(xù)創(chuàng)建產(chǎn)品,點(diǎn)擊產(chǎn)品頁(yè)面,點(diǎn)擊右上角創(chuàng)建產(chǎn)品:
2.2 創(chuàng)建設(shè)備
這是我的設(shè)備信息:
設(shè)備ID
625cd29cecf9c41c38215ba5_1126626497
?
設(shè)備密鑰
1126626497
{
"device_id": "625cd29cecf9c41c38215ba5_1126626497",
"secret": "1126626497"
}
2.3 產(chǎn)品模型定義
這一步就是設(shè)置上報(bào)設(shè)備的屬性,也就是設(shè)備的數(shù)據(jù)類型定義。
2.4 生成MQTT登錄密匙
創(chuàng)建完產(chǎn)品、設(shè)備之后,接下來(lái)就需要知道如何通過(guò)MQTT協(xié)議登陸華為云服務(wù)器。
官方的詳細(xì)介紹在這里: https://support.huaweicloud.com/devg-iothub/iot_01_2127.html#ZH-CN_TOPIC_0240834853__zh-cn_topic_0251997880_li365284516112
MQTT設(shè)備登陸密匙生成地址: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
下面就得到了MQTT協(xié)議設(shè)備登錄的參數(shù)。
2.5 使用MQTT客戶端軟件登錄
所有的參數(shù)已經(jīng)得到,接下來(lái)采用MQTT客戶端登錄華為云進(jìn)行測(cè)試。
華為云物聯(lián)網(wǎng)平臺(tái)的域名是: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
華為云物聯(lián)網(wǎng)平臺(tái)的IP地址是: 121.36.42.100
在軟件里參數(shù)填充正確之后,就看到設(shè)備已經(jīng)連接成功了。
接下來(lái)打開(kāi)設(shè)備頁(yè)面,可以看到設(shè)備已經(jīng)在線了。
2.6 上報(bào)數(shù)據(jù)
在這個(gè)文檔里介紹了MQTT上報(bào)數(shù)據(jù)的格式。
總結(jié)的格式:
//訂閱主題: 平臺(tái)下發(fā)消息給設(shè)備
$oc/devices/625cd29cecf9c41c38215ba5_1126626497/sys/messages/down
?
//設(shè)備上報(bào)數(shù)據(jù)
$oc/devices/625cd29cecf9c41c38215ba5_1126626497/sys/properties/report
?
//上報(bào)的屬性消息 (一次可以上報(bào)多個(gè)屬性,在json里增加就行了)
{"services": [{"service_id": "MQ3","properties":{"MQ3":50}}]}
到此,設(shè)備數(shù)據(jù)已經(jīng)上報(bào)成功,如果需要增加更多的屬性,按照流程繼續(xù)增加即可。
3. STM32代碼實(shí)現(xiàn)
酒精濃度傳感器的預(yù)熱時(shí)間要20秒~1分鐘左右,這段時(shí)間之后采集的數(shù)據(jù)才會(huì)穩(wěn)定。預(yù)熱模塊會(huì)發(fā)熱,燙手,這個(gè)是正常現(xiàn)象。
STM32連接華為云IOT的工程代碼Get: https://download.csdn.net/download/xiaolong1126626497/81993720
3.1 系統(tǒng)原理圖
3.2 程序下載
通過(guò)USB進(jìn)行程序下載: 下載軟件在軟件包目錄下。
點(diǎn)擊開(kāi)始編程之后,點(diǎn)擊板子上的復(fù)位鍵即可下載程序,如果失敗,重試幾次即可。正常的效果如下。
正常程序運(yùn)行之后,打開(kāi)串口調(diào)試助手看到的初始化信息如下:
3.3 字體取模
3.4 main.c代碼
MQTT協(xié)議連接華為云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. 酒精檢測(cè)傳感器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
*/
?
//華為物聯(lián)網(wǎng)服務(wù)器的設(shè)備信息
#define MQTT_ClientID "62381267575fb713ee164ad2_xl_1_0_0_2022032106"
#define MQTT_UserName "62381267575fb713ee164ad2_xl_1"
#define MQTT_PassWord "124344feff3e3d96ff6af13cf36af36766619ff1eeee40e99cbae9b7b9739fe4"
?
//訂閱與發(fā)布的主題
#define SET_TOPIC "$oc/devices/62381267575fb713ee164ad2_xl_1/sys/messages/down" //訂閱
#define POST_TOPIC "$oc/devices/62381267575fb713ee164ad2_xl_1/sys/properties/report" //發(fā)布
//設(shè)置連接的路由器信息
#define CONNECT_WIFI "Xiaomi_meizi6" //將要連接的路由器名稱 --不要出現(xiàn)中文、空格等特殊字符
#define CONNECT_PASS "12170307yu" //將要連接的路由器密碼
?
#define CONNECT_SERVER_IP "a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com" //服務(wù)器IP地址
#define CONNECT_SERVER_PORT 1883 //服務(wù)器端口
?
//JTAG模式設(shè)置,用于設(shè)置JTAG的模式
//mode:jtag,swd模式設(shè)置;00,全使能;01,使能SWD;10,全關(guān)閉;
#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; //開(kāi)啟輔助時(shí)鐘
AFIO- >MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
AFIO- >MAPR|=temp; //設(shè)置jtag模式
}
?
?
u16 MQ3_data=0; //酒精濃度
float MQ3_data_float=0; //mg/l
?
char data_buff[100];
//酒精超標(biāo)提示
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初始化-打印調(diào)試信息
Lcd_Init(); //LCD初始化
Lcd_Clear(0); //清屏為黑色
LCD_LED_SET; //通過(guò)IO控制背光亮
AdcInit(); //ADC初始化--檢測(cè)酒精傳感器的值
TIMER2_Init(72,20000);//輔助串口2接收,超時(shí)時(shí)間為20ms
USART2_Init(115200); //可能的波特率(測(cè)試): 57600 、9600、115200
USART3_Init(115200);//串口-WIFI
TIMER3_Init(72,20000); //超時(shí)時(shí)間20ms
//預(yù)熱視頻
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); //初始化時(shí)間30秒
delay_ms(5000); //初始化時(shí)間5秒
Lcd_Clear(0); //清屏為黑色
//采集數(shù)據(jù)的真實(shí)數(shù)據(jù)
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);
//酒精含量計(jì)算結(jié)果
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);
?
//酒精超標(biāo)顯示
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初始化狀態(tài):%drn",state);
DelayMs(1000);
//設(shè)置文本模式
state=SIM800C_SetNoteTextMode();
printf("設(shè)置文本模式狀態(tài):%drn",state);
DelayMs(1000);
//
printf("正在初始化WIFI請(qǐng)稍等.rn");
for(i=0;i< 5;i++)
{
if(ESP8266_Init()==0)
{
esp8266_state=1;
break;
}
else
{
esp8266_state=0;
printf("ESP8266硬件檢測(cè)錯(cuò)誤.n");
}
}
if(esp8266_state)
{
printf("準(zhǔn)備連接服務(wù)器....rn");
//非加密端口
printf("WIFI:%dn",ESP8266_STA_TCP_Client_Mode(CONNECT_WIFI,CONNECT_PASS,CONNECT_SERVER_IP,CONNECT_SERVER_PORT,1));
//2. MQTT協(xié)議初始化
MQTT_Init();
?
//3. 連接服務(wù)器
for(i=0;i< 5;i++)
{
if(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord)==0)
{
esp8266_state=1;
break;
}
esp8266_state=0;
printf("服務(wù)器連接失敗,正在重試...n");
delay_ms(500);
}
printf("服務(wù)器連接成功.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;
}
//手動(dòng)控制蜂鳴器測(cè)試
//手動(dòng)發(fā)送短信測(cè)試
if(key==1)
{
BEEP=1;
delay_ms(100);
BEEP=0;
?
sprintf((char*)sim800c_buff,"Drunk driving reminder:%d",MQ3_data);
//發(fā)送短信
if(SIM800C_SendNote((u8*)"13800138000",sim800c_buff,strlen((char*)sim800c_buff))==0)
printf("短信發(fā)送成功rn");
else
printf("短信發(fā)送失敗rn");
}
//輪詢時(shí)間到達(dá)
if(time_cnt >300)
{
time_cnt=0;
LED1=!LED1;
//獲取空氣質(zhì)量
MQ3_data=GetAdcCHxDATA(1);
printf("采集MQ3數(shù)據(jù):%drn",MQ3_data);
//上報(bào)數(shù)據(jù)
sprintf(data_buff,"{"services": [{"service_id":"STM32","properties":{"MQ3":%d}]}",
MQ3_data);
MQTT_PublishData(POST_TOPIC,data_buff,0);
//上報(bào)數(shù)據(jù)
sprintf(data_buff,"{"services": [{"service_id":"STM32","properties":{"MQ3":%d}]}",
MQ3_data);
MQTT_PublishData(POST_TOPIC,data_buff,0);
//LCD屏實(shí)時(shí)顯示酒精濃度
//采集數(shù)據(jù)
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("計(jì)算酒精濃度:%srn",data_buff);
Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)" ");
Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)data_buff);
//判斷酒精濃度是否超標(biāo),設(shè)置閥值
if(MQ3_data >2000)
{
sprintf((char*)sim800c_buff," :%d",MQ3_data);
//發(fā)送短信
if(SIM800C_SendNote((u8*)"18171571217",sim800c_buff,strlen((char*)sim800c_buff))==0)
printf("短信發(fā)送成功rn");
else
printf("短信發(fā)送失敗rn");
}
//采集的值越小,表明酒精濃度越高。反之越大。
//根據(jù)閥值顯示不同的文字提示
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);
}
//正常穩(wěn)定范圍采集的值是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++;
}
}
審核編輯:湯梓紅
-
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2909文章
44557瀏覽量
372759 -
報(bào)警系統(tǒng)
+關(guān)注
關(guān)注
5文章
647瀏覽量
75186 -
STM32
+關(guān)注
關(guān)注
2270文章
10895瀏覽量
355729 -
IOT
+關(guān)注
關(guān)注
187文章
4202瀏覽量
196684 -
華為云
+關(guān)注
關(guān)注
3文章
2445瀏覽量
17408
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論