专注电子技术学习与研究
当前位置:单片机教程网 >> Arduino >> 浏览文章

arduino RDM8800+SIM900实现刷NFC卡短信提示

作者:未知   来源:互联网   点击数:  更新时间:2014年07月27日   【字体:

RDM8800是一款能读写13.56Mhz NFC RFID卡的单片机,串口直接输出,体积小巧,性能稳定。兼容arduino,我们可以像使用arduino一样修改它的固件来实现我们想要的功能。

 

今天教小伙伴们使用RDM8800烧写程序来实现刷NFC卡,把卡号通过短信发送到手机上。这有什么实际意义吗?比如上班打卡?一起来大开脑洞吧!

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




首先下载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接口的数据线将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的固件就烧好了。

接下来是测试,拔掉电源线和所有杜邦线,按照下面的硬件连接图来连接FOCARDM8800SIM900模块。

SIM900模块装上SIM卡(仅支持联通/移动sim卡)和天线,把NFC的天线板连接到RDM8800的接口上,然后插上USB线供电。实物如下图:

上电后,SIM900开机,看到NET LED灯开始闪烁时,等待10s。然后把NFC typeA卡放到RDM8800的天线板上,这时RDM8800会把读到的卡号发送到对应的手机上,例如: “card: 0046553491” 。输出格式为“card: +卡号”。

卡一直放在天线板上只读一次,只发一次短信,同一张卡需要隔2秒后才能刷第二次并发送短信,不同的卡号无需等待。

此处的FOCA仅是用于供电,你也可以使用5V/1A适配器或者电池供电。

 视频演示地址:http://v.youku.com/v_show/id_XNzQ1OTM5ODIw.html

关闭窗口

相关文章