專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> Arduino >> 瀏覽文章

arduino RDM8800+SIM900實(shí)現(xiàn)刷NFC卡短信提示

作者:未知   來(lái)源:互聯(lián)網(wǎng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年07月27日   【字體:

RDM8800是一款能讀寫(xiě)13.56Mhz NFC RFID卡的單片機(jī),串口直接輸出,體積小巧,性能穩(wěn)定。兼容arduino,我們可以像使用arduino一樣修改它的固件來(lái)實(shí)現(xiàn)我們想要的功能。

 

今天教小伙伴們使用RDM8800燒寫(xiě)程序來(lái)實(shí)現(xiàn)刷NFC卡,把卡號(hào)通過(guò)短信發(fā)送到手機(jī)上。這有什么實(shí)際意義嗎?比如上班打卡?一起來(lái)大開(kāi)腦洞吧!

本次教程需要用到的配件有:




首先下載RDM8800的硬件補(bǔ)丁包和庫(kù)文件:http://pan.baidu.com/s/1jG63c7k

下載完成后把每個(gè)壓縮包都解壓出來(lái),將Iteaduino_Lite文件夾放到你的Arduino IDE安裝目錄下的hardware 文件夾里面,把PN532_SPI文件夾放到你的Arduino IDE安裝目錄下的libraries 文件夾里面。

注意:新的硬件驅(qū)動(dòng)和庫(kù)文件需要在IDE下次運(yùn)行時(shí)生效,所以在操作上面這一步的時(shí)候請(qǐng)關(guān)閉arduino IDE軟件。

接下來(lái),我們需要給RDM8800燒寫(xiě)固件。按照下面的硬件連接圖來(lái)連接FOCA轉(zhuǎn)串板和RDM8800注意:FOCA轉(zhuǎn)串板的開(kāi)關(guān)要打到5V。詳細(xì)引腳定義請(qǐng)查閱datasheet和原理圖。

使用USB mini接口的數(shù)據(jù)線將FOCA轉(zhuǎn)串板連接到電腦上,開(kāi)始燒寫(xiě)以下代碼:

 

#include

#include

#define delaytime 2000

#define timeout1 5000

#define timeout2 7000

char number[20] = "123456789";   //改成接收短信的手機(jī)號(hào)碼

byte comm_buf[20];

const int LED = 3;

#define PN532_CS 10

PN532 nfc(PN532_CS);

//#define  NFC_DEMO_DEBUG 1

unsigned int frame_format;

 

unsigned char id_buffer[10];

uint32_t old_id;

unsigned long lasttime=0;

unsigned long prev_time=0;

unsigned char r_buffer[30];

 

void setup(void) {

  Serial.begin(9600); 

  nfc.begin();

  nfc.SAMConfig();

 

  pinMode(LED,OUTPUT);

  digitalWrite(LED,HIGH);

  delay(1000);

  digitalWrite(LED,LOW);

  delay(10000);

 

    lasttime = millis();

}

 

void loop(void) {

  uint32_t id;

  // look for MiFare type cards

  id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);

 

       if (id != 0)

       {

           if(old_id != id)

           {

              old_id = id;

               hex_to_dec(id);

              while(Serial.available())

                  Serial.read();                 

              Serial.println("AT+CMGF=1");

                prev_time = millis();

              int a=0;

              while((millis() - prev_time)

              {

                  if(Serial.available())

                  {

                    

                     r_buffer[a++]=Serial.read();

                    

                     if(strstr((char *)r_buffer, "OK"))

                         break;

                 

                  }

                 

                 

              }

              Serial.print("AT+CMGS=\"");

              Serial.print(number);

              Serial.println("\"");

              prev_time = millis();

              a=0;

              while((millis() - prev_time)

              {

                  if(Serial.available())

                  {

                    

                     r_buffer[a++]=Serial.read();

                    

                     if(strstr((char *)r_buffer, ">"))

                         break;

                 

                  }

                 

                 

              }

              Serial.print("card: ");

              for(unsigned char i=0;i<10;i++)

              {

                  Serial.write(id_buffer[i]);

              }

              char buf_end[2];

              buf_end[0]=0x1a;

              buf_end[1]='\0';

              Serial.println(buf_end);

              prev_time = millis();

              a=0;

              while((millis() - prev_time)

              {

                  if(Serial.available())

                  {

                    

                     r_buffer[a++]=Serial.read();

                    

                     if(strstr((char *)r_buffer, "OK"))

                         break;

                 

                  }

                 

                 

              }

               

          

           }

 

              lasttime = millis();

          

 

       }

      

       if(millis() - lasttime > delaytime)

       {

           lasttime = millis();

           old_id=0;

 

       }

   

}

 

void hex_to_dec(uint32_t value)

{

    id_buffer[0] = 0x30 + value / 1000000000;

    id_buffer[1] = 0x30 + value % 1000000000 / 100000000;

    id_buffer[2] = 0x30 + value % 100000000 / 10000000;

    id_buffer[3] = 0x30 + value % 10000000 / 1000000;

    id_buffer[4] = 0x30 + value % 1000000 / 100000;

    id_buffer[5] = 0x30 + value % 100000 / 10000;

    id_buffer[6] = 0x30 + value % 10000 / 1000;

    id_buffer[7] = 0x30 + value % 1000 / 100;

    id_buffer[8] = 0x30 + value % 100 / 10;

    id_buffer[9] = 0x30 + value % 10;

}

燒寫(xiě)的時(shí)候選擇“board板子類型:Iteaduino_Lite”,然后選擇相應(yīng)的串口。

點(diǎn)擊upload,提示燒寫(xiě)成功,RDM8800的固件就燒好了。

接下來(lái)是測(cè)試,拔掉電源線和所有杜邦線,按照下面的硬件連接圖來(lái)連接FOCARDM8800SIM900模塊。

SIM900模塊裝上SIM卡(僅支持聯(lián)通/移動(dòng)sim卡)和天線,把NFC的天線板連接到RDM8800的接口上,然后插上USB線供電。實(shí)物如下圖:

上電后,SIM900開(kāi)機(jī),看到NET LED燈開(kāi)始閃爍時(shí),等待10s。然后把NFC typeA卡放到RDM8800的天線板上,這時(shí)RDM8800會(huì)把讀到的卡號(hào)發(fā)送到對(duì)應(yīng)的手機(jī)上,例如: “card: 0046553491” 。輸出格式為“card: +卡號(hào)”。

卡一直放在天線板上只讀一次,只發(fā)一次短信,同一張卡需要隔2秒后才能刷第二次并發(fā)送短信,不同的卡號(hào)無(wú)需等待。

此處的FOCA僅是用于供電,你也可以使用5V/1A適配器或者電池供電。

 視頻演示地址:http://v.youku.com/v_show/id_XNzQ1OTM5ODIw.html

關(guān)閉窗口

相關(guān)文章