极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 33506|回复: 18

【教程】给妈妈做的老人手机(已升级至NFC)

[复制链接]
发表于 2015-1-5 15:22:12 | 显示全部楼层 |阅读模式
本帖最后由 ITEAD创易工作室 于 2015-3-11 09:41 编辑


Hello,小伙伴们好久不见了。在此先祝各位在2015年扬眉吐气,喜气洋洋!

这次带来的教程是使用Gboard做一个老人手机,一键拨打5个预设号码,可接听,可挂断。

或许你觉得现在的老人手机满大街都是,便宜到白送了。但是所谓的老人手机不过是按键大点,音量大点而已,操作按键还是那么多。

对于一些60岁以上的老人,特别是老太太,可能一辈子也没用过手机,打个电话还要叫老伴或者年轻人代劳。

当然,这只是我们的初衷,希望能给你带来不一样的想法。

制作很简单,先上我DIY的实物效果图。



需要准备的材料有:



将sim卡插入到Gboard背面的sim卡槽。硬件连接如下图所示:



按钮电子积木也是3pin的接口,这里没有画出G 和 V了。使用3pin杜邦线直接连接即可。



需要使用的库下载地址:http://pan.baidu.com/s/1o67eIy2    解压后放到libraries文件夹下面。如果libraries文件夹里面已经有以前下载过的sim900相关库文件,需要暂时删除或者压缩备份,以免有相同文件名冲突。

打开Arduino IDE软件。将以下代码复制黏贴到编辑框:

  1. #include "SIM900.h"
  2. #include <SoftwareSerial.h>


  3. #include "call.h"


  4. CallGSM call;

  5. char number1[]="1234567890";  //enter phone or tel number
  6. char number2[]="1234567890";  //enter phone or tel number
  7. char number3[]="1234567890";  //enter phone or tel number
  8. char number4[]="1234567890";  //enter phone or tel number
  9. char number5[]="1234567890";  //enter phone or tel number



  10. byte stat=0;
  11. int status=0;
  12. int pickup=1;

  13. int pin1=A0;
  14. int pin2=A1;
  15. int pin3=A2;
  16. int pin4=A3;
  17. int pin5=A4;
  18. int pin6=A5;
  19. char value_str[5];

  20. void setup()
  21. {
  22.          
  23.      pinMode(pin1,INPUT);
  24.          pinMode(pin2,INPUT);
  25.          pinMode(pin3,INPUT);
  26.          pinMode(pin4,INPUT);
  27.          pinMode(pin5,INPUT);
  28.          pinMode(pin6,INPUT);
  29.          
  30.      //Serial connection.
  31.      Serial.begin(9600);
  32.      Serial.println("GSM Shield testing.");
  33.      //Start configuration of shield with baudrate.
  34.      //For http uses is raccomanded to use 4800 or slower.
  35.      if (gsm.begin(9600))
  36.           Serial.println("\nstatus=READY");
  37.      else Serial.println("\nstatus=IDLE");
  38. };

  39. void loop()
  40. {
  41.          if(digitalRead(pin1)==0)        
  42.          {
  43.                 delay(100);
  44.                 while(digitalRead(pin1)==1);
  45.                 call.Call(number1);
  46.                 status = 1;
  47.          }
  48.          if(digitalRead(pin2)==0)        
  49.          {
  50.                 delay(100);
  51.                 while(digitalRead(pin2)==1);
  52.                 call.Call(number2);
  53.                 status = 1;
  54.          }
  55.          if(digitalRead(pin3)==0)        
  56.          {
  57.                 delay(100);
  58.                 while(digitalRead(pin3)==1);        
  59.                 call.Call(number3);
  60.                 status = 1;
  61.          }
  62.          if(digitalRead(pin4)==0)        
  63.          {
  64.                 delay(100);
  65.                 while(digitalRead(pin4)==1);
  66.                 call.Call(number4);
  67.                 status = 1;
  68.          }
  69.          if(digitalRead(pin5)==0)        
  70.          {
  71.                 delay(100);
  72.                 while(digitalRead(pin5)==1);
  73.                 call.Call(number5);
  74.                 status = 1;
  75.          }         
  76.          if(digitalRead(pin6)==0)        
  77.          {
  78.                 delay(100);
  79.                 while(digitalRead(pin6)==1);
  80.                 if(status==1)
  81.                 {
  82.                         status=0;
  83.                         call.HangUp();
  84.                 }
  85.                 else
  86.                 {
  87.                         if(pickup==1)
  88.                         {
  89.                                 call.PickUp();
  90.                                 pickup=0;
  91.                         }
  92.                         else
  93.                         {
  94.                                 pickup=1;
  95.                                 call.HangUp();
  96.                         }
  97.                 }
  98.                
  99.          }         
  100.          delay(20);

  101. };
