HƯỚNG DẪN ĐỌC VÀ GHI DỮ LIỆU LÊN THẺ TỪ NFC/RFID

Lời đầu tiên, Arduino Shop xin gởi đến các bạn yêu mếm Arduino một lời chúc tràn đầy năng lượng. Ở một chủ đề tương tự, Arduino Shop đã hướng dẫn mọi người làm quen với con PN532 V3 - thiết bị có thể đọc và ghi dữ liệu lên thử từ NFC. Hôm nay, Arduino Shop sẽ giúp các bạn 1 đoạn code cách đọc ghi dữ liệu tư thẻ NFC và lưu lên thẻ nhớ mini Card. Để vào nội dung chi tiết của bài viết, chúng ta cùng vào trang dưới nhé. Nào Let's Go ==>>>

Ngày đăng: 22-11-2016

6,210 lượt xem

Xin chào các bạn, Do dạo này công việc của Arduino Shop khá bận rộn nên chưa ra được các bài viết để chia sẽ kiến thức cho mọi người được. Hôm nay, Arduino Shop sẽ giới thiệu đến các bạn một đoạn code nhỏ, hướng dẫn lập trình đọc ghi dữ liệu lên thẻ từ NFC và lưu giá trị hoặc thông tin từ thẻ từ NFC lên thẻ nhớ Mini SD Card. Để thực hiện được mini Project này, thì cần yêu cầu chúng ta một số thiết bị phần cứng như sau:

1. Yêu cầu phần cứng:

- Thứ 1: Một board Arduino uno R3 hoặc tương đương

indruino-uno-R3

Board indruino-uno-R3

- Thứ 2: Một board PN532 V3. Bạn có thể tham khảo con này tại đây ở một bài viết mà Arduino Shop đã từng làm về nó. Hãy click để biết thêm thông tin về board này.

HUONG-DAN-LAP-TRINH-DOC-GHI-THE-TU-NFC

PN532 V3

-Thứ 3: Một board hỗ trợ Ethernet Shield. Bời vì board này có hỗ trợ cho thiết bị Mini SD Card. Hoặc bạn có thể mua bất cứ một cái board nào có hỗ trợ đọc ghi dữ liệu lên SD Card

Shield Ethernet W5100

Shield Ethernet W5100

- Thứ 4: Board đọc thời gian thực 1307 và một số dây kết nối....

==> Đã chuẩn bị xong phần cứng chưa các bạn, giờ là lúc chúng ta lập trình nhé

2. Mô tả giải thuật

Ở đây, phần lập trình thì chúng ta sẽ lập trình ứng dụng này theo sơ đồ như sau:

Bước 1: Quẹt thẻ từ NFC/ RFID để thiết bị PN532 V3 này đọc giá trị

Bước 2: Arduino nhận giá thị của thẻ từ và dữ liệu lưu trên thẻ từ để xử lý

Bước 3: Arduino sẽ lấy giá trị bao gồm mã thẻ và nội dung lưu trên thẻ nhớ dưới dạng file CSV. Giống như máy chấm công vậy các bạn( có thể là chuổi ký tự, số...) cùng với thời gian quẹt thẻ

Với dữ liệu này, chúng ta có thể phân tích. 

Đơn giản cho ứng dụng này, chúng ta có thể nghỉ đến là chấm công, theo dõi hàng hóa, bảo vệ nhà xưởng...

3. Code mẫu

Việc tải thư viện và cài đặt thư viện cho PN532 V3, bạn có thể tham khảo tại bài viết >>>ở đây<<<

Giờ chúng ta cùng nhau đọc code nhé. Đoạn code bên dưới:

// Khai báo chuẩn giao tiếp I2C giữa thiết bị PN532 V3 với Arduino

#include <Wire.h>

#include <PN532_I2C.h>

#include <PN532.h>

#include <NfcAdapter.h>

PN532_I2C pn532_i2c(Wire);

NfcAdapter nfc = NfcAdapter(pn532_i2c);

#include <SD.h> // Khai báo thư viện thẻ nhớ SD Card

#include <DS1307.h> // Khai báo đồng hồ thời gian thực

DS1307 rtc(A4, A5); // Khai biến giao tiếp chân I2C giữa Arduino và DS1307

