查看: 2335|回复: 0

【参赛作品】汽车监测与救援(sos)

[复制链接]

4

主题

8

帖子

49

积分

新手上路

Rank: 1

积分
49
发表于 2017-6-20 21:02:09 | 显示全部楼层 |阅读模式
本帖最后由 33****@qq.com 于 2017-9-23 16:24 编辑

     
                                                                                                声明一下:因最近有些发烧友在做实验,没有修改报警号码,以至于不停给我打电话发短信,寡人无语了,请各位大神人家查看代码,修改为自测试号码好吗!!!!!!!
参赛作品:汽车监测与救援(sos)



本次参赛项目基于one net物联网管理平台开发的作品,凭借着one net平台强大的功能,让我的项目得以顺利的制作完成!接下来我把我们作品以文档的方式展示给大家看!下图为作品实物图!



       一、  作品摘要:
       交通事故,尤其是严重的交通事故,如果发生在繁华的城市地区之外,事故当事人无法报警,事故现场也没有人代为报警,我们只能事后遗憾的感叹:“如果事故当时有人报警,就不会… …”
为此,我们设计了一款可靠性高、及时有效地重大交通事故自动求救系统。
系统以汽车本身的碰撞传感器为触发信号,只要是汽车的安全气囊打开,就判断为重大事故。系统实时监测汽车碰撞传感器的信号,并以此触发系统发出报警信号。
系统以arduino单片机为主控芯片,利用GPS定位汽车、GPRS无线通信等技术;正常情况,定位汽车,向第三方平台(One NET设备云)发送汽车位置信息。紧急情况,即时向救援中心和车主家人发送求救(SOS)信号,求救信号内容:

      1.汽车发生重大碰撞(安全气囊打开)事故。
      2.事故发生地的地理位置(经纬度坐标和百度地图上的位置标识)。

      该系统由系统控制,地理位置系统、通信系统组成,实时报告驾乘人行驶路径,在发生严重车祸情况下及时救援,为汽车驾乘人员提供了生命的最后一道防线。

      关键词:GPS   GPRS   One NET 救援系统

      二、创作目的:

       随着中国汽车保有量的急剧增加,交通事故也随之爆发增长,中国以汽车保有量占全球的10%,而事故率却占了全球的15%。中国的汽车保有量只有美国的60%,交通事故的死亡人数却是 美国的16倍。
交通事故,死亡,令人触目惊心!快速有效的拯救生命,就是“汽车自动SOS系统”的宗旨。为防止事故发生固然重要,但是事故发生后及时恰当的处理也是非常重要的。本创作是以arduino单片机为主控芯片,综合利用GPS定位、GPRS无线通信等物联网技术;通过对安全气囊数据实时监测,当安全气囊打开时自动启动,汽车发生交通事故后,被动安全设备被启用。
本设计主要研究的是被动安全实施的安全气囊打开作为事故的启动信号,车载模块将碰撞传感器的碰撞信号送入微处理器,通过串行接口驱动无线数据传输模块,经GPRS网络将GPS的定位信息发送给家人和One NET平台。该作品有定位准确、通信可靠、覆盖范围广,用性强,实现容易,安装快捷等特色,为汽车安全增添了保护屏障。改善早期的报警系统不及时、精度差的现状,真正解决报警求援问题。基于以上交通故障安全情况,本系统致力于,让生命和交通都能得到保障。

     三、作品功能:

汽车自动SOS系统是综合利用GPS模块、GPRS模块通信技术和单片机控制技术,为驾驶者提供一种车祸发生时能自动求救的系统。其主要功能如下:

       1.位置更新 平台显示
安装汽车自动SOS系统以后,通过GPS系统对汽车进行精确定位,通过One NET平台上查看到实时行车路径情况。

       2.紧急情况 自动报警
不幸发生车祸紧急情况、自动报警,第一时间发信息给家人(事故当事人无法报警,事故现场也没有人代为报警)。

       3.路线清晰 精确定位
