專注電子技術學習與研究
當前位置:單片機教程網(wǎng) >> Arduino >> 瀏覽文章

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

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

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

 

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

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




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

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

注意:新的硬件驅動和庫文件需要在IDE下次運行時生效,所以在操作上面這一步的時候請關閉arduino IDE軟件。

接下來,我們需要給RDM8800燒寫固件。按照下面的硬件連接圖來連接FOCA轉串板和RDM8800。注意:FOCA轉串板的開關要打到5V。詳細引腳定義請查閱datasheet和原理圖。

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

 

#include

#include

#define delaytime 2000

#define timeout1 5000

#define timeout2 7000

char number[20] = "123456789";   //改成接收短信的手機號碼

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;

}

燒寫的時候選擇“board板子類型:Iteaduino_Lite”,然后選擇相應的串口。

點擊upload,提示燒寫成功,RDM8800的固件就燒好了。

接下來是測試,拔掉電源線和所有杜邦線,按照下面的硬件連接圖來連接FOCA,RDM8800SIM900模塊。

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

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

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

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

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

關閉窗口

相關文章