系统描述

题目:《arduino 密码锁设计》

功能:

可以设置密码,开锁成功

五次输入密码,错误报警(蜂鸣器)

液晶显示(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 驱动  引用 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 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);
    }   
  }
}