arduino门禁系统

展示

材料准备

arduino uno开发板、RFID-RC522、继电器、3×4薄膜按键、面包板、杜邦线

硬件连接

1、RFID-RC522

Arduino引脚RFID-RC522引脚
10SDA
13SCK
11MOSI
12MISO
GNDGND
9RST
3.3V3.3V

2、继电器

Arduino引脚继电器引脚
5VVCC
GNDGND
A0IN

3、薄膜按键

行:5,4,3,2

列:8,7,6

4、0.96oled

Arduinooled
A4OLED_MOSI
A5OLED_CLK
A2OLED_DC
A2OLED_CS
A3OLED_RESET

源码

​
#include <EEPROM.h>
#include <Keypad.h>
boolean Lock_state;//锁的状态
int secret_lenth;//密码长度
int x=0;
char secret_num[6]={};  //设置6位密码,保存至eeprom
char secret_input[6]={};//输入密码进行判断
int set_break=1,enter_break=1,ZhuYe=0;
const byte ROWS = 4; //4行
const byte COLS = 3; //3列
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {8,7,6,5}; //设置行的引脚
byte colPins[COLS] = {4,3,2}; //设置列的引脚
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
//----------------------------------------------------------------------------mfrc522
//Card UID1: 73 FF 16 1E
//Card UID2:41 89 8D 1D
#include <SPI.h>//引入SPI库
#include <MFRC522.h>
#define RST_PIN   9// 设置引脚
#define SS_PIN    10// 设置引脚
#define Lock      A0//继电器
//为了检测卡是否被检测到,因为在做的过程中经常有卡不被检测的情况出现
int i=0;
MFRC522 rfid(SS_PIN, RST_PIN);   // Create MFRC522 instance.
MFRC522::MIFARE_Key key;
byte nuidPICC[4]; //存储读取的UID
byte cardID1[4] = {0x73, 0xFF, 0x16, 0x1E};//存储有权限的卡ID
byte cardID2[4] = {0x41, 0x89, 0x8D, 0x1D};//存储有权限的卡ID
//----------------------------------------------------------------------------0.96oled
//引入IIC通讯所需的Wire库文件
#include <Wire.h>
//引入SPI库
//#include<SPI.h>
// 引入驱动OLED0.96所需的库
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // 128像素=横坐标(0,127)
#define SCREEN_HEIGHT 64 // 64像素=纵坐标(0,63)
//自定义重置引脚,虽然教程未使用,但却是Adafruit_SSD1306库文件所必需的
#define OLED_MOSI  A4
#define OLED_CLK   A5
#define OLED_DC    A2
#define OLED_CS    A2
#define OLED_RESET A3
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET,OLED_CS);


void setup(){
    Serial.begin(9600);
    Lock_state = digitalRead(Lock);
//----------------------------------------------------------------------------mfrc522    
    SPI.begin();        // Init SPI bus
    rfid.PCD_Init(); // Init MFRC522 card
    pinMode(Lock,OUTPUT);
    digitalWrite(Lock,HIGH);
//----------------------------------------------------------------------------0.96oled
    display.begin(SSD1306_SWITCHCAPVCC);  
    display.setTextColor(WHITE);//开像素点发光,如果不设置,oled不显示
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE,BLACK);
    display.setCursor(0,15);
    display.println("-Welcome-");
    display.setTextSize(1);
    display.setTextColor(WHITE, BLACK);
    display.setCursor(0, 35);
    display.println("0:put your card");
    display.setTextSize(1);
    display.setTextColor(WHITE,BLACK);
    display.setCursor(0,45);
    display.println("*:setting password");
    display.setTextSize(1);
    display.setTextColor(WHITE,BLACK);
    display.setCursor(0,55);
    display.println("#:enter password");
     display.display(); // 开显示
  for(int x = 0;x<6;x++)//初始化密码
  {
    secret_num[x]=EEPROM.read(x);
    delay(10);
    }

}


  
void loop()
{
  ini_display();
  char KEY = keypad.getKey();
  if(KEY)
  {
    Serial.println(KEY);
    if (KEY == '*') //-----------------设置密码
    {
      Serial.println("1");
      set_password();
    }

    if (KEY == '#') //-----------------输入密码
    {
      enter_password();
    }

    if (KEY == '0')
    {
      Serial.print("请刷卡");
      credit_card();//-----------------刷卡
    }
    if (KEY == '1') //刷新
    {
      }
  }
}
void ini_display()//----------------------刷新
{
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE,BLACK);
    display.setCursor(0,15);
    display.println("-Welcome-");
    display.setTextSize(1);
    display.setTextColor(WHITE, BLACK);
    display.setCursor(0, 35);
    display.println("0:put your card");
    display.setTextSize(1);
    display.setTextColor(WHITE,BLACK);
    display.setCursor(0,45);
    display.println("*:setting password");
    display.setTextSize(1);
    display.setTextColor(WHITE,BLACK);
    display.setCursor(0,55);
    display.println("#:enter password");
    display.display(); // 开显示
  }
