系统描述
题目:《arduino 密码锁设计》
功能:
可以设置密码,开锁成功
五次输入密码,错误报警(蜂鸣器)
液晶显示(1602)
使用的模块:
模块实物图
接线图
LCD1602
LCD1602 IIC -- IIC
红外接收
红外接收 -- 5
继电器
继电器 -- 2
蜂鸣器
蜂鸣器 -- 3
RC522
SDA--10
SCK--13
MOSI--11
MISO--12
其余信号线闲置。
红外遥控信号
源代码
/***************************
* 基于 Arduino 的智能门锁
* 作者:刘增林
* 时间:2020.12.05
***************************
*/
#include
#include //1602LCD 驱动 引用 I2C 库
#include
#include
#include
#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 successfullyn");
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);
}
}
}
阅读全文