本文分享自华为云社区《STM32+华为云IOT设计的动态密码锁》,作者:DS小龙哥。

1. 前言

随着人们生活水平的提高及科学技术的发展,个人信息保护显得至关重要,设计了一款物联网智能电子密码锁,以STM32单片机为主控制器,由触摸矩阵键盘、ESP8266、步进电机等模块组成,具有远程控制、随机密码生成等功能。经软硬件测试,系统响应迅速,灵敏度高,实时性好,系统识别准确率高达99%,该系统运行稳定,安全可靠,功耗低及具有较好的扩展性。
当前支持的开锁方式:

(1)支持手机APP远程开锁。通过华为云物联网平台实现远程发送指令开锁,设备上的ESP8266通过连接家里路由器,在连接华为云物联网平台,可以在手机APP上对设备端的RTC时间进行校准,设备唯一ID获取,生成随机开锁密码,可以点击APP上的开锁按钮,通过物联网平台提供的API发送指令给STM32设备完成开锁。
(2)随机密码开锁。手机APP与本地设备都采用时间、作为算法种子,采用算法生成开锁密码,每一串的密码有效时间为一分钟。查看手机APP上显示的密码之后,在本地设备上输入完成密码对比开锁。
v2-b0371cdb625e50486fe61f0cc0e2e53c_720w.jpg
v2-e9c0656f0cc3e547e4358f8389743168_720w.jpg
v2-83d2887463090d672e4402b356ec0a89_720w.jpg
v2-c1f517b304e312daedae5724a4015f92_720w.jpg


2. 手机APP设计

2.1 开发环境介绍

上位机软件采用Qt框架设计,Qt是一个跨平台的C++图形用户界面应用程序框架。Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。简单来说,QT可以很轻松的帮你做带界面的软件,甚至不需要你投入很大精力。

QT官网: https://www.qt.io/
v2-9d3d2c975ea51dd288a7ee1081bb4577_720w.jpg

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 实现效果


v2-911908737c4c0315e2bf7ad68f080176_720w.jpg


3. 创建云端设备

3.1 创建设备

登录官网: https://www.huaweicloud.com/
直接搜索物联网,打开页面。
https://www.huaweicloud.com/product/iothub.html

v2-5de42c5640565f049d61e6702ab7ef92_720w.jpg
v2-27286332b212b9946dddf10bcb2f0b04_720w.jpg
v2-b6248463414ef21df2792affd47645dd_720w.jpg
v2-bdbb2953a559b9df506cd3f8bd3a8f65_720w.jpg
v2-012d662774cefb582a667893efe98f23_720w.jpg

得到产品ID,保存好ID,点击查看详情:

产品ID为:61b9ba3a2b2aa20288c1e7f1.
v2-aa8e1439ea671b59234e77c78f45055d_720w.jpg
v2-9be53d02704e9478bca462fe4e4e3ca3_720w.jpg
v2-0a15e959a59045c17daaa468780f1d49_720w.jpg
v2-cb5b2205b5163f475f79771042d4e4f9_720w.jpg
v2-3c61c98e9c80e666a710312b4947f52e_720w.jpg
v2-ff9348b94deee54def0c693487d57558_720w.jpg
v2-6126acfc4eeb529bed8b7a4c90d0929a_720w.jpg
v2-fd003c1363c85d2004a71b2ce0cc7ec7_720w.jpg
v2-aebed1dd818f12daf3906b12f9951340_720w.jpg

3.2 创建MQTT登录账号和密匙

设备创建完成接来下生成MQTT登录账号、密匙,方便设备登录云端平台。

官网工具地址: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

v2-7cb7aad0081d3d028a68912252ed2c9b_720w.jpg


4. STM32设备端代码设计  

4.1 硬件相关原理图

v2-0173e4882f6ea2352dc3fd3138accb79_720w.jpg

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");
  •     }
  •     ..................
  •     ..................
  •     ...................
  • }
  • 复制代码