เรียนรู้และฝึกปฏิบัติ RFID ไปกับชุด RFID Basic Starter Kit
(ตอนที่ 3 ทดลองใช้งาน RFID ร่วมกับ NFC Shield + จอ LCD 16×2 + ลำโพง Buzzer)
ดูสารบัญบทความ “เรียนรู้และฝึกปฏิบัติ RFID ไปกับชุด RFID Basic Starter Kit”
ตอนที่ 3 ทดลองใช้งาน RFID ร่วมกับ NFC Shield + จอ LCD 16×2 + ลำโพง Buzzer

ในการทดลองเชื่อมต่อจอ LCD 16×2 ผ่านพอร์ต I2C และลำโพง Buzzer ผ่านขา PWM โดยให้ Arduino อ่านค่า UID จากบัตรให้แสดงที่หน้าจอ LCD พร้อมทั้งสั่งให้ Buzzer ดังเมื่อตรวจสอบว่ามีบัตร MIFARE มาทาบ โดยกำหนดขาดังนี้


ภาพแสดงการต่อ NFC Shield จอ LCD 16×2 และลำโพง Buzzer เข้ากับบอร์ด Arduino
ติดตั้ง Library LiquidCrystal_I2C โดยดาวน์โหลดได้จาก Example Code & Library
จากนั้น แตกไฟล์ นำไปวางไว้ในโฟลเดอร์ .. Arduino\libraries

เมื่อเปิดโปรแกรม Arduino ไปที่ File > Example > LiquidCrystal_I2C จะเห็นตัวอย่างโปรแกรม