复制代码


连接foca到电脑,选择board类型为“Arduino Duemilanove w/atmega328”,选择相应的串口。编译烧写。

代码上传完成了,DIY一个操作外壳吧。



最后使用电源适配器给Gboard供电即可。开机自启动sim900模块。其中一个按钮是用来挂断和接听电话的,一键两用。

插上麦克风和耳机就可以通话了。妈妈再也不用担心不会用智能手机打电话了!

升级版老人手机


继上一篇【给妈妈做的老人手机】发出后,很多小伙伴们觉得5个预设号码太少了,由此我们推出升级版本:【给妈妈做的NFC老人手机】

先上我DIY 的最终效果图:

需要的材料有:
因为RDM8800使用的是LGT8F88A而非ATMega328等标准Arduino采用的芯片,所以我们还需要在为标准的Arduino IDE打上一个补丁(https://github.com/iteadsw/Iteaduino-Lite-HSP/)。现在补丁可支持1.0x版本和1.5x版本。将补丁包解压到你的arduinoIDE安装目录下,覆盖原来文件即可(此方法对arduino初学者而言)。

另外因为涉及到用RDM880013.56MHz的白卡写入号码,建议购买两个RDM8800,这样可以方便后续添加联系人,只有一个的话需要重新搭建,比较麻烦。(上图硬件清单一套的价钱在300元左右,不包括sim卡和外设)

硬件连接如下图所示,分为写卡和读卡两部分:

写卡部分的硬件连接图:



直接使用的是串口通信。

读卡打电话部分的硬件连接图:



sim卡插入到sim900模块背面的sim卡槽,foca达到5V的一边。按钮电子积木可以用3Pin杜邦线接到rdm8800,另外的GV刚好可以给sim900模块供电。sim900模块也是直接用的串口通信。

需要使用的库下载地址:http://pan.baidu.com/s/1c03vv7y     解压后放到libraries文件夹下面。如果libraries文件夹里面已经有以前下载过的PN532相关库文件,需要暂时删除或者压缩备份,以免有相同文件名冲突。

打开Arduino IDE软件。连接foca到电脑,选择board类型为“Iteaduino Lite”,选择相应的串口。

首先给RDM8800烧写写入电话号码的代码:
  1. [/align]
  2. #include <;PN532.h>
  3. #include <SPI.h>


  4. const int LED = 3;

  5. #define PN532_CS 10
  6. PN532 nfc(PN532_CS);

  7. int num_length=0;
  8. uint8_t writeBuffer[16];

  9. uint8_t written=0;
  10. #define  NFC_DEMO_DEBUG 1

  11. void setup(void) {
  12.   Serial.begin(9600);  
  13.   nfc.begin();
  14.   nfc.SAMConfig();


  15.    
  16. }


  17. void loop(void) {
  18.   Serial.println("Enter your phone number!\n");
  19.   while(!Serial.available());
  20.   delay(500);
  21.   while(Serial.available())
  22.   {
  23.     writeBuffer[num_length]= Serial.read();
  24.     num_length++;
  25.   }
  26.   writeBuffer[num_length] = ';';
  27.   num_length++;
  28.   while(num_length!=16)
  29.   {
  30.         writeBuffer[num_length] = ' ';
  31.         num_length++;
  32.   }
  33.   for(uint8_t i=0;i<16;i++)
  34.   {
  35.     Serial.write(writeBuffer[i]);

  36.   }
  37.   num_length=0;
  38.   written = 0;
  39.   Serial.println();
  40.   uint32_t id;
  41.   // look for MiFare type cards
  42.   id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);


  43.         if (id != 0)
  44.         {
  45.                 #ifdef NFC_DEMO_DEBUG
  46.                 Serial.print("Read card #");
  47.                 Serial.println(id);
  48.                 Serial.println();
  49.                 #endif
  50.                 uint8_t keys[]= {
  51.                 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF    };
  52.                 if(nfc.authenticateBlock(1, id ,0x08,KEY_A,keys)) //authenticate block 0x08
  53.                 {
  54.                 //if authentication successful

  55.                         if(written == 0) //Not written
  56.                         {
  57.                         written = nfc.writeMemoryBlock(1,0x08,writeBuffer); // Write writeBuffer[] to block 0x08
  58.                         if(written)
  59.                         
  60.                         #ifdef NFC_DEMO_DEBUG
  61.                         Serial.println("Write Successful");   
  62.                         #endif
  63.                         }
  64.                         
  65.                         
  66.                         
  67.                         uint8_t block[16];
  68.                         //read memory block 0x08
  69.                         if(nfc.readMemoryBlock(1,0x08,block))
  70.                         {
  71.                                 #ifdef NFC_DEMO_DEBUG
  72.                                 Serial.println("Read block 0x08:");
  73.                                 //if read operation is successful
  74.                                 for(uint8_t i=0;i<16;i++)
  75.                                 {
  76.                                 //print memory block
  77.                                 Serial.print(block[i],HEX);
  78.                                 Serial.print(" ");
  79.                                 }
  80.                                 Serial.println();
  81.                                 Serial.println();
  82.                                 Serial.println();
  83.                                 Serial.println();
  84.                                 #endif
  85.                         }

  86.                         }
  87.                         //while(1);
  88.                 }
  89.         else
  90.         {
  91.             Serial.println("can't find your card!");
  92.                   
  93.          }

  94. }

  95. [align=left]
