历史上的今天
返回首页

历史上的今天

今天是:2025年10月13日(星期一)

正在发生

2022年10月13日 | 基于STM32F103设计的智能门锁(支持多种开锁解锁方式)

2022-10-13 来源:csdn

一、环境介绍

编程软件: keil5


主控MCU: STM32F103ZET6


射频卡读写器: RFID-RC522


步进电机: 28BYJ4  4相5线


蓝牙:  ATK-HC05


WIFI: ATK-ESP8266


物联网云平台: 采用腾讯云物联网平台,直接支持微信小程序和手机独立APP控制


完整项目源码下载地址: https://download.csdn.net/download/xiaolong1126626497/19101807


二、功能介绍

这是基于STM32设计的智能锁模型,支持多种开锁方式,详情如下:


1.  门禁卡刷卡开锁:使用RC522射频卡读卡器,读取IC卡卡号和内部数据,验证身份,开锁。


2. 蓝牙自动开锁:  业主的手机蓝牙在范围内,自动开锁(通过连接蓝牙地址确认业主身份),范围是通过蓝牙断开与连接上为准。


3. 微信小程序开锁、关锁:通过ESP8266连接腾讯云物联网平台,业主可以通过微信小程序“腾讯连连” 进行远程开锁和关锁。


如果没有使用过腾讯云物联网平台的,可以看这里:https://blog.csdn.net/xiaolong1126626497/article/details/116902653


4. 按键开锁、关锁: 可以通过开发板上的按键进行开锁和关锁(模拟物理钥匙而已)


开锁和关锁使用步进电机正转一圈、反转一圈模拟。

三、使用的相关硬件介绍

3.1  STM32F103ZET6系统板

3.2 HC05蓝牙模块

3.3 WIFI模块

3.4 RFID-RC522模块

3.5 步进电机

四、腾讯物联网平台

没有使用过物联网云平台的参考这里: https://blog.csdn.net/xiaolong1126626497/article/details/116902653

五、设备核心源码

#include "stm32f10x.h"

#include "led.h"

#include "delay.h"

#include "key.h"

#include "usart.h"

#include

#include "timer.h"

#include "esp8266.h"

#include "mqtt.h"

#include "hc05_Bluetooth.h"

#include "RFID_RC522.h"

#include "motor.h"

 

/*

硬件连接方式:

ATK-HC-05串口蓝牙模块与STM32的串口2相连接。

PA1--LED 配对状态输出; 配对成功输出高电平,未配对则输出低电平。

PA4---KEY 用于进入 AT 状态;高电平有效(悬空默认为低电平)。

PA2--RXD 模块接收脚

PA3--TXD 模块发送脚

GND---GND 地

VCC---VCC 电源(3.3V~5.0V)

ATK-ESP8266串口WIFI模块与STM32的串口3相连接。

PB10--RXD 模块接收脚

PB11--TXD 模块发送脚

GND---GND 地

VCC---VCC 电源(3.3V~5.0V)

RC522射频模块外部的接口:    

*1--SDA <----->PB5--片选脚

*2--SCK <----->PB4--时钟线

*3--MOSI<----->PA12--输出

*4--MISO<----->PA11--输入

*5--悬空

*6--GND <----->GND

*7--RST <----->PA8--复位脚

*8--VCC <----->VCC

ULN2003控制28BYJ-48步进电机接线:

ULN2003接线:

IN4: PC9   d

IN3: PC8   c

IN2: PC7   b

IN1: PC6   a

+  : 5V

-  : GND

*/

 

//腾讯物联网服务器的设备信息

#define MQTT_ClientID "3XM7FNOG4Llock"

#define MQTT_UserName "3XM7FNOG4Llock;12010126;W5WOU;1624006004"

#define MQTT_PassWord "209f8dfc3079a54540aeb4263e99be24c5b0212141d8067e6348036383535941;hmacsha256"

 

//订阅与发布的主题

#define SET_TOPIC  "$thing/down/property/3XM7FNOG4L/lock"  //订阅

#define POST_TOPIC "$thing/up/property/3XM7FNOG4L/lock"  //发布

 

