Ycr's Blog
喜欢你的人一直有空,什么都懂,无所不能。
Ycr's Blog

如何使用 Arduino Mega 2560 实现一个家庭智能安防门锁?

说明视频见我的 Bilibili

创作灵感

       新冠肺炎疫情发生以来,习近平总书记高度重视,多次主持召开会议对疫情防控工作进行研究部署,并对如何发挥社区在疫情防控中的作用提出明确要求。习近平总书记指出,要压实地方党委和政府责任,强化社区防控网格化管理,实施地毯式排查,采取更加严格、更有针对性、更加管用有效的措施,防止疫情蔓延。

       本人以社区和家庭疫情防控为出发点,设计了一款智慧防疫门禁系统。本次设计的作品能够实现刷卡,蓝牙开锁等方式开启家庭门锁,同时实时监测人的体温,贴心的提示外出回家的人员消毒。防止体温过热人员回家接触家人,造成病情蔓延。

       这样一个可以让人们在享受智慧家居便利性的同时,又能监测健康状况的智慧防疫门禁系统,能够很好地配合社区疫情防控,做好家庭防疫工作。

设计思路

       这是一种无接触式的门锁,自然就要用到现在成熟的无线技术了。在这种小型门锁中,蓝牙技术再好不过了。再利用RFID-RC522模块,也能实现NFC通信。

        疫情期间,大家对自己的健康也有极大的要求。家庭门锁也要实时监控自己的体温以及客人的体温。如果你的体温超过37.3摄氏度,那智能门锁也会利用LED灯以及蜂鸣器来警告你,同时也会紧闭门锁,做好疫情防控第一步。

       直观的设计思路以及功能原理图如图1所示:

https://s3.ax1x.com/2021/03/05/6mBbGD.png

图1 设计思路及功能原理图

硬件一览

主控板:

Arduino Mega 2560 *1

配件:

RFID-RC522模块 *1

DX-BT05蓝牙模块 *1

FL-3FF-S-Z继电器模块 *1

蜂鸣器 *1

电磁锁 *1

LED *3

220Ω电阻 *3

接线图

模块名称模块针脚Aruduino Mega针脚
Relay ModeVCC5V
Relay ModeGNDGND
Relay ModeIND5
RFID-RC522IRQD10
RFID-RC522SCKD8
RFID-RC522MOSID9
RFID-RC522MISOD11
RFID-RC522SDAD7
RFID-RC522RSTD12
RFID-RC5223.3V3.3V
RFID-RC522GNDGND
BuzzerGNDGND
BuzzerVCC5V
BuzzerI/OD2
DX-BT05GNDGND
DX-BT05VCC5V
DX-BT05TXRX
DX-BT05RXTX
DX-BT05EN5V
mlx90614GNDGND
mlx90614VCCVCC
mlx90614SDASDA
mlx90614SCLSCL
LED-RedGNDGND
LED-RedVCC220Ω电阻端
LED-YellowGNDGND
LED-YellowVCC220Ω电阻端
LED-GreenGNDGND
LED-GreenVCC220Ω电阻端
220Ω电阻一端5V
220Ω电阻另一端LED

仿真接线图如下

https://s3.ax1x.com/2021/03/05/6mBHPO.png

图2 仿真接线图

制作过程

  1. 准备木板,设计家庭木门外观:
    • 使用切割机切割木板,得到前门和侧门
    • 在前门中间安装电磁锁
https://s3.ax1x.com/2021/03/05/6mBIVx.jpg
  1. 门板正面外观和组装设计:
    • 使用电钻钻出三个LED发光二极管
    • 在门板上沿安装红外温度检测模块
    • 在门板上沿安装LCD液晶显示屏
    • 在门板右上角画门禁图案
https://s3.ax1x.com/2021/03/05/6mBoa6.jpg
  1. 门板背面外观和组装设计
    • 安装电池盒和继电器开关
    • 安装Arduino电路板
    • 安装门禁卡
https://s3.ax1x.com/2021/03/05/6mBTIK.jpg
  1. 组装木板以及组接各个模块
    • 将木板前门和侧边墙壁组装
    • 接线并通电
https://s3.ax1x.com/2021/03/05/6mBqRe.jpg
  1. 测试各个模块功能以及两种开锁方式
    • IC门禁卡开锁
    • 手机蓝牙开锁

https://s3.ax1x.com/2021/03/05/6mBLxH.jpg

https://s3.ax1x.com/2021/03/05/6mBXMd.jpg

成品外观

