极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 42929|回复: 13

Arduino+GSM模块实现短信远程控制

[复制链接]
发表于 2012-8-24 22:38:20 | 显示全部楼层 |阅读模式
本帖最后由 freevector 于 2012-8-24 23:23 编辑

这是我在DFRobotDFRobot做实习时所做的一个小小的应用,现在实习完了难得闲下来,借此机会将其写下来,权当纪念。本项目中利用GSM模块实现短信远程控制,本来制作了一个Video,但上传速度比较慢,以后有机会再传视频吧,先上几张图片,我通过发短信控制接在Arduino针脚上的LED灯的开灭,当然很容易通过继电器等实现对其它devices的控制,从而实现一定意义上的智能家居。
   模  块                                  数量
Arduino board     (DFR0109)                  1
GPS/GSM/GPRS模块(TEL0051)                1
锂电池(7.4V左右,FIT0137)                                 1
以及一张SIM卡,我所使用的当然是DFRobot公司自己生产的板子及模块,性能非常好,强烈推荐。


上图为所用的Arduino板子及GSM模块

通过手机发送控制指令到GSM模块

很Q的房子
源代码
  1. //-------------------From DFrobot.com------------------------//
  2. //---using this program,we can control the pins on Arduino---//
  3. #include <Wire.h>
  4. #include <Arduino.h>

  5. #define S_IDLE 0
  6. #define S_ATOK 1
  7. #define S_GETMESSAGE 2
  8. #define S_READMESSAGE 3

  9. #define M_ATOK "OK"
  10. #define M_GETMESSAGE "+CMTI"
  11. #define M_READMESSAGE "+CMGR"
  12. #define M_CALLREADY "Call Ready"
  13. #define M_FLAG "DF"                      //DF the the flag to position the Command in the data recevied by Serial port.you also can change it using other flag.

  14. char messageCMD[2]="";                   //using to hold Command,for example,if the value is H8,stands the pin 8 will output a high level.
  15. String comdata = "";
  16. int gsmDriverPin[3] = {10,11,12};
  17. int messageControlPin[7]={3,4,5,6,7,8,9};
  18. void setup(){
  19.   Serial.begin(19200);                   // The rate should not too high.It's ralated with the delay time of reading data from the Serial port.
  20.   InitGsmMode();                         //Initial GSM Module
  21.   delay(100);
  22.   for(int i=0;i<7;i++)
  23.   {
  24.     pinMode(messageControlPin[i],OUTPUT);//Initial the controlled pin
  25.   }
  26. }

  27. void loop(){
  28.   String event_message="";
  29.   int at_event=0;
  30.   while(1)
  31.   {
  32.     event_message=SerialDataRead(event_message);
  33.     event_message=SerialMessageCheck(event_message,&at_event);
  34.     MessageCommand(&at_event,messageCMD);
  35.   }
  36. }
  37. //-------------------------Initial------------------------------------------//
  38. void InitGsmMode(){
  39.   for(int i = 0 ; i < 3; i++)
  40.   {
  41.     pinMode(gsmDriverPin[i],OUTPUT);
  42.   }
  43.   digitalWrite(10,LOW);              //Enable the GSM mode
  44.   digitalWrite(11,HIGH);             //Disable the GPS mode
  45.   digitalWrite(12,HIGH);
  46.   delay(1500);
  47.   digitalWrite(12,LOW);
  48.   delay(1500);//need test
  49.   Serial.print("AT");
  50.   Serial.write(0x0D);
  51.   Serial.print("ATE0");             // echo off
  52.   Serial.write(0x0D);
  53.   delay(20);
  54.   Serial.print("AT+CMGF=1");        //Set the format of message to Text Mode
  55.   Serial.write(0x0D);
  56.   delay(20);
  57.   Serial.print("AT+CNMI=2,1,0,0,0"); //Set new SMS message indications
  58.   Serial.write(0x0D);
  59.   delay(20);
  60. }
  61. //---------------------------Read data------------------------------------//
  62. String SerialDataRead(String MessageData){
  63.   while(Serial.available()>0)         //serial data read
  64.   {
  65.     char CharRead=Serial.read();
  66.     if(CharRead!=10&&CharRead!=13)
  67.     {
  68.       MessageData=MessageData+CharRead;
  69.     }
  70.     delay(5);
  71.   }
  72. return MessageData;
  73. }
  74. //-----------------------------Check data---------------------------------------//
  75. String SerialMessageCheck(String Message,int *Event){
  76.   if(Message.indexOf(M_ATOK)!=-1)       //check AT OK
  77.   {
  78.     Message="";
  79.     *Event=S_IDLE;
  80.   }
  81.   else if(Message.indexOf(M_CALLREADY)!=-1)  //check CALL READY
  82.   {
  83.     Message="";*Event=S_ATOK;
  84.   }
  85.   else if(Message.indexOf(M_GETMESSAGE)!=-1)
  86.   {
  87.     Message="";
  88.     *Event=S_GETMESSAGE;
  89.     delay(20);
  90.   }
  91.   else ;
  92.   return Message;
  93. }
  94. //----------------------The most important part!----------------------------//
  95. void MessageCommand(int *Event,char *messageCMD) {
  96.   if(*Event==S_GETMESSAGE)                     // when get new SMS,execute follows
  97.   {
  98.     Serial.print("AT+CMGR=1");                //Attention,we will read the message from zone No.1
  99.     Serial.write(0x0D);
  100.     delay(20);
  101.     while(Serial.available()<1);            
  102.     while(Serial.available()>0)              //Read out the data that has just been print,AT+CMGR=1.
  103.     {  
  104.       char CharRead=Serial.read();
  105.       delay(5);
  106.     }
  107.     comdata="";                             
  108.     while(Serial.available()<1);            //waiting data.......
  109.     while(Serial.available())
  110.     {
  111.       char CharRead=char(Serial.read());
  112.       if(CharRead!=10&&CharRead!=13)
  113.       {
  114.         comdata +=CharRead;
  115.       }
  116.       delay(2);
  117.     }
  118.     int messageIndex1=comdata.lastIndexOf(M_FLAG);
  119.     if( messageIndex1!=-1)
  120.     {
  121.       for(int i=0;i<2;i++)
  122.       {
  123.         messageCMD[i]=comdata[messageIndex1+2+i];
  124.       }
  125.       comdata="";
  126.     }
  127.     *Event=S_READMESSAGE;
  128.     if(*Event==S_READMESSAGE)                     
  129.     {
  130.       if(messageCMD[0]=='H'||messageCMD[0]=='h')
  131.       {
  132.         digitalWrite(int(messageCMD[1]-'0'),HIGH);
  133.       }
  134.       if(messageCMD[0]=='L'||messageCMD[0]=='l')
  135.       {
  136.         digitalWrite(int(messageCMD[1]-'0'),LOW);
  137.       }
  138.     }
  139.     Serial.print("AT+CMGD=1");                    //deleted the Received SMS message  in Card.
  140.     Serial.write(0x0D);
  141.     delay(20);
  142.     *Event=0;
  143.   }
  144. }