File myFile; // Khai báo tệp tin myFile để lưu giá trị vào

int theodoi;

String mangthe[12]={"35 5D EE C5","37 D9 02 1F","65 0C 04 6D" }; //Khai báo mã thẻ của các thẻ từ NFC

// Đoạn mã khai báo so sánh 2 chuổi dữ liệu với nhau thuộc kiểu String


boolean isSame(String x, String y)
{
    for (int i = 0; i < 12; i++)
    {
      if (x[i] != y[i])
      {
        return false;
      }
    }
    return true;
}

//kiem tra ma the 
boolean isAuthorized_S(String chuoikiemtra)
{
    for(int i = 0; i<12; i++)//so the la 12
    {

      if(isSame(chuoikiemtra, mangthe[i]))
      {

       return true;

      }
    }

   return false;
}

// Chương trình kiểm tra SD Card có lắp thẻ nhớ vào hay chưa

void check_SD_Card()
{
  Serial.println("Check SD card...");
  lai1:

  if(!SD.begin(53))
  {

    Serial.print("ERRO SD Card");

    Serial.print("      ");

    Serial.println("Plese Again");

    goto lai1;

  }
  Serial.println("SD Card OK");

  delay(1000);
}

Cài đặt thời gian ban đầu cho đồng hồ DS1307

void set_time()
{
// The following lines can be uncommented to set the time

  rtc.setDOW(THURSDAY);        // Set Day-of-Week to SUNDAY

  rtc.setTime(4, 27, 30);     // Set the time to 12:00:00 (24hr format)

  rtc.setDate(17, 11, 2016);   // Set the date to October 3th, 2010

}

// Cho phép hiển thị thời gian lên màn hình

void dislaytime()

{

  Serial.print(rtc.getDOWStr());// hien thi thong tin thu ngay

  Serial.print(" ");

  // Send date

  Serial.print(rtc.getDateStr());// hien thi thong tin ngay thang

  Serial.print(" -- ");

  // Send time

  Serial.println(rtc.getTimeStr());// hien thi thoi gian la gio


}

void setup(void) {

  Serial.begin(9600); 

  Serial.println("Doc The");

  rtc.begin();

  rtc.halt(false);

  nfc.begin();

  check_SD_Card();

  myFile = SD.open("TEST.CSV", FILE_WRITE); // Cho phép tạo ra một cái tập tin tên là TEST.CSV để lưu dữ //liệu lên trên file nà

  myFile.println("");

  myFile.print("STT"); myFile.print(",");myFile.print("Ma the"); myFile.print(","); myFile.print("Ho ten");  

  myFile.print(","); myFile.print("Ngay vao");  myFile.print(","); myFile.print("Gio Vao"); 

  myFile.print(","); myFile.println("so lan quet the"); 

  myFile.close();

  Serial.println(" Da ghi xong");

  delay(100);
}
  int stt;

void loop(void) {

String s1,s2="";String payloadAsString = "";

Serial.println("\nScan a NFC tag\n");

  if (nfc.tagPresent())
  {
    NfcTag tag = nfc.read();

    Serial.println(tag.getTagType());

    Serial.print("UID: ");Serial.println(tag.getUidString());

    s1=tag.getUidString();

    // Đoạn này không sài, nhưng nếu các bạn muốn thì có thể bỏ cái dấu /* này đi. Đoạn code để phân biệt thẻ củ hay thẻ mới. Ví dụ, nhân viên củ quẹt vào nó cho vì đã tồn tại mã, mã thẻ mới quẹt vào không cho, yêu cầu bạn phải UPdate lên và nó tự update cho các bạn luôn.

   /* if(isAuthorized_S(s1)==false)

    {
      for(int i=0;i<=12;i++)

      {
        if(mangthe[i]=="")
        {

         mangthe[i]=s1;

          Serial.print("Update Finished");

          delay(100);

          return;

        }
      }
    }else Serial.println(" ma the cu");*/

    if (tag.hasNdefMessage()) // every tag won't have a message
    {

      NdefMessage message = tag.getNdefMessage();

      Serial.print("\nThis NFC Tag contains an NDEF Message with ");

      Serial.print(message.getRecordCount());

      Serial.print(" NDEF Record");

      if (message.getRecordCount() != 1) {

        Serial.print("s");

      }

      Serial.println(".");
     
      // cycle through the records, printing some info from each

      int recordCount = message.getRecordCount();

      for (int i = 0; i < recordCount; i++)

      {

        Serial.print("\nNDEF Record ");Serial.println(i+1);

        NdefRecord record = message.getRecord(i);

        // NdefRecord record = message[i]; // alternate syntax

        Serial.print("  TNF: ");Serial.println(record.getTnf());

        Serial.print("  Type: ");Serial.println(record.getType()); // will be "" for TNF_EMPTY

        // The TNF and Type should be used to determine how your application processes the payload

        // There's no generic processing for the payload, it's returned as a byte[]

        int payloadLength = record.getPayloadLength();

        byte payload[payloadLength];

        record.getPayload(payload);

        // In ra thông tin dưới dạng mã Hex

        //Serial.print("  Payload (HEX): ");

        //PrintHexChar(payload, payloadLength);

        // Sử lý dữ liệu lưu trên thẻ từ NFC ra dữ liệu và kiểu String

        for (int c = 0; c < payloadLength; c++) {

          payloadAsString += (char)payload[c];

        }

        Serial.print("  Payload (as String): ");

        Serial.println(payloadAsString);

        // id is probably blank and will return ""

        String uid = record.getId();

        if (uid != "") {

          Serial.print("  ID: ");Serial.println(uid);

        }

      }

    }

  }

// Nguyên đoạn dưới này là các bạn thực hiện việc lưu dữ liệu mà đọc được từ thẻ từ NFC

  myFile = SD.open("TEST7.CSV", FILE_WRITE);

  if(myFile)

  {

    myFile.print(stt++); myFile.print(",");myFile.print(s1); myFile.print(","); myFile.print(payloadAsString); 

    myFile.print(","); myFile.print(rtc.getDateStr());  myFile.print(","); myFile.println(rtc.getTimeStr()); 

    myFile.close();

  }else Serial.println(" The nho loi");

  delay(500);

}
 

4. Video

  Arduino Shop đang cập nhật video, do chưa ghi hình kịp. Tối nay, Arduino Shop sẽ ghi hình mô tả chi tiết đề tài các bạn nhé. Hãy đoán xem :)

5. Tổng kết:

Đến đây, chúng ta đã làm xong rồi đúng không ạ. Bạn nào chưa làm được hoặc có vấn đề gì cần giải đáp cho dự án này, có thể liên hệ ngay để được hỗ trợ nha các bạn. Thì để thực hiện được dự án này, đều cấp thiết ban đầu là bạn phải có một chút kiến thức lập trình Arduino. Nếu bạn chưa trạng bị, thì Arduino Shop sẽ trang bị giúp các bạn nếu các bạn có nhu cầu. Có thể tham khảo >>thông tin đào tạo của Arduino Shop>>

Thứ 2, là chúng ta cần trang bị các phần cứng để đáp ứng yêu cầu. Ở phần trên, Arduino Shop đã giới thiệu các phần cứng, bạn có thể mua về và thực hành. Hoặc tham khảo các sản phẩm của Arduino Shop

Đến đây, Arduino Shop chúc các bạn thành công và nghỉ ra nhiều ý tưởng hay để nâng cao dự án này lên các bạn nhé.

GỌI NGAY - 0902 37 12 52 (Mr Quốc): Tư vấn KT

ĐỂ ĐƯỢC TƯ VẤN VÀ CUNG CẤP GIẢI PHÁP KỊP THỜI CHO BẠN

ARDUINO SHOP

Địa chỉ: Số 41 Gò Dưa, Phường Tam Bình, Quận Thủ Đức, TP. Hồ Chí Minh
Email: arduinoshophcm@gmail.com

Bình luận (2)

Gửi bình luận của bạn

Captcha
  • Viethan (02-12-2016) Trả lời
    Bạn ơi cho mình hỏi thẻ atm mình có thể đọc mã thẻ trên đó k, tại mình muốn ứng dụng nó vào việc quản lý nhân sự luôn. nếu được bạn nói cho mình cách với. cám ơn bạn!
    • Huỳnh Tấn Quốc (02-12-2016)
      Đọc mã thẻ atm bên em chưa làm nha anh.
<