
به نام خدا
سیستم هشدار دهنده خودرو با آردوینو و از GPS، GSM و شتاب سنج

در پروژه سیستم هشدار دهنده خودرو مبتنی بر آردوینو با استفاده از GPS، GSM و شتاب سنج ، ما یک سیستم هشدار دهنده ی خودروی مبتنی بر آردوینو با استفاده از GPS ، GSM و شتاب سنج را خواهیم ساخت. شتاب سنج تغییر ناگهانی در جهت حرکت خودرو را تشخیص می دهد و ماژول GSM پیام های هشدار را به تلفن همراه شما همراه با آدرس محل حادثه ارسال می کند. موقعیت تصادف در قالب لینک نقشه گوگل ، از طول و عرض جغرافیایی ماژول GPS حاصل می شود .این پروژه هشدار دهنده حوادث خودرو همچنین می تواند به عنوان یک سیستم ردیابی و حتی خیلی بیشتر، تنها با ایجاد چند تغییر در سخت افزار و نرم افزار مورد استفاده قرار گیرد.

قطعات مورد نیاز سیستم هشدار دهنده خودرو با آردوینو و از GPS، GSM و شتاب سنج :
۱۶×۲ LCD
منبع تغذیه
سیم برد بردی
پتانسیومتر ۱۰K
برد برد یا PCB
ماژول GPS و طرز کار آن:
ماژول GPS اطلاعات مربوط به موقعیت ردیابی را بصورت REAL-TIME ارسال می کند و داده های بسیار زیادی را در فرمت NMEA می فرستد (تصویر زیر را ببینید). فرمت NMEA متشکل از چندین جمله است، که ما فقط به یک جمله نیاز داریم .
این جمله با GPGGA$ شروع می شود و حاوی مختصات، زمان و سایر اطلاعات مفید است . عبارت GPGGA به سیستم موقعیت یابی جهانی ثابت اطلاعات ( Global Positioning System Fix Data) بر میگردد .ما می توانیم از رشته 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,latitude,N,longitude,E,FQ,NOS,HDP,altitude,M,height,M,,checksum data

ماژول GSM:
SIM900 یک مودم GSM / GPRS چهار باند کامل است که می تواند به آسانی مورد استفاده قرار گیرد.
مودم GSM SIM900 رابط کاربری استانداردی را فراهم می کند. SIM900 عملکرد GSM / GPRS 850/900/1800 / 1900MHz را برای صدا، SMS، اینترنت با مصرف کم انرژی ارائه می دهد.

SIM900 با استفاده از یک پردازنده تک هسته یکپارچه AMR926EJ-S طراحی شده است.
دستور های AT :
AT به معنای ATTENTION (توجه) است . این فرمان برای کنترل ماژول GSM استفاده می شود. برای آزمایش ماژول GSM از دستور AT استفاده می کنیم . پس از دریافت AT Command ماژول GSM ، با OK پاسخ می دهد. به این معناست که ماژول GSM درست کار می کند. در زیر برخی از دستورات AT را که در این پروژه استفاده می شود آمده است :
ATE0 For echo off AT+CNMI=2,2,0,0,0 <ENTER> Auto opened message Receiving. (No need to open message) ATD<Mobile Number>; <ENTER> making a call (ATD+919610126059;\r\n) AT+CMGF=1 <ENTER> Selecting Text mode AT+CMGS=”Mobile Number” <ENTER> Assigning recipient’s mobile number >>Now we can write our message >>After writing message Ctrl+Z send message command (26 in decimal). ENTER=0x0d in HEX
شتاب سنج:
معرفی پین های شتاب سنج :
- Vcc : منبع ۵ ولت باید در این پین وصل شود.
- X-OUT : این پین خروجی آنالوگ را در محور x می دهد.
- Y-OUT : این پین خروجی آنالوگ را در محور y می دهد .
- Z-OUT : این پین خروجی آنالوگ را در محور z می دهد.
- GND : زمین
- ST : این پین برای تنظیم حساسیت سنسور استفاده می شود.


توضیحات مدار :
اتصالات مدار سیستم هشدار دهنده خودرو مبتنی بر آردوینو با استفاده از GPS، GSM و شتاب سنج ساده است .پین Tx ماژول GPS به طور مستقیم به شماره پین دیجیتال ۱۰ آردوینو با استفاده از کتابخانه Software Serial متصل است.
به طور پیش فرض پین ۰ و ۱ از آردوینو برای ارتباط سریال استفاده می شود، اما با استفاده از کتابخانه SoftwareSerial، ما می توانیم ارتباط سریال را بر روی دیگر پین های دیجیتال آردوینو داشته باشیم . منبع تغذیه ۱۲ ولت نیز برای تغذیه ماژول GPS استفاده میشود .

