系统描述

题目:《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);

    }   

  }

}