基于STM32+華為云IOT設計的酒駕監控系統【玩轉華為云】

      網友投稿 559 2025-03-31

      1. 前言

      隨著人們生活水平的提高,為了減少和杜絕車的現象越來越多,所引發的交通事故也引起了人們的重視,為了減少和杜絕酒后駕車導致事故發生,當前設計了一種安裝在駕駛室內,能根據具體功能進行鑒別酒精濃度的系統,當識別到酒駕之后會發出警報,并發送短信給指定緊急聯系人,通知家人通知酒駕,一起監督行車安全。并將GPS數據上傳到華為云物聯網平臺,調用地圖模塊顯示具體位置,主控芯片采用STM32單片機,GSM模塊采用IM800C。系統還帶了一塊LCD顯示屏,可以實時顯示檢測的酒精含量,酒精超標后,本地蜂鳴器也會發出警報,提醒駕駛員。

      測量酒駕的標準是:

      (1)飲酒駕車是指車輛駕駛人員血液中的酒精含量大于或者等于20mg/100ml,小于80mg/100ml的駕駛行為。(2)醉酒駕車是指車輛駕駛人員血液中的酒精含量大于或者等于80mg/100ml的駕駛行為。

      需要使用的硬件如下:

      (1)STM32系統板

      (2)酒精檢測傳感器

      (3)LCD顯示屏

      (4)供電模塊

      (5)SIM800C模塊

      (6)蜂鳴器模塊

      (7)GPS模塊–采用SIM800C內部的GPS功能獲取GPS數據。

      為了測試,搞了幾口二鍋頭。

      上位機采用QT開發,調用華為云的應用側接口獲取設備上傳的數據。再調用百度接口,獲取GPS定位的位置。

      2. 登錄華為云創建云端設備

      2.1 創建產品

      華為運官網: https://www.huaweicloud.com/

      在這里可以查看接入的協議的端口號和地址。

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

      我們設備接入的協議選擇MQTT,端口對應是1883

      接下來繼續創建產品,點擊產品頁面,點擊右上角創建產品:

      2.2 創建設備

      這是我的設備信息:

      設備ID 625cd29cecf9c41c38215ba5_1126626497 設備密鑰 1126626497 { "device_id": "625cd29cecf9c41c38215ba5_1126626497", "secret": "1126626497" }

      2.3 產品模型定義

      這一步就是設置上報設備的屬性,也就是設備的數據類型定義。

      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

      基于STM32+華為云IOT設計的酒駕監控系統【玩轉華為云】

      在軟件里參數填充正確之后,就看到設備已經連接成功了。

      接下來打開設備頁面,可以看到設備已經在線了。

      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分鐘左右,這段時間之后采集的數據才會穩定。預熱模塊會發熱,燙手,這個是正常現象。

      3.1 系統原理圖

      3.2 程序下載

      通過USB進行程序下載: 下載軟件在軟件包目錄下。

      點擊開始編程之后,點擊板子上的復位鍵即可下載程序,如果失敗,重試幾次即可。正常的效果如下。

      正常程序運行之后,打開串口調試助手看到的初始化信息如下:

      3.3 字體取模

      3.4 main.c代碼

      keil工程可以在這里get: https://download.csdn.net/download/xiaolong1126626497/81993720

      #include "stm32f10x.h" #include "led.h" #include "delay.h" #include "key.h" #include "usart.h" #include #include "timer.h" #include "oled.h" #include "adc.h" #include #include #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/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初始化狀態:%d\r\n",state); DelayMs(1000); //設置文本模式 state=SIM800C_SetNoteTextMode(); printf("設置文本模式狀態:%d\r\n",state); DelayMs(1000); // printf("正在初始化WIFI請稍等.\r\n"); 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("準備連接服務器....\r\n"); //非加密端口 printf("WIFI:%d\n",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=%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*)"13800138000",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); //上報數據 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("計算酒精濃度:%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++; } }

      IoT TCP/IP 單片機

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:簡單介紹Excel中的數組公式為進一步的研究和應用打下基礎(excel組數的計算公式)
      下一篇:探索未來:食品訂單管理的新技術
      相關文章
      久久久亚洲精品国产| 国产成人亚洲综合无码精品| 亚洲美免无码中文字幕在线| 亚洲阿v天堂在线| 日本红怡院亚洲红怡院最新| 亚洲国产精品无码久久一区二区| 久久久久一级精品亚洲国产成人综合AV区| 蜜芽亚洲av无码一区二区三区| 亚洲熟妇丰满xxxxx| 亚洲欧美成人综合久久久| 亚洲色欲色欲www在线播放| 亚洲乱码国产乱码精华| 欧美亚洲精品一区二区| 精品国产_亚洲人成在线| 男人的天堂亚洲一区二区三区 | 精品国产亚洲一区二区三区在线观看| 亚洲精品理论电影在线观看 | 亚洲av无码乱码国产精品fc2| 亚洲成AV人片在| 亚洲一区二区电影| 亚洲欧洲校园自拍都市| 亚洲免费在线视频观看| 亚洲午夜在线播放| 亚洲av永久中文无码精品综合| 久久亚洲AV成人无码国产电影| 内射无码专区久久亚洲| 国产成人99久久亚洲综合精品| 中文字幕在线亚洲精品 | 久久精品亚洲综合一品| 亚洲黄色在线电影| 亚洲a级在线观看| 亚洲成av人片在线天堂无| 亚洲AV无码不卡在线观看下载| 亚洲一区二区高清| 亚洲国产精品无码久久SM| 久久精品国产亚洲AV麻豆网站| 亚洲成a人片在线观看中文!!!| 亚洲国产精品线观看不卡| 亚洲综合成人婷婷五月网址| 精品亚洲国产成人av| 亚洲综合激情另类专区|