复制代码

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2012-8-24 22:40:53 | 显示全部楼层
另外大家在使用GSM模块的时候,可以先用USB模式调试,然后再脱机运行,调试的代码在DFRobot的官网都有,我也是先用的USB模式调试,然后才开始尝试用Arduino 控制的。
回复 支持 反对

使用道具 举报

发表于 2012-8-25 08:29:38 | 显示全部楼层
很酷.........我也弄一个....
回复 支持 反对

使用道具 举报

发表于 2012-8-25 09:30:32 | 显示全部楼层
您用的GSM模是什么型号啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-25 09:41:58 | 显示全部楼层
wing 发表于 2012-8-25 09:30
您用的GSM模是什么型号啊?

SIM548C
具体参数你可以点击网址:http://www.dfrobot.com/index.php ... &product_id=673
里面有详细的datasheet。呵呵...............
回复 支持 反对

使用道具 举报

发表于 2012-8-25 17:03:45 | 显示全部楼层
东西不错,价格接受不了
回复 支持 反对

使用道具 举报

发表于 2012-8-25 21:11:27 | 显示全部楼层
本帖最后由 thelover 于 2012-8-25 21:21 编辑

向你打听点事情,taobao上的那个DFRobot是正牌的代理么?就是你实习的公司么?

我看到他们只有一款二合一的模块在卖,而且还巨贵。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-25 22:52:11 | 显示全部楼层
thelover 发表于 2012-8-25 21:11
向你打听点事情,taobao上的那个DFRobot是正牌的代理么?就是你实习的公司么?

我看到他们只有一款二合一 ...

恩,应该是的.............
回复 支持 反对

使用道具 举报

发表于 2012-8-26 00:48:31 | 显示全部楼层
谢谢, 我估计你的判断依据是"巨贵"
回复 支持 反对

使用道具 举报

发表于 2012-8-26 10:20:01 | 显示全部楼层
GSM 模块的话推荐SIM300或者TC35i,性价比比较高~网上的相关资料也比较多!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-26 11:00:13 | 显示全部楼层
thelover 发表于 2012-8-26 00:48
谢谢, 我估计你的判断依据是"巨贵"

同意楼下的,因为该模块功能确实很多,如果只用GSM模块的相关功能的话有点大才小用
回复 支持 反对

使用道具 举报

发表于 2012-10-6 11:54:27 | 显示全部楼层
DFRobot的东西太贵了。。
回复 支持 反对

使用道具 举报

发表于 2012-11-11 15:41:48 | 显示全部楼层
不错,是我想要的。先收藏了。
回复 支持 反对

使用道具 举报

发表于 2015-5-31 20:32:41 | 显示全部楼层
特别想知道你的小房子哪里弄的{:soso_e154:}
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 15:11 , Processed in 0.042510 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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