很多时候,我们需要在家里或办公室(可能是秘密的 dexter 实验室)设置一个房间,这样任何人都无法在未经我们许可的情况下进入房间,并确保防止我们的重要配件和资产被盗或丢失。今天有很多类型的安全系统,但在幕后,它们都依靠指纹、视网膜扫描仪、虹膜扫描仪、面部识别码、舌头扫描仪、RFID 阅读器、密码、密码、图案等进行身份验证。关闭所有解决方案低成本的一种是使用密码或基于密码的系统。因此,在这个项目中,我构建了一个Arduino 键盘门锁,它可以安装到您现有的任何门上,以使用数字密码保护它们。
在构建我们的密码门锁项目之前,首先,我们需要收集所需的组件,然后继续执行逐步构建过程。
组件列表
使用 Atmega 328p 微控制器的 Arduino Uno/Pro/Mini 或定制板
16 x 2 LCD(液晶显示器)
用于 Arduino 的 4 x 3 或 4 x 4 矩阵键盘
伺服电机
3D打印门储物柜/定制门储物柜
1 安培 5 伏移动充电器电源的附加组件
4‘’ / 6‘’塑料盒、跳线、螺母螺栓、塑料外壳等
Arduino键盘门锁电路图
我们基于 Arduino 的数字键盘门锁项目的完整电路图如下所示。
首先,我们从这个项目的大脑开始,即 Arduino UNO 板。Arduino 板连接到 LCD 和伺服电机。伺服电机用于推动(锁定)或拉动(解锁)门上的闩锁。Arduino 需要一个 16 x 2 的 LCD 来显示消息,16 x 2 意味着它有 16 列和 2 行。
在这里,我使用 5v Towerpro SG90伺服电机来制作我们定制的门锁。它是一款基础级伺服电机,无需任何驱动电路或外部模块即可与 Arduino 配合使用。此外,这种伺服电机的成本非常低,因此您可以轻松购买。
在这个项目中,我使用了一个 4 x 4 矩阵键盘(但 4 x 4 键盘部分在 fritzing 中无法用于制作此图形表示),但不要担心,因为 4 x 3 矩阵键盘也适用于我的编码。 我们需要一个用于输入密码的键盘并手动锁定我们定制的门锁。它由 16 个按键(软开关)组成 4 个按键在行(R1、R2、R3、R4)和 4 个按键在列(C1、C2、C3、C4) 当一个按键被按下时,它在相应的行之间建立连接和列。下表显示了如何将您的 Arduino 与键盘连接。
用于数字键盘门锁的 Arduino 代码
完整的 Arduino 门锁代码可在本页底部找到。您可以直接上传代码,但建议阅读以下段落以了解代码的工作原理。此外,确保您已将以下键盘库添加到您的 Arduino IDE 以成功编译代码,这一点很重要。为此,只需打开下面的链接并下载 ZIP 文件。然后在您的 Arduino IDE 上导航到 Sketch -》 Include Library -》 Add.ZIP Library 并浏览您刚刚下载的文件。
插入所有头文件和库文件后,为 LCD 分配所有引脚并定义密码长度并将伺服的初始位置设置为 0。之后,采用“char”数据类型来声明可以容纳它的数字,包括空字符。
//#include#include#include 伺服myservo; 液晶液晶(A0、A1、A2、A3、A4、A5); #define Password_Lenght 7 // 为六个字符提供足够的空间 + NULL 字符 整数位置 = 0;// 存储伺服位置的变量 字符数据[密码长度];// 6 是它可以容纳的字符数 + 空字符 = 7 char Master[Password_Lenght] = "123456";
用这段代码 (char Master[Password_Lenght] = "123456";) -- 在 Char Master 下,我声明了门锁的密码,然后分配键盘的行数和列数,同时声明 keyMaps 并连接与行和列。在 void setup 下,初始化舵机信号管脚 D9,舵机状态关闭,并在 LCD 开机时间延迟 3 秒打印项目/设备/公司名称。
无效设置() { myservo.attach(9); 伺服关闭(); lcd.begin(16, 2); lcd.print("Arduino 门"); lcd.setCursor(0, 1); lcd.print("--看项目--"); 延迟(3000); lcd.clear(); }
在循环函数下,有简单的 if-else 条件。根据状态(自动上锁),延迟3秒打印“门已关闭”,舵机旋转到关闭位置,门数据计为1,否则门锁保持打开状态,数据计0,舵机打开旋转到0度到 180 度,关闭它从 180 到 0。伺服打开和伺服关闭功能如下所示。
无效伺服打开() { for (pos = 180; pos >= 0; pos -= 5) { // 从 0 度变为 180 度 // 以 1 度为单位 myservo.write(pos); // 告诉伺服器转到变量 'pos' 中的位置 延迟(15);// 等待 15ms 让舵机到达位置 } } 无效伺服关闭() { for (pos = 0; pos <= 180; pos += 5) { // 从 180 度变为 0 度 myservo.write(pos); // 告诉伺服器转到变量 'pos' 中的位置 延迟(15);// 等待 15ms 让舵机到达位置 } }
延迟 15 秒写入舵机位置以到达舵机位置。在 void open 功能下,在 LCD 上打印“输入密码”,然后条件指定输入的密码应该与自定义密钥相同,在此正文中数据计数并将 char 存储到数据数组中,如果数据长度(密钥数量)和输入密码与数据主控(存在预定义密钥)匹配。然后作为一个动作 LCD 清零,伺服驱动,在 LCD 上打印“Door is open”,数据计数器清零。
如果输入的密钥与 Data Master 不匹配,作为 LCD 上的操作,在 LCD 上清除打印“错误密码”以延迟 1 秒通知并保持在其锁定位置,数据计数器设置为 1,并在循环中继续此过程.
if (data_count == Password_Lenght - 1) // 如果数组索引等于预期字符数,则将数据与 master 进行比较 { if (!strcmp(Data, Master)) // 等于 (strcmp(Data, Master) == 0) { lcd.clear(); 伺服打开(); lcd.print("门开着"); 门 = 0; } 别的 { lcd.clear(); lcd.print("密码错误"); 延迟(1000); 门 = 1; } 清除数据(); }
Arduino 键盘门锁组装和测试
现在,把所有东西都装在一个 4 英寸/ 6 英寸的塑料盒上,并用移动充电器为其供电,用外壳很好地排列所有东西。理想情况下,我可以用 3D 打印来组装我的锁,但是在设计完我的文件后,我发现 3D 打印非常昂贵,所以我只是先固定了舵机,然后用金属板将普通的滑动锁与我的舵机连接并覆盖它用玻璃纤维制成,虽然它工作正常,但不太安全。
如果您想要更高的安全性,那么您必须打印一个在内部与该伺服系统配合使用的 3D 门锁模型。如果您可以使用 3D 打印机,您可以从下面的链接下载所需的 STL 文件并进行 3D 打印。
设计文件也显示在下图中。
在项目开始时,我们第一次启动它的那一刻,我们需要给项目名称(您也可以显示公司名称),以便它看起来像商业设备一样智能和独特(如您在下图)。
延时 3 秒,快速锁上门,直接查看显示屏上的门锁状态,如下图所示。
当您按“#”键手动锁门时,首先显示门已关闭1 秒钟,然后显示输入密码。另一方面,当输入正确密码解锁门时,显示Door is Open。
如果门保持解锁状态,它会显示 - 只要您根据编码手动锁定门,门就会打开。我已经给出了代码,您可以根据需要通过更改代码显示参数来自定义设置。
#include
#include
#include
Servo myservo;
液晶液晶(A0、A1、A2、A3、A4、A5);
#define Password_Lenght 7 // 为六个字符提供足够的空间 + NULL char
int pos = 0; // 存储伺服位置的变量
char Data[Password_Lenght]; // 6 是它可以容纳的字符数 + null char = 7
char Master[Password_Lenght] = "123456";
字节data_count = 0,master_count = 0;
布尔 Pass_is_good;
字符自定义键;
常量字节 ROWS = 4;
常量字节 COLS = 3;
字符键[ROWS][COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '
布尔门=真;
字节 rowPins[ROWS] = {1, 2, 3, 4}; //连接到键盘
字节 colPins[COLS] = {5, 6, 7} 的行引脚;//连接到键盘的列引脚
Keypad customKeypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS); //初始化类NewKeypad的一个实例
void setup()
{
myservo.attach(9);
伺服关闭();
lcd.begin(16, 2);
lcd.print("Arduino 门");
lcd.setCursor(0, 1);
lcd.print("--看项目--");
延迟(3000);
lcd.clear();
}
void loop()
{
if (door == 0)
{
customKey = customKeypad.getKey();
if (customKey == '#')
{
lcd.clear();
伺服关闭();
lcd.print("门已关闭");
延迟(3000);
门 = 1;
}
}
否则打开();
}
void clearData()
{
while (data_count != 0)
{ // 这可以用于任何数组大小,
Data[data_count--] = 0; //清除新数据的数组
}
return;
}
void ServoOpen()
{
for (pos = 180; pos >= 0; pos -= 5) { // 从 0 度到 180 度
// 以 1 度为步长
myservo.write(pos); // 告诉伺服器转到变量 'pos' 中的位置
延迟(15);// 等待 15ms 让舵机到达位置
}
}
void ServoClose()
{
for (pos = 0; pos <= 180; pos += 5) { // 从 180 度转到 0 度
myservo.write(pos) ;
// 告诉伺服器在变量 'pos' delay(15)中到达位置;// 等待 15ms 让舵机到达位置
}
}
void Open()
{
lcd.setCursor(0, 0);
lcd.print("输入密码");
customKey = customKeypad.getKey();
if (customKey) // 确保一个键被实际按下,等于 (customKey != NO_KEY)
{
数据[data_count] = customKey;// 将字符存入数据数组
lcd.setCursor(data_count, 1); // 移动光标以显示每个新字符
lcd.print(Data[data_count]); // 在光标处打印字符
data_count++; // 将数据数组加 1 以存储新字符,同时跟踪输入的字符数
}
if (data_count == Password_Lenght - 1) // 如果数组索引等于预期字符数,则将数据与 master 进行比较
{
if (!strcmp(Data, Master)) // 等于 (strcmp(Data, Master) == 0)
{
lcd.clear();
伺服打开();
lcd.print("门开着");
门 = 0;
}
lcd.clear();
lcd.print("密码错误");
延迟(1000);
门 = 1;
}
清除数据();
}
其他
{}