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

เรียนรู้และฝึกปฏิบัติ RFID ไปกับชุด RFID Basic Starter Kit

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

+ ลำโพง Buzzer + Keypad + RTC (ผ่าน Data Logging Shield))

07

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

ตอนที่ 5 ทดลองใช้งาน RFID ร่วมกับ NFC Shield + จอ LCD 16×2+ ลำโพง Buzzer + Keypad + RTC (ผ่าน Data Logging Shield)

41

ในการทดลองเชื่อมต่อ RTC โดยทดสอบตั้งเวลา RTC และอ่านเวลา RTC โดยกำหนดขาดังนี้

42
43

จากภาพแสดงการต่อ Arduino เข้ากับ NFC Shield Buzzer Keyboard LCD และ RTC ซึ่งอยู่บน bus I2C เดียวกัน

44

ใส่ถ่านนาฬิกา ก่อนเริ่มใช้งาน RTC 

45

ติดตั้ง Library DS1306RTC โดยดาวน์โหลดได้จาก Example Code & Library จากนั้น แตกไฟล์ นำไปวางไว้ในโฟลเดอร์ .. Arduino\libraries

46

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

47

4.1 ทดลองตั้งเวลา RTC 
          ในการทดลองนี้ เมื่อผู้ใช้เริ่มใช้งาน RTC ครั้งแรกต้องส่งคำสั่งไปตั้งเวลาก่อน โดยใช้ Arduino ติดต่อ RTC ผ่านพอร์ต I2C ส่งคำสั่งตั้งเวลา พร้อมวัน/เดือน/ปี ชั่วโมง/นาที/วินาที ที่ต้องการ จากนั้นส่งคำสั่งให้ RTC เริ่มนับเวลา 
โค้ดโปรแกรมบนบอร์ด Arduino มีดังนี้

//--------- RTC I2C----------//
#include <TEE_RTC.h>
#include <Wire.h>
RTC rtc;
//--------- RTC I2C----------//
//--------- LCD I2C ----------//
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
//--------- LCD I2C ----------//
 
void setup()
{
  Serial.begin(9600);
  Serial.println("Arduino_settime_RTC!");
   
  lcd.begin();
  lcd.backlight();
  lcd.setCursor(0,0);
   
  rtc.second = 00;
  rtc.minute = 30;
  rtc.hour   = 22 ;
  rtc.weekDay = 1;
  rtc.monthDay = 13;
  rtc.month = 10;
  rtc.year = 14;
  rtc.set_time_date();
   
  lcd.print("Set Time OK");
  Serial.println("Set Time OK");
}
void loop () 
{
  Serial.println(rtc.get_time());
  Serial.println(rtc.get_date());
  delay(1000);
}  
 
rtc.second = 00;
rtc.minute = 30;
rtc.hour   = 22;
rtc.weekDay = 1;
rtc.monthDay = 13;
rtc.month = 10;
rtc.year = 14;
rtc.set_time_date();

          ในฟังก์ชั่น setup กำหนดเวลาให้ RTC โดยกำหนดค่าให้ object rtc จากนั้นใช้คำสั่งกำหนดเวลา set_time_date();

Serial.println(rtc.get_time());
Serial.println(rtc.get_date());
delay(1000);

          ในฟังก์ชั่น loop วนทุกๆ 1 วินาที (1000 ms) อ่านเวลา จากคำสั่ง get_time อ่านวันทีจาก get_date 

48

  เมื่อการเซตเวลา RTC เสร็จ Arduino แสดงข้อความผ่าน Serial แสดงเวลาและวันที่

4.2 ทดลองอ่านเวลา RTC
          หลังจากที่เราได้ตั้งเวลาให้ RTC แล้ว หลังจากนั้นเวลา RTC จะเดินไปเรื่อยๆ ถ้ายังมีถ่านนาฬิกาให้พลังงานอยู่ เมื่อผู้ใช้ต้องการอ่านเวลา RTC ใช้คำสั่ง Update() และอ่านค่าเวลา จาก object rtc ออกมา โดยในตัวอย่างนี้ให้ Arduino อ่านเวลาจาก RTC แสดงผลที่ LCD เมื่อมีบัตรเข้ามาทาบ Arduino จะตรวจสอบ UID ของบัตร เวลาต้องอยู่ในช่วงที่กำหนด จึงจะขึ้นข้อความ “OK pass” หรือถ้าไม่จะแสดงข้อความ “You late!”
โค้ดโปรแกรมบนบอร์ด Arduino มีดังนี้

//--------- LCD I2C ----------//
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
//--------- LCD I2C ----------//
 
//--------- RTC I2C----------//
#include <TEE_RTC.h>
#include <Wire.h>
RTC rtc;
//--------- RTC 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 ---------//
 
//---------- valiable ---------//
String password = "1234";
String buffer_key;
char state = '0'; 
//---------- valiable ---------// 
 
//--------- Keypad -----------------//
#include <Keypad.h>
const byte ROWS = 4;        // Four rows
const byte COLS = 4;        //  columns
byte rowPins[ROWS] = { 7,8,A2,A3 } ;
byte colPins[COLS] = { 2,3,4,5, }; 
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );  
//--------- Keypad -----------------//
 
 
void lcd_show(char* txt)
{
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print(txt); 
  analogWrite(buzzer,128);
} 
 
 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; //no mismatches
}
 
boolean compare_key(char one[], char two[]) {
 
if(strlen(one) == 0) return false; //empty
for(int n = 0; n < 3; n++){
if(one[n] != two[n]) return false;
}
return true; //no mismatches
}
 
 
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);   
  nfc.begin();
  nfc.SAMConfig();
    
}
 
void loop() 
{
  
  if(state== '0')
  {
   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");
            nfc.PrintHex(uid_read, uidLength_read);
           if(state== '0')
           {
             state= '1';
             lcd_show("press password"); 
             Serial.println("press password");
           }
         }
       else
       {
         lcd_show("ID is mismatched!");
         Serial.println("ID is mismatched");
         nfc.PrintHex(uid_read, uidLength_read);
       }
    }
    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);
   } 
  }
   
   if(state== '1')
  {
   char key = keypad.getKey();
    if (key)
     {
       Serial.println(key);
       buffer_key += key;
       analogWrite(buzzer,125);
       delay(100);
     if(buffer_key.length() == 4)
     {
      if(buffer_key == password)
      {
        lcd_show("pass is match!");
        Serial.println("password is match!");
        state= '2';
      }
      else
       {
        lcd_show("pass is wrong");
        Serial.println("password is not matched");
        state= '0';
       } 
        buffer_key = "";
         
     }
    }
    analogWrite(buzzer,255);
  }
   
   if(state== '2')
  {
    rtc.update();
    if( (rtc.hour >= 9 ) && (rtc.minute <= 30) && (rtc.second <= 59) &&
         (rtc.hour <= 16 ) && (rtc.minute <= 30) && (rtc.second <= 59))
      {
        lcd_show("You late!");
        Serial.println("You late!");
      }
      else
      {
        lcd_show("OK pass");
        Serial.println("OK pass");
      }
     state= '0';
     analogWrite(buzzer,255);
  }
}