查看: 2893|回复: 4

[Arduino教程] RFID门禁系统

[复制链接]

该用户从未签到

发表于 2021-8-13 19:54 | 显示全部楼层 |阅读模式
RFID门禁系统
准备材料:一块arduino开发板(uno,nano,mega2560均可),RC522 RFID门禁射频,SG90舵机,oled ssd1306 128x64
本篇作者使用的是mega2560 atmega2560
首先开始
电脑上安装arduino ide
菜单栏里打开项目>加载库>管理库里挨个搜索将其下载U8glib,Wire,Servo,SPI,MFRC522,代码如下:
/*-------------------------------------------------------*/
#include <U8g2lib.h>
#include <Wire.h>
#include <Servo.h>
#include <SPI.h>
#include <MFRC522.h>
//调用所需库
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
Servo servo_9;
MFRC522 rfid(2, 3);
//初始化oled,舵机,rc522
String MFRC522_ReadCardUID(MFRC522 *_name){
  String _CardUID = "";
  for (byte _i = 0; _i < _name->uid.size; _i++){
    if(_name->uid.uidByte[_i] < 0x10)
      _CardUID += "0";
    _CardUID += String(_name->uid.uidByte[_i], HEX) + String(" ");
  }
  return _CardUID;
}
boolean MFRC522_IsNewCard(MFRC522 *_name){
  if(!_name->ICC_IsNewCardPresent())
    return false;
  if(!_name->ICC_ReadCardSerial())
    return false;
  return true;
}
void page2() {
  u8g2.setFont(u8g2_font_helvR10_tf);
  //oled设置字体、字号、加粗
  u8g2.setFontPosTop();
  u8g2.setCursor(0,17);
  //设置文字坐标
  u8g2.print("The RF card ID is:");
  //oled显示文字The RF card ID is:
  u8g2.setCursor(0,30);
  u8g2.print(MFRC522_ReadCardUID(&rfid));
}
void page1() {
  u8g2.setFont(u8g2_font_helvR10_tf);
  u8g2.setFontPosTop();
  u8g2.setCursor(0,17);
  u8g2.print("lease place the RFID  ");
  u8g2.setCursor(0,29);
  u8g2.print("card near the sensor");
}
void setup(){
  u8g2.setI2CAddress(0x3C*2);
  //设置oled IIC地址
  u8g2.begin();
  servo_9.attach(9);
  //设置舵机针脚
  Serial.begin(9600);
  //设置串口波特率为9600
  SPI.begin();
  rfid.PCD_Init();
  u8g2.enableUTF8Print();
}
void loop(){
  servo_9.write(0);
  delay(0);
  u8g2.firstPage();
  do
  {
    page1();
  }while(u8g2.nextPage());
  if(MFRC522_IsNewCard(&rfid)){
    u8g2.firstPage();
    do
    {
      page2();
    }while(u8g2.nextPage());
    Serial.println(MFRC522_ReadCardUID(&rfid));
    if (String(MFRC522_ReadCardUID(&rfid)).equals(String("29 5d 8b 47 "))) {
   //当读取卡号与自己的卡号一致时舵机开
      servo_9.write(90);
      delay(0);
    }
    delay(5000);
    rfid.PICC_HaltA();
    rfid.PCD_StopCrypto1();
  }
}
效果图如下
ps:拍照技术不是很行,请多多谅解



微信图片_20210813195156.jpg

该用户从未签到

 楼主| 发表于 2021-8-13 19:56 | 显示全部楼层
源码如下
#include <U8g2lib.h>
#include <Wire.h>
#include <Servo.h>
#include <SPI.h>
#include <MFRC522.h>

U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
Servo servo_9;
MFRC522 rfid(2, 3);

String MFRC522_ReadCardUID(MFRC522 *_name){
  String _CardUID = "";
  for (byte _i = 0; _i < _name->uid.size; _i++){
    if(_name->uid.uidByte[_i] < 0x10)
      _CardUID += "0";
    _CardUID += String(_name->uid.uidByte[_i], HEX) + String(" ");
  }
  return _CardUID;
}

boolean MFRC522_IsNewCard(MFRC522 *_name){
  if(!_name->PICC_IsNewCardPresent())
    return false;
  if(!_name->PICC_ReadCardSerial())
    return false;
  return true;
}

void page2() {
  u8g2.setFont(u8g2_font_helvR10_tf);
  u8g2.setFontPosTop();
  u8g2.setCursor(0,17);
  u8g2.print("The RF card ID is:");
  u8g2.setCursor(0,30);
  u8g2.print(MFRC522_ReadCardUID(&rfid));
}

void page1() {
  u8g2.setFont(u8g2_font_helvR10_tf);
  u8g2.setFontPosTop();
  u8g2.setCursor(0,17);
  u8g2.print("Please place the RFID  ");
  u8g2.setCursor(0,29);
  u8g2.print("card near the sensor");
}

void setup(){
  u8g2.setI2CAddress(0x3C*2);
  u8g2.begin();
  servo_9.attach(9);
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  u8g2.enableUTF8Print();

}

void loop(){
  servo_9.write(0);
  delay(0);
  u8g2.firstPage();
  do
  {
    page1();
  }while(u8g2.nextPage());
  if(MFRC522_IsNewCard(&rfid)){
    u8g2.firstPage();
    do
    {
      page2();
    }while(u8g2.nextPage());
    Serial.println(MFRC522_ReadCardUID(&rfid));
    if (String(MFRC522_ReadCardUID(&rfid)).equals(String("29 5d 8b 47 "))) {
      servo_9.write(90);
      delay(0);

    }
    delay(5000);
    rfid.PICC_HaltA();
    rfid.PCD_StopCrypto1();
  }

}

该用户从未签到

发表于 2021-10-18 20:43 | 显示全部楼层
大佬在吗,这是java写的吧,现在遇到点问题不知道能不能请教一下,就是字符串对比那一块,为什么我这里不能呢,现在串口显示读卡的ID但是就是不进if语句进行字符串对比

签到天数: 1 天

[LV.1]初来乍到

发表于 2022-6-24 18:50 | 显示全部楼层
能不能弄一个LCD1602的显示屏代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

用米思齐编程库文件【blinker点灯】模块不全,如图,期待....
用米思齐编程库文件【blin
此问题困扰已久,求大神指点,问题详见图片截图,附图3张。 我在官网下载的最新版本
ESP8266入坑提醒
ESP8266入坑提醒
WEMOS D1 MINI开发板上用的CH340C是翻新的 照片拍不出效果,但实际效果明显:
合宙ESP32C3点亮1.54寸墨水屏
合宙ESP32C3点亮1.54寸墨
1,安装的库文件: 2,接线: Eink ESP32C3 GND GND VCC 3.3V SCL
OLED 128*64自制可达10000000个选项的菜单(已更新)
OLED 128*64自制可达10000
OLED 128*64自制可达10000000个选项的菜单 温馨提示: 建议占个楼再食用本帖子
【花雕动手做】有趣好玩音乐可视化(17)--光导纤维灯
【花雕动手做】有趣好玩音
偶然心血来潮,想要做一个声音可视化的系列专题。这个专题的难度有点高,涉及面也比较
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表