复制代码

代码上传完成后打开串口监视器,把卡放在天线板上,在输入框输入一个电话号码,回车,即可写入号码。换下一张卡,输入号码,回车。
接下来给另一套打电话的RDM8800烧写读卡代码,如果只有一套,需要重新接线和烧写代码:
  1. [/align]
  2. #include <PN532.h>
  3. #include <SPI.h>


  4. #define delaytime 5000
  5. #define timeout1 5000
  6. #define timeout2 7000

  7. byte comm_buf[20];

  8. const int LED = 3;

  9. #define PN532_CS 10
  10. PN532 nfc(PN532_CS);
  11. //#define  NFC_DEMO_DEBUG 1
  12. unsigned int frame_format;

  13. unsigned char id_buffer[10];
  14. uint32_t old_id;
  15. unsigned long lasttime=0;
  16. unsigned long prev_time=0;

  17. unsigned char r_buffer[30];

  18. void setup(void) {
  19.   Serial.begin(9600);  
  20.   nfc.begin();
  21.   nfc.SAMConfig();

  22.   pinMode(LED,INPUT);
  23.   delay(5000);

  24.   
  25.   lasttime = millis();
  26.    
  27. }


  28. void loop(void) {


  29.         
  30.   uint32_t id;
  31.   // look for MiFare type cards
  32.   id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);
  33.   
  34.   


  35.                 if (id != 0)
  36.                 {
  37.                         if(old_id != id)
  38.                         {
  39.                                 old_id = id;
  40.                                 while(Serial.available())
  41.                                         Serial.read();                                       
  42.                                 
  43.                                 
  44.                                 uint8_t keys[]= { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF };
  45.                                 if(nfc.authenticateBlock(1, id ,0x08,KEY_A,keys)) //authenticate block 0x08
  46.                                 {
  47.                                         //if authentication successful
  48.                                         uint8_t block[16];
  49.                                         //read memory block 0x08
  50.                                         if(nfc.readMemoryBlock(1,0x08,block))
  51.                                         {
  52.                                                 Serial.print("ATD");
  53.                                                 int a=0;
  54.                                                 while(block[a]!=' ')
  55.                                                 {
  56.                                                         Serial.write(block[a]);
  57.                                                         a++;
  58.                                                 }
  59.                                                 Serial.println();
  60.                                                 delay(200);
  61.                                         }
  62.                                        
  63.                                 }

  64.                
  65.                         
  66.                         }

  67.                                 lasttime = millis();


  68.                         

  69.                 }

  70.                
  71.                
  72.                 if(millis() - lasttime > delaytime)
  73.                 {
  74.                         lasttime = millis();
  75.                         old_id=0;

  76.                 }
  77.                

  78.                
  79.                 if(digitalRead(LED)==0)
  80.                 {
  81.                         delay(100);
  82.                         while(!digitalRead(LED)==1);
  83.                         Serial.flush();
  84.                         //Serial.setTimeout(1000);
  85.                         Serial.println("AT+CPAS");
  86.                         if(Serial.find("+CPAS: 3"))
  87.                         {
  88.                                 delay(100);
  89.                                 Serial.println("ATA");
  90.                         }
  91.                         else
  92.                         {
  93.                                 Serial.println("ATH");
  94.                         }
  95.                         delay(100);
  96.                         Serial.flush();
  97.                 }
  98. }
复制代码

代码上传完成了,按下sim900模块上的power键开机,然后把刚写好电话号码的白卡放到打电话的天线板上刷一下。稍等片刻手机或者固话即可收到来电。插上麦克风和耳机就可以通话了。用双面胶固定在盒子里。


伙伴们可还记得这个盒子是做什么用的?

另外的一个按钮是用来挂断和接听电话的,一键两用。注意:因为程序里面有延迟,按键的时候需要按住1秒再放开才生效。
视频后续添加。

最后祝大家天天开心,父母身体健康!

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2015-1-5 17:25:14 | 显示全部楼层
e,  手机好像有个功能,叫快速拔号吧,设置好了后,一直按着一个数字键,就拔出对应存储的的号码 。。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2015-1-5 21:11:40 | 显示全部楼层
我觉得挺不错的,按一个键就好了,对老人而言使用起来也简单。手机的话, 确实年纪大了 ,接受起来有点困难。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-6 09:55:36 | 显示全部楼层
wwwusr 发表于 2015-1-5 17:25
e,  手机好像有个功能,叫快速拔号吧,设置好了后,一直按着一个数字键,就拔出对应存储的的号码 。。。。。 ...

手机按键太多,老人记不住,有时候连开屏保都不知道怎么弄。学不会的话更会挫伤她们的信心,觉得人老了没有价值了,由此更排斥用手机。
回复 支持 反对

使用道具 举报

发表于 2015-1-6 14:23:04 | 显示全部楼层
真不错,楼主有心了。
回复 支持 反对

使用道具 举报

发表于 2015-1-6 20:44:58 | 显示全部楼层
开屏保,锁键盘,对老人,确实是个麻烦事儿。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-7 14:58:56 | 显示全部楼层
wwwusr 发表于 2015-1-5 17:25
e,  手机好像有个功能,叫快速拔号吧,设置好了后,一直按着一个数字键,就拔出对应存储的的号码 。。。。。 ...

谢谢支持,已上传视频。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-7 14:59:55 | 显示全部楼层
小叉 发表于 2015-1-5 21:11
我觉得挺不错的,按一个键就好了,对老人而言使用起来也简单。手机的话, 确实年纪大了 ,接受起来有点困难 ...

谢谢支持,已上传视频。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-7 15:00:29 | 显示全部楼层
mjgzdnw 发表于 2015-1-6 14:23
真不错,楼主有心了。

谢谢支持,已上传视频。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-7 15:01:02 | 显示全部楼层
wwwusr 发表于 2015-1-6 20:44
开屏保,锁键盘,对老人,确实是个麻烦事儿。

谢谢支持,已上传视频。
回复 支持 反对

使用道具 举报

发表于 2015-1-7 16:52:44 | 显示全部楼层
真心不错,太有爱了。要是能弄个音频拨号器,就可以控制固定电话拨号了。
回复 支持 反对

使用道具 举报

发表于 2015-1-7 18:27:05 | 显示全部楼层
谢谢分享学习一下
回复 支持 反对

使用道具 举报

发表于 2015-1-7 21:55:42 | 显示全部楼层
(如果不考虑成本,嘿嘿,貌似你现有的配置已经相当的土豪了)还可以加上非特定语音识别,可以达到:

老人按一下唯一的一个键,激活手机,相当于解锁了。
手机吱一声,然后说:“请说您要联系的人名”
老人说:“老伴儿”。
手机说:“正在为您接通”。
然后拔出相应的号码

这样就一个键,作用是想用时唤醒手机,不用时就低功耗。操作更简单,用非特定语音识别,识别率也可以。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-8 10:49:35 | 显示全部楼层
老胖熊 发表于 2015-1-7 16:52
真心不错,太有爱了。要是能弄个音频拨号器,就可以控制固定电话拨号了。

老人手机已升级至NFC刷卡打电话了。谢谢关注!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-8 10:50:01 | 显示全部楼层
wwwusr 发表于 2015-1-7 21:55
(如果不考虑成本,嘿嘿,貌似你现有的配置已经相当的土豪了)还可以加上非特定语音识别,可以达到:

老 ...

老人手机已升级至NFC刷卡打电话了。谢谢关注!
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 01:03 , Processed in 0.043753 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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