เรียนรู้และฝึกปฏิบัติ RFID ไปกับชุด RFID Basic Starter Kit (ตอนที่ 6 ทดลองใช้งาน RFID ร่วมกับ SD Card ผ่าน Data Logging Shield)

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

(ตอนที่ 6 ทดลองใช้งาน RFID ร่วมกับ SD Card ผ่าน Data Logging Shield)

07

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

ตอนที่ 6 ทดลองใช้งาน RFID ร่วมกับ SD Card ผ่าน Data Logging Shield

50

  ในการทดลองนี้ ติดต่อ SD Card ผ่าน Data Logging Shield โดย ทดลองสร้างไฟล์บน SD Card เขียนไฟล์บน SD Card และอ่านไฟล์บน SD Card บอร์ด Arduino ต่อเข้ากับ Data Logging Shield พอร์ต SPI โดยกำหนดขาดังนี้

51
52

เตรียม SD Card ก่อน โดย Format SD Card กำหนด file system เป็น FAT32 โดยสั่งได้จาก Windows ผ่าน Format Removable Disk หรือใช้โปรแกรมอื่นเช่น SDFormatter

53

จากภาพแสดงการต่อ Arduino เชื่อมต่อ SD Card บน Data Logging Shield
ติดตั้ง Library SD โดยดาวน์โหลดได้จาก Example Code & Library

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

54

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

55

5.1 ทดลองสร้างไฟล์บน SD Card
ในการทดลองนี้ให้ Arduino สร้างไฟล์ข้อความ นามสกุล .CSV (Comma Separated Values) บน SD Card ไฟล์ CSV คือ Text File สำหรับเก็บข้อมูลแบบตาราง โดยใช้จุลภาค (,) แบ่งข้อมูลในแต่ละหลัก (Column) และใช้การเว้นบรรทัดแทนการแบ่งแถว (Row) สามารถเปิดในบนโปรแกรมแก้ไขข้อความทั่วไป เช่น notepad WordPad หรือโปรแกรม Excel ทำให้การอ่านหรือแก้ไขข้อมูลได้ง่าย

56

ภาพแสดงไฟล์ .CSV เมื่อเปิดในโปรแกรม Notepad และ Excel

โดยรูปแบบไฟล์ CSV ที่สร้างในการทดลองนี้มีดังนี้

57

จากตารางจะเห็นได้ว่า สร้างไฟล์มีข้อมูล 8 คอลัมน์ แต่ละคอลัมน์เก็บข้อมูลของผู้ใช้บัตร เช่น เลข ID ชื่อ เวลาเข้า-ออกล่าสุด โดยการเขียนไฟล์ไปที่แต่ละคอลัมน์ ขนาดตัวอักษรต้องไม่เกินกว่าที่กำหนดไว้

โค้ดโปรแกรมบนบอร์ด Arduino มีดังนี้

#include <SPI.h>
#include <SD.h>
 
File myFile;
const int chipSelect = 10;
 
void setup() {
   Serial.begin(9600);
   Serial.println("Initializing SD card...");
   pinMode(SS, OUTPUT);
     if (!SD.begin(chipSelect)) {
        Serial.println("initialization failed!");
        return;
      }
     Serial.println("initialization done.");
    myFile = SD.open("database.csv", FILE_WRITE);
     
     if (myFile) 
     {
       Serial.print("Writing to database.csv...");
       create_table(50);
       myFile.close();
       Serial.println("done.");
     }
}
 
void loop() 
{
   
}
 
void create_table(int long_table){
  for(int i=0;i<=long_table;i++)
   {
    if((i >= 0)&&(i < 10))
    {
      myFile.print("00");
      myFile.print(String(i));
    }
    else if((i >= 10)&&(i < 100)){
      myFile.print("0");
      myFile.print(String(i));
    }
    else if((i >= 100)&&(i < 1000)){
      myFile.print(String(i));
    }
     
     myFile.print(",");
     if(i==0){
       myFile.println("ID,Name,Password,Is_in,T_in,T_out,Late_count");  
      }
      else
      {       myFile.println("__________,____________________,____,F,00/00/00/00:00,00/00/00/00:00,000");
      }
    }
}

จากโค้ดจะเห็นได้ว่า

#include <SPI.h>
#include <SD.h>
 
File myFile;
const int chipSelect = 10;

ใช้งาน SD Card Library โดย include <SPI.h> และ <SD.h> สร้าง object File ชื่อ myfile กำหนดขา Select chip ของ SD Card ที่ขา 10

Serial.begin(9600);
   Serial.println("Initializing SD card...");
   pinMode(SS, OUTPUT);
     if (!SD.begin(chipSelect)) 
      {
        Serial.println("initialization failed!");
        return;
      }
     Serial.println("initialization done.");

