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

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

โปรแกรมเริ่มทำงาน และผลหลังจากแสกนบัตร

ผลเมื่อแสกนบัตร

ผลเมื่อไม่มีกิจกรรมใดๆ
สิ่งที่ต้องเตรียม
1. Arduino MEGA 25602. Module RC522 และ RFID Card ที่ใช้กับตัวโมดูลได้
3. Module LCD (16×2) แบบ I2C
4. Protoboard สายไฟ หรืออุปกรณ์อื่นๆที่จะใช้ในการทดลอง
Libary ที่ใช้ในโปรเจคนี้
1. Arduino-LiquidCrystal-I2C-library-master.zip2. MFRC522-1.4.4.zip
การต่อสาย
MEGA Pins | Module / Pins |
3.3V | RC522 / 3.3V |
49 | RC522 / RST |
GND | RC522 / GND |
– | RC522 / IRQ |
50 | RC522 / MISO |
51 | RC522 / MOSI |
52 | RC522 / SCK |
53 | RC522 / SDA |
5V | LCD / VCC |
GND | LCD / GND |
20 | LCD / SDA |
21 | LCD / 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 วินาทีต่อมา ยังไม่มีคำสั่งใดๆอีก ไฟแบล็คไลท์ก็จะดับลง

