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

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

说明视频见我的 Bilibili

创作灵感

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

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

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

设计思路

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

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

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

图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 Mode VCC 5V
Relay Mode GND GND
Relay Mode IN D5
RFID-RC522 IRQ D10
RFID-RC522 SCK D8
RFID-RC522 MOSI D9
RFID-RC522 MISO D11
RFID-RC522 SDA D7
RFID-RC522 RST D12
RFID-RC522 3.3V 3.3V
RFID-RC522 GND GND
Buzzer GND GND
Buzzer VCC 5V
Buzzer I/O D2
DX-BT05 GND GND
DX-BT05 VCC 5V
DX-BT05 TX RX
DX-BT05 RX TX
DX-BT05 EN 5V
mlx90614 GND GND
mlx90614 VCC VCC
mlx90614 SDA SDA
mlx90614 SCL SCL
LED-Red GND GND
LED-Red VCC 220Ω电阻端
LED-Yellow GND GND
LED-Yellow VCC 220Ω电阻端
LED-Green GND GND
LED-Green VCC 220Ω电阻端
220Ω电阻 一端 5V
220Ω电阻 另一端 LED

仿真接线图如下

图2 仿真接线图

制作过程

  1. 准备木板,设计家庭木门外观:
    • 使用切割机切割木板,得到前门和侧门
    • 在前门中间安装电磁锁

  1. 门板正面外观和组装设计:
    • 使用电钻钻出三个LED发光二极管
    • 在门板上沿安装红外温度检测模块
    • 在门板上沿安装LCD液晶显示屏
    • 在门板右上角画门禁图案

  1. 门板背面外观和组装设计
    • 安装电池盒和继电器开关
    • 安装Arduino电路板
    • 安装门禁卡

  1. 组装木板以及组接各个模块
    • 将木板前门和侧边墙壁组装
    • 接线并通电

  1. 测试各个模块功能以及两种开锁方式
    • IC门禁卡开锁
    • 手机蓝牙开锁


成品外观

图3 成品外观正面

图4 成品外观侧面

图5 成品外观背面

图6 成品外观俯视图

使用说明

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

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

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

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#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重置
}

 评论