Arduino MEGA ใช้งาน RC522 กับ LCD16x2 แบบ I2C

บทความนี้จะเป็นตัวอย่างการใช้งานระหว่าง Arduino MEGA 2560 กับโมดูล RFID Scanner RC522 และโมดูล LCD แบบ 16×2

สิ่งที่ต้องเตรียม

1. Arduino MEGA 2560
2. Module RC522 และ RFID Card ที่ใช้กับตัวโมดูลได้
3. Module LCD (16×2) แบบ I2C
4. Protoboard สายไฟ หรืออุปกรณ์อื่นๆที่จะใช้ในการทดลอง

Libary ที่ใช้ในโปรเจคนี้

1. Arduino-LiquidCrystal-I2C-library-master.zip
2. MFRC522-1.4.4.zip

การต่อสาย

MEGA PinsModule / Pins
3.3VRC522 / 3.3V
49RC522 / RST
GNDRC522 / GND
RC522 / IRQ
50RC522 / MISO
51RC522 / MOSI
52RC522 / SCK
53RC522 / SDA
5VLCD / VCC
GND LCD / GND
20LCD / SDA
21LCD / SCL

โค้ด

#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);   //Module IIC/I2C Interface บางรุ่นอาจจะใช้ 0x3f

#define SS_PIN 53
#define RST_PIN 49
 
MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class

MFRC522::MIFARE_Key key; 

// Init array that will store new NUID 
byte nuidPICC[4];

String cardUID;

int ledState = LOW;  
int ledBlacklight = 1;
int ledReseted = 1;

unsigned long lastMillis1;
unsigned long lastMillis2;

void setup() { 
  Serial.begin(9600);

  lastMillis1 = millis();
  lastMillis2 = millis();
  
  pinMode(13, OUTPUT);
  lcd.begin();
  //lcd.noBacklight();   // ปิด backlight
  lcd.backlight();       // เปิด backlight 

  lcd.home();
  lcd.print("SaPray");
  lcd.setCursor(0, 1);
  lcd.print("RFID Tester");

  resetLcd();
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522 

  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
}

int echoLoop = 0;
void echoISR() {
    Serial.println("0.5 Sec");
}


void loop() {
  if (((millis() - lastMillis1) <= 10000)) {
    ledBlacklight = 1;
    lcd.backlight(); 
  } else {
    if(ledBlacklight != 0){
      ledBlacklight = 0;
      lcd.noBacklight();
    }
  }

  if((millis() - lastMillis2) <= 5000){
    ledReseted = 0;
  } else {
    if(ledReseted != 1){
      ledReseted = 1;
      resetLcd();
    }
  }
  
  // Reset the loop if no new card present on the sensor/reader.
  // This saves the entire process when idle.
  if ( ! rfid.PICC_IsNewCardPresent()) {
    //Serial.println(millis());
    return;
  }
  lastMillis1 = millis();
  lastMillis2 = millis();
  ledBlacklight = 1;
  echoLoop = 0;
  // Verify if the NUID has been readed
  if ( ! rfid.PICC_ReadCardSerial()){
    return;
  }
  readSerialCard();
  // Halt PICC
  rfid.PICC_HaltA();

  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
}

void readSerialCard(){
  lcd.clear();
  lcd.print("UID : ");
  lcd.setCursor(0, 1);
  String valueCard;
  String valueTemp;
  for (byte i = 0; i < rfid.uid.size; i++) {
    valueTemp=String(rfid.uid.uidByte[i]);
    valueCard=valueCard+valueTemp;
  }
  lcd.print(valueCard);
  Serial.print(valueCard);
  Serial.println();
}

void resetLcd(){
  lcd.clear();
  lcd.print("Scan RFID.");
}

ผลการทำงาน

เมื่อเริ่มทำงาน ที่หน้าจอ LCD จะแสดงคำว่า Scan RFID. และหากไม่มีกิจกรรมใดๆ นานประมาณ 10 วินาที โปรแกรมจะสั่งให้ LCD ปิดไฟแบล็คไลท์ แต่ถ้าหากลองนำบัตรไปทาบ โปรแกรมจะทำการเช็คว่าเป็นการแตะบัตรใหม่หรือไม่ (สังเกตุโดยลองแตะค้าง จะพบว่าโปรแกรมจะทำงานแค่ครั้งเดียว) และสามารถอ่านค่าได้หรือไม่ หากไม่ได้ในข้อใดข้อหนึ่ง โปรแกรมจะทำการรีเซ็ตลูปออกไป หรือหากเช็คแล้วว่าเป็นการแตะใหม่ และอ่านค่าได้ โปรแกรมจะอ่านค่า UID หรือ Serial Card และแสดงไปที่จอ LCD พร้อมกับการเปิดไฟแบล็คไลท์ และรีเซ็ตเวลาดับของไฟแบล็คไลท์ที่ 10 วินาที ในตอนนี้ ที่จอ LCD จะแสดง บรรทัดที่ 1 ว่า UID : และบรรทัดที่ 2 เป็น เลข UID หรือ Serial Card ที่อ่านได้ เป็นเวลา 5 วินาที หากไม่มีคำสั่งใดๆ จะกลับไปแสดง Scan RFID. ตามเดิม และอีก 5 วินาทีต่อมา ยังไม่มีคำสั่งใดๆอีก ไฟแบล็คไลท์ก็จะดับลง


โปรแกรมเริ่มทำงาน และผลหลังจากแสกนบัตร
ผลเมื่อแสกนบัตร
ผลเมื่อไม่มีกิจกรรมใดๆ

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *