在以前的教程中,我们了解了如何将GPS模块与计算机接口以及如何使用GSM和GPS跟踪车辆。我们还使用Arduino和加速度计构建了车辆事故警报系统。在这里,我们再次构建相同的项目,但是这次将使用MSP430启动板和振动传感器来检测车辆事故。因此,该项目还将介绍如何将振动传感器与MSP430启动板连接。您可以在这里找到更多的MSP430项目。
此处,振动传感器模块检测到车辆的振动,并向MSP430 Launchpad发送信号。然后,MSP430从GPS模块获取数据,然后使用GSM模块通过SMS将其发送到用户手机。当事故警报信号发出时,LED也会发光,该LED可以由一些警报代替。事故的位置以Google Map链接的形式发送,该链接来自GPS模块的经度和纬度。请参阅最后的 演示视频 。
GPS模块 实时发送与跟踪位置有关的数据,并以NMEA格式发送大量数据(请参见下面的屏幕截图)。NMEA格式包含几个句子,其中我们只需要一个句子。这句话从$ GPGGA开始 ,包含坐标,时间和其他有用的信息。该 GPGGA 被称为“ 全球定位系统修订数据”。在此处了解有关NMEA句子和读取GPS数据的更多信息。
我们可以通过计算字符串中的逗号来从$ GPGGA字符串中提取坐标。假设您找到$ GPGGA字符串并将其存储在数组中,则可以在两个逗号后找到“纬度”,在四个逗号后找到“经度”。现在,此纬度和经度可以放在其他数组中。
以下是$ GPGGA字符串及其说明:
$ GPGGA,104534.000,7791.0381,N,06727.4434,E,1,08,0.9,510.4,M,43.9,M,* 47 $ GPGGA,HHMMSS.SSS,纬度,N,经度,E,FQ,NOS,HDP ,高度,M,高度,M,校验和数据
识别码 |
描述 |
$ GPGGA |
全球定位系统修复数据 |
卫生管理系统 |
时间以小时,分钟,秒和毫秒的格式表示。 |
纬度 |
纬度(坐标) |
ñ |
方向N =北,S =南 |
经度 |
经度(坐标) |
Ë |
方向E =东,W =西 |
FQ |
修正质量数据 |
NOS |
正在使用的卫星数 |
高密度脂蛋白 |
水平精度稀释 |
高度 |
海拔高度(距海平面以上米) |
中号 |
仪表 |
高度 |
高度 |
校验和 |
校验和数据 |
GSM模块
SIM900是完整的四频段GSM / GPRS模块,可以被客户或业余爱好者轻松嵌入。SIM900 GSM模块提供了行业标准的接口。SIM900具有GSM / GPRS 850/900/1800 / 1900MHz的性能,可降低语音,短信和数据的功耗。它很容易在市场上买到。
- 使用集成AMR926EJ-S内核的单芯片处理器设计的SIM900
- 小型四频GSM / GPRS模块。
- 启用GPRS
AT指令
AT表示注意。该命令用于控制GSM模块。在Arduino以前的许多GSM项目中,我们已经使用了一些用于调用和消息传递的命令。为了测试GSM模块,我们使用了AT命令。收到AT命令后,GSM模块以OK响应。这表示GSM模块工作正常。以下是 我们在此项目中使用的一些AT命令:
ATE0用于回声关闭
AT + CNMI = 2,2,0,0,0
ATD
AT + CMGF = 1
AT + CMGS =“手机号码”
>>现在我们可以写留言了
>>写完留言后
Ctrl + Z发送消息命令(十进制为26)。
十六进制中的ENTER = 0x0d
(要了解有关GSM模块的更多信息,请在此处查看我们使用各种微控制器的各种GSM项目)
振动传感器模块
在这个MSP430事故警报系统项目中,我们使用了一个振动传感器模块来检测振动或突然的调制。振动传感器模块根据模块提供数字输出高/低逻辑。在我们的案例中,我们使用了有源HIGH逻辑振动传感器模块。这意味着只要振动传感器检测到振动,就会向微控制器提供HIGH逻辑。
电路说明
该车辆事故警报系统项目的电路连接 很简单。GPS模块的Tx引脚 直接连接到MSP430 Launchpad(硬件串行)的数字引脚编号P1_1,并且5v用于为GPS模块供电。通过使用此处的软件串行库,我们允许在引脚P_6和P1_7上进行串行通信,并将它们分别设置为Rx和Tx并连接到GSM模块。12伏电源用于为GSM模块供电。所述振动传感器被连接在P1_3。LED也用于指示事故检测。其余连接在电路图中显示。
编程说明
除GPS部分外,对该项目进行编程非常容易。完整的代码在项目末尾给出。为了在MSP430中编写或编译代码,我们使用了与Arduino兼容的Energia IDE。大多数Arduino IDE功能都可以在此Energia IDE中直接使用。
因此,首先我们包含了必需的库,并声明了pin和变量。
#包括
给定功能用于读取振动传感器信号。此功能还将滤除微小或错误的振动。
#define count_max 25 char SensorRead(int pin)//用去抖动读取sw { char count_low = 0,count_high = 0; 做{ delay(1); 如果(digitalRead(pin)== HIGH){ count_high ++; count_low = 0; } else { count_high = 0; count_low ++; } } while(count_low <count_max && count_high <count_max); 如果(count_low> = count_max)返回LOW; 否则返回高;}
下面的函数检测振动,并调用 gpsEvent() 函数获取GPS坐标,最后调用 Send() 函数发送SMS。
void loop() { if(SensorRead(vibrationSensor)== HIGH) { digitalWrite(led,HIGH); gpsEvent(); 发送(); digitalWrite(led,LOW); delay(2000); } }
给定功能负责从GPS模块获取GPS字符串,从中提取坐标并将其转换为小数位数格式。
void gpsEvent() { char gpsString; char test =“ RMC”; i = 0; while(1) { while(Serial.available())//来自GPS的串行输入数据 { char inChar =(char)Serial.read(); gpsString = inChar; //将来自GPS的传入数据存储到临时字符串str i ++; if(i <4) { if(gpsString!= test)//检查正确的字符串 i = 0; }
整数度= 0; degree = gpsString-48; 度* = 10; degree + = gpsString-48; int minut_int = 0; minut_int = gpsString-48; minut_int * = 10; minut_int + = gpsString-48; int minut_dec = 0; minut_dec + =(gpsString-48)* 10000; minut_dec + =(gpsString-48)* 1000; minut_dec + =(gpsString-48)* 100; minut_dec + =(gpsString-48)* 10; minut_dec + =(gpsString-48); 浮动minut =((float)minut_int +(((float)minut_dec / 100000.0))/ 60.0; 纬度=((浮动)度+分钟);
最后, Send() 函数用于将SMS发送到插入此代码部分的用户号码。
无效的Send() { GSM.print(“ AT + CMGS =”); GSM.print('“'); GSM.print(” 961 **** 059“); //输入您的手机号码 GSM.println('”'); 延迟(500); // GSM.print(“ Latitude:”); // GSM.println(latitude); GSM.println(“发生事故”); 延迟(500); // GSM.print(“ longitude:”); // GSM.println(logitude); GSM.println(“点击链接查看位置”); GSM.print(“ http://maps.google.com/maps?&z=15&mrt=yp&t=k&q=”);; GSM.print(latitude,6); GSM.print(“ +”); GSM.print(logitude,6); GSM.write(26); 延迟(4000); }
下面提供了完整的代码和演示视频 ,您可以检查代码中的所有功能。