
به نام خدا
موقعیت یابی یک ماشین با Google Map به وسیله آردینو، ESP8266 و GPS
سیستم ردیابی خودرو در حال حاضر بسیار مهم است، به ویژه در مورد وسایل نقلیه به سرقت رفته. اگر سیستم GPS در خودرو شما نصب شده است، شما می توانید محل خودرو خود را پیدا کنید. همچنین این سیستم به پلیس کمک می کند تا خودروهای سرقت شده را ردیابی کنند .
در اینجا ما در حال ساخت نسخه پیشرفته تر سیستم ردیابی خودرو هستیم که در آن شما می توانید خودرو خود را در Google Maps موقعیت یابی کنید. در این پروژه، مختصات مکان را به سرور محلی ارسال می کنیم و فقط باید یک صفحه وب را بر روی کامپیوتر یا تلفن همراه خود باز کنید جایی که میتوانید مختصات ماشین خود را در Google Map مشاهده کنید. در این سیستم ردیابی خودرو با استفاده از Google Map، ماژول GPS برای دریافت مختصات مکانی خودرو، ماژول Wi-Fi برای ارسال اطلاعات به رایانه یا تلفن همراه استفاده می شود و آردینو برای برقراری ارتباط بین GPS و Wi-Fi استفاده می شود.
طرز کار پروژه موقعیت یابی یک ماشین با Google Map به وسیله آردینو، ESP8266 و GPS:
برای موقعیت یابی یک ماشین، ما باید مختصات آن را بوسیله ماژول GPS بیابیم. ماژول GPS به طور پیوسته اطلاعاتی را از ماهواره ها دریافت می کند. ما فقط نیاز داریم که این مختصات را بوسیله UART به آردینو بفرستیم تا قسمت های مربوط به مختصات از ان استخراج شود.
قبل از آن، آردینو دستوراتی به ماژول وای فای ESP8266 برای پیکربندی و برقراری ارتباط به روتر و گرفتن IP آدرس میفرستد. بعد از آن GPS مختصات را دریافت میکند و روی LCD پیغامی مبتنی بر تازه سازی صفحه وب ظاهر می شود و کاربر باید صفحه را تازه سازی کند. بعد از آن آردینو مختصات گرفته شده توسط GPS را به همان صفحه وب توسط Wi-Fi ، با اطلاعاتی اضافه و لینک گوگل مپ میفرستد. در نهایت می توان با کلیک کردن روی لینک به گوگل مپ رفته و مکان ماشین را مشاهده کرد.
قطعات مورد نیاز پروژه ی موقعیت یابی یک ماشین با Google Map به وسیله آردینو، ESP8266 و GPS :
- آردینو UNO
- ماژول Wi-Fi مدل ESP8266
- ماژول GPS
- کابل USB
- سیم برد بورد
- لپ تاپ
- منبع تغذیه
- LCD 16*2
- برد بورد
- وای فای روتر
توضیحات مدار:
مدار پروژه موقعیت یابی یک ماشین با Google Map بسیار ساده است. LCD 16*2 را به پایه های ۱۹-۱۴ متصل میکنیم.
پایه TX ماژول GPS مستقیما به پایه ۱۰ آردینو متصل میکنیم.پایه RX را به جایی وصل نمی کنیم.پایه های اصلی ارتباط سریال ۰ و ۱ است ولی با استفاده از کتابخانه SoftwareSerial این پایه ها قابل تغییر می باشد. آداپتور ۱۲ ولت هم برای تغذیه ماژول GPS استفاده می شود.
پایه های VCC و GND مستقیما به ۳٫۳V و GND آردینو متصل می شود پایه CH_PD هم به ۳٫۳V متصل می شود. پایه های TX و RX به پایه ۲ و ۳ آردینو متصل می شود.
ESP8266 دو LED دارد یکی قرمز، که مشخص کننده خاموش یا روشن بودن آن است و دیگری آبی است که وقتی چشمک میزند یعنی در حال ارسال اطلاعات است.دقت کنید که تغذیه این ماژول ۳٫۳ است اگر بیشتر از این مقدار به ماژول اعمال شود امکان خرابی آن وجود دارد. baud rate هم در اینجا ۹۶۰۰ تعریف شده.
کاربر میتواند ارتباط بین ماژول وای فای و آردینو را بوسیله ارتباط سریال در baud rate 9600 مشاهده کند.
تبدیل مختصات GPS از درجه دقیقه به درجه ده دهی:
ماژول GPS مختصات رو در واحد درجه دقیقه دریافت می کند (ddmm.mmmm) در حالی که ما برای موقعیت یابی در گوگل مپ از سیستم درجه ده دهی استفاده می کنیم پس باید طبق فرمول زیر این دو را به هم تبدیل کنیم.
فرض کنید عدد ۲۸۵۶٫۳۴۶۵ (ddmm.mmmm) مختصاتی باشد که ماژول gps دریافت می کند. دو عدد اول درجه اند و بقیه آنها دقیقه هستند. پس ۲۸ درجه و ۵۶٫۳۴۶۵ دقیقه میباشد. ما باید فقط قسمت دقیقه را تبدیل کنیم برای این کار لازم است ان را به ۶۰ تقسیم کنیم.
مختصات به درجه ده دهی = درجه + دقیقه تقسیم بر ۶۰
در این مثال پس از تبدیل ۲۸٫۹۴ بدست می آید.
همین تبدیلات برای عرض جغرافیایی هم صدق می کند . کد زیر همان فرمول بالا است که ما در آردینو می نویسیم.
float minut= lat_minut.toFloat(); minut=minut/60; float degree=lat_degree.toFloat(); latitude=degree+minut; minut= long_minut.toFloat(); minut=minut/60; degree=long_degree.toFloat(); logitude=degree+minut;
توضیحات برنامه:
در این برنامه از کتابخانه SeriaSoftware برای اتصال با GPS و ESP8266 با آردینو استفاده می کنیم. پایه ها را مشخص کرده و baud rate را روی ۹۶۰۰ تنظیم می کنیم. همچنین از کتابخانه LiquidCrystal برای ارتباط با lcd استفاده می کنیم.
#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(14,15,16,17,18,19);
سپس متغییر های مورد نیاز را اضافه میکنیم.
String webpage=""; int i=0,k=0; int gps_status=0; String name="<p>1. Name: Your Name </p>"; //22 String dob="<p>2. DOB: 12 feb 1993</p>"; //21 String number="<p>4. Vehicle No.: RJ05 XY 4201</p>";//29 String cordinat="<p>Coordinates:</p>"; //17 String latitude=""; String logitude=""; String gpsString=""; char *test="$GPGGA";
سپس توابعی برای اهداف مختلفی مینویسیم مانند:
تابع برای گرفتن مختصات از GPS
void gpsEvent() { gpsString=""; while(1) { while (gps.available()>0) { char inChar = (char)gps.read(); gpsString+= inChar; if (i < 7) { if(gpsString[i-1] != test[i-1]) { i=0; ..... .... ..... .....
تابع برای تبدیل مختصات GPS همانطور که قبلا که گفته شد.
void coordinate2dec() { String lat_degree=""; for(i=18;i<20;i++) lat_degree+=gpsString[i]; String lat_minut=""; for(i=20;i<28;i++) lat_minut+=gpsString[i]; ..... .... ..... .....
تابعی برای ارسال دستورات به ESP8266 برای تنظیم و اتصال ان به وای فای
void connect_wifi(String cmd, int t) { int temp=0,i=0; while(1) { Serial.println(cmd); Serial1.println(cmd); while(Serial1.available()>0) ..... .... ..... .....
void show_coordinate() برای نمایش مختصات روی LCD و سریال مانیتور می باشد.void get_ip() برای دریافت IP می باشد.
() Void Send دستورات رابوسیله ESP8266 به صفحه وب می فرستد. () void sendwebdata برای فرستادن اطلاعات به صفحه وب از طریق UART است.
در void loop اردینو منتظر می ماند تا صفحه وب تازه سازی شود.
void loop() { k=0; Serial.println("Please Refresh Ur Page"); lcd.setCursor(0,0); lcd.print("Please Refresh "); lcd.setCursor(0,1); lcd.print("Your Web Page.. "); while(k<1000) ..... .... ..... .....
دانلود کد پروژه موقعیت یابی یک ماشین با Google Map به وسیله آردینو، ESP8266 و GPS :
دانلود فایل#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(14,15,16,17,18,19); boolean No_IP=false; String IP=""; String webpage=""; int i=0,k=0; int gps_status=0; String name="<p>1. Name: Your Name </p>"; //22 String dob="<p>2. DOB: 12 feb 1993</p>"; //21 String number="<p>4. Vehicle No.: RJ05 XY 4201</p>";//29 String cordinat="<p>Coordinates:</p>"; //17 String latitude=""; String logitude=""; String gpsString=""; char *test="$GPGGA"; void check4IP(int t1) { int t2=millis(); while(t2+t1>millis()) { while(Serial1.available()>0) { if(Serial1.find("WIFI GOT IP")) { No_IP=true; } } } } void get_ip() { IP=""; char ch=0; while(1) { Serial1.println("AT+CIFSR"); while(Serial1.available()>0) { if(Serial1.find("STAIP,")) { delay(1000); Serial.print("IP Address:"); while(Serial1.available()>0) { ch=Serial1.read(); if(ch=='+') break; IP+=ch; } } if(ch=='+') break; } if(ch=='+') break; delay(1000); } lcd.clear(); lcd.print(IP); lcd.setCursor(0,1); lcd.print("Port: 80"); Serial.print(IP); Serial.print("Port:"); Serial.println(80); delay(1000); } void connect_wifi(String cmd, int t) { int temp=0,i=0; while(1) { Serial.println(cmd); Serial1.println(cmd); while(Serial1.available()>0) { if(Serial1.find("OK")) { i=8; } } delay(t); if(i>5) break; i++; } if(i==8) { Serial.println("OK"); } else { Serial.println("Error"); } delay(1000); } void setup() { Serial1.begin(9600); Serial.begin(9600); lcd.begin(16,2); lcd.print("Vehicle Tracking"); lcd.setCursor(0,1); lcd.print(" System "); delay(2000); lcd.clear(); lcd.print("WIFI Connecting.."); // lcd.setCursor(0,1); // lcd.print("Please Wait..."); delay(1000); connect_wifi("AT",1000); connect_wifi("AT+CWMODE=3",1000); connect_wifi("AT+CWQAP",1000); connect_wifi("AT+RST",5000); check4IP(5000); if(!No_IP) { Serial.println("Connecting Wifi...."); connect_wifi("AT+CWJAP=\"1st floor\",\"muda1884\"",7000); //AT+CWJAP=”wifi_username”,”wifi_password” } else { } Serial.println("Wifi Connected"); lcd.clear(); lcd.print("WIFI Connected"); delay(2000); lcd.clear(); lcd.print("Getting IP"); get_ip(); delay(2000); connect_wifi("AT+CIPMUX=1",100); connect_wifi("AT+CIPSERVER=1,80",100); Serial1.end(); lcd.clear(); lcd.print("Waiting For GPS"); lcd.setCursor(0,1); lcd.print(" Signal "); delay(2000); gps.begin(9600); get_gps(); show_coordinate(); gps.end(); Serial1.begin(9600); delay(2000); lcd.clear(); lcd.print("GPS is Ready"); delay(1000); lcd.clear(); lcd.print("System Ready"); Serial.println("System Ready.."); } void loop() { k=0; Serial.println("Please Refresh Ur Page"); lcd.setCursor(0,0); lcd.print("Please Refresh "); lcd.setCursor(0,1); lcd.print("Your Web Page.. "); while(k<1000) { k++; while(Serial1.available()) { if(Serial1.find("0,CONNECT")) { Serial1.end(); gps.begin(9600); get_gps(); gps.end(); Serial1.begin(9600); Serial1.flush(); /* lcd.clear(); lcd.print("Sending Data to "); lcd.setCursor(0,1); lcd.print(" Web Page ");*/ Serial.println("Start Printing"); Send(); show_coordinate(); Serial.println("Done Printing"); delay(5000); lcd.clear(); lcd.print("System Ready"); delay(1000); k=1200; break; } } delay(1); } } 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 temporary string str[] i++; if (i < 7) { if(gpsString[i-1] != test[i-1]) //check for right string { i=0; gpsString=""; } } if(inChar=='\r') { if(i>65) { gps_status=1; break; } else { i=0; } } } if(gps_status) break; } } void get_gps() { gps_status=0; int x=0; while(gps_status==0) { gpsEvent(); int str_lenth=i; latitude=""; logitude=""; coordinate2dec(); i=0;x=0; str_lenth=0; } } void show_coordinate() { lcd.clear(); lcd.print("Latitide:"); lcd.print(latitude); lcd.setCursor(0,1); lcd.print("Longitude:"); lcd.print(logitude); Serial.print("Latitude:"); Serial.println(latitude); Serial.print("Longitude:"); Serial.println(logitude); } void coordinate2dec() { //j=0; String lat_degree=""; for(i=18;i<20;i++) //extract latitude from string lat_degree+=gpsString[i]; String lat_minut=""; for(i=20;i<28;i++) lat_minut+=gpsString[i]; String long_degree=""; for(i=30;i<33;i++) //extract longitude from string long_degree+=gpsString[i]; String long_minut=""; for(i=33;i<41;i++) long_minut+=gpsString[i]; float minut= lat_minut.toFloat(); minut=minut/60; float degree=lat_degree.toFloat(); latitude=degree+minut; minut= long_minut.toFloat(); minut=minut/60; degree=long_degree.toFloat(); logitude=degree+minut; } void Send() { webpage = "<h1>Welcome to Saddam Khan's Page</h1><body bgcolor=f0f0f0>"; webpage+=name; webpage+=dob; webpage+=number; webpage+=cordinat; webpage+="<p>Latitude:"; webpage+=latitude; webpage+="</p>"; webpage+="<p>Longitude:"; webpage+=logitude; webpage+="</p>"; webpage+= "<a href=\"http://maps.google.com/maps?&z=15&mrt=yp&t=k&q="; webpage+=latitude; webpage+='+'; //28.612953, 77.231545 //28.612953,77.2293563 webpage+=logitude; webpage+="\">Click Here for google map</a>"; sendwebdata(); webpage=""; while(1) { Serial.println("AT+CIPCLOSE=0"); Serial1.println("AT+CIPCLOSE=0"); while(Serial1.available()) { //Serial.print(Serial1.read()); if(Serial1.find("0,CLOSE")) { return; } } delay(500); i++; if(i>5) { i=0; } if(i==0) break; } } void sendwebdata() { i=0; while(1) { unsigned int l=webpage.length(); Serial1.print("AT+CIPSEND=0,"); Serial1.println(l+2); Serial.println(l+2); Serial.println(webpage); Serial1.println(webpage); while(Serial1.available()) { if(Serial1.find("OK")) { return; } } i++; if(i>5) i=0; if(i==0) break; delay(200); } }
دیدگاهها (0)