展示
材料准备
arduino uno开发板、RFID-RC522、继电器、3×4薄膜按键、面包板、杜邦线
硬件连接
1、RFID-RC522
Arduino引脚 | RFID-RC522引脚 |
10 | SDA |
13 | SCK |
11 | MOSI |
12 | MISO |
GND | GND |
9 | RST |
3.3V | 3.3V |
2、继电器
Arduino引脚 | 继电器引脚 |
5V | VCC |
GND | GND |
A0 | IN |
3、薄膜按键
行:5,4,3,2
列:8,7,6
4、0.96oled
Arduino | oled |
A4 | OLED_MOSI |
A5 | OLED_CLK |
A2 | OLED_DC |
A2 | OLED_CS |
A3 | OLED_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();
}
}
}
}