เรียนรู้และฝึกปฏิบัติ 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)

07

ดูสารบัญบทความ “เรียนรู้และฝึกปฏิบัติ RFID ไปกับชุด RFID Basic Starter Kit”

ตอนที่ 3 ทดลองใช้งาน RFID ร่วมกับ NFC Shield + จอ LCD 16×2 + ลำโพง Buzzer

27

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

28
29

ภาพแสดงการต่อ NFC Shield จอ LCD 16×2 และลำโพง Buzzer เข้ากับบอร์ด Arduino

        ติดตั้ง Library LiquidCrystal_I2C โดยดาวน์โหลดได้จาก Example Code & Library

จากนั้น แตกไฟล์ นำไปวางไว้ในโฟลเดอร์ .. Arduino\libraries

30

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

31

โค้ดโปรแกรมบนบอร์ด 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