很多時候,我們需要在家里或辦公室(可能是秘密的 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 <伺服.h> 伺服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;
}
清除數據();
}
其他
{}
評論
查看更多