https://s3.ax1x.com/2021/03/05/6mBjsA.jpg

图3 成品外观正面

https://s3.ax1x.com/2021/03/05/6mBzZt.jpg

图4 成品外观侧面

https://s3.ax1x.com/2021/03/05/6mBvqI.jpg

图5 成品外观背面

https://s3.ax1x.com/2021/03/05/6mDSdP.jpg

图6 成品外观俯视图

使用说明

       这个家庭智能门锁提供多种开锁方式,你可以使用IC卡或者手机蓝牙打开他它。

       门锁上有三个LED灯,若红灯常亮即为待机状态;绿灯亮起,蜂鸣器鸣叫两声,表示锁已打开;黄灯闪烁两次,蜂鸣器鸣叫三声,表示体温过高;红绿黄三灯亮起,蜂鸣器长鸣,即表示密码错误。

       当你想要使用IC卡进行开锁操作,仅需将正确的IC卡放置到读卡区域,IC卡读到后,将会自动打开。使用蓝牙开锁时,仅需连接上Smart-lock蓝牙,通过串口发送密码,即可打开门锁。

代码

#include"rfid1.h" //调用读卡器模块库文件
#include "Adafruit_MLX90614.h" //调用温度传感器库文件
#include "LiquidCrystal_I2C.h" //调用LCD库文件
#include <Wire.h> //调用库文件
#define uchar unsigned char
#define uint  unsigned int
#define ull unsigned long long
#define Red  45
#define Green 47
#define Yellow 49
#define Buzzer 2
#define Relay 5
#define IRQ 10
#define SCK 8
#define MOSI 9
#define MISO 11
#define SDA 7
#define RST 12 //接口定义 详情见说明文档接线图
RFID1 rfid;
Adafruit_MLX90614 mlx = Adafruit_MLX90614(); //测温模块初始化
LiquidCrystal_I2C lcd(0x27,16,2); //lcd模块初始化
uchar serNum[5];
uchar a;
uint b; 
double tem; //一些用于记录数据的变量 数组
void setup() //初始化函数
{
  Serial.begin(9600); //电脑(测试)串口初始化
  Serial2.begin(9600); //蓝牙模块串口初始化
  pinMode(Buzzer,OUTPUT);
  pinMode(Relay,OUTPUT); 
  pinMode(Red,OUTPUT);
  pinMode(Yellow,OUTPUT);
  pinMode(Green,OUTPUT); //IO引脚声明
  rfid.begin(IRQ,SCK,MOSI,MISO,SDA,RST); //RFID模块引脚声明
  mlx.begin(); //温度计初始化
  rfid.init(); //RFID初始化
  lcd.init(); //lcd模块初始化
  lcd.backlight(); //lcd模块背光
  lcd.print("   Smart-lock   "); //lcd输出
}
void TEM() //测温函数
{
  Serial.println(mlx.readObjectTempC()+5); //调试串口输出
  tem=mlx.readObjectTempC()+5; //常量赋值
  return tem+5; //返回读取的温度值
}
void open() //开门函数
{
  if(tem<=37.3) //如果体温不超过37.3摄氏度,即可开门
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Temperature OK");
    lcd.setCursor(0,1);
    lcd.print("Temp is: ");
    lcd.print(tem);
    lcd.print("*C"); //lcd输出
    Serial.println("Temperature OK"); //调试串口输出
    Serial2.println("Temperature OK"); //蓝牙串口输出
    Serial.print("Turn on."); //调试串口输出
    Serial2.print("Turn on."); //蓝牙串口输出
    digitalWrite(Red,LOW);
    digitalWrite(Green,HIGH);
    digitalWrite(Relay,LOW);
    digitalWrite(Buzzer,LOW); //绿灯亮起,并打开电磁锁(继电器)
    delay(100);
    digitalWrite(Buzzer,HIGH);
    delay(100);
    digitalWrite(Buzzer,LOW);
    delay(100);
    digitalWrite(Buzzer,HIGH); //蜂鸣器鸣叫两声,代表锁已开
    digitalWrite(Relay,HIGH); //锁关闭
    digitalWrite(Green,LOW);
    digitalWrite(Red,HIGH); //红灯重新亮起
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("   Smart-lock   "); //lcd输出
    Serial.print("Turn off."); //调试串口输出
    Serial2.print("Turn off."); //蓝牙串口输出
  }
  else //体温超过37.3摄氏度
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Temperature HIGH");
    lcd.setCursor(0,1);
    lcd.print("Temp is: ");
    lcd.print(tem);
    lcd.print("*C"); //lcd输出
    Serial.println("Temperature HIGH"); //调试串口输出
    Serial2.println("Temperature HIGH"); //蓝牙串口输出
    digitalWrite(Red,LOW);
    digitalWrite(Yellow,HIGH);
    delay(100);
    digitalWrite(Yellow,LOW);
    delay(100);
    digitalWrite(Yellow,HIGH);
    delay(100);
    digitalWrite(Yellow,LOW);
    digitalWrite(Red,HIGH); //黄灯闪烁两次,红灯重新亮起
    digitalWrite(Buzzer,LOW);
    delay(100);
    digitalWrite(Buzzer,HIGH);
    delay(100);
    digitalWrite(Buzzer,LOW);
    delay(100);
    digitalWrite(Buzzer,HIGH);
    delay(100);
    digitalWrite(Buzzer,LOW);
    delay(100);
    digitalWrite(Buzzer,HIGH); //蜂鸣器鸣叫三声,表示温度过高
    lcd.clear();
    lcd.print("   Smart-lock   "); //lcd输出
  }
}
void loop() //主循环函数
{
  uchar status;
  uchar str[MAX_LEN];
  digitalWrite(Relay,HIGH);
  digitalWrite(Buzzer,HIGH);
  digitalWrite(Red,HIGH);
  digitalWrite(Yellow,LOW);
  digitalWrite(Green,LOW); //初始化
  TEM(); //测温
  status = rfid.request(PICC_REQIDL, str);
  rfid.showCardType(str);
  status=rfid.anticoll(str);
  if(status==MI_OK)
  {
    Serial.print("The card's number is: "); //调试串口输出
    memcpy(serNum,str,SCK);
    rfid.showCardID(serNum);
    Serial.println();
    Serial.println();
  }
  uchar* id=serNum; //读取卡的ID  
  if(Serial2.available()>0)  //如果蓝牙模块串口有读到信息
  {
    a=Serial2.read(); //蓝牙串口读取
    b=1; //一个用于记录是否执行的变量
  }
  if(id[0]==0xCA && id[1]==0xD9 && id[2]==0xF0 && id[3]==0x3F) //如果读到了正确的卡
  {
    open(); //执行开门函数
    for(int i=0;i<=3;i++) id[i]=0; //初始值返回0
    for(int i=0;i<=3;i++) serNum[i]=0; //初始值返回0
  }
  else //如果不是正确的卡
  {
    if(status==MI_OK) //且有读到卡,执行不开门
    {
      lcd.clear();
      lcd.println("Password Error");  //lcd输出
      digitalWrite(Yellow,HIGH);
      digitalWrite(Green,HIGH);
      digitalWrite(Buzzer,LOW); //红黄蓝三灯常亮,蜂鸣器响起
      delay(3000);
      digitalWrite(Buzzer,HIGH);
      digitalWrite(Yellow,LOW);
      digitalWrite(Green,LOW); //灯熄灭,蜂鸣器停止,代表密码错误
      lcd.clear();
      lcd.print("   Smart-lock   ");  //lcd输出
    }
  }
  if(a=='a') //如果蓝牙串口读到密码
  {
    b=0; //记录的变量值归零
    open(); //执行开门函数
  }
  else //若密码错误
  {
    if(b==1) //且有接收到数据,执行不开门
    {
      lcd.clear();
      lcd.println("Password Error");  //lcd输出
      digitalWrite(Yellow,HIGH);
      digitalWrite(Green,HIGH);
      digitalWrite(Buzzer,LOW); //红黄蓝三灯常亮,蜂鸣器响起
      delay(3000);
      digitalWrite(Buzzer,HIGH);
      digitalWrite(Yellow,LOW);
      digitalWrite(Green,LOW); //灯熄灭,蜂鸣器停止,代表密码错误
      lcd.clear(); 
      lcd.println("Password Error");  //lcd输出
    }
  }
  rfid.halt(); //RFID-RC522重置
}

# #
首页      硬件设计      如何使用 Arduino Mega 2560 实现一个家庭智能安防门锁?

发表回复

textsms
account_circle
email

Ycr's Blog

如何使用 Arduino Mega 2560 实现一个家庭智能安防门锁?
说明视频见我的 Bilibili 创作灵感        新冠肺炎疫情发生以来,习近平总书记高度重视,多次主持召开会议对疫情防控工作进行研究部署,并对如何发挥社区在疫情防控中的作用提出明确要…
扫描二维码继续阅读
2021-02-13