Tutorial Koneksi RFID RC522 dengan Arduino Uno dan MEGA 2560
Rabu, 17 September 2014
0
komentar
RFID atau Radio Frequency Identification, adalah suatu metode
yang mana bisa digunakan untuk menyimpan atau menerima data secara jarak jauh
dengan menggunakan suatu piranti yang bernama RFID tag atau transponder.
Suatu RFID tag adalah sebuah benda kecil, misalnya berupa stiker adesif, dan
dapat ditempelkan pada suatu barang atau produk. RFID tag berisi antena yang
memungkinkan mereka untuk menerima dan merespon terhadap suatu query yang dipancarkan oleh
suatu RFID transceiver.
Koneksinya:
Arduino Uno:
Uno RC522
3.3V VCC
GND GND
5 RST
12 MISO
11 MOSI
13 SCK
10 NSS
|
Arduino MEGA 2560 :
Mega RC522
3.3V VCC
GND GND
RESET RST
50 MISO
51 MOSI
52 SCK
53 NSS / SDA
|
MOSI (Master In Slave Out): Garis Master untuk
mengirimkan data ke perangkat.
MISO(Master Out Slave In): Garis Slave(Perangkat) untuk
mengirim data ke master.
SCK (Serial Clock) :
Menyinkronkan transmisi
data yang dihasilkan oleh master dan khusus untuk setiap perangkat.
NSS/SDA (Slave Select) :
Pin pada setiap
perangkat master dapat digunakan untuk mengaktifkan
dan menonaktifkan perangkat tertentu.
|
Source Codenya:
//sensor berkomunikasi menggunakan SPI (Serial Peripheral Interface)
#include
#define uchar unsigned char
#define uint unsigned int
// Panjang maksimum dari array
#define MAX_LEN 16
/////////////////////////////////////////////////////////////////////
//set pinnya
/////////////////////////////////////////////////////////////////////
// Arduino Mega - pin = 53
// Arduino Uno - pin = 10
const int chipSelectPin = 53;
const int NRSTPD = 5;
//MF522命令字
#define PCD_IDLE 0x00 // Membatalkan perintah saat ini
#define PCD_AUTHENT 0x0E // Authentication Key
#define PCD_RECEIVE 0x08 // Menerima Data
#define PCD_TRANSMIT 0x04 // Mengirim data
#define PCD_TRANSCEIVE 0x0C // Mengirim dan menerima data
#define PCD_RESETPHASE 0x0F // Atur ulang
#define PCD_CALCCRC 0x03 // Menghitung CRC
// Prosedure perintah Kartu
#define PICC_REQIDL 0x26 // Ketika tidak menemukan Sinyal ke hibernasi
#define PICC_REQALL 0x52 // Aarea sinyal dengan semua kartu
#define PICC_ANTICOLL 0x93 // Antisipasi Tabrakan Data
#define PICC_SElECTTAG 0x93 // Memilih kartu
#define PICC_AUTHENT1A 0x60 // Sebuah verifikasi kunci A
#define PICC_AUTHENT1B 0x61 // Verifikasi kunci B
#define PICC_READ 0x30 // Baca Block
#define PICC_WRITE 0xA0 // Menulis Block
#define PICC_DECREMENT 0xC0 // Memasukan pengurangan
#define PICC_INCREMENT 0xC1 // Mengisi kembali
#define PICC_RESTORE 0xC2 // Mentransfer blok data ke buffer
#define PICC_TRANSFER 0xB0 // Disimpan dalam Buffer data
#define PICC_HALT 0x50
// Kode kesalahan dikembalikan ketika MF522 melakukan komunikasi kembali.
#define MI_OK 0
#define MI_NOTAGERR 1
#define MI_ERR 2
// ------------------ MFRC522 melakukan registrasi ---------------
//Page 0:Command and Status
#define Reserved00 0x00
#define CommandReg 0x01
#define CommIEnReg 0x02
#define DivlEnReg 0x03
#define CommIrqReg 0x04
#define DivIrqReg 0x05
#define ErrorReg 0x06
#define Status1Reg 0x07
#define Status2Reg 0x08
#define FIFODataReg 0x09
#define FIFOLevelReg 0x0A
#define WaterLevelReg 0x0B
#define ControlReg 0x0C
#define BitFramingReg 0x0D
#define CollReg 0x0E
#define Reserved01 0x0F
//Page 1:Command
#define Reserved10 0x10
#define ModeReg 0x11
#define TxModeReg 0x12
#define RxModeReg 0x13
#define TxControlReg 0x14
#define TxAutoReg 0x15
#define TxSelReg 0x16
#define RxSelReg 0x17
#define RxThresholdReg 0x18
#define DemodReg 0x19
#define Reserved11 0x1A
#define Reserved12 0x1B
#define MifareReg 0x1C
#define Reserved13 0x1D
#define Reserved14 0x1E
#define SerialSpeedReg 0x1F
//Page 2:CFG
#define Reserved20 0x20
#define CRCResultRegM 0x21
#define CRCResultRegL 0x22
#define Reserved21 0x23
#define ModWidthReg 0x24
#define Reserved22 0x25
#define RFCfgReg 0x26
#define GsNReg 0x27
#define CWGsPReg 0x28
#define ModGsPReg 0x29
#define TModeReg 0x2A
#define TPrescalerReg 0x2B
#define TReloadRegH 0x2C
#define TReloadRegL 0x2D
#define TCounterValueRegH 0x2E
#define TCounterValueRegL 0x2F
//Page 3:TestRegister
#define Reserved30 0x30
#define TestSel1Reg 0x31
#define TestSel2Reg 0x32
#define TestPinEnReg 0x33
#define TestPinValueReg 0x34
#define TestBusReg 0x35
#define AutoTestReg 0x36
#define VersionReg 0x37
#define AnalogTestReg 0x38
#define TestDAC1Reg 0x39
#define TestDAC2Reg 0x3A
#define TestADCReg 0x3B
#define Reserved31 0x3C
#define Reserved32 0x3D
#define Reserved33 0x3E
#define Reserved34 0x3F
//-----------------------------------------------
// Card 4 byte nomor seri, kelima byte checksum byte
uchar serNum[5];
uchar writeData[16]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100}; // Inisialisasi 100 dolar
uchar moneyConsume = 18 ; // Menghabiskan 18 yuan
uchar moneyAdd = 10 ; // Isi Ulang 10 yuan
// Sebuah sektor password, 16 sektor, masing-masing sandi 6 Byte
uchar sectorKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
//{0x19, 0x84, 0x07, 0x15, 0x76, 0x14},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
};
uchar sectorNewKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0x19,0x84,0x07,0x15,0x76,0x14},
//you can set another ket , such as " 0x19, 0x84, 0x07, 0x15, 0x76, 0x14 "
//{0x19, 0x84, 0x07, 0x15, 0x76, 0x14, 0xff,0x07,0x80,0x69, 0x19,0x84,0x07,0x15,0x76,0x14},
// but when loop, please set the sectorKeyA, the same key, so that RFID module can read the card
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0x19,0x33,0x07,0x15,0x34,0x14},
};
void setup() {
Serial.begin(9600); // RFID reader SOUT pin connected to Serial RX pin at 2400bps
// start SPI library:
SPI.begin();
pinMode(chipSelectPin,OUTPUT); // Set digital pin 10 as OUTPUT to connect it to the RFID /ENABLE pin
digitalWrite(chipSelectPin, LOW); // Activate the RFID reader
pinMode(NRSTPD,OUTPUT); // Set digital pin 10 , Not Reset and Power-down
digitalWrite(NRSTPD, HIGH);
MFRC522_Init();
}
void loop()
{
uchar i,tmp;
uchar status;
uchar str[MAX_LEN];
uchar RC_size;
uchar blockAddr; // Pilih alamat blok operasi 0-63
String mynum = "";
// Cari kartu, kembali jenis kartu
status = MFRC522_Request(PICC_REQIDL, str);
if (status == MI_OK)
{
Serial.println("Card detected");
Serial.print(str[0],BIN);
Serial.print(" , ");
Serial.print(str[1],BIN);
Serial.println(" ");
}
// Anti-tabrakan, mengembalikan kartu nomor seri 4 byte
status = MFRC522_Anticoll(str);
memcpy(serNum, str, 5);
if (status == MI_OK)
{
Serial.println("Karu terdeteksi : ");
Serial.print(serNum[0]);
Serial.print(" , ");
Serial.print(serNum[1],BIN);
Serial.print(" , ");
Serial.print(serNum[2],BIN);
Serial.print(" , ");
Serial.print(serNum[3],BIN);
Serial.print(" , ");
Serial.print(serNum[4],BIN);
Serial.println(" ");
// Should really check all pairs, but for now we'll just use the first
if(serNum[0] == 181) { //Sesuaikan dengan Kartu yang terdeteksi
Serial.println("Kartu Satu Terdeteksi Sebagai Iwan Cilibur ");
} else if(serNum[0] == 105) {
Serial.println("Kartu Dua Terdeteksi Sebagai Orang Ganteng");
}
delay(1000);
}
//Serial.println(" ");
MFRC522_Halt(); // Kartu perintah ke Sleep
}
/*
* Nama Fungsi: Write_MFRC5200
* Keterangan: MFRC522 register untuk menulis byte data
* Masukan: - mendaftarkan alamat addr; val - nilai yang akan ditulis
* Kembali Nilai: Tidak ada
*/
void Write_MFRC522(uchar addr, uchar val)
{
digitalWrite(chipSelectPin, LOW);
// Format Alamat:0XXXXXX0
SPI.transfer((addr<<1 amp="" br="" nbsp="" x7e=""> SPI.transfer(val);
digitalWrite(chipSelectPin, HIGH);
}
/*
* Nama Fungsi: Read_MFRC522
* Keterangan: Membaca satu byte data dari MFRC522 kemudian mendaftarkan
* Masukan Parameter: addr - mendaftarkan alamat
* Mengembalikan nilai: Mengembalikan byte data dibaca
*/
uchar Read_MFRC522(uchar addr)
{
uchar val;
digitalWrite(chipSelectPin, LOW);
//地址格式:1XXXXXX0
SPI.transfer(((addr<<1 0x80="" amp="" br="" nbsp="" x7e=""> val =SPI.transfer(0x00);
digitalWrite(chipSelectPin, HIGH);
return val;
}
/*
* Nama Fungsi: SetBitMask
* Keterangan: Set RC522 mendaftar bit
* Parameter input: reg - mendaftarkan alamat; mask - set nilai
* Kembali Nilai: Tidak ada
*/
void SetBitMask(uchar reg, uchar mask)
{
uchar tmp;
tmp = Read_MFRC522(reg);
Write_MFRC522(reg, tmp | mask); // set bit mask
}
/*
* Nama Fungsi: ClearBitMask
* Keterangan: Clear bit RC522 mendaftar
* Parameter input: reg - mendaftarkan alamat; mask - nilai bit yang jelas
* Kembali Nilai: Tidak ada
*/
void ClearBitMask(uchar reg, uchar mask)
{
uchar tmp;
tmp = Read_MFRC522(reg);
Write_MFRC522(reg, tmp & (~mask)); // clear bit mask
}
/*
* Nama Fungsi: AntennaOn
* Keterangan: Sinyal akan terbuka /mendeteksi kartu setiap kali memulai tap setidaknya 1ms Interval .
* Masukan: Tidak ada
* Kembali Nilai: Tidak ada
*/
void AntennaOn(void)
{
uchar temp;
temp = Read_MFRC522(TxControlReg);
if (!(temp & 0x03))
{
SetBitMask(TxControlReg, 0x03);
}
}
/*
* Nama Fungsi: AntennaOff
* Keterangan: Sinyal akan tertutup /tidak mendeksi kartu setiap kali memulai tap setidaknya 1ms Interval .
* Masukan: Tidak ada
* Kembali Nilai: Tidak ada
*/
void AntennaOff(void)
{
ClearBitMask(TxControlReg, 0x03);
}
/*
* Nama Fungsi: ResetMFRC522
* Keterangan: Ganti RC522
* Masukan: Tidak ada
* Kembali Nilai: Tidak ada
*/
void MFRC522_Reset(void)
{
Write_MFRC522(CommandReg, PCD_RESETPHASE);
}
/*
* Nama Fungsi: InitMFRC522
* Keterangan: Initialize RC522
* Masukan: Tidak ada
* Kembali Nilai: Tidak ada
*/
void MFRC522_Init(void)
{
digitalWrite(NRSTPD,HIGH);
MFRC522_Reset();
//Timer: TPrescaler*TreloadVal/6.78MHz = 24ms
Write_MFRC522(TModeReg, 0x8D); //Tauto=1; f(Timer) = 6.78MHz/TPreScaler
Write_MFRC522(TPrescalerReg, 0x3E); //TModeReg[3..0] + TPrescalerReg
Write_MFRC522(TReloadRegL, 30);
Write_MFRC522(TReloadRegH, 0);
Write_MFRC522(TxAutoReg, 0x40); //100%ASK
Write_MFRC522(ModeReg, 0x3D); //CRC初始值0x6363 ???
//ClearBitMask(Status2Reg, 0x08); //MFCrypto1On=0
//Write_MFRC522(RxSelReg, 0x86); //RxWait = RxSelReg[5..0]
//Write_MFRC522(RFCfgReg, 0x7F); //RxGain = 48dB
AntennaOn(); //打开天线
}
/*
* Nama Fungsi: MFRC522_Request
* Description: Mencari kartu, membaca nomor jenis kartu
* Parameter input: reqMode - menemukan kartu dengan cara TagType - Card Kembali Type
* 0x4400 = Mifare_UltraLight
* 0x0400 = Mifare_One(S50)
* 0x0200 = Mifare_One(S70)
* 0x0800 = Mifare_Pro(X)
* 0x4403 = Mifare_DESFire
* Mengembalikan nilai: kembali sukses MI_OK
*/
uchar MFRC522_Request(uchar reqMode, uchar *TagType)
{
uchar status;
uint backBits; // Bit data yang diterima
Write_MFRC522(BitFramingReg, 0x07); //TxLastBists = BitFramingReg[2..0] ???
TagType[0] = reqMode;
status = MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);
if ((status != MI_OK) || (backBits != 0x10))
{
status = MI_ERR;
}
return status;
}
/*
* Nama Fungsi: MFRC522_ToCard
* Keterangan: RC522 dan kartu ISO14443 komunikasi
* Parameter input: Perintah - perintah kata MF522,
* SendData - data yang dikirim ke kartu melalui RC522,
* SendLen - panjang data yang dikirim
* Fxtrader Backdata - menerima data kartu kembali,
* BackLen - kembali panjang data bit
* Mengembalikan nilai: kembali sukses MI_OK
*/
uchar MFRC522_ToCard(uchar command, uchar *sendData, uchar sendLen, uchar *backData, uint *backLen)
{
uchar status = MI_ERR;
uchar irqEn = 0x00;
uchar waitIRq = 0x00;
uchar lastBits;
uchar n;
uint i;
switch (command)
{
case PCD_AUTHENT: // Saat Kartu didekatkan
{
irqEn = 0x12;
waitIRq = 0x10;
break;
}
case PCD_TRANSCEIVE: // Mengirimkan data FIFO
{
irqEn = 0x77;
waitIRq = 0x30;
break;
}
default:
break;
}
Write_MFRC522(CommIEnReg, irqEn|0x80); // Permintaan interupsi
ClearBitMask(CommIrqReg, 0x80); // Hapus semua interrupt request bit
SetBitMask(FIFOLevelReg, 0x80); // FlushBuffer = 1, FIFO inisialisasi
Write_MFRC522(CommandReg, PCD_IDLE); // NO tindakan; membatalkan perintah sesaat ???
// Menulis data ke FIFO
for (i=0; i{ 1>1>
Write_MFRC522(FIFODataReg, sendData[i]);
}
//执行命令
Write_MFRC522(CommandReg, command);
if (command == PCD_TRANSCEIVE)
{
SetBitMask(BitFramingReg, 0x80); //StartSend=1,transmission of data starts
}
// Menunggu untuk menerima data untuk diproses
i = 2000; //i sesuai dengan penyesuaian frekuensi delay, kartu operasi M1 maksimum menunggu waktu 25ms???
do
{
//CommIrqReg[7..0]
//Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq
n = Read_MFRC522(CommIrqReg);
i--;
}
while ((i!=0) && !(n&0x01) && !(n&waitIRq));
ClearBitMask(BitFramingReg, 0x80); //StartSend=0
if (i != 0)
{
if(!(Read_MFRC522(ErrorReg) & 0x1B)) //BufferOvfl Collerr CRCErr ProtecolErr
{
status = MI_OK;
if (n & irqEn & 0x01)
{
status = MI_NOTAGERR; //??
}
if (command == PCD_TRANSCEIVE)
{
n = Read_MFRC522(FIFOLevelReg);
lastBits = Read_MFRC522(ControlReg) & 0x07;
if (lastBits)
{
*backLen = (n-1)*8 + lastBits;
}
else
{
*backLen = n*8;
}
if (n == 0)
{
n = 1;
}
if (n > MAX_LEN)
{
n = MAX_LEN;
}
// Membaca FIFO data yang diterima
for (i=0; i{
backData[i] = Read_MFRC522(FIFODataReg);
}
}
}
else
{
status = MI_ERR;
}
}
//SetBitMask(ControlReg,0x80); //timer stops
//Write_MFRC522(CommandReg, PCD_IDLE);
return status;
}
/*
* Nama Fungsi: MFRC522_Anticoll
* Keterangan: deteksi Anti-tabrakan, untuk membaca nomor seri kartu /cek kartu
* Parameter input: serNum - kembali 4 byte kartu nomor seri, kelima byte checksum byte
* Mengembalikan nilai: kembali sukses MI_OK
*/
uchar MFRC522_Anticoll(uchar *serNum)
{
uchar status;
uchar i;
uchar serNumCheck=0;
uint unLen;
//ClearBitMask(Status2Reg, 0x08); //TempSensclear
//ClearBitMask(CollReg,0x80); //ValuesAfterColl
Write_MFRC522(BitFramingReg, 0x00); //TxLastBists = BitFramingReg[2..0]
serNum[0] = PICC_ANTICOLL;
serNum[1] = 0x20;
status = MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);
if (status == MI_OK)
{
// Periksa kartu nomor seri
for (i=0; i<4 br="" i=""> {
serNumCheck ^= serNum[i];
}
if (serNumCheck != serNum[i])
{
status = MI_ERR;
}
}
//SetBitMask(CollReg, 0x80); //ValuesAfterColl=1
return status;
}
/*
* Nama Fungsi: CalulateCRC
* Keterangan: CRC dihitung dengan MF522
* Parameter input: pIn data - untuk membaca data CRC, len - panjang data, pOutData - hasil perhitungan CRC
* Kembali Nilai: Tidak ada
*/
void CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData)
{
uchar i, n;
ClearBitMask(DivIrqReg, 0x04); //CRCIrq = 0
SetBitMask(FIFOLevelReg, 0x80); //清FIFO指针
//Write_MFRC522(CommandReg, PCD_IDLE);
// Menulis data ke FIFO
for (i=0; i{ 4>
Write_MFRC522(FIFODataReg, *(pIndata+i));
}
Write_MFRC522(CommandReg, PCD_CALCCRC);
// Tunggu perhitungan CRC selesai
i = 0xFF;
do
{
n = Read_MFRC522(DivIrqReg);
i--;
}
while ((i!=0) && !(n&0x04)); //CRCIrq = 1
//读取CRC计算结果
pOutData[0] = Read_MFRC522(CRCResultRegL);
pOutData[1] = Read_MFRC522(CRCResultRegM);
}
/*
* Nama Fungsi: MFRC522_SelectTag
* Keterangan: Kartu yang dipilih, baca kapasitas memory card
* Masukan parameter: serNum - kartu masuk nomor seri
* Mengembalikan nilai: sukses kapasitas kartu
*/
uchar MFRC522_SelectTag(uchar *serNum)
{
uchar i;
uchar status;
uchar size;
uint recvBits;
uchar buffer[9];
//ClearBitMask(Status2Reg, 0x08); //MFCrypto1On=0
buffer[0] = PICC_SElECTTAG;
buffer[1] = 0x70;
for (i=0; i<5 br="" i=""> {
buffer[i+2] = *(serNum+i);
}
CalulateCRC(buffer, 7, &buffer[7]); //??
status = MFRC522_ToCard(PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits);
if ((status == MI_OK) && (recvBits == 0x18))
{
size = buffer[0];
}
else
{
size = 0;
}
return size;
}
/*
* Nama Fungsi: MFRC522_Auth
* Keterangan: Ulangi password kartu
* Parameter input: authMode - modus otentikasi password
0x60 = A verifikasi kunci
0x61 = verifikasi kunci B
BlockAddr - blok alamat
Sandi Sektor - Sectorkey
serNum - kartu nomor seri, 4 byte
* Mengembalikan nilai: kembali sukses MI_OK
*/
uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *serNum)
{
uchar status;
uint recvBits;
uchar i;
uchar buff[12];
// Verifikasi instruksi blok alamat + sektor + password + kartu nomor seri
buff[0] = authMode;
buff[1] = BlockAddr;
for (i=0; i<6 br="" i=""> {
buff[i+2] = *(Sectorkey+i);
}
for (i=0; i<4 br="" i=""> {
buff[i+8] = *(serNum+i);
}
status = MFRC522_ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits);
if ((status != MI_OK) || (!(Read_MFRC522(Status2Reg) & 0x08)))
{
status = MI_ERR;
}
return status;
}
/*
* Nama Fungsi: MFRC522_Read
* Keterangan: Membaca data blok
* Parameter input: blockAddr - blok alamat; recvData - blok data dibacakan
* Mengembalikan nilai: kembali sukses MI_OK
*/
uchar MFRC522_Read(uchar blockAddr, uchar *recvData)
{
uchar status;
uint unLen;
recvData[0] = PICC_READ;
recvData[1] = blockAddr;
CalulateCRC(recvData,2, &recvData[2]);
status = MFRC522_ToCard(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen);
if ((status != MI_OK) || (unLen != 0x90))
{
status = MI_ERR;
}
return status;
}
/*
* Nama Fungsi: MFRC522_Write
* Keterangan: Menulis data blok
* Parameter input: blockAddr - blok alamat; WriteData - untuk blok data 16-byte yang ditulis
* Mengembalikan nilai: kembali sukses MI_OK
*/
uchar MFRC522_Write(uchar blockAddr, uchar *writeData)
{
uchar status;
uint recvBits;
uchar i;
uchar buff[18];
buff[0] = PICC_WRITE;
buff[1] = blockAddr;
CalulateCRC(buff, 2, &buff[2]);
status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits);
if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
{
status = MI_ERR;
}
if (status == MI_OK)
{
for (i=0; i<16 16byte="" br="" data="" fifo="" i="" ke="" menulis="" nbsp=""> {
buff[i] = *(writeData+i);
}
CalulateCRC(buff, 16, &buff[16]);
status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits);
if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
{
status = MI_ERR;
}
}
return status;
}
/*
* Nama Fungsi: MFRC522_Halt
* Keterangan: Kartu Command ke hibernasi
* Masukan: Tidak ada
* Kembali Nilai: Tidak ada
*/
void MFRC522_Halt(void)
{
uchar status;
uint unLen;
uchar buff[4];
buff[0] = PICC_HALT;
buff[1] = 0;
CalulateCRC(buff, 2, &buff[2]);
status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen);
}16>4>6>5>
Terimakasih Atas Kunjungan Sahabat Cilibur Inspirasi
Judul: Tutorial Koneksi RFID RC522 dengan Arduino Uno dan MEGA 2560
Ditulis oleh IWAN MUTTAQIN
Rating Blog 5 dari 5
Semoga artikel ini bermanfaat bagi Saahabat Cilibur Inspirasi, Jika Sahabat Cilibur ingin mengutip, baik itu sebagian atau keseluruhan dari isi artikel ini harap menyertakan link dofollow ke https://ciliburkerajan.blogspot.com/2014/09/tutorial-koneksi-rfid-rc522-dengan-arduino-uno-dan-mega-2560.html. Terima kasih sudah singgah membaca artikel ini. Salam Sahabat Cilibur Inspirasi dan Sukses SelalauDitulis oleh IWAN MUTTAQIN
Rating Blog 5 dari 5
0 komentar:
Posting Komentar
Commanlah dengan Bahasa yang Sopan dan baik
By: Cilibur Inspirasi
FB:Facebook
TWET: Twiiter