说明视频见我的 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 仿真接线图
制作过程
- 准备木板,设计家庭木门外观:
- 使用切割机切割木板,得到前门和侧门
- 在前门中间安装电磁锁
- 门板正面外观和组装设计:
- 使用电钻钻出三个LED发光二极管
- 在门板上沿安装红外温度检测模块
- 在门板上沿安装LCD液晶显示屏
- 在门板右上角画门禁图案
- 门板背面外观和组装设计
- 安装电池盒和继电器开关
- 安装Arduino电路板
- 安装门禁卡
- 组装木板以及组接各个模块
- 将木板前门和侧边墙壁组装
- 接线并通电
- 测试各个模块功能以及两种开锁方式
- IC门禁卡开锁
- 手机蓝牙开锁
成品外观
图3 成品外观正面
图4 成品外观侧面
图5 成品外观背面
图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重置
}