可以设置密码,开锁成功
五次输入密码,错误报警(蜂鸣器)
液晶显示(1602)
RFID-RC522射频模块(刷卡直接开门)
LCD1602 IIC -- IIC
红外接收 -- 5
继电器 -- 2
蜂鸣器 -- 3
SDA--10
SCK--13
MOSI--11
MISO--12
其余信号线闲置。
/***************************
* 基于Arduino的智能门锁
* 作者:刘增林
* 时间:2020.12.05
***************************
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h> //1602LCD 驱动 引用I2C库
#include <IRremote.h>
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
unsigned char i = 0, j = 0, m = 0, n = 0; //循环变量
unsigned char code[6]; //保存密码
unsigned char code_temp[6]; //保存临时输入密码
int rf522_flag = 0; //门禁卡标志位
int Setpassword_flag = 1; //设置密码标志位
int Inputpassword_flag = 1; //输入密码标志位
int door_flag = 0; //门标志位
//管脚定义
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库函数独有的变量类型(decode_resultc)
MFRC522 rfid(SS_PIN, RST_PIN); //实例化类
// 初始化数组用于存储读取到的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(); //设置LCD背光
lcd.setCursor(0,0); //设置显示指针
lcd.print(" Set Clded Lock "); //输出字符到LCD1602上
lcd.setCursor(0,1); //设置显示指针
lcd.print("Password:"); //输出字符到LCD1602上
//红外接收
irrecv.enableIRIn(); //开始接收信号
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
while (Setpassword_flag) //设置密码
{
if (irrecv.decode(&results)) //检查是否接收到红外遥控信号
{
Serial.println(results.value, HEX); //输出16进制接收到的数据指令信息
switch(results.value)//通过这个循环,比对
{
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; //清除设置密码标志位
Serial.print("Password set successfully\n");
for (j = 0; j < 6; j++)
{
Serial.print(code[j]);
}
Serial.println(" ");
digitalWrite(realy, LOW); //密码设置成功,开门
delay(2000);
digitalWrite(realy, HIGH);
lcd.clear(); //清屏
lcd.setCursor(0,0); //设置显示指针
lcd.print("===Clded Lock==="); //输出字符到LCD1602上
lcd.setCursor(0,1); //设置显示指针
lcd.print("Password:"); //输出字符到LCD1602上
}
}
} //密码设置完成
while (Inputpassword_flag)
{
if (irrecv.decode(&results)) //检查是否接收到红外遥控信号
{
Serial.println(results.value, HEX); //输出16进制接收到的数据指令信息
switch(results.value)//通过这个循环,比对
{
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); //密码设置成功,开门
delay(2000);
digitalWrite(realy, HIGH);
}
else
{
n++;
}
lcd.clear(); //清屏
lcd.setCursor(0,0); //设置显示指针
lcd.print("===Clded Lock==="); //输出字符到LCD1602上
lcd.setCursor(0,1); //设置显示指针
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);
}
}
}
刘增林,群内微信名:底色悲凉,佳木斯大学信息电子技术学院自动化专业大三学生,学习方向为单片机和嵌入式。
~~~
感谢刘增林的无私分享,欢迎各位投稿!
大家给他点个赞吧,
我们一起学习、一起进步,加油!~