很多時(shí)候,我們需要在家里或辦公室(可能是秘密的 dexter 實(shí)驗(yàn)室)設(shè)置一個(gè)房間,這樣任何人都無(wú)法在未經(jīng)我們?cè)S可的情況下進(jìn)入房間,并確保防止我們的重要配件和資產(chǎn)被盜或丟失。今天有很多類型的安全系統(tǒng),但在幕后,它們都依靠指紋、視網(wǎng)膜掃描儀、虹膜掃描儀、面部識(shí)別碼、舌頭掃描儀、RFID 閱讀器、密碼、密碼、圖案等進(jìn)行身份驗(yàn)證。關(guān)閉所有解決方案低成本的一種是使用密碼或基于密碼的系統(tǒng)。因此,在這個(gè)項(xiàng)目中,我構(gòu)建了一個(gè)Arduino 鍵盤門鎖,它可以安裝到您現(xiàn)有的任何門上,以使用數(shù)字密碼保護(hù)它們。
在構(gòu)建我們的密碼門鎖項(xiàng)目之前,首先,我們需要收集所需的組件,然后繼續(xù)執(zhí)行逐步構(gòu)建過(guò)程。
組件列表
使用 Atmega 328p 微控制器的 Arduino Uno/Pro/Mini 或定制板
16 x 2 LCD(液晶顯示器)
用于 Arduino 的 4 x 3 或 4 x 4 矩陣鍵盤
3D打印門儲(chǔ)物柜/定制門儲(chǔ)物柜
1 安培 5 伏移動(dòng)充電器電源的附加組件
4‘’ / 6‘’塑料盒、跳線、螺母螺栓、塑料外殼等?
Arduino鍵盤門鎖電路圖
我們基于 Arduino 的數(shù)字鍵盤門鎖項(xiàng)目的完整電路圖如下所示。
首先,我們從這個(gè)項(xiàng)目的大腦開(kāi)始,即 Arduino UNO 板。Arduino 板連接到 LCD 和伺服電機(jī)。伺服電機(jī)用于推動(dòng)(鎖定)或拉動(dòng)(解鎖)門上的閂鎖。Arduino 需要一個(gè) 16 x 2 的 LCD 來(lái)顯示消息,16 x 2 意味著它有 16 列和 2 行。
在這里,我使用 5v Towerpro SG90伺服電機(jī)來(lái)制作我們定制的門鎖。它是一款基礎(chǔ)級(jí)伺服電機(jī),無(wú)需任何驅(qū)動(dòng)電路或外部模塊即可與 Arduino 配合使用。此外,這種伺服電機(jī)的成本非常低,因此您可以輕松購(gòu)買。
在這個(gè)項(xiàng)目中,我使用了一個(gè) 4 x 4 矩陣鍵盤(但 4 x 4 鍵盤部分在 fritzing 中無(wú)法用于制作此圖形表示),但不要擔(dān)心,因?yàn)?4 x 3 矩陣鍵盤也適用于我的編碼。 我們需要一個(gè)用于輸入密碼的鍵盤并手動(dòng)鎖定我們定制的門鎖。它由 16 個(gè)按鍵(軟開(kāi)關(guān))組成 4 個(gè)按鍵在行(R1、R2、R3、R4)和 4 個(gè)按鍵在列(C1、C2、C3、C4) 當(dāng)一個(gè)按鍵被按下時(shí),它在相應(yīng)的行之間建立連接和列。下表顯示了如何將您的 Arduino 與鍵盤連接。
用于數(shù)字鍵盤門鎖的 Arduino 代碼
完整的 Arduino 門鎖代碼可在本頁(yè)底部找到。您可以直接上傳代碼,但建議閱讀以下段落以了解代碼的工作原理。此外,確保您已將以下鍵盤庫(kù)添加到您的 Arduino IDE 以成功編譯代碼,這一點(diǎn)很重要。為此,只需打開(kāi)下面的鏈接并下載 ZIP 文件。然后在您的 Arduino IDE 上導(dǎo)航到 Sketch -》 Include Library -》 Add.ZIP Library 并瀏覽您剛剛下載的文件。
插入所有頭文件和庫(kù)文件后,為 LCD 分配所有引腳并定義密碼長(zhǎng)度并將伺服的初始位置設(shè)置為 0。之后,采用“char”數(shù)據(jù)類型來(lái)聲明可以容納它的數(shù)字,包括空字符。
?
//#include#include #include <伺服.h> 伺服myservo; 液晶液晶(A0、A1、A2、A3、A4、A5); #define Password_Lenght 7 // 為六個(gè)字符提供足夠的空間 + NULL 字符 整數(shù)位置 = 0;// 存儲(chǔ)伺服位置的變量 字符數(shù)據(jù)[密碼長(zhǎng)度];// 6 是它可以容納的字符數(shù) + 空字符 = 7 char Master[Password_Lenght] = "123456";
?
用這段代碼 (char Master[Password_Lenght] = "123456";) -- 在 Char Master 下,我聲明了門鎖的密碼,然后分配鍵盤的行數(shù)和列數(shù),同時(shí)聲明 keyMaps 并連接與行和列。在 void setup 下,初始化舵機(jī)信號(hào)管腳 D9,舵機(jī)狀態(tài)關(guān)閉,并在 LCD 開(kāi)機(jī)時(shí)間延遲 3 秒打印項(xiàng)目/設(shè)備/公司名稱。
?
無(wú)效設(shè)置() { myservo.attach(9); 伺服關(guān)閉(); lcd.begin(16, 2); lcd.print("Arduino 門"); lcd.setCursor(0, 1); lcd.print("--看項(xiàng)目--"); 延遲(3000); lcd.clear(); }
?
在循環(huán)函數(shù)下,有簡(jiǎn)單的 if-else 條件。根據(jù)狀態(tài)(自動(dòng)上鎖),延遲3秒打印“門已關(guān)閉”,舵機(jī)旋轉(zhuǎn)到關(guān)閉位置,門數(shù)據(jù)計(jì)為1,否則門鎖保持打開(kāi)狀態(tài),數(shù)據(jù)計(jì)0,舵機(jī)打開(kāi)旋轉(zhuǎn)到0度到 180 度,關(guān)閉它從 180 到 0。伺服打開(kāi)和伺服關(guān)閉功能如下所示。
?
無(wú)效伺服打開(kāi)() { for (pos = 180; pos >= 0; pos -= 5) { // 從 0 度變?yōu)?180 度 // 以 1 度為單位 myservo.write(pos); // 告訴伺服器轉(zhuǎn)到變量 'pos' 中的位置 延遲(15);// 等待 15ms 讓舵機(jī)到達(dá)位置 } } 無(wú)效伺服關(guān)閉() { for (pos = 0; pos <= 180; pos += 5) { // 從 180 度變?yōu)?0 度 myservo.write(pos); // 告訴伺服器轉(zhuǎn)到變量 'pos' 中的位置 延遲(15);// 等待 15ms 讓舵機(jī)到達(dá)位置 } }
?
延遲 15 秒寫入舵機(jī)位置以到達(dá)舵機(jī)位置。在 void open 功能下,在 LCD 上打印“輸入密碼”,然后條件指定輸入的密碼應(yīng)該與自定義密鑰相同,在此正文中數(shù)據(jù)計(jì)數(shù)并將 char 存儲(chǔ)到數(shù)據(jù)數(shù)組中,如果數(shù)據(jù)長(zhǎng)度(密鑰數(shù)量)和輸入密碼與數(shù)據(jù)主控(存在預(yù)定義密鑰)匹配。然后作為一個(gè)動(dòng)作 LCD 清零,伺服驅(qū)動(dòng),在 LCD 上打印“Door is open”,數(shù)據(jù)計(jì)數(shù)器清零。
如果輸入的密鑰與 Data Master 不匹配,作為 LCD 上的操作,在 LCD 上清除打印“錯(cuò)誤密碼”以延遲 1 秒通知并保持在其鎖定位置,數(shù)據(jù)計(jì)數(shù)器設(shè)置為 1,并在循環(huán)中繼續(xù)此過(guò)程.
?
if (data_count == Password_Lenght - 1) // 如果數(shù)組索引等于預(yù)期字符數(shù),則將數(shù)據(jù)與 master 進(jìn)行比較 { if (!strcmp(Data, Master)) // 等于 (strcmp(Data, Master) == 0) { lcd.clear(); 伺服打開(kāi)(); lcd.print("門開(kāi)著"); 門 = 0; } 別的 { lcd.clear(); lcd.print("密碼錯(cuò)誤"); 延遲(1000); 門 = 1; } 清除數(shù)據(jù)(); }
?
Arduino 鍵盤門鎖組裝和測(cè)試
現(xiàn)在,把所有東西都裝在一個(gè) 4 英寸/ 6 英寸的塑料盒上,并用移動(dòng)充電器為其供電,用外殼很好地排列所有東西。理想情況下,我可以用 3D 打印來(lái)組裝我的鎖,但是在設(shè)計(jì)完我的文件后,我發(fā)現(xiàn) 3D 打印非常昂貴,所以我只是先固定了舵機(jī),然后用金屬板將普通的滑動(dòng)鎖與我的舵機(jī)連接并覆蓋它用玻璃纖維制成,雖然它工作正常,但不太安全。
如果您想要更高的安全性,那么您必須打印一個(gè)在內(nèi)部與該伺服系統(tǒng)配合使用的 3D 門鎖模型。如果您可以使用 3D 打印機(jī),您可以從下面的鏈接下載所需的 STL 文件并進(jìn)行 3D 打印。
設(shè)計(jì)文件也顯示在下圖中。
在項(xiàng)目開(kāi)始時(shí),我們第一次啟動(dòng)它的那一刻,我們需要給項(xiàng)目名稱(您也可以顯示公司名稱),以便它看起來(lái)像商業(yè)設(shè)備一樣智能和獨(dú)特(如您在下圖)。
延時(shí) 3 秒,快速鎖上門,直接查看顯示屏上的門鎖狀態(tài),如下圖所示。
當(dāng)您按“#”鍵手動(dòng)鎖門時(shí),首先顯示門已關(guān)閉1 秒鐘,然后顯示輸入密碼。另一方面,當(dāng)輸入正確密碼解鎖門時(shí),顯示Door is Open。
如果門保持解鎖狀態(tài),它會(huì)顯示 - 只要您根據(jù)編碼手動(dòng)鎖定門,門就會(huì)打開(kāi)。我已經(jīng)給出了代碼,您可以根據(jù)需要通過(guò)更改代碼顯示參數(shù)來(lái)自定義設(shè)置。
#include
#include
#include
Servo myservo;
液晶液晶(A0、A1、A2、A3、A4、A5);
#define Password_Lenght 7 // 為六個(gè)字符提供足夠的空間 + NULL char
int pos = 0; // 存儲(chǔ)伺服位置的變量
char Data[Password_Lenght]; // 6 是它可以容納的字符數(shù) + null char = 7
char Master[Password_Lenght] = "123456";
字節(jié)data_count = 0,master_count = 0;
布爾 Pass_is_good;
字符自定義鍵;
常量字節(jié) ROWS = 4;
常量字節(jié) COLS = 3;
字符鍵[ROWS][COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '
布爾門=真;
字節(jié) rowPins[ROWS] = {1, 2, 3, 4}; //連接到鍵盤
字節(jié) colPins[COLS] = {5, 6, 7} 的行引腳;//連接到鍵盤的列引腳
Keypad customKeypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS); //初始化類NewKeypad的一個(gè)實(shí)例
void setup()
{
myservo.attach(9);
伺服關(guān)閉();
lcd.begin(16, 2);
lcd.print("Arduino 門");
lcd.setCursor(0, 1);
lcd.print("--看項(xiàng)目--");
延遲(3000);
lcd.clear();
}
void loop()
{
if (door == 0)
{
customKey = customKeypad.getKey();
if (customKey == '#')
{
lcd.clear();
伺服關(guān)閉();
lcd.print("門已關(guān)閉");
延遲(3000);
門 = 1;
}
}
否則打開(kāi)();
}
void clearData()
{
while (data_count != 0)
{ // 這可以用于任何數(shù)組大小,
Data[data_count--] = 0; //清除新數(shù)據(jù)的數(shù)組
}
return;
}
void ServoOpen()
{
for (pos = 180; pos >= 0; pos -= 5) { // 從 0 度到 180 度
// 以 1 度為步長(zhǎng)
myservo.write(pos); // 告訴伺服器轉(zhuǎn)到變量 'pos' 中的位置
延遲(15);// 等待 15ms 讓舵機(jī)到達(dá)位置
}
}
void ServoClose()
{
for (pos = 0; pos <= 180; pos += 5) { // 從 180 度轉(zhuǎn)到 0 度
myservo.write(pos) ;
// 告訴伺服器在變量 'pos' delay(15)中到達(dá)位置;// 等待 15ms 讓舵機(jī)到達(dá)位置
}
}
void Open()
{
lcd.setCursor(0, 0);
lcd.print("輸入密碼");
customKey = customKeypad.getKey();
if (customKey) // 確保一個(gè)鍵被實(shí)際按下,等于 (customKey != NO_KEY)
{
數(shù)據(jù)[data_count] = customKey;// 將字符存入數(shù)據(jù)數(shù)組
lcd.setCursor(data_count, 1); // 移動(dòng)光標(biāo)以顯示每個(gè)新字符
lcd.print(Data[data_count]); // 在光標(biāo)處打印字符
data_count++; // 將數(shù)據(jù)數(shù)組加 1 以存儲(chǔ)新字符,同時(shí)跟蹤輸入的字符數(shù)
}
if (data_count == Password_Lenght - 1) // 如果數(shù)組索引等于預(yù)期字符數(shù),則將數(shù)據(jù)與 master 進(jìn)行比較
{
if (!strcmp(Data, Master)) // 等于 (strcmp(Data, Master) == 0)
{
lcd.clear();
伺服打開(kāi)();
lcd.print("門開(kāi)著");
門 = 0;
}
lcd.clear();
lcd.print("密碼錯(cuò)誤");
延遲(1000);
門 = 1;
}
清除數(shù)據(jù)();
}
其他
{}
評(píng)論
查看更多