ในฟังก์ชั่น setup เปิดใช้งาน Serial กำหนด Baud Rates เป็น 9600 bps ตรวจสอบ SD Card ใช้คำสั่ง begin ถ้าค่าที่ return ออกมาเป็น false ส่งข้อความผ่าน Serial “initialization failed!” วนตรวจสอบวนกว่าการเตรียม SD Card จะสำเร็จ จากนั้น ส่งข้อความ “initialization done.”

myFile = SD.open("database.csv", FILE_WRITE);
      if (myFile) 
      {
       Serial.print("Writing to database.csv...");
       create_table(50);
       myFile.close();
       Serial.println("done.");
      }

หลังจากการเตรียม SD Card เสร็จแล้ว สร้างและเปิดไฟล์ database.csv จากนั้นเขียนข้อมูล สร้างตารางขนาด 50 แถว ผ่านฟังก์ชั่น create_table และนั้นปิดไฟล์ 

void create_table(int long_table) {
  for(int i=0;i<=long_table;i++)
   {
    if((i >= 0)&&(i < 10))
    {
      myFile.print("00");
      myFile.print(String(i));
    }
    else if((i >= 10)&&(i < 100))
    {
      myFile.print("0");
      myFile.print(String(i));
    }
    else if((i >= 100)&&(i < 1000))
    {
      myFile.print(String(i));
    }
     
     myFile.print(",");
     if(i==0)
      {
       myFile.println("ID,Name,Password,Is_in,T_in,T_out,Late_count");   
      }
      else
      {
       myFile.println("__________,____________________,____,F,00/00/00/00:00,00/00/00/00:00,000");
      }
    }
}

ในฟังก์ชั่น create_table เขียนไฟล์ลงไปในผ่านคำสั่ง myFile.println ในบรรทักแรก (i=0) เป็นการกำหนดชื่อคอลัมน์ จากนั้นเขียนข้อมูลเริ่มต้นลงไปในแต่ละช่องของตาราง ตามจำนวนที่กำหนดใน parameter long_table

58

เมื่อ Arduino สร้างไฟล์เสร็จแล้ว นำ SD Card มาเปิดไฟล์บน PC จะเห็นได้ว่ารูปแบบข้อมูลเป็นไปตามที่กำหนดในโปรแกรม 
5.2 ทดลองเขียนข้อมูลบน SD Card
ทดลองให้ Arduino แก้ไขข้อมูลในไฟล์ CSV ที่ได้สร้างจากการทดลองที่แล้ว โดยกำหนดแถว คอลัมน์ และข้อมูลที่ต้องการบันทึกลงไป 
โค้ดโปรแกรมบนบอร์ด Arduino มีดังนี้

#include <SPI.h>
#include <SD.h>
 
File myFile;
const int chipSelect = 10;
 
const int _line_no = 0; 
const int _ID = 2;
const int _name = 4;
const int _pass = 6;
const int _is_in = 8;
const int _t_in = 10;
const int _t_out = 11;
const int _late_count = 14;   
 
void write_data(int line,int colum,String data)
{
  int selsect=0;
   
   if((line >=0) && (colum>=0))
   {
    selsect = ((line-1) * 78) + 50;  
   
   switch(colum)
   {
     case _line_no:    selsect+=0;    break;
     case _ID :        selsect+=4;    break;
     case  _name:      selsect+=15;   break;
     case _pass:       selsect+=36;   break;
     case _is_in:      selsect+=41;   break;
     case _t_in :      selsect+=43;   break;
     case _t_out :     selsect+=58;   break;
     case _late_count: selsect+=73;   break; 
   } 
     myFile.seek(selsect);  
     myFile.print(data);
  } 
}
 
 
void setup() 
{
   Serial.begin(9600);
   Serial.println("Initializing SD card...");
   pinMode(SS, OUTPUT);
     if (!SD.begin(chipSelect)) 
      {
        Serial.println("initialization failed!");
        return;
      }
     Serial.println("initialization done.");
    myFile = SD.open("database.csv", FILE_WRITE);
     
     if (myFile) 
     {
       Serial.print("Writing to database.csv...");
       write_data(1,_ID,"0000000001");
       write_data(1,_name,"Mr.Thaieasyelec");
       write_data(1,_pass,"1234");
       write_data(1,_is_in,"T");
       write_data(1,_t_in,"30/10/14/10:10");
       write_data(1,_t_out,"30/10/14/16:30");
       write_data(1,_late_count,"999");
        
       write_data(5,_ID,"0000000005");
       write_data(5,_name,"Mr.Arduino");
       write_data(5,_pass,"0725");
       write_data(5,_is_in,"T");
       write_data(5,_t_in,"30/10/14/10:10");
       write_data(5,_t_out,"30/10/14/16:30");
       write_data(5,_late_count,"001");
       myFile.close();
       Serial.println("done.");
     }
}
 
 void loop() 
 {
   
 
 }