本文分享自华为云社区《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");
}
..................
..................
...................
}
复制代码
点击关注,第一时间了解华为云新鲜技术~
评论