โค้ดโปรแกรมบนบอร์ด Arduino มีดังนี้
//--------- LCD I2C ----------// #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 20, 4); //--------- LCD I2C ----------// //----------- RFID -----------// #include <SPI.h> #include <PN532_SPI.h> #include "PN532.h" PN532_SPI pn532spi(SPI, 10); PN532 nfc(pn532spi); uint8_t success; uint8_t uid_read[] = { 0, 0, 0, 0, 0, 0, 0 }; uint8_t uidLength_read; uint8_t uid_user[] = {0x10,0x0F,0x42,0x03}; uint8_t uidLength_user = 4 ; //----------- RFID -----------// //----------- Buzzer ---------// #define buzzer 6 //----------- Buzzer ---------// boolean compare_UID(uint8_t one[],uint8_t two[]) { for(int n = 0; n < uidLength_read; n++) { if(one[n] != two[n]) return false; } return true; } void lcd_show(char* txt) { lcd.setCursor(0,1); lcd.print(txt); analogWrite(buzzer,128); } void setup() { Serial.begin(9600); Serial.println("Arduino_test_mifare!"); lcd.begin(); lcd.backlight(); lcd.setCursor(0,0); lcd.print("Hello,RFID"); pinMode(buzzer, OUTPUT); lcd.setCursor(0,1); lcd.print("Waiting for Tag"); lcd.clear(); nfc.begin(); nfc.SAMConfig(); } void loop() { success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid_read, &uidLength_read); if (success) { lcd.clear(); lcd.setCursor(0,0); lcd.print("Found an Tag"); if(uidLength_read==uidLength_user) { if(compare_UID(uid_read,uid_user)==true) { lcd_show("ID is matched"); Serial.println("ID is matched"); } else { lcd_show("ID is mismatched!"); Serial.println("ID is mismatched"); } } else { lcd_show("ID is mismatched"); Serial.println("ID is mismatched"); } nfc.PrintHex(uid_read, uidLength_read); } else { lcd.clear(); lcd.setCursor(0,0); lcd.print("Waiting for Tag"); analogWrite(buzzer,255); } }
จากโค้ดจะเห็นได้ว่า
//--------- LCD I2C ----------// #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 20, 4); //--------- LCD I2C ----------//
เรียกใช้ Library LCD I2C โดยกำหนด Address เป็น 0x27 16 ตัวอักษร 2 บรรทัด
uint8_t uid_read[] = { 0, 0, 0, 0, 0, 0, 0 }; uint8_t uidLength_read; uint8_t uid_user[] = {0x10,0x0F,0x42,0x03}; uint8_t uidLength_user = 4 ;
สร้างตัวแปร uid_read สำหรับเก็บค่า uid ที่อ่านได้ uidLength_read เก็บขนาดรหัส uid_user เก็บรหัส uid ของผู้ใช้ uidLength_user เก็บขนาดของรหัส uid ผู้ใช้ ในโปรแกรมจะนำ uid อ่านได้ ไปเทียบเทียบกับ uid_user ที่กำหนดไว้
boolean compare_UID(uint8_t one[],uint8_t two[]) { for(int n = 0; n < uidLength_read; n++) { if(one[n] != two[n]) return false; } return true; }
ประกาศฟังก์ชั่น compare_UID สำหรับใช้เปรียบเทียบรหัส UID 2 ชุด ถ้ารหัสทั้ง 2 เหมือนกันฟังก์ชั่นจะ return true ถ้าไม่ตรง ฟังก์ชั่นจะ return เป็น false
void lcd_show(char* txt) { lcd.setCursor(0,1); lcd.print(txt); analogWrite(buzzer,128); }
ประกาศฟังก์ชั่น lcd_show โดยกำหนด cursor จอที่ ตัวอักษรที่ 0 บรรทัดที่ 1 จากนั้นแสดงข้อความ จากตัวแปร txt ที่รับเข้ามา และสั่ง Buzzer ดัง โดยกำหนด PWM ที่ 50% หรือ 127 จาก 255
void setup() { Serial.begin(9600); Serial.println("Arduino_test_mifare!"); lcd.begin(); lcd.backlight(); lcd.setCursor(0,0); lcd.print("Hello,RFID"); pinMode(buzzer, OUTPUT); lcd.setCursor(0,1); lcd.print("Waiting for Tag"); lcd.clear(); nfc.begin(); nfc.SAMConfig(); }
ที่ฟังก์ชั่น setup กำหนดให้ LCD I2C เริ่มทำงาน เปิด Backlight เซต Cursor ที่ตัวอักษร 0 บรรทัด 1 แสดงข้อความ “Hello RFID” และแสดงข้อความ “Waiting for Tag” บรรทัดที่ 2 เซตขา buzzer เป็นเอาท์พุต
จากนั้นเริ่มการทำงาน NFC Shield
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid_read, &uidLength_read); if (success) { lcd.clear(); lcd.setCursor(0,0); lcd.print("Found an Tag");
ในฟังก์ชั่น loop ถ้าพบบัตรทาบอยู่ให้โปรแกรมแสดงข้อความ “Found an Tag” ที่บรรทัด 1
if(uidLength_read==uidLength_user) { if(compare_UID(uid_read,uid_user)==true) { lcd_show("ID is matched"); Serial.println("ID is matched"); } else { lcd_show("ID is mismatched!"); Serial.println("ID is mismatched"); } } else { lcd_show("ID is mismatched"); Serial.println("ID is mismatched"); } nfc.PrintHex(uid_read, uidLength_read); }
หลังจากที่ตรวจสอบมีบัตรทาบอยู่ โปรแกรมจะเปรียบเทียบ ขนาดของรหัสเท่ากันหรือไม่ ถ้าเท่ากันโปรแกรมเปรียบเทียบรหัสของทั้งสองชุด ถ้าเหมือนกันให้จอ LCD แสดงข้อความ
“ID is matched” ถ้าขนาดของรหัสหรือไม่เหมือนกับที่กำหนดไว้ จอ LCD แสดงข้อความ
“ID is mismatched” จากนั้นแสดงข้อมูล UID ของบัตรที่ Serial port ผ่านฟังก์ชั่น PrintHex
lcd.clear(); lcd.setCursor(0,0); lcd.print("Waiting for Tag"); analogWrite(buzzer,255);
แต่ถ้าตรวจสอบได้ว่า ไม่มีบัตรทาบอยู่ โปรแกรมจะแสดงข้อความ “Waiting for Tag” และให้ลำโพง Buzzer ไม่ทำงาน
จากภาพแสดงเมื่อมีบัตรทาบ โปรแกรมเปรียบเทียบ UID ของบัตรที่ทาบอยู่ และที่กำหนดไว้ในโปรแกรม แสดงสถานะผ่าน Serial port และ LCD