#define CONNECT_WIFI  "CMCC-Cqvn"   //将要连接的路由器名称 --不要出现中文、空格等特殊字符

#define CONNECT_PASS "99pu58cb"     //将要连接的路由器密码

 

#define CONNECT_SERVER_IP "106.55.124.154"  //服务器IP地址

#define CONNECT_SERVER_PORT 1883            //服务器端口号

 

char mqtt_message[200];//上报数据缓存区

 

 

unsigned char SN[4]; //存放读出的卡号

unsigned char CheckSN[4]={71,151,114,179}; //用于验证的卡号--业主的卡号用于开锁

char SendBuff[10];

 

 

/*

函数功能: 打印卡号

*/

void print_info(unsigned char *p,int cnt)

{

  int i;

for(i=0;i {

printf("%d ",p[i]);

}

printf("rn");

}

 

 

/*

函数功能: 读卡号--电子标签的卡号

返回值: 1成功 0失败

*/

int ReadCardNumber(void)

{

    unsigned char CT[2];//卡类型

u8 status=1;

status=RC522_PcdRequest(PICC_REQIDL ,CT);//(寻卡模式,卡类型),成功返回0

if(status==MI_OK)//寻卡成功

{

   status=MI_ERR;

   status=RC522_PcdAnticoll(SN);  //防冲撞,成功返回0,SN是读到卡号的地址

printf("卡类型:");

print_info(CT,2);//打印类型

printf("卡号:");

    print_info(SN,4);//打印卡号

        return 1;

}

    return 0;

}

 

 

int main()

{

    u8 esp8266_state=0;

    u8 key;

    u8 i;

    u32 time_cnt=0;

    u8 ble_connect_flag=0;

    u8 Motor=0; //电机状态

    

    LED_Init();

    KEY_Init();

    USART1_Init(115200);

    RC522_Init(); //RC522 

    Moto_Init();  //步进电机初始化

    USART3_Init(115200);//串口-WIFI

    TIMER3_Init(72,20000); //超时时间20ms

 

    USART1_Printf("正在初始化WIFI请稍等.rn");

    

    for(i=0;i<5;i++)

    {

        if(ESP8266_Init()==0)

        {

           esp8266_state=1;

           break;

        }

        else

        {

            esp8266_state=0;

            USART1_Printf("ESP8266硬件检测错误.n");  

        }

    }

  

   if(esp8266_state)

   {

       printf("准备连接服务器....rn");

       

        //非加密端口

        USART1_Printf("WIFI:%dn",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;

            USART1_Printf("服务器连接失败,正在重试...n");

            delay_ms(500);

        }

        USART1_Printf("服务器连接成功.n");

 

        //3. 订阅主题

        if(MQTT_SubscribeTopic(SET_TOPIC,0,1))

        {

           USART1_Printf("主题订阅失败.n");

        }

        else

        {

           USART1_Printf("主题订阅成功.n");

        } 

   }

 

  /*4. 初始化HC05串口蓝牙*/

    printf("蓝牙正在初始化.........rn");

    USART2_RX_FLAG=0;

    while(HC05_Bluetooth_Init()){}

 

    /*设置当前蓝牙为从机模式---这里设置从机的代码只需要设置一次,后面就可以屏蔽掉了*/

//    HC05_Bluetooth_SetCmd((u8*)"AT+ROLE=0rn"); //设置为从机模式

//    if(HC05_Bluetooth_GetRoleStatus()==0)printf("当前蓝牙处于从机状态!rn");

//    else if(HC05_Bluetooth_GetRoleStatus()==1)printf("当前蓝牙处于主机状态!rn");

//    HC05_Bluetooth_SetCmd((u8*)"AT+RESETrn"); //复位ATK-HC05模块

    DelayMs(1000); //等待蓝牙模块稳定

      

    /*2. 查询蓝牙主从状态*/

    if(HC05_Bluetooth_GetRoleStatus()==0)printf("2 当前蓝牙处于从机状态!rn");

    else if(HC05_Bluetooth_GetRoleStatus()==1)printf("2 当前蓝牙处于主机状态!rn");

    else printf("2 当前蓝牙主从状态查询失败!rn");

 

    /*3. 查看蓝牙连接状态*/

    if(HC05_LED)printf("3 当前蓝牙连接成功!rn");

    else printf("3 当前蓝牙未连接!rn");

 

//    /*4. 设置蓝牙的名称*/

//    if(HC05_Bluetooth_SetCmd((u8*)"AT+NAME=WBYQ_HC-05rn"))printf("4 蓝牙名称设置失败!rn");

//    else printf("4 蓝牙名称设置为 WBYQ_HC-05! rn");

 

//    /*5. 设置蓝牙配对密码*/

//    if(HC05_Bluetooth_SetCmd((u8*)"AT+PSWD=1234rn"))printf("5 蓝牙配对密码设置失败!rn"); //密码必须是4位

//    else printf("5 蓝牙配对密码设置为 1234 rn");

while(1)

{

         //按键可以测试开锁和关锁

        key=KEY_Scan(0);

        if(key==1)

        {

            LED1=0;  //亮灯--表示开锁

            time_cnt=0;

            Motorcw_ring(1,300);   //电机正转1圈

            

            Motor=1;

            //更新微信小程序

            sprintf(mqtt_message,"{"method":"report","clientToken":"123","params":{"Motor":%d}}",Motor);

            MQTT_PublishData(POST_TOPIC,mqtt_message,0);

            USART1_Printf("更新门锁状态:开锁rn");

        }

        else if(key==2)

        {

            LED1=1;  //灭灯--表示关锁

            time_cnt=0;

            Motorccw_ring(1,300);  //电机反转1圈

             Motor=0;

            //更新微信小程序

            sprintf(mqtt_message,"{"method":"report","clientToken":"123","params":{"Motor":%d}}",Motor);

            MQTT_PublishData(POST_TOPIC,mqtt_message,0);

            USART1_Printf("更新门锁状态:关锁rn");   

        } 

 

        DelayMs(10);

        time_cnt++;

        if(time_cnt>=50)

        {

            time_cnt=0;

            LED2=!LED2;

        }

 

        //微信小程序开锁方式: 接收WIFI返回的数据

        if(USART3_RX_FLAG)

        {

            USART3_RX_BUFFER[USART3_RX_CNT]='';

            

    printf("UART3收到数据.....rn");

            //向串口打印微信小程序返回的数据

            for(i=0;i

推荐阅读

史海拾趣

灿科盟(Ckmtw)公司的发展小趣事

作为一家专注于连接器产品的企业,灿科盟始终注重技术创新和产品升级。近年来,公司在LED连接器部件生产领域取得了重要突破,成功打破了国外技术垄断。这一技术突破不仅提升了公司的市场竞争力,也为客户提供了更加优质的产品和服务。同时,公司还加大了对新能源、智能家居等新兴领域的研究和开发力度,以应对市场变化和挑战。

AC Photonics Inc公司的发展小趣事

AC Photonics Inc深知品质是企业生存和发展的关键。因此,公司始终将品质管理放在首位,从原材料采购到生产流程控制,再到产品出厂检验,都严格遵循国际标准和行业规范。同时,公司还注重品牌建设,通过参加行业展会、举办技术研讨会等方式,不断提升品牌知名度和美誉度。这些努力使得AC Photonics Inc的产品在市场上获得了广泛的认可和好评。

ETL semiconductor公司的发展小趣事

英特尔(Intel)的成立与发展与微处理器的发明密不可分。在20世纪70年代初,英特尔的工程师们开始研发一种能够将计算机的中央处理器(CPU)集成到单一芯片上的技术。经过数年的努力,他们成功推出了世界上第一款微处理器——Intel 4004。这一创新不仅改变了计算机行业,也为英特尔的崛起奠定了坚实基础。

FILTRONETICS Inc公司的发展小趣事

进入21世纪后,FILTRONETICS意识到全球化市场的重要性,开始积极开拓国际市场。公司加强了与国际客户的沟通与合作,参加了多个国际电子展会,展示了公司的技术和产品。同时,公司还在海外设立了分支机构,以便更好地服务当地客户。通过不懈的努力,FILTRONETICS成功打入多个国际市场,并赢得了众多国际客户的信赖和支持。

Green Power Solutions公司的发展小趣事
将新的电子管按照原位置和方向安装好,并确保连接牢固可靠。
西安航天民芯公司的发展小趣事

随着公司业务的不断拓展和市场规模的逐步扩大,西安航天民芯吸引了众多投资者的关注。多家知名投资机构纷纷入股公司,为公司的发展提供了强大的资本支持。这些资金的注入不仅加速了公司的技术研发和市场拓展步伐,也为公司的持续发展注入了新的活力。

这五个故事展示了西安航天民芯公司在电子行业中的发展历程和取得的成就。通过不断地技术创新和市场拓展,西安航天民芯已经逐渐成为了电子行业中的领军企业之一,为行业的发展做出了积极的贡献。

问答坊 | AI 解惑

光接入网GPON越显活力

在光接入网领域,应该采用EPON技术还是GPON技术一度成为业界讨论的焦点。其实两种技术本身并不存在孰优孰劣的问题,只是EPON的产业链已经相对成熟,出于对成本的考虑,目前运营商更青睐E PON技术。但GPON的发展势头良好,其完善的标准、明显的技 ...…

查看全部问答>

急!!求助,为什么430的外部晶振不起振??

本帖最后由 paulhyde 于 2014-9-15 09:35 编辑 我程序在运行过程中,突然停止运行,最后发现是8M的晶振没有起振。我为了找原因,用32K的外部晶振发现还是没有起振,换了个8M的晶振还是没有起振。现在急死人了,马上就要交校赛作品了! 哪位 ...…

查看全部问答>

《单片机模糊控制系统设计与应用实例》

《单片机模糊控制系统设计与应用实例》知识是永远都不会落伍的,一起进步,加油!…

查看全部问答>

信号跨越两个时钟域外文资料

A signal to another clock domainLet\'s say a signal from clkA domain is needed in clkB domain. It needs to be \"synchronized\" to clkB domain, so we want to build a \"synchronizer\" design, which takes a signal from clkA domain, a ...…

查看全部问答>

修改S3C6410立宇泰的EBOOT启动画面出现蓝屏

最近在整EBOOT,先想修改下启动画面,然后自己就修改了InitialImage_rgb16_320x240.h,仅仅只是把其中的0XFFFFFFFF全部换成了0X00000000,然后重新刷新了EBOOT,结果开机总是出现蓝屏,即使是把修改的地方还原都已经不能改回来了。 反复试了几次还 ...…

查看全部问答>

2440官方bsp移植问题的建议!!

经过几周的努力nk终于成功下载进去了。并且显示wince桌面了,触摸屏也可以用了?但是突然间不知道下面怎么做了,我知道驱动还要调试?但是我不知道是什么顺序,可以这样说我迷茫了,不知道从那下手了?是不是应该从文件系统开始呢》还是什么??韦 ...…

查看全部问答>

vxworks bootrom 编译问题

请问谁知道bootrom编译的时候,同样的代码,编译两次,编译出来的bin大小为什么会不一样? make bootrom.bin 第一次编译结果是: bootrom: 17024(t) + 74800(d) = 91824 (432464 unused) 不作任何代码改动。 make clean make bootrom.bin 第 ...…

查看全部问答>

请问版主STM8S的防震能力怎么样?

最近使用STM8S903K3的产品在跌落/球击测试中有几台出问题,跌完之后发现MCU的VDD与VSS短路或者阻抗变得很小,完全没法开机,换一个新的芯片就一切正常了。以前用freescale的JL8/FL8都完全没有这方面的问题。 请问这个芯片的抗震有这么差吗? ...…

查看全部问答>

求助,想做一个AVR ISP下载线

前段时间才知道AVR的下载线分ASP和ISP, 发现我买的是ASP,不能串口通信,当时图不用装驱动悲剧了啊 刚好实验室找了块atmega8,所以想自已做个下载线, 网上找了个电器图感觉可以再简化点,大神看看那些可以简化的 晶振上的C8和C9两个电容是可 ...…

查看全部问答>