基于STM32F103设计的智能门锁(支持多种开锁解锁方式)

发布时间:2024-09-18  

一、环境介绍

编程软件: keil5

主控MCU: STM32F103ZET6

射频卡读写器:RFID-RC522

步进电机: 28BYJ4 4相5线

蓝牙: ATK-HC05

WIFI: ATK-ESP8266

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


二、功能介绍

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

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

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

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

如果没有使用过腾讯云物联网平台的,可以看这里:STM32+ESP8266+MQTT协议连接腾讯物联网开发平台_DS小龙哥的专栏-CSDN博客_腾讯物联网平台

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

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

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png


poYBAGDYdXCAWkKMAAAAK8RNs4s030.png


三、使用的相关硬件介绍

3.1 STM32F103ZET6系统板


poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3.2 HC05蓝牙模块


poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3.3 WIFI模块


poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3.4 RFID-RC522模块


poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3.5 步进电机


poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

四、腾讯物联网平台

没有使用过物联网云平台的参考这里:STM32+ESP8266+MQTT协议连接腾讯物联网开发平台_DS小龙哥的专栏-CSDN博客_腾讯物联网平台

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png


poYBAGDYdXCAWkKMAAAAK8RNs4s030.png


poYBAGDYdXCAWkKMAAAAK8RNs4s030.png


五、设备核心源码

#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=50)

        {

            time_cnt=0;

            LED2=!LED2;

        }

 

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

        if(USART3_RX_FLAG)

        {

            USART3_RX_BUFFER[USART3_RX_CNT]='';

            

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

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

            for(i=0;i5)

            {

                //使用字符串查找函数

                //开锁

                if(strstr((char*)&USART3_RX_BUFFER[5],''Motor':1'))

                {

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

                     //开锁

                    //执行开锁代码--电机正转

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

                     Motor=1;

                }

                //关锁

                else if(strstr((char*)&USART3_RX_BUFFER[5],''Motor':0'))

                {

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

                    

                    //关锁

                    //执行开锁代码--电机反转

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

                   Motor=0;

                }

            }

           

            USART3_RX_CNT=0;

            USART3_RX_FLAG=0;

        }

   //RC522开锁方式:  读取IC卡号

        if(ReadCardNumber())

        {

            sprintf(SendBuff,'%x%x%x%xrn',SN[0],SN[1],SN[2],SN[3]);

             

            //比较卡号是否是业主的卡号,决定是否需要开锁

            int i=0;

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

            {

                if(CheckSN[i]!=SN[i])break;

            }

            

            //如果是业主,就开锁

            if(i==4)

            {

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

                

                //更新微信小程序

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

                MQTT_PublishData(POST_TOPIC,mqtt_message,0);

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

                 

                 Motor=1;

                 //执行开锁代码--电机正转

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

            }

        }

        

        

        if(USART2_RX_FLAG)

        {

            USART2_RX_BUFFER[USART2_RX_CNT]='';

            USART1_Printf('蓝牙:%srn',USART2_RX_BUFFER);

            USART2_RX_CNT=0;

            USART2_RX_FLAG=0;

        }

        

        //蓝牙解锁方式: 离开范围就自动关锁   连接上就自动解锁

        // 区分业主身份方式: 使用蓝牙的配对密码区分.

        if(HC05_LED==1 && Motor==0) //关锁状态才需要开始

        {

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

            ble_connect_flag=1; //表示蓝牙已经连接过

            printf('蓝牙已经连接.rn');

             Motor=1;

            

            //更新微信小程序

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

            MQTT_PublishData(POST_TOPIC,mqtt_message,0);

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

            

              //开锁

            //执行开锁代码--电机正转

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

        }      

        else

        {

            //之前蓝牙连接过

            if(ble_connect_flag)

            {

                ble_connect_flag=0; //清除标记

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

                printf('蓝牙已经断开.rn');

                Motor=0;

                //关锁

                //执行开锁代码--电机反转

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


                //更新微信小程序

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

                MQTT_PublishData(POST_TOPIC,mqtt_message,0);

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

            }   

        }

}

}

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>