void set_password()//----------------------修改密码
{
  while(set_break)
  {
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE, BLACK);
    display.setCursor(0, 5);
    display.println("Setting Password:");
    display.display();
    int num_break = 0;
    while(1)
    {
      char KEY = keypad.getKey();
      if(KEY)
      {
        secret_num[num_break] = KEY;
        Serial.print(KEY);
        display.clearDisplay();
        display.setTextSize(1);
        display.setCursor(0,30);
        display.print(KEY);
        display.display();
        num_break++;
        if(num_break>5)
        {
        for (int x = 0; x < 6; x++)
        {
          EEPROM.write(x, secret_num[x]);
          delay(10);
        }
        Serial.print("\n");
        display.clearDisplay();
        for (int x = 0; x < 6; x++)
        {
          display.setTextSize(1);
          display.setCursor(x*15,30);
          display.print(secret_num[x]);
          display.display();
          Serial.print(secret_num[x]);      //这里输入显示内容,可以是变量
        }
        num_break=0;
        delay(2000);
        display.clearDisplay();
        display.setTextSize(1);
        display.setCursor(0, 25);
        display.println("Set Password Success!");
        display.display();
        delay(1000);
        display.clearDisplay();        
        return;          
          }
        }
      }
    }
  }
void enter_password()//------------------------输入密码
{
  while(1)
  {
    display.clearDisplay();
    display.setTextSize(1);
    display.setCursor(0, 15);
    display.println("Enter Your Password:");
    display.display();
    int num_break2=0;
    while(1)
    {
      char KEY=keypad.getKey();
      if(KEY)
      {
        secret_input[num_break2] = KEY;
        display.setTextSize(1);
        display.setCursor(0,15);
        display.println("Enter Your Password:");
        display.setCursor(num_break2 * 15, 45);
        display.println(secret_input[num_break2]);
        display.display();
        Serial.print(secret_input[num_break2]);
        num_break2++;
        }
        if(num_break2>5)
        {
          int num_True = 0;
         for (int x = 0; x < 6; x++)
        {
          Serial.print(secret_input[x]);      //这里输入显示内容,可以是变量
//          display.setTextSize(1);
//          display.setCursor(0, 30);
//          display.println(secret_input[x]);
//          display.display();
        }
          for (int x = 0; x < 6; x++)
          {
          if (secret_input[x] == secret_num[x])
          {
            num_True++;
          }
          delay(10);
           }
         if(num_True==6)
         {
          Serial.print("密码正确");
          num_True=0;
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE, BLACK);
          display.setCursor(0, 25);
          display.println("Success!");
          display.display();
          delay(2000);
          digitalWrite(Lock,LOW);
          delay(500);
          digitalWrite(Lock,HIGH);
          delay(500);
          ini_display();
          return;
          }else
          {
            Serial.print("密码错误");
            num_True=0;
            display.clearDisplay();
            display.setTextSize(1);
            display.setTextColor(WHITE, BLACK);
            display.setCursor(0, 25);
            display.print("Access denied");
            display.display();
            delay(2000);
            display.clearDisplay();
            return;
          }
       }
     }
   } 
}
void credit_card()//-----------------------------刷卡
{
  display.clearDisplay();//清屏
  display.setTextSize(1);
  display.setCursor(0, 25);//设置显示位置
  display.println("Plesase Put Your Card...");
  display.display(); // 开显示
  while(1)
  {
    if(rfid.PICC_IsNewCardPresent())
    {
      if(rfid.PICC_ReadCardSerial())
      {
        Serial.print("Tag UID:"); 
        for(byte i = 0;i<rfid.uid.size;i++)
        {
          nuidPICC[i]=rfid.uid.uidByte[i];//保存UID
          }
          if(
            nuidPICC[0] == cardID1[0]
            &&nuidPICC[1] == cardID1[1]
            &&nuidPICC[2] == cardID1[2]
            &&nuidPICC[3] == cardID1[3]||
            nuidPICC[0] == cardID2[0]
            &&nuidPICC[1] == cardID2[1]
            &&nuidPICC[2] == cardID2[2]
            &&nuidPICC[3] == cardID2[3]
            &&nuidPICC[4] == cardID2[4]
          )
          {
            display.clearDisplay();
            display.setTextSize(1);
            display.setCursor(0,25);
            display.print("Success!");
            display.display();
            delay(2000);
            display.clearDisplay();
            digitalWrite(Lock,LOW);
            delay(500);
            digitalWrite(Lock,HIGH);
            delay(500);
            return;
            }
            else{
            display.clearDisplay();
            display.setTextSize(1);
            display.setCursor(0,25);
            display.print("Access denied");
            display.display();
            delay(2000);
            display.clearDisplay();
            return;
              }
              rfid.PICC_HaltA();
        }
      }
  } 
}

​

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值