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