توضیح عملکرد پروژه سیستم هشدار دهنده خودرو مبتنی بر آردوینو با استفاده از GPS، GSM و شتاب سنج :
گیرنده GPS برای تشخیص مختصات وسیله نقلیه استفاده می شود، ماژول GSM برای ارسال SMS هشدار با مختصات و لینک به نقشه گوگل استفاده می شود.
شتاب سنج یعنی ADXL335 برای تشخیص تصادف یا تغییر ناگهانی در هر محور و یک ال سی دی اختیاری ۱۶×۲ نیز برای نمایش وضعیت یا مختصات استفاده می شود .
پس از نصب این سیستم داخل خودرو هر زمان که یک تصادف رخ دهد ، ماشین تغییر وضعیت می دهد و شتاب سنج تغییرات محور ها را نشان می دهد. این مقادیر توسط آردوینو خوانده شده و بررسی می کند که آیا هر گونه تغییر در هر محور وجود دارد یا خیر؟ در صورت وجود هر گونه تغییری ، آردوینو با استخراج رشته GPGGA$ از اطلاعات ماژول GPS (نحوه کار ماژول در بالا توضیح داده شده)، مختصات را می گیرد و یک SMS را به شماره پیش تعیین شده مثلا به پلیس یا آمبولانس یا اعضای خانواده با مختصات موقعیت محل حادثه ارسال می کند.
این پیام همچنین دارای یک لینک نقشه گوگل به محل حادثه است، به طوری که مکان را می توان به آسانی ردیابی کرد. هنگامی که پیام را دریافت می کنیم، فقط باید روی لینک کلیک کنیم و ما به نقشه Google هدایت می کنیم و سپس می توانیم محل دقیق وسیله نقلیه را مشاهده کنیم . سرعت وسیله نقلیه، در گره (۱٫۸۵۲ KPH)، نیز در اس ام اس ارسال و در پنل LCD نمایش داده می شود .
#define minVal -50 #define MaxVal 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);
delay(100);
while(Serial1.available()>0)
{
if(Serial1.find(res))
{
Serial.println(res);
delay(t);
return;
}
else
{
Serial.println("Error");
}
}
delay(t);
}
}
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();
.... ......
...... .....
lcd.print("Callibrating ");
lcd.setCursor(0,1);
lcd.print("Acceleromiter");
for(int i=0;i<samples;i++)
{
xsample+=analogRead(x);
ysample+=analogRead(y);
zsample+=analogRead(z);
}
xsample/=samples;
ysample/=samples;
zsample/=samples;
Serial.println(xsample);
Serial.println(ysample);
Serial.println(zsample);
پس از این، در تابع ()void loop ، مقادیر محور شتاب سنج را خوانده ایم و محاسبات انجام شده را برای استخراج تغییرات با کمک نمونه هایی که در کالیبراسیون گرفته شده اند انجام می دهیم. حالا اگر تغییرات بیشتر یا کمتر از سطح تعریف شده باشد، آردوینو یک پیام به شماره پیش تعریف شده ارسال میکند.
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);
..... .....
........ ...
کد های پروژه سیستم هشدار دهنده خودرو مبتنی بر آردوینو با استفاده از GPS، GSM و شتاب سنج در پایین برای مشاهده و دانلود آورده شده اند .
دانلود کد های پروژه سیستم هشدار دهنده خودرو با آردوینو و از GPS، GSM و شتاب سنج:
#include<SoftwareSerial.h>
SoftwareSerial Serial1(2,3); //make RX arduino line is pin 2, make TX arduino line is pin 3.
SoftwareSerial gps(10,11);
#include<LiquidCrystal.h>
LiquidCrystal lcd(4,5,6,7,8,9);
#define x A1
#define y A2
#define z A3
int xsample=0;
int ysample=0;
int zsample=0;
#define samples 10
#define minVal -50
#define MaxVal 50
int i=0,k=0;
int gps_status=0;
float latitude=0;
float logitude=0;
String Speed="";
String gpsString="";
char *test="$GPRMC";
void initModule(String cmd, char *res, int t)
{
while(1)
{
Serial.println(cmd);
Serial1.println(cmd);
delay(100);
while(Serial1.available()>0)
{
if(Serial1.find(res))
{
Serial.println(res);
delay(t);
return;
}
else
{
Serial.println("Error");
}
}
delay(t);
}
}
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();
lcd.print("Initializing");
lcd.setCursor(0,1);
lcd.print("Please Wait...");
delay(1000);
Serial.println("Initializing....");
initModule("AT","OK",1000);
initModule("ATE1","OK",1000);
initModule("AT+CPIN?","READY",1000);
initModule("AT+CMGF=1","OK",1000);
initModule("AT+CNMI=2,2,0,0,0","OK",1000);
Serial.println("Initialized Successfully");
lcd.clear();
lcd.print("Initialized");
lcd.setCursor(0,1);
lcd.print("Successfully");
delay(2000);
lcd.clear();
lcd.print("Callibrating ");
lcd.setCursor(0,1);
lcd.print("Acceleromiter");
for(int i=0;i<samples;i++)
{
xsample+=analogRead(x);
ysample+=analogRead(y);
zsample+=analogRead(z);
}
xsample/=samples;
ysample/=samples;
zsample/=samples;
Serial.println(xsample);
Serial.println(ysample);
Serial.println(zsample);
delay(1000);
lcd.clear();
lcd.print("Waiting For GPS");
lcd.setCursor(0,1);
lcd.print(" Signal ");
delay(2000);
gps.begin(9600);
get_gps();
show_coordinate();
delay(2000);
lcd.clear();
lcd.print("GPS is Ready");
delay(1000);
lcd.clear();
lcd.print("System Ready");
Serial.println("System Ready..");
}
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);
if(xValue < minVal || xValue > MaxVal || yValue < minVal || yValue > MaxVal || zValue < minVal || zValue > MaxVal)
{
get_gps();
show_coordinate();
lcd.clear();
lcd.print("Sending SMS ");
Serial.println("Sending SMS");
Send();
Serial.println("SMS Sent");
delay(2000);
lcd.clear();
lcd.print("System Ready");
}
}
void gpsEvent()
{
gpsString="";
while(1)
{
while (gps.available()>0) //Serial incoming data from GPS
{
char inChar = (char)gps.read();
gpsString+= inChar; //store incoming data from GPS to temparary string str[]
i++;
// Serial.print(inChar);
if (i < 7)
{
if(gpsString[i-1] != test[i-1]) //check for right string
{
i=0;
gpsString="";
}
}
if(inChar=='\r')
{
if(i>60)
{
gps_status=1;
break;
}
else
{
i=0;
}
}
}
if(gps_status)
break;
}
}
void get_gps()
{
lcd.clear();
lcd.print("Getting GPS Data");
lcd.setCursor(0,1);
lcd.print("Please Wait.....");
gps_status=0;
int x=0;
while(gps_status==0)
{
gpsEvent();
int str_lenth=i;
coordinate2dec();
i=0;x=0;
str_lenth=0;
}
}
void show_coordinate()
{
lcd.clear();
lcd.print("Lat:");
lcd.print(latitude);
lcd.setCursor(0,1);
lcd.print("Log:");
lcd.print(logitude);
Serial.print("Latitude:");
Serial.println(latitude);
Serial.print("Longitude:");
Serial.println(logitude);
Serial.print("Speed(in knots)=");
Serial.println(Speed);
delay(2000);
lcd.clear();
lcd.print("Speed(Knots):");
lcd.setCursor(0,1);
lcd.print(Speed);
}
void coordinate2dec()
{
String lat_degree="";
for(i=20;i<=21;i++)
lat_degree+=gpsString[i];
String lat_minut="";
for(i=22;i<=28;i++)
lat_minut+=gpsString[i];
String log_degree="";
for(i=32;i<=34;i++)
log_degree+=gpsString[i];
String log_minut="";
for(i=35;i<=41;i++)
log_minut+=gpsString[i];
Speed="";
for(i=45;i<48;i++) //extract longitude from string
Speed+=gpsString[i];
float minut= lat_minut.toFloat();
minut=minut/60;
float degree=lat_degree.toFloat();
latitude=degree+minut;
minut= log_minut.toFloat();
minut=minut/60;
degree=log_degree.toFloat();
logitude=degree+minut;
}
void Send()
{
Serial1.println("AT");
delay(500);
serialPrint();
Serial1.println("AT+CMGF=1");
delay(500);
serialPrint();
Serial1.print("AT+CMGS=");
Serial1.print('"');
Serial1.print("9821757249"); //mobile no. for SMS alert
Serial1.println('"');
delay(500);
serialPrint();
Serial1.print("Latitude:");
Serial1.println(latitude);
delay(500);
serialPrint();
Serial1.print(" longitude:");
Serial1.println(logitude);
delay(500);
serialPrint();
Serial1.print(" Speed:");
Serial1.print(Speed);
Serial1.println("Knots");
delay(500);
serialPrint();
Serial1.print("http://maps.google.com/maps?&z=15&mrt=yp&t=k&q=");
Serial1.print(latitude,6);
Serial1.print("+"); //28.612953, 77.231545 //28.612953,77.2293563
Serial1.print(logitude,6);
Serial1.write(26);
delay(2000);
serialPrint();
}
void serialPrint()
{
while(Serial1.available()>0)
{
Serial.print(Serial1.read());
}
}
سلام میشود بجای استفاده از ماژول سیمکارت sim900Aاز ماژول sim800Lاستفده کرد و بجای استفاده از ماژول جی پی اس (GPS (SIM28ML از مدل های دیگر استفاده کرد
سلام با این کد نه... کلیت کد همینه منتهی یه تغییرات جزئی باید توی کد بدید