加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 系統(tǒng)描述
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

【開源分享】基于Arduino的智能門鎖,贊!【網(wǎng)友投稿】

2020/12/08
485
閱讀需 10 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

系統(tǒng)描述

題目:《arduino 密碼鎖設(shè)計》

功能:

可以設(shè)置密碼,開鎖成功

五次輸入密碼,錯誤報警(蜂鳴器

液晶顯示(1602)

RFID-RC522 射頻模塊(刷卡直接開門)

?

使用的模塊:

  • 繼電器紅外遙控(代替矩陣鍵盤)RFID-RC522 射頻模塊 LCD1602(i2c)

?

模塊實物圖

?

接線圖

LCD1602

LCD1602? IIC -- IIC

?

紅外接收

紅外接收?-- 5

?

繼電器

繼電器?-- 2

?

蜂鳴器

蜂鳴器?-- 3

?

RC522

SDA--10

SCK--13

MOSI--11

MISO--12

其余信號線閑置。

?

紅外遙控信號

?

源代碼

/***************************
?*?基于 Arduino智能門鎖
?*?作者:劉增林
?*?時間:2020.12.05
?***************************
?*/
?
#include??
#include??//1602LCD?驅(qū)動??引用 I2C 庫
#include?
#include?
#include?

#define?SS_PIN?10
#define?RST_PIN?9

unsigned?char?i?=?0,?j?=?0,?m?=?0,?n?=?0;??????// 循環(huán)變量

unsigned?char?code[6];???????????// 保存密碼
unsigned?char?code_temp[6];??????// 保存臨時輸入密碼

int?rf522_flag?=?0;??????????????// 門禁卡標(biāo)志位
int?Setpassword_flag?=?1;????????// 設(shè)置密碼標(biāo)志位
int?Inputpassword_flag?=?1;??????// 輸入密碼標(biāo)志位
int?door_flag?=?0;???????????????// 門標(biāo)志位

// 管腳定義
const?int?buzzer?=?3;
const?int?realy?=?2;

LiquidCrystal_I2C?lcd(0x27,16,2);??// 配置 LCD 地址及行列

int?RECV_PIN?=?5;
IRrecv?irrecv(RECV_PIN);???// 定義接收引腳為 11 腳 .
decode_results?results;????// 聲明一個 IRremote 庫函數(shù)獨有的變量類型(decode_resultc)

MFRC522?rfid(SS_PIN,?RST_PIN);?// 實例化類
?
//?初始化數(shù)組用于存儲讀取到的 NUID?
byte?nuidPICC[4];


void?setup()?{
??//?put?your?setup?code?here,?to?run?once:

??// 管腳初始化
??pinMode(realy,?OUTPUT);
??digitalWrite(realy,?HIGH);

??pinMode(buzzer,?OUTPUT);
??digitalWrite(buzzer,?HIGH);
??
??SPI.begin();?//?初始化 SPI 總線
??rfid.PCD_Init();?//?初始化?MFRC522?
????
??//LCD1602
??lcd.init();??????// 初始化 LCD?
??lcd.backlight();?// 設(shè)置 LCD 背光
??lcd.setCursor(0,0);????????????// 設(shè)置顯示指針??
??lcd.print("?Set?Clded?Lock?");?// 輸出字符到 LCD1602 上??
??lcd.setCursor(0,1);????????????// 設(shè)置顯示指針??
??lcd.print("Password:");????????// 輸出字符到 LCD1602 上??
??
??// 紅外接收
??irrecv.enableIRIn();?// 開始接收信號

??Serial.begin(9600);?
}

void?loop()?{
??//?put?your?main?code?here,?to?run?repeatedly:

??while?(Setpassword_flag)?// 設(shè)置密碼
??{
????if?(irrecv.decode(&results))??// 檢查是否接收到紅外遙控信號
????{?
??????Serial.println(results.value,?HEX);?// 輸出 16 進(jìn)制接收到的數(shù)據(jù)指令信息

??????switch(results.value)// 通過這個循環(huán),比對
??????{
????????case?0xFF9867:?
??????????lcd.print("0");delay(500);code[i]=0;i++;break;
????????case?0XFFA25D:?
??????????lcd.print("1");delay(500);code[i]=1;i++;break;
????????case?0xFF629D:?
??????????lcd.print("2");delay(500);code[i]=2;i++;break;
????????case?0xFFE21D:?
??????????lcd.print("3");delay(500);code[i]=3;i++;break;
????????case?0xFF22DD:?
??????????lcd.print("4");delay(500);code[i]=4;i++;break;
????????case?0xFF02FD:?
??????????lcd.print("5");delay(500);code[i]=5;i++;break;
????????case?0xFFC23D:?
??????????lcd.print("6");delay(500);code[i]=6;i++;break;
????????case?0xFFE01F:?
??????????lcd.print("7");delay(500);code[i]=7;i++;break;
????????case?0xFFA857:?
??????????lcd.print("8");delay(500);code[i]=8;i++;break;
????????case?0xFF906F:?
??????????lcd.print("9");delay(500);code[i]=9;i++;break;
????????default:
??????????break;??
??????}
??????
??????irrecv.resume();?// 接收下一指令??
??
??????if?(i?==?6)
??????{
????????Setpassword_flag?=?0;?// 清除設(shè)置密碼標(biāo)志位
????????Serial.print("Password?set?successfullyn");
????????for?(j?=?0;?j?<?6;?j++)
????????{
??????????Serial.print(code[j]);
??????????}
????????Serial.println("?");
????????
????????digitalWrite(realy,?LOW);??// 密碼設(shè)置成功,開門
????????delay(2000);
????????digitalWrite(realy,?HIGH);?
????????
????????lcd.clear();???????????????????// 清屏
????????lcd.setCursor(0,0);????????????// 設(shè)置顯示指針??
????????lcd.print("===Clded?Lock===");?// 輸出字符到 LCD1602 上??
????????lcd.setCursor(0,1);????????????// 設(shè)置顯示指針??
????????lcd.print("Password:");????????// 輸出字符到 LCD1602 上
????????}
????}
??}??// 密碼設(shè)置完成

??while?(Inputpassword_flag)
??{
????if?(irrecv.decode(&results))??// 檢查是否接收到紅外遙控信號
????{?
??????Serial.println(results.value,?HEX);?// 輸出 16 進(jìn)制接收到的數(shù)據(jù)指令信息

??????switch(results.value)// 通過這個循環(huán),比對
??????{
????????case?0xFF9867:?
??????????lcd.print("0");delay(500);code_temp[m]=0;m++;break;
????????case?0XFFA25D:?
??????????lcd.print("1");delay(500);code_temp[m]=1;m++;break;
????????case?0xFF629D:?
??????????lcd.print("2");delay(500);code_temp[m]=2;m++;break;
????????case?0xFFE21D:?
??????????lcd.print("3");delay(500);code_temp[m]=3;m++;break;
????????case?0xFF22DD:?
??????????lcd.print("4");delay(500);code_temp[m]=4;m++;break;
????????case?0xFF02FD:?
??????????lcd.print("5");delay(500);code_temp[m]=5;m++;break;
????????case?0xFFC23D:?
??????????lcd.print("6");delay(500);code_temp[m]=6;m++;break;
????????case?0xFFE01F:?
??????????lcd.print("7");delay(500);code_temp[m]=7;m++;break;
????????case?0xFFA857:?
??????????lcd.print("8");delay(500);code_temp[m]=8;m++;break;
????????case?0xFF906F:?
??????????lcd.print("9");delay(500);code_temp[m]=9;m++;break;
????????default:
??????????break;??
??????}
??????
??????irrecv.resume();?// 接收下一指令??
??????
??????if?(m?==?6)
??????{
????????
????????m?=?0;
??
????????if?((code[0]?==?code_temp[0])?&&?(code[1]?==?code_temp[1])?&&?(code[2]?==?code_temp[2])?&&?(code[3]?==?code_temp[3])?&&?(code[4]?==?code_temp[4])?&&?(code[5]?==?code_temp[5]))
????????{
??????????digitalWrite(realy,?LOW);??// 密碼設(shè)置成功,開門
??????????delay(2000);
??????????digitalWrite(realy,?HIGH);?
??????????}
????????else
????????{
??????????n++;
??????????}
??????????
????????lcd.clear();???????????????????// 清屏
????????lcd.setCursor(0,0);????????????// 設(shè)置顯示指針??
????????lcd.print("===Clded?Lock===");?// 輸出字符到 LCD1602 上??
????????lcd.setCursor(0,1);????????????// 設(shè)置顯示指針??
????????lcd.print("Password:");????????// 輸出字符到 LCD1602 上
????????
??????}
????????
??????while?(n?==?5)// 錯誤五次蜂鳴器報警
??????{
????????// 蜂鳴器報警 2s
????????digitalWrite(buzzer,?LOW);
????????}??????????
????}

??//?找卡
??if?(?!?rfid.PICC_IsNewCardPresent())
??{
????rf522_flag?=?1;
????return;
????}
????

??if?(rf522_flag?==?1)
??{
????digitalWrite(realy,?LOW);
????delay(2000);
????rf522_flag?=?0;
????digitalWrite(realy,?HIGH);
????}???
??}
}

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

公眾號『嵌入式從0到1』,號主:程序員小哈,是一個軟硬件全棧開發(fā)工程師(12年工作經(jīng)驗的老司機(jī)),電子發(fā)燒友論壇鴻蒙版塊版主,公眾號內(nèi)容專注于嵌入式學(xué)習(xí)。堅持原創(chuàng),寫有圖、有視頻的保姆級教程文章,篇篇有干貨。做一個講清楚,說明白,大家學(xué)得會的交流平臺。