事故发生后,能在平台上看到行车方向、具体的行车轨迹,精确定位持续发送求救信号。类似于飞机上的黑匣子,只不过它是装在汽车上的。

       4.便于管理 数据积累
通过安装这些安全装置,既保证了用户的行车安全,又收集了大量的交通信息,而这些数据都是有意义。通过精确地位置显示,就知道每一辆车的行车路径,通过长期对求救信号发出位置的信息的分析,就知道哪些地段是危险地段,经常发生事故,以后立警示牌来提醒车辆行驶安全。


       5、记录车祸出事点信息以便交通事故调查。

      四、设计原理:

本作品我们采用arduino 2560单片机为主控芯片。系统主要由GPS模块、GPRS模块、arduinoMCU三大部分组成。在自动启动中,随时监测安全气囊状态,根据安全气囊状态的信号,单片机从GPS模块中取得经纬度等地址位置信号,然后通过GPRS模块将信号综合在通讯数据上,通过程序,以数据流的方式发送到One Net平台,实时显示出地理信息来。同时GPRS模块也会向家人发一条求救信息,告知家人即时救援。系统的硬件框图如图1所示的系统控制模块。

Q%T%]76IA%5VDXMD8I6IB05.png

      1.安全气囊
安全气囊是整个设备触发的信号源,是发送车祸的一个开始触发装置,主要功能是实时监测车辆安全气囊是否发打开。

     2.GPS模块
GPS模块,接收当前的用户所在的经纬度、海拔时间等信息,通过串口发送给单片机进行处理分析。

     3.处理器
处理器是整个系统运行的核心,主要功能将接收到的GPS信息通过串口发送到GPRS模块中的过程。

      4.GPRS模块
GPRS是信息发送模块,通过已有的网络,将单片机接收的信号发送到对应的平台和用户。

      软件流程框图
当碰撞传感器检测到车辆发生碰撞时,并判断安全气囊是否打开,如果打开并提读取GPS数据信号进行处理分析,处理过后的信息通过串口发送到GPRS模块中,GPRS收到AT指令过后,将数据发送到OneNet平台和救援中心,使伤者即时得到救援。


