摘要:設計一款物聯網智能電子密碼鎖,以STM32單片機為主控制器,由觸摸矩陣鍵盤、ESP8266、步進電機等模塊組成,具有遠程控制、隨機密碼生成等功能。
本文分享自華為雲社區《STM32+華為雲IOT設計的動態密碼鎖》,作者:DS小龍哥。
1. 前言
隨着人們生活水平的提高及科學技術的發展,個人信息保護顯得至關重要,設計了一款物聯網智能電子密碼鎖,以STM32單片機為主控制器,由觸摸矩陣鍵盤、ESP8266、步進電機等模塊組成,具有遠程控制、隨機密碼生成等功能。經軟硬件測試,系統響應迅速,靈敏度高,實時性好,系統識別准確率高達99%,該系統運行穩定,安全可靠,功耗低及具有較好的擴展性。
當前支持的開鎖方式:
(1)支持手機APP遠程開鎖。通過華為雲物聯網平台實現遠程發送指令開鎖,設備上的ESP8266通過連接家里路由器,在連接華為雲物聯網平台,可以在手機APP上對設備端的RTC時間進行校准,設備唯一ID獲取,生成隨機開鎖密碼,可以點擊APP上的開鎖按鈕,通過物聯網平台提供的API發送指令給STM32設備完成開鎖。
(2)隨機密碼開鎖。手機APP與本地設備都采用時間、作為算法種子,采用算法生成開鎖密碼,每一串的密碼有效時間為一分鍾。查看手機APP上顯示的密碼之后,在本地設備上輸入完成密碼對比開鎖。
2. 手機APP設計
2.1 開發環境介紹
上位機軟件采用Qt框架設計,Qt是一個跨平台的C++圖形用戶界面應用程序框架。Qt是一個1991年由Qt Company開發的跨平台C++圖形用戶界面應用程序開發框架。它既可以開發GUI程序,也可用於開發非GUI程序,比如控制台工具和服務器。簡單來說,QT可以很輕松的幫你做帶界面的軟件,甚至不需要你投入很大精力。
QT官網: https://www.qt.io/
2.2 學習教程
QT入門實戰專欄: https://blog.csdn.net/xiaolong1126626497/category_11400392.html
QT5環境安裝教程:https://xiaolong.blog.csdn.net/article/details/120654599
下載QT5.12.6下載地址:
https://download.qt.io/archive/qt/5.12/5.12.6/
打開鏈接后選擇:
qt-opensource-windows-x86-5.12.6.exe 13-Nov-2019 07:28 3.7G Details
軟件安裝時斷網安裝,否則會提示輸入賬戶。
安裝的時候,勾選一個mingw 32編譯器即可。
2.3 實現效果
3. 創建雲端設備
3.1 創建設備
登錄官網: https://www.huaweicloud.com/
直接搜索物聯網,打開頁面。
https://www.huaweicloud.com/product/iothub.html
得到產品ID,保存好ID,點擊查看詳情:
產品ID為:61b9ba3a2b2aa20288c1e7f1.
3.2 創建MQTT登錄賬號和密匙
設備創建完成接來下生成MQTT登錄賬號、密匙,方便設備登錄雲端平台。
官網工具地址: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
4. STM32設備端代碼設計
4.1 硬件相關原理圖
4.2 硬件接線
1. 板載ESP8266串口WIFI模塊與STM32的串口3相連接。 PB10--RXD 模塊接收腳 PB11--TXD 模塊發送腳 PB8---CH-PD---懸空 PB9---RST---懸空 GND---GND 地 VCC---VCC 電源(3.3V~5.0V) 2. 觸摸按鍵使用TTP229型號的驅動芯片 SCL接PC11 SDA-OUT接PC10 電源接VCC-3.3 GND接GND 3. ULN2003控制28BYJ-48步進電機接線: ULN2003接線: IN4: PC9 d IN3: PC8 c IN2: PC7 b IN1: PC6 a + : 5V - : GND 4. OLED顯示屏 D0----SCK-----PB14 D1----MOSI----PB13 RES—復位(低電平有效)—PB12 DC---數據和命令控制管腳—PB1 CS---片選引腳-----PA7 5. 板載按鍵 KEY1---PA0 KEY2---PC13 6.板載LED燈 LED1---PB5 LED2---PB0 LED3---PB1 7. 板載蜂鳴器 BEEP---PA8
4.3 服務器連接核心代碼
//華為物聯網服務器的設備信息 #define MQTT_ClientID "61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510" #define MQTT_UserName "61b9ba3a2b2aa20288c1e7f1_QQ1126626497" #define MQTT_PassWord "385ce91dfe7da5b7431868d5d87e7998163c493344040935d5a00024d6324242" //訂閱與發布的主題 #define SET_TOPIC "$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/messages/down" //訂閱 #define POST_TOPIC "$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/properties/report" //發布 char mqtt_message[200];//上報數據緩存區 int main() { u32 time_cnt=0; u32 i; u8 key; LED_Init(); BEEP_Init(); KEY_Init(); USART1_Init(115200); TIMER1_Init(72,20000); //超時時間20ms USART2_Init(9600);//串口-藍牙 TIMER2_Init(72,20000); //超時時間20ms USART3_Init(115200);//串口-WIFI TIMER3_Init(72,20000); //超時時間20ms USART1_Printf("正在初始化WIFI請稍等.\n"); if(ESP8266_Init()) { USART1_Printf("ESP8266硬件檢測錯誤.\n"); } else { //非加密端口 USART1_Printf("WIFI:%d\n",ESP8266_STA_TCP_Client_Mode("CMCC-Cqvn","99pu58cb","121.36.42.100",1883,1)); } //2. MQTT協議初始化 MQTT_Init(); //3. 連接華為服務器 while(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord)) { USART1_Printf("服務器連接失敗,正在重試...\n"); delay_ms(500); } USART1_Printf("服務器連接成功.\n"); //3. 訂閱主題 if(MQTT_SubscribeTopic(SET_TOPIC,0,1)) { USART1_Printf("主題訂閱失敗.\n"); } else { USART1_Printf("主題訂閱成功.\n"); } .................. .................. ................... }