|
在之前的教程中,我们已经了解了如何将GPS模块与计算机连接以及如何使用GSM和GPS跟踪车辆。我们还使用Arduino和加速度计制作了车辆事故警报系统。在本篇文章中,我们再次制作相同的项目,但这次将使用MSP430 Launchpad开发板和振动传感器来检测车辆事故。因此,该项目还将介绍振动传感器与MSP430的连接。
振动传感器模块检测车辆的振动并向MSP430 Launchpad发送信号。然后MSP430从GPS模块获取数据,使用GSM模块通过SMS将其发送到用户移动电话。同时LED也会发出事故警报信号,这个LED可以使用其他一些警报设备取代。事故地点以谷歌地图链接的形式发送,源自GPS模块的纬度和经度。
需要的组件 ● MSP430 Launchpad开发板 ● GSM模块 ● GPS模块 ● 振动传感器模块 ● 1602液晶显示屏 ● 电源 ● 连接导线 ● 10K电位器 ● 面包板
在开始制作之前,我们将先讨论GPS、GSM和振动传感器。
GPS模块及其工作原理 GPS(Global Positioning System),中文全称全球定位系统,用于检测地球上任何位置的纬度和经度,具有精确的UTC时间(协调世界时)。 GPS模块用于跟踪项目中事故的位置。该设备每时每秒接收卫星的坐标,包括时间和日期。我们之前在车辆跟踪系统中提取了$ GPGGA字符串,以查找纬度和经度坐标。
GPS模块实时发送与跟踪位置相关的数据,并以NMEA格式发送大量数据(参见下面的屏幕截图)。 NMEA格式包含几个句子,我们只需要一个句子。这句话从$ GPGGA开始,包含坐标、时间和其他有用信息。该GPGGA被称为全球定位系统修复数据。
我们可以通过计算字符串中的逗号来从$ GPGGA字符串中提取坐标。假设您找到$ GPGGA字符串并将其存储在数组中,则可以在两个逗号后找到Latitude,并且可以在四个逗号后找到Longitude。现在,这个纬度和经度可以放在其他数组中。
下面是$ GPGGA字符串及其描述: - $GPGGA,104534.000,7791.0381,N,06727.4434,E,1,08,0.9,510.4,M,43.9,M,,*47
- $GPGGA,HHMMSS.SSS,latitude,N,longitude,E,FQ,NOS,HDP,altitude,M,height,M,,checksum data
复制代码| 识别符 | 描述 | | $ GPGGA | 全球定位系统修复数据 | | hhmmss.sss | 以小时为单位的时间和毫秒格式。 | | Latitude | 纬度(坐标) | | N | 方向N =北,S =南 | | Longitude | 经度(坐标) | | Ë | 方向E =东,W =西 | | FQ | 修复质量数据 | | NOS | 正在使用的卫星数量 | | HDP | 水平稀释精度 | | Altitude | 海拔高度(海拔以上米) | | M | 米 | | Height | 高度 | | Checksum | 校验和数据
|
GSM模块 SIM900是一个完整的四频GSM / GPRS模块,可以轻松嵌入客户或业余爱好者使用。 SIM900 GSM模块提供行业标准接口。 SIM900为语音、短信、数据提供GSM / GPRS 850/900/1800 / 1900MHz性能,功耗极低。它很容易在市场上买到。 ◾ SIM900采用集成AMR926EJ-S内核的单芯片处理器设计 ◾ 小型GSM / GPRS四频模块。 ◾ GPRS已启用
AT命令 AT表示ATTENTION。该命令用于控制GSM模块。为了测试GSM模块,我们使用AT命令。收到AT命令后,GSM模块响应OK。这意味着GSM模块工作正常。下面是我们在这个项目中使用的一些AT命令: ● ATE0用于回声 ● AT + CNMI = 2,2,0,0,0 <ENTER>自动打开信息接收。 (无需打开消息) ● ATD <手机号码>; <ENTER>拨打电话(ATD + 919610126059; \ r \ n) ● ● AT + CMGF = 1 <ENTER>选择文本模式 ● AT + CMGS =“手机号码”<ENTER>分配收件人的手机号码 >>现在我们可以写下我们的信息 >>写完信息后 ● Ctrl + Z发送消息命令(十进制26)。 ● HEX中的ENTER = 0x0d
振动传感器模块 在这个MSP430事故警报系统项目中,我们使用了一个振动传感器模块来检测振动或突然调制。振动传感器模块根据模块提供数字输出HIGH / LOW逻辑。在我们的例子中,我们使用了一个有源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中使用。
首先,我们包含了一个必需的库,以及声明一些引脚和变量。 - #include <SoftwareSerial.h>
- SoftwareSerial GSM(P1_6, P1_7); // RX, TX
- float latitude=0;
- float logitude=0;
- #define led P1_0
- const int vibrationSensor=PUSH2;
- int i=0;
复制代码
以下函数用于读取振动传感器信号。 该函数也可以过滤小的或错误的振动。 - #define count_max 25
- char SensorRead(int pin) // read sw with debounce
- {
- char count_low=0,count_high = 0;
- do
- {
- delay(1);
- if (digitalRead(pin) == HIGH)
- {
- count_high++;
- count_low = 0;
- }
- else
- {
- count_high = 0;
- count_low++;
- }
- }while(count_low< count_max && count_high < count_max);
- if (count_low >= count_max)
- return LOW;
- else
- return HIGH;
- }
复制代码
下面的函数检测振动并调用gpsEvent()函数获取GPS坐标,最后调用Send()函数发送短信。 - void loop()
- {
- if(SensorRead(vibrationSensor) == HIGH)
- {
- digitalWrite(led, HIGH);
- gpsEvent();
- Send();
- digitalWrite(led, LOW);
- delay(2000);
- }
- }
复制代码
以下函数负责从GPS模块获取GPS字符串,从中提取坐标并以十进制格式转换它们。 - void gpsEvent()
- {
- char gpsString[55];
- char test[]="RMC";
- i=0;
- while(1)
- {
- while (Serial.available()) //Serial incomming data from GPS
- {
- char inChar = (char)Serial.read();
- gpsString[i]=inChar; //store incomming data from GPS to temparary string str[]
- i++;
- if (i < 4)
- {
- if(gpsString[i-1] != test[i-1]) //check for right string
- i=0;
- }
复制代码
最后,Send()函数用于将SMS发送到此部分代码中插入的用户号码。 - void Send()
- {
- GSM.print("AT+CMGS=");
- GSM.print('"');
- GSM.print("961****059"); // enter your Mobile number
- GSM.println('"');
- delay(500);
- // GSM.print("Latitude:");
- // GSM.println(latitude);
- GSM.println("Accident Happned");
- delay(500);
- // GSM.print(" longitude:");
- // GSM.println(logitude);
- GSM.println("Click On link to see Location");
- 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);
- delay(4000);
- }
复制代码
代码 以下是本篇文章使用的完整代码:
main.rar
(1.18 KB, 下载次数: 11)
|