1. 前言
酒后駕車是一種嚴重的交通違法行為,不僅危及駕駛人員自身的生命安全,還可能對其他道路使用者造成傷害甚至生命危險。為了提高道路交通安全水平,減少酒后駕車事故的發(fā)生,開發(fā)一種可靠的酒后駕車監(jiān)測報警系統(tǒng)變得尤為重要。
傳統(tǒng)的酒后駕車檢測方法主要依賴于交警的抽血或呼氣測試,這種方法存在著操作復雜、時間延遲、成本高昂等問題。為了解決這些問題,基于物聯網和嵌入式技術的酒后駕車監(jiān)測報警系統(tǒng)應運而生。
當前設計一種酒后駕車監(jiān)測報警系統(tǒng),通過安裝在駕駛室內的設備,能夠準確檢測酒精濃度,并在識別到酒駕行為時觸發(fā)報警和通知功能。系統(tǒng)能將GPS數據上傳到華為云物聯網平臺,并通過地圖模塊顯示具體位置信息。主控芯片采用STM32單片機,GSM模塊采用IM800C,系統(tǒng)還配備了LCD顯示屏、供電模塊、蜂鳴器模塊和GPS模塊。
功能特點:
- 酒精檢測:系統(tǒng)能夠準確測量駕駛人員血液中的酒精含量,并根據設定的標準判斷是否酒駕或醉酒駕駛。
- 報警功能:當檢測到酒駕行為時,系統(tǒng)會觸發(fā)警報,通過本地蜂鳴器發(fā)出聲音,提醒駕駛員。
- 短信通知:系統(tǒng)會發(fā)送短信給指定的緊急聯系人,通知家人發(fā)生酒駕行為,以便他們能夠及時采取行動。
- GPS定位:系統(tǒng)將獲取到的GPS數據上傳到華為云物聯網平臺,并調用地圖模塊顯示具體位置信息,方便監(jiān)督行車安全。
- LCD顯示:系統(tǒng)配備了LCD顯示屏,可以實時顯示檢測到的酒精含量,提供直觀的信息展示。
硬件配置:
- STM32系統(tǒng)板:作為主控芯片,負責系統(tǒng)的控制和數據處理。
- 酒精檢測傳感器:用于測量駕駛人員血液中的酒精含量。
- LCD顯示屏:提供實時的酒精含量顯示和其他信息展示。
- 供電模塊:為系統(tǒng)提供穩(wěn)定的電源供應。
- SIM800C模塊:用于發(fā)送短信通知給指定聯系人。
- 蜂鳴器模塊:當檢測到酒駕行為時,通過發(fā)出聲音進行警示。
- GPS模塊:采用SIM800C內部的GPS功能獲取GPS數據,用于定位和上傳位置信息。
項目目標:
通過該酒后駕車監(jiān)測報警系統(tǒng),提高駕駛人員的安全意識,減少酒后駕駛行為的發(fā)生,保障交通安全。通過實時監(jiān)測、報警和通知功能,有效地防止和遏制酒駕行為的發(fā)生,并提供準確的位置信息,以便相關人員能夠及時采取措施。
為了測試,搞了幾口二鍋頭。
上位機采用QT開發(fā),調用華為云的應用側接口獲取設備上傳的數據。再調用百度接口,獲取GPS定位的位置。
2. 登錄華為云創(chuàng)建云端設備
2.1 創(chuàng)建產品
華為運官網: https://www.huaweicloud.com/
在這里可以查看接入的協(xié)議的端口號和地址。
MQTT (1883) a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
我們設備接入的協(xié)議選擇MQTT,端口對應是1883
接下來繼續(xù)創(chuàng)建產品,點擊產品頁面,點擊右上角創(chuàng)建產品:
2.2 創(chuàng)建設備
這是我的設備信息:
設備ID
625cd29cecf9c41c38215ba5_1126626497
?
設備密鑰
1126626497
{
"device_id": "625cd29cecf9c41c38215ba5_1126626497",
"secret": "1126626497"
}
2.3 產品模型定義
這一步就是設置上報設備的屬性,也就是設備的數據類型定義。
2.4 生成MQTT登錄密匙
創(chuàng)建完產品、設備之后,接下來就需要知道如何通過MQTT協(xié)議登陸華為云服務器。
MQTT設備登陸密匙生成地址: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
下面就得到了MQTT協(xié)議設備登錄的參數。
2.5 使用MQTT客戶端軟件登錄
所有的參數已經得到,接下來采用MQTT客戶端登錄華為云進行測試。
華為云物聯網平臺的域名是: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
華為云物聯網平臺的IP地址是: 121.36.42.100
在軟件里參數填充正確之后,就看到設備已經連接成功了。
接下來打開設備頁面,可以看到設備已經在線了。
2.6 上報數據
在這個文檔里介紹了MQTT上報數據的格式。
總結的格式:
//訂閱主題: 平臺下發(fā)消息給設備
$oc/devices/625cd29cecf9c41c38215ba5_1126626497/sys/messages/down
?
//設備上報數據
$oc/devices/625cd29cecf9c41c38215ba5_1126626497/sys/properties/report
?
//上報的屬性消息 (一次可以上報多個屬性,在json里增加就行了)
{"services": [{"service_id": "MQ3","properties":{"MQ3":50}}]}
到此,設備數據已經上報成功,如果需要增加更多的屬性,按照流程繼續(xù)增加即可。
3. STM32代碼實現
酒精濃度傳感器的預熱時間要20秒~1分鐘左右,這段時間之后采集的數據才會穩(wěn)定。預熱模塊會發(fā)熱,燙手,這個是正常現象。
STM32連接華為云IOT的工程代碼Get: https://download.csdn.net/download/xiaolong1126626497/81993720
3.1 系統(tǒng)原理圖
3.2 程序下載
點擊開始編程之后,點擊板子上的復位鍵即可下載程序,如果失敗,重試幾次即可。正常的效果如下。
正常程序運行之后,打開串口調試助手看到的初始化信息如下:
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. 酒精檢測傳感器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"
?
//訂閱與發(fā)布的主題
#define SET_TOPIC "$oc/devices/62381267575fb713ee164ad2_xl_1/sys/messages/down" //訂閱
#define POST_TOPIC "$oc/devices/62381267575fb713ee164ad2_xl_1/sys/properties/report" //發(fā)布
//設置連接的路由器信息
#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/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
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初始化狀態(tài):%drn",state);
DelayMs(1000);
//設置文本模式
state=SIM800C_SetNoteTextMode();
printf("設置文本模式狀態(tài):%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協(xié)議初始化
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;
}
//手動控制蜂鳴器測試
//手動發(fā)送短信測試
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");
}
//輪詢時間到達
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);
//發(fā)送短信
if(SIM800C_SendNote((u8*)"18171571217",sim800c_buff,strlen((char*)sim800c_buff))==0)
printf("短信發(fā)送成功rn");
else
printf("短信發(fā)送失敗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);
}
//正常穩(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++;
}
}
審核編輯:湯梓紅
-
物聯網
+關注
關注
2900文章
44062瀏覽量
370234 -
報警系統(tǒng)
+關注
關注
5文章
647瀏覽量
75129 -
STM32
+關注
關注
2264文章
10854瀏覽量
354294 -
IOT
+關注
關注
186文章
4161瀏覽量
195969 -
華為云
+關注
關注
3文章
2391瀏覽量
17244
發(fā)布評論請先 登錄
相關推薦
評論