在之前的教程中,我们了解了如何将GPS模块与计算机接口,如何构建Arduino GPS时钟以及如何使用GSM和GPS跟踪车辆。在此项目中,我们将使用GPS,GSM和加速度计来构建基于Arduino的车辆事故预警系统。加速度计检测到车辆轴的突然变化,GSM模块会在手机上发送警报消息以及事故发生的位置。事故的位置以Google Map链接的形式发送,该链接来自GPS模块的经度和纬度。该消息还包含以节为单位的车辆速度。观看演示视频在最后。只需对硬件和软件进行少量更改,该车辆事故警报项目就可以用作跟踪系统,并且可以用作更多项目。
所需组件:
- Arduino Uno
- GSM模块(SIM900A)
- GPS模块(SIM28ML)
- 加速度计(ADXL335)
- 16x2 LCD
- 电源供应
- 连接线
- 10 K点
- 面包板或PCB
- 电源12v 1amp
在进入项目之前,我们将讨论GPS,GSM和加速度计。
GPS模块及其工作原理:
GPS代表全球定位系统,用于以精确的UTC时间(协调世界时)检测地球上任何位置的纬度和经度。GPS模块用于跟踪我们项目中的事故位置。该设备每秒钟每秒从卫星接收一次坐标,包括时间和日期。我们先前已 在车辆追踪系统中提取了 $ GPGGA字符串以查找经度和纬度坐标。
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
(要了解有关GSM模块的更多信息,请在此处查看我们使用各种微控制器的各种GSM项目)
加速度计:
加速度计的引脚说明:
- Vcc 5伏电源应连接到此引脚。
- X-OUT此引脚在x方向上提供模拟输出
- Y-OUT该引脚在y方向提供模拟输出
- Z-OUT此引脚在z方向上提供模拟输出
- GND地
- ST该引脚用于设置传感器的灵敏度
还可以使用Accelerometer检查我们的其他项目:使用Arduino和基于Accelerometer的手势控制机器人进行Ping Pong游戏。
电路说明:
该车辆事故警报系统项目的电路连接 很简单。GPS模块的Tx引脚直接连接到Arduino的10号数字引脚。通过使用此处的软件串行库,我们允许在引脚10和11上进行串行通信,并将它们分别设置为Rx和Tx,并使GPS模块的Rx引脚保持打开状态。默认情况下,Arduino的引脚0和1用于串行通信,但是通过使用SoftwareSerial库,我们可以允许在Arduino的其他数字引脚上进行串行通信。12伏电源用于为GPS模块供电。
GSM模块的Tx和Rx引脚直接连接到Arduino的D2和D3引脚。对于GSM接口,这里我们还使用了软件串行库。GSM模块也由12v电源供电。一个可选的LCD的数据引脚D4,D5,D6,和D7被连接到管脚号6,7,8,和阿尔杜伊诺9。LCD的命令引脚RS和EN与Arduino的引脚编号4和5连接,而RW引脚直接与地面连接。电位计还用于设置LCD的对比度或亮度。
在此系统中添加了一个加速度计,用于检测事故,并且其x,y和z轴ADC输出引脚直接连接到Arduino ADC引脚A1,A2和A3。
工作说明:
在该项目中,Arduino用于通过GPS接收器和GSM模块控制整个过程 。 GPS接收器用于检测车辆的坐标,GSM模块用于发送带有坐标和链接到Google Map的警报SMS。加速度计(即ADXL335)用于检测任何轴上的事故或突然变化。可选的16x2 LCD也用于显示状态消息或坐标。我们已经使用了GPS模块SIM28ML和GSM模块SIM900A。
编程后准备好硬件时,可以将其安装在车辆中并加电。现在,无论何时发生事故,汽车都会倾斜并且加速计会更改其轴值。这些值由Arduino读取,并检查任何轴上是否发生任何变化。如果发生任何变化,则Arduino将通过从GPS模块数据中提取$ GPGGA String来读取坐标(上述GPS工作原理),然后将SMS发送给预定义的号码,并将其与事故发生地点的坐标一起发送给警察,救护车或家庭成员。该消息还包含指向事故地点的Google Map链接,以便可以轻松跟踪该地点。收到消息后,我们只需要单击链接,我们将重定向到Google地图,然后我们可以看到车辆的确切位置。车速(节)(1.852 KPH),也会通过SMS发送并显示在LCD面板上。查看项目下方的完整演示视频。
在此项目中,我们可以通过将最小值和最大值放入代码中来设置加速度计的灵敏度。
在演示中,这里使用了给定值:
#define minVal -50 #define MaxVal 50
但是为了获得更好的结果,您可以使用200代替50,也可以根据需要进行设置。
编程说明:
完整的程序已在下面的“代码”部分给出;在这里,我们简要解释其各种功能。
首先,我们包含了所有必需的库或头文件,并声明了用于计算和临时存储数据的各种变量。
此后,我们创建了一个函数 void initModule(String cmd,char * res,int t), 以初始化GSM模块并使用AT命令检查其响应。
void initModule(String cmd,char * res,int t){while(1){Serial.println(cmd); Serial1.println(cmd); 延迟(100); while(Serial1.available()> 0){if(Serial1.find(res)){Serial.println(res); 延迟(t); 返回; } else {Serial.println(“ Error”); }; delay(t); }}
此后,在 void setup() 函数中,我们初始化了硬件和软件串行通信,LCD,GPS,GSM模块和加速度计。
void setup(){Serial1.begin(9600); Serial.begin(9600); lcd.begin(16,2); lcd.print(“ Accident Alert”); lcd.setCursor(0,1); lcd.print(“ System”); delay(2000); lcd.clear();……………….
加速度计校准过程也在 设置 循环中完成。在此,我们采取了一些样本,然后找到x轴,y轴和z轴的平均值。并将它们存储在变量中。然后,我们使用这些样本值读取了车辆倾斜(事故)时加速度计轴的变化。
lcd.print(“ Callibrating”); lcd.setCursor(0,1); lcd.print(“ Acceleromiter”); for(int i = 0; i
之后,在 void loop() 函数中,我们读取了加速度计的轴值,并进行了计算以借助于在Calibration中获取的样本来提取变化。现在,如果任何变化或多或少都超出了定义的级别,那么Arduino将向预定义的数字发送一条消息。
void loop(){int value1 = analogRead(x); int value2 = analogRead(y); int value3 = analogRead(z); int xValue = xsample-value1; int yValue = ysample-value2; int zValue = zsample-value3; Serial.print(“ x =”); Serial.println(xValue); Serial.print(“ y =”); Serial.println(yValue); Serial.print(“ z =”); Serial.println(zValue);…………………
在这里,我们也创造了一些其他的功能,用于各种puposes像 无效gpsEvent() 获得GPS坐标, 无效coordinate2dec() 从GPS字符串中提取坐标,并将它们转换为十进制值, 无效show_coordinate() 用于显示通过串行监控值和LCD,最后是 void Send(), 用于将警报SMS发送到预定义的号码。
下面提供了完整的代码和演示视频,您可以检查代码中的所有功能。