极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11750|回复: 0

【教程】RDM8800+SIM900实现 刷NFC卡短信提示

[复制链接]
发表于 2014-7-25 16:06:04 | 显示全部楼层 |阅读模式
本帖最后由 ITEAD创易工作室 于 2015-3-11 09:58 编辑

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转串板连接到电脑上,开始烧写以下代码:
  1. /******************** RDM8800 *************************
  2. RDM8800 sends the ID number by HEX.
  3. eg.
  4. ID num                        output(10 bits)
  5. 46553491        0x30 0x30 0x34 0x36 0x35 0x35 0x33 0x34 0x39 0x31 (0x0D 0x0A)
  6. ************************************************************/
  7. #include <PN532.h>
  8. #include <SPI.h>
  9. #define delaytime 2000
  10. #define timeout1 5000
  11. #define timeout2 7000
  12. char number[20] = "123456789";   //改成接收短信的手机号码
  13. byte comm_buf[20];
  14. const int LED = 3;
  15. #define PN532_CS 10
  16. PN532 nfc(PN532_CS);
  17. //#define  NFC_DEMO_DEBUG 1
  18. unsigned int frame_format;

  19. unsigned char id_buffer[10];
  20. uint32_t old_id;
  21. unsigned long lasttime=0;
  22. unsigned long prev_time=0;
  23. unsigned char r_buffer[30];

  24. void setup(void) {
  25.   Serial.begin(9600);  
  26.   nfc.begin();
  27.   nfc.SAMConfig();

  28.   pinMode(LED,OUTPUT);
  29.   digitalWrite(LED,HIGH);
  30.   delay(1000);
  31.   digitalWrite(LED,LOW);
  32.   delay(10000);
  33.   
  34.         lasttime = millis();
  35. }

  36. void loop(void) {
  37.   uint32_t id;
  38.   // look for MiFare type cards
  39.   id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);
  40.   
  41.                 if (id != 0)
  42.                 {
  43.                         if(old_id != id)
  44.                         {
  45.                                 old_id = id;
  46.                                 hex_to_dec(id);
  47.                                 while(Serial.available())
  48.                                         Serial.read();                                       
  49.                                 Serial.println("AT+CMGF=1");
  50.                 prev_time = millis();
  51.                                 int a=0;
  52.                                 while((millis() - prev_time)<timeout1)
  53.                                 {
  54.                                         if(Serial.available())
  55.                                         {
  56.                                                 
  57.                                                 r_buffer[a++]=Serial.read();
  58.                                                 
  59.                                                 if(strstr((char *)r_buffer, "OK"))
  60.                                                         break;
  61.                                        
  62.                                         }
  63.                                        
  64.                                        
  65.                                 }
  66.                                 Serial.print("AT+CMGS="");
  67.                                 Serial.print(number);
  68.                                 Serial.println(""");
  69.                                 prev_time = millis();
  70.                                 a=0;
  71.                                 while((millis() - prev_time)<timeout2)
  72.                                 {
  73.                                         if(Serial.available())
  74.                                         {
  75.                                                 
  76.                                                 r_buffer[a++]=Serial.read();
  77.                                                 
  78.                                                 if(strstr((char *)r_buffer, ">"))
  79.                                                         break;
  80.                                        
  81.                                         }
  82.                                        
  83.                                        
  84.                                 }
  85.                                 Serial.print("card: ");
  86.                                 for(unsigned char i=0;i<10;i++)
  87.                                 {
  88.                                         Serial.write(id_buffer[i]);
  89.                                 }
  90.                                 char buf_end[2];
  91.                                 buf_end[0]=0x1a;
  92.                                 buf_end[1]='\0';
  93.                                 Serial.println(buf_end);
  94.                                 prev_time = millis();
  95.                                 a=0;
  96.                                 while((millis() - prev_time)<timeout2)
  97.                                 {
  98.                                         if(Serial.available())
  99.                                         {
  100.                                                 
  101.                                                 r_buffer[a++]=Serial.read();
  102.                                                 
  103.                                                 if(strstr((char *)r_buffer, "OK"))
  104.                                                         break;
  105.                                        
  106.                                         }
  107.                                        
  108.                                        
  109.                                 }
  110.                
  111.                         
  112.                         }

  113.                                 lasttime = millis();
  114.                         

  115.                 }
  116.                
  117.                 if(millis() - lasttime > delaytime)
  118.                 {
  119.                         lasttime = millis();
  120.                         old_id=0;

  121.                 }
  122.         
  123. }

  124. void hex_to_dec(uint32_t value)
  125. {
  126.         id_buffer[0] = 0x30 + value / 1000000000;
  127.         id_buffer[1] = 0x30 + value % 1000000000 / 100000000;
  128.         id_buffer[2] = 0x30 + value % 100000000 / 10000000;
  129.         id_buffer[3] = 0x30 + value % 10000000 / 1000000;
  130.         id_buffer[4] = 0x30 + value % 1000000 / 100000;
  131.         id_buffer[5] = 0x30 + value % 100000 / 10000;
  132.         id_buffer[6] = 0x30 + value % 10000 / 1000;
  133.         id_buffer[7] = 0x30 + value % 1000 / 100;
  134.         id_buffer[8] = 0x30 + value % 100 / 10;
  135.         id_buffer[9] = 0x30 + value % 10;
  136. }
复制代码


烧写的时候选择“board板子类型:Iteaduino_Lite”,然后选择相应的串口。



点击upload,提示烧写成功,RDM8800的固件就烧好了。

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



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



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

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

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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-18 22:37 , Processed in 0.036607 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表