(TWUKVJ$C4RE_2V%_V%P3LC.png

      好了,文档思路部分拟了一遍,接下来是实作实训了,嘿嘿!我将从硬件和软件两个方面来介绍说明!

(一)硬件demo原型
  1、首先我介绍一下我们参赛作品的硬件demo原型,所需要的硬件如下图所示,
       所需要的硬件如下图所示
2017-06-20_214441.jpg 2017-06-20_214705.jpg 2017-06-20_220112.jpg 2017-06-20_220203.jpg XUB(8}0S([YGLP0(61B_$NN.png

    硬件清单
     GPS模块     SIM900A/gprs/gsm模块       IIC转接板         模拟安全气囊开关     arduino 2560         物联网手机卡一张(除电信)

     导线若干    洞洞板2张         排针如干。

    下面是我们作品硬件连线说明
    SIM900------------arduino2560                            gps------------------arduino2560
    rx--------------D0                                                   rx--------------------tx1
    tx--------------D1                                                   tx--------------------rx1
    gnd-----------gnd                                                 1602------------------arduino2560
    vcc----------- vcc                                                   SDA------------------SDA
                                                                               SCL------------------SCL
    arduino 的串口2、3作为调试打印,0、1作为数据发送和接收!

2017-06-20_221646.jpg 2017-06-20_221926.jpg

     使用说明,本作品需自备电源(充电宝),通电,作品就自动获取GPS数据,提取,处理,转换,在上传one net平台,当发生事故(模拟开关打开),中断触发,模块就会向家人发短信和拨打电话,在短信端的内容包括文字信息和one net路迹网址,可以直接打开网站查看车辆状况!



   下面是实验手机截图,网页就略掉了!

2017-06-20_232409.jpg 2017-06-20_232433.jpg 2017-06-20_232518.jpg 2017-06-20_232552.jpg


(二)软件demo软件端,主要分为3个部分

第一个gps数据提取处理
  1. //////////获取经度值
  2. String parseGprmcLon(String s)
  3. {
  4.   int pLoc = 0; //paramater location pointer
  5.   int lEndLoc = 0; //lat parameter end location
  6.   int dEndLoc = 0; //direction parameter end location
  7.   String lon;

  8.   /*make sure that we are parsing the GPRMC string.
  9.     Found that setting s.substring(0,5) == "GPRMC" caused a FALSE.
  10.     There seemed to be a 0x0D and 0x00 character at the end. */
  11.   if (s.substring(0, 4) == "GPGG")
  12.   {
  13.     //Serial.println(s);
  14.     for (int i = 0; i < 7; i++)
  15.     {
  16.       if (i < 4)
  17.       {
  18.         pLoc = s.indexOf(',', pLoc + 1);
  19.         //gpsDaying.print("i < 3, pLoc: ");
  20.         //gpsDaying.print(pLoc);
  21.         //gpsDaying.print(", ");
  22.         //gpsDaying.println(i);*/
  23.       }
  24.       if (i == 4)
  25.       {
  26.         lEndLoc = s.indexOf(',', pLoc + 1);
  27.         lon = s.substring(pLoc + 1, lEndLoc);
  28.         /*gpsDaying.print("i = 3, pLoc: ");
  29.           gpsDaying.println(pLoc);
  30.           gpsDaying.print("lEndLoc: ");
  31.           gpsDaying.println(lEndLoc);*/
  32.       }/*
  33.         else
  34.         {
  35.           dEndLoc = s.indexOf(',', lEndLoc + 1);
  36.           lon = lon + " " + s.substring(lEndLoc + 1, dEndLoc);
  37.           //gpsDaying.print("i = 4, lEndLoc: ");
  38.           //gpsDaying.println(lEndLoc);
  39.           //gpsDaying.print("dEndLoc: ");
  40.           //gpsDaying.println(dEndLoc);
  41.         }*/
  42.     }
  43.     return lon;
  44.   }
  45. }
复制代码
     第二个,将GPS数据转换成one net 需要的格式


GPS数据转换为OneNet需要的数据GPS的数据格式是DDMM.MMMMMM
获取到的GPS帧数据比如是:$GNRMC,112317.000,A,3438.1633,N,11224.4992,E,0.19,186.95,240916,,,A*7D
说明
经度112°24.4992′
纬度34°38.1633′
OneNet支持的GPS数据经测试是DD.DDDDD,因此需要转换
经度为 112+24.4992/60 = 112.40832
纬度为 34+38.1633/60 = 34.636055
上传到GPS的数据流为
{"datastreams":[{"id":"location","datapoints":[{"value":{"lon":112.40832,"lat":34.636055}}]}]}
OneNet的GPS坐标是经过百度地图纠偏过的,所以这部分转换交给平台,直接上传上面的数据即可


  1. double longitudeToOnenetFormat(<font color="#ff0000">char *lon_str_temp</font>)
  2. {
  3.   double lon_temp = 0;
  4.   long lon_Onenet = 0;
  5.   int dd_int = 0;
  6.   long mm_int = 0;
  7.   double lon_Onenet_double = 0;
  8.   lon_temp = atof(lon_str_temp);
  9.   lon_Onenet = lon_temp * 100000; //转换为整数
  10.   dd_int = lon_Onenet / 10000000; //取出dd
  11.   mm_int = lon_Onenet % 10000000; //取出MM部分
  12.   lon_Onenet_double = dd_int + (double)mm_int / 60 / 100000; //换算为Onenet格式
  13.   return lon_Onenet_double;
  14. }
复制代码


      转换过后的经纬纬度我们还需要转换一下,在放在数据包中,上传上one net.

  1. dtostrf(longitudeToOnenetFormat(lon_temp),3,6, lon_str_end);  //转换成字符串输出
  2.     dtostrf(latitudeToOnenetFormat(lat_temp),2,6, lat_str_end);  //转换成字符串输出
复制代码


      第三个就是GPRS/SIM900要做初始化,当他在发短信和传数据的设置有一定的改变,需要在程序上注意这一点

  1. void initGprs()
  2. {
  3.   if (sendCommand("AT\r\n", "OK", 3000, 1) == Success);
  4.   else GPRS_ERROR(1);

  5.   //      如果输入 AT+CREG? <CR>则返回+CREG: <mode>, <stat> [ ,<lac>,<ci> ]
  6.   // 注: <mode>的值共有三个选项,分别是 0 or 1 or 2,  其中0 代表关闭网络注册结果
  7.   //            码, 1 代表当网络注册状态改变时激活网络注册结果码, 2 代表激活网
  8.   // 络注册结果码同时显示区域和小区信息.
  9.   //    <stat>的返回值共有三个,分别是 0, 1, 2,3,4,5 ,  其中 0 代表没有注册网络同时
  10.   //   模块没有找到运营商, 1代注册到了本地网络, 2 代表找到运营商但没
  11.   // 有注册网络, 3 代表注册被拒绝, 4 代表未知的数据, 5代表注册在漫游
  12.   // 状态.
  13.   //    <lac>表示所属网络区域代码,十六进制格式显示,如: “ 279C”
  14.   //    <ci>表示所属网络的小区 ID,十六进制格式显示,如: “ 0EB2”  Tech-Link T&E
  15.   if (sendCommand("AT+CREG?\r\n", "+CREG: 0,1", 3000, 10) == Success);
  16.   else GPRS_ERROR(2);

  17.   if (sendCommand("AT+CGCLASS=\"B\"\r\n", "OK", 3000, 2) == Success);
  18.   else GPRS_ERROR(3);

  19.   if (sendCommand("AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n", "OK", 3000, 2) == Success);
  20.   else GPRS_ERROR(4);

  21.   if (sendCommand("AT+CGATT=1\r\n", "OK", 3000, 2) == Success);
  22.   else GPRS_ERROR(5);

  23.   if (sendCommand("AT+CLPORT=\"TCP\",\"2000\"\r\n", "OK", 3000, 3) == Success);
  24.   else GPRS_ERROR(6);
  25. }
复制代码
     短信设置例子如下
  1. void sendMeg(void)
  2. {
  3.   if (sendCommand("AT+CMGF=1\r\n", "OK", 3000, 3) == Success);
  4.   else GPRS_ERROR(22);
  5.   delay(500);

  6.   if (sendCommand("AT+CSMP=17,167,2,25\r\n", "OK", 3000, 3) == Success);
  7.   else GPRS_ERROR(23);
  8.   delay(500);

  9.   if (sendCommand("AT+CSCS=\"UCS2\"\r\n", "OK", 3000, 3) == Success);
  10.   else GPRS_ERROR(24);

  11.   if (sendCommand("AT+CMGS=\"00310038003900300038003300380039003400340035\"\r\n", ">", 3000, 2) == Success);
  12.   else GPRS_ERROR(25);
  13.   delay(1000);

  14.   if (sendCommand("8F668F866545969CFF0C8BF76C42655163F4FF01",
  15.                   "8F668F866545969CFF0C8BF76C42655163F4FF01", 3000, 1) == Success);
  16.   else GPRS_ERROR(26);
  17.   delay(2000);

  18.   char sendCom[2] = {0x1A};
  19.   if (sendCommand(sendCom, "\"+CMGS: 91\"}", 5000, 1) == Success);
  20.   else GPRS_ERROR(27);
  21.   delay(500);
复制代码

     第四  我想说的是下面代码就不多解释
  1. #include <Wire.h>
  2. #include <TimerOne.h>
  3. #include <Adafruit_GPS.h>
  4. //#include<LiquidCrystal.h> //申明1602液晶的函数库
  5. #include <LiquidCrystal_I2C.h> //引用I2C库
  6. LiquidCrystal_I2C lcd(0x3F, 16, 2);

  7. //申明1602液晶的引脚所连接的Arduino数字端口,8线或4线数据模式,任选其一
  8. //LiquidCrystal lcd(12,11,10,9,8,7,6,5,4,3,2);   //8数据口模式连线声明
  9. //LiquidCrystal lcd(12,11,10, 5, 4, 3, 2); //4数据口模式连线声明

  10. #define DebugSerial Serial3
  11. #define GprsSerail Serial
  12. #define GpsSeriail Serial1        //接收GPS串口数据
  13. #define gpsDaying  Serial2
  14. Adafruit_GPS GPS(&GpsSeriail); //建立GPS对象

  15. String NMEA1;  //我们将使用这个变量来保存我们的第一个NMEA句子
  16. String NMEA2;  //我们将使用这个变量来保存我们的第二个NMEA句子
  17. char c;       //用于读取从GPS模块中喷涌出来的字符

  18. char nmeaSentence[68];//GPS数组

  19. #define Success 1
  20. #define Failure 0

  21. int L = 13; //LED指示灯引脚

  22. unsigned long  Time_Cont = 0;       //定时器计数器

  23. const unsigned int gprsRxBufferLength = 600;
  24. char gprsRxBuffer[gprsRxBufferLength];
  25. unsigned int gprsBufferCount = 0;
  26. char OneNetServer[] = "api.heclouds.com";       //不需要修改


  27. char device_id[] = "1100851";    //修改为自己的设备ID
  28. char API_KEY[] = "OviuBwQgiFKPVW1mHXj3eUTEMBU=";    //修改为自己的API_KEY
  29. char sensor_gps[] = "location";

  30. int Duan_xin = 0;

  31. char lon_str[20] = "11224.4992";
  32. char lat_str[20] = "3438.1633";
复制代码

       以上是部分中要的代码说明,后面我会用压缩包跟新在帖子的后面,值得注意的是,如果做中断,最好不要再中断函数里面处理信息,最好设置一个标志位!这样就避免了不必要的麻烦!

      团队介绍

       我们都知道团队应该是Team,而不是Group,也就是说团队不仅仅是一群人的简单的组合,而一定是不同成员有分工、有协同,是一个有机的整体,这个就叫做协同合作、相互支持。团队成员根据工作需要,根据个人特长,合理分工,有效协同,一起把事情做好。团队成员之间协同合作、互相支持,就是要使1+1>2,并且不断改进提高,使效能(效率+效果)达到最大化,1+1能不能=3,能不能=4,甚至更大,就看我们在团队的工作中如何更有效的协作和互相支持,这需要不断的训练。
        我们的团队成员,王顺、万大圣、邹栋才、向芸花,他们都来自物联网工程,其所涉及的专业知识面很广泛。诸如:模拟电子技术、数字电子技术、通信原理、物联网概论、C语言、单片机应用与编程、PCB电路板绘制、多媒体技术、微信开发、CAD绘图等,通过我们的辛勤劳动,做事认真负责,思虑周详,良好的团队凝聚力和向心力。“相对分工,绝对合作”,取长补短,共同完成项目作品。


      整体来说,本次做这个作品还算是顺利的,感谢one net给了我这么好的物联网平台,感谢我们的团队精心付出,让我们收获了很多书本上学不到的东西!


发布链接: https://open.iot.10086.cn/appview/p/1b070ea40c956b4d5aa98817198b4b5e
视频链接:http://v.youku.com/v_show/id_XMj ... j.8428770.3416059.1
arduino_dsim900_2560_GPS4-1-1602_iic.rar (5.39 KB, 下载次数: 170)
IMG_20170620_175535.jpg
回复

举报

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

本版积分规则

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