GPS GPRS Modül İle Gerçek Zamanlı Araç Takip Projesi

48 14.449

Araç hırsızları bu proje ile artık çok kolay bir şekilde yakalanacak.Arduino ve gps gprs modül kullanarak telefonumuzdan veya bilgisayarımızdan harita üzerinden anlık olarak aracımızın bulunduğu yeri görebileceğiz.

Malzemeler:

  1. Arduino Uno
  2. GPRS + GPS SIM908 Modül
  3. 2300mAh Şarj Edilebilir Pil
  4. GPRS-GSM Dış Anten
  5. Harici GPS Anteni
  6. 9V Pil
  7. 9V Pil Tutucu

Elektronik Kısım:

GPRS+GPS shield Devre Diyagramı(ÖN):

GPRS+GPS shield Devre Diyagramı(ARKA):

GPRS+GPS shield üzerinde bulunan ledin durumuna göre aşağıdaki işlemler gerçekleşmektedir.

 

LED DURUM SIM908 DAVRANIŞI
Sönük SIM908 Çalışmıyor.
64ms Yanıyor 800ms Sönüyor SIM908 Ağa kayıtlı değil
64ms Yanıyor / 3000ms Sönüyor SIM908 Ağa kaydedildi
SIM908 Ağa kaydedildi PPP GPRS İletişim Kuruldu

 

GPS Modülümüze antenimizi bağlıyoruz.

Arduino ve gps modülümüzün bağlantılarını yapıyoruz.Modülümüz arduino uyumlu olduğu için üst üste direk birleştiriyoruz.

Dikkat Edilecek Noktalar:

  1. Dahili antenimizi dikkatli bir şekilde yerleştirelim.Aksi taktirde kırılabilir.
  2. GPS anteni yatay konumda olmalıdır.
  3. Uydular sinyali iyileştirmek için, anten açık alanda olmak zorunda.

GPS anteni konumu çok önemlidir! Harici GPS anteni yukarıda olmalı  dahili GPS anteni seramik tarafa doğru işaret edilmelidir.

Telefon numarası doğru olduğunda, modül numaraya sms ile gps pozisyonunu gönderecektir.Bilgisayarınızdaki php script ile internet üzerinden GPS e veri göndererek, enlem ve boylamını alır.

Yazılım Kısmı:

Arduino Yazılımı:

APN, kullanıcı adı ve şifre yapılandırmanız gerekir. Bunu yapmazsanız, GPRS + GPS GPRS şebekesine bağlanamassınız. Ayrıca, bilgisayarınıza (dış IP, değil LAN IP adresi) veya sunucunun etki alanı IP adresiyle URL’yi ayarlamanız gerekir.

 

int8_t answer;
int onModulePin= 2;
char aux_string[30];
int flag = 0;
char number [20];
char realnumber[9];
char mynumber[9];
int a=0;
int b=0;
int c=0;
//Your phone number
char phone_number[]="012345678"; // telefon numaranızı girin
 
char data[100];
int data_size;
 
char aux_str[30];
char aux;
int x = 0;
char N_S,W_E;
 
char url[] = "pruebas.libelium.com";
char frame[200];
 
char latitude[15];
char longitude[15];
char altitude[6];
char date[16];
char time[7];
char satellites[3];
char speedOTG[10];
char course[10];
 
void setup(){
 mynumber[0]='0';
 mynumber[1]='1';
 mynumber[2]='2';
 mynumber[3]='3';
 mynumber[4]='4';
 mynumber[5]='5';
 mynumber[6]='6';
 mynumber[7]='7';
 mynumber[8]='8';
 
 
 pinMode(onModulePin, OUTPUT);
 Serial.begin(115200); 
 
 power_on();
 power_onGPS();
 power_onSMS();
 
 delay(5000);
 
 sendATcommand("AT+CPIN=****", "OK", 2000); 
 
 delay(3000); 
 
 while( (sendATcommand("AT+CREG?", "+CREG: 0,1", 1000) || sendATcommand("AT+CREG?", "+CREG: 0,5", 1000)) == 0 );
 
 
 sendATcommand("AT+CLIP=1", "OK", 1000); 
 
 while ( start_GPS() == 0);
 
 while (sendATcommand("AT+CREG?", "+CREG: 0,1", 2000) == 0);
 
 // sets APN , user name and password
 sendATcommand("AT+SAPBR=3,1,\"Contype\",\"GPRS\"", "OK", 2000);
 sendATcommand("AT+SAPBR=3,1,\"APN\",\"*******\"", "OK", 2000);
 sendATcommand("AT+SAPBR=3,1,\"USER\",\"*******\"", "OK", 2000);
 sendATcommand("AT+SAPBR=3,1,\"PWD\",\"*******\"", "OK", 2000);
 
 // gets the GPRS bearer
 while (sendATcommand("AT+SAPBR=1,1", "OK", 20000) == 0)
 {
 delay(5000);
 }
 
 delay(1000);
 while(Serial.available() != 0)
 {
 Serial.read(); 
 }
}
void loop(){
 
 answer = sendATcommand("", "+CLIP", 1000);
 //Detect incomming call
 if (answer == 1)
 {
 Serial.println("Incoming call"); 
 
 if ( flag == 0){
 
 for (int i=0; i<19; i++){
 // read the incoming byte:
 while (Serial.available() == 0)
 { 
 delay (50);
 }
 //Stores phone number
 number[i]= Serial.read(); 
 
 }
 Serial.flush();
 flag = 1; 
 } 
 //Stores phone calling number
 for (int i=0; i<=14; i++){
 if(number[i]== '"'){
 i++;
 realnumber[0]=number[i];
 i++;
 realnumber[1]=number[i];
 i++;
 realnumber[2]=number[i];
 i++;
 realnumber[3]=number[i];
 i++;
 realnumber[4]=number[i];
 i++;
 realnumber[5]=number[i];
 i++;
 realnumber[6]=number[i];
 i++;
 realnumber[7]=number[i];
 i++;
 realnumber[8]=number[i];
 break;
 } 
 }
 //Check phone number
 for (int i=0;i<9;i++){ if (realnumber[i]== mynumber[i]){ a++; if( a==9){ Serial.println("Correct number"); sendATcommand("ATH", "OK", 1000); if(b==1){ b=0; }else{ b=1; c=1; } break; } }else{ Serial.println("Wrong number"); break; } } a=0; answer=0; flag = 0; } //Send SMS once and position to HTTP if (b==1){ get_GPS(); send_HTTP(); delay(500); if (c==1){ sendSMS(); delay(100); c=0; } } } void power_on(){ uint8_t answer=0; digitalWrite(onModulePin,HIGH); delay(3000); digitalWrite(onModulePin,LOW); while(answer == 0){ // Send AT every two seconds and wait for the answer answer = sendATcommand("AT", "OK", 2000); } } int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout){ uint8_t x=0, answer=0; char response[100]; unsigned long previous; memset(response, '\0', 100); // Initialice the string delay(100); while( Serial.available() > 0) Serial.read(); // Clean the input buffer
 
 if (ATcommand[0] != '\0')
 {
 Serial.println(ATcommand); // Send the AT command 
 }
 
 
 x = 0;
 previous = millis();
 
 // this loop waits for the answer
 do{
 if(Serial.available() != 0){ // if there are data in the UART input buffer, reads it and checks for the asnwer
 response[x]= Serial.read();
 //Serial.print(response[x]);
 x++;
 if (strstr(response, expected_answer) != NULL) // check if the desired answer (OK) is in the response of the module
 {
 answer = 1;
 }
 }
 }while((answer == 0) && ((millis() - previous) < timeout)); // Waits for the asnwer with time out
 
 return answer;
}
 
void power_onGPS(){
 
 uint8_t answer=0;
 
 // checks if the module is started
 answer = sendATcommand("AT", "OK", 2000);
 if (answer == 0)
 {
 // power on pulse
 digitalWrite(onModulePin,HIGH);
 delay(3000);
 digitalWrite(onModulePin,LOW);
 
 // waits for an answer from the module
 while(answer == 0){ 
 // Send AT every two seconds and wait for the answer 
 answer = sendATcommand("AT", "OK", 2000); 
 }
 }
 
}
 
int8_t start_GPS(){
 
 unsigned long previous;
 
 previous = millis();
 // starts the GPS
 sendATcommand("AT+CGPSPWR=1", "OK", 2000);
 sendATcommand("AT+CGPSRST=0", "OK", 2000);
 
 // waits for fix GPS
 while(( (sendATcommand("AT+CGPSSTATUS?", "2D Fix", 5000) || 
 sendATcommand("AT+CGPSSTATUS?", "3D Fix", 5000)) == 0 ) && 
 ((millis() - previous) < 90000));
 
 if ((millis() - previous) < 90000) { return 1; } else { return 0; } } int8_t get_GPS(){ int8_t counter, answer; long previous; // First get the NMEA string // Clean the input buffer while( Serial.available() > 0) Serial.read(); 
 // request Basic string
 sendATcommand("AT+CGPSINF=0", "AT+CGPSINF=0\r\n\r\n", 2000);
 
 counter = 0;
 answer = 0;
 memset(frame, '\0', 100); // Initialize the string
 previous = millis();
 // this loop waits for the NMEA string
 do{
 
 if(Serial.available() != 0){ 
 frame[counter]= Serial.read();
 counter++;
 // check if the desired answer is in the response of the module
 if (strstr(frame, "OK") != NULL) 
 {
 answer = 1;
 }
 }
 // Waits for the asnwer with time out
 }
 while((answer == 0) && ((millis() - previous) < 2000)); 
 
 frame[counter-3] = '\0'; 
 
 // Parses the string 
 strtok(frame, ",");
 strcpy(longitude,strtok(NULL, ",")); // Gets longitude
 strcpy(latitude,strtok(NULL, ",")); // Gets latitude
 strcpy(altitude,strtok(NULL, ".")); // Gets altitude 
 strtok(NULL, ","); 
 strcpy(date,strtok(NULL, ".")); // Gets date
 strtok(NULL, ",");
 strtok(NULL, ","); 
 strcpy(satellites,strtok(NULL, ",")); // Gets satellites
 strcpy(speedOTG,strtok(NULL, ",")); // Gets speed over ground. Unit is knots.
 strcpy(course,strtok(NULL, "\r")); // Gets course
 
 convert2Degrees(latitude);
 convert2Degrees(longitude);
 
 return answer;
}
 
/* convert2Degrees ( input ) - performs the conversion from input 
 * parameters in DD°MM.mmm’ notation to DD.dddddd° notation. 
 * 
 * Sign '+' is set for positive latitudes/longitudes (North, East)
 * Sign '-' is set for negative latitudes/longitudes (South, West)
 * 
 */
int8_t convert2Degrees(char* input){
 
 float deg;
 float minutes;
 boolean neg = false; 
 
 //auxiliar variable
 char aux[10];
 
 if (input[0] == '-')
 {
 neg = true;
 strcpy(aux, strtok(input+1, "."));
 
 }
 else
 {
 strcpy(aux, strtok(input, "."));
 }
 
 // convert string to integer and add it to final float variable
 deg = atof(aux);
 
 strcpy(aux, strtok(NULL, '\0'));
 minutes=atof(aux);
 minutes/=1000000;
 if (deg < 100)
 {
 minutes += deg;
 deg = 0;
 }
 else
 {
 minutes += int(deg) % 100;
 deg = int(deg) / 100; 
 }
 
 // add minutes to degrees 
 deg=deg+minutes/60;
 
 
 if (neg == true)
 {
 deg*=-1.0;
 }
 
 neg = false;
 
 if( deg < 0 ){ neg = true; deg*=-1; } float numberFloat=deg; int intPart[10]; int digit; long newNumber=(long)numberFloat; int size=0; while(1){ size=size+1; digit=newNumber%10; newNumber=newNumber/10; intPart[size-1]=digit; if (newNumber==0){ break; } } int index=0; if( neg ){ index++; input[0]='-'; } for (int i=size-1; i >= 0; i--)
 {
 input[index]=intPart[i]+'0'; 
 index++;
 }
 
 input[index]='.';
 index++;
 
 numberFloat=(numberFloat-(int)numberFloat);
 for (int i=1; i<=6 ; i++) { numberFloat=numberFloat*10; digit= (long)numberFloat; numberFloat=numberFloat-digit; input[index]=char(digit)+48; index++; } input[index]='\0'; } void send_HTTP(){ uint8_t answer=0; // Initializes HTTP service answer = sendATcommand("AT+HTTPINIT", "OK", 10000); if (answer == 1) { // Sets CID parameter answer = sendATcommand("AT+HTTPPARA=\"CID\",1", "OK", 5000); if (answer == 1) { // Sets url sprintf(aux_str, "AT+HTTPPARA=\"URL\",\"http://%s/demo_sim908.php?", url); Serial.print(aux_str); sprintf(frame, "visor=false&latitude=%s&longitude=%s&altitude=%s&time=%s&satellites=%s&speedOTG=%s&course=%s", latitude, longitude, altitude, date, satellites, speedOTG, course); Serial.print(frame); answer = sendATcommand("\"", "OK", 5000); if (answer == 1) { // Starts GET action answer = sendATcommand("AT+HTTPACTION=0", "+HTTPACTION:0,200", 30000); if (answer == 1) { Serial.println(F("Done!")); } else { Serial.println(F("Error getting url")); } } else { Serial.println(F("Error setting the url")); } } else { Serial.println(F("Error setting the CID")); } } else { Serial.println(F("Error initializating")); } sendATcommand("AT+HTTPTERM", "OK", 5000); } void power_onSMS(){ uint8_t answer=0; // checks if the module is started answer = sendATcommand("AT", "OK", 2000); if (answer == 0) { // power on pulse digitalWrite(onModulePin,HIGH); delay(3000); digitalWrite(onModulePin,LOW); // waits for an answer from the module while(answer == 0){ // Send AT every two seconds and wait for the answer answer = sendATcommand("AT", "OK", 2000); } } } void sendSMS(){ sendATcommand("AT+CPIN=****", "OK", 2000); delay(3000); Serial.println("Connecting to the network..."); while( (sendATcommand("AT+CREG?", "+CREG: 0,1", 500) || sendATcommand("AT+CREG?", "+CREG: 0,5", 500)) == 0 ); Serial.print("Setting SMS mode..."); sendATcommand("AT+CMGF=1", "OK", 1000); // sets the SMS mode to text Serial.println("Sending SMS"); sprintf(aux_string,"AT+CMGS=\"%s\"", phone_number); answer = sendATcommand(aux_string, ">", 2000); // send the SMS number
 if (answer == 1)
 {
 Serial.print("Help me! I've been stolen. Find me in:");
 Serial.print("Latitude: ");
 int i = 0;
 while(latitude[i]!=0){
 Serial.print(latitude[i]);
 i++;
 }
 Serial.print(" / Longitude: ");
 i = 0;
 while(longitude[i]!=0){
 Serial.print(longitude[i]);
 i++;
 }
 Serial.write(0x1A);
 answer = sendATcommand("", "OK", 20000);
 if (answer == 1)
 {
 Serial.print("Sent "); 
 }
 else
 {
 Serial.print("error ");
 }
 }
 else
 {
 Serial.print("error ");
 Serial.println(answer, DEC);
 }
 
}

PHP Yazılımı:

GPRS + GPS modül ağa bağlanacak ve bilgisayarınızda php script Internet üzerinden GPS verilerini gönderecek.

Buradan indir >> https://www.robimek.com/wp-content/uploads/gps.txt

Bunlar da İlgini Çekebilir

Cevap bırakın

E-posta hesabınız yayımlanmayacak.

  1. Özcan Özaltın

    Arkadaşlar bu modül ile minimum ne kadarlık bir konum değişikliğini algılayabliriz? mesela 10 cm’lik bir değişim algılanabilir mi?

  2. Hamit Keşan

    sezgin bey iyi günler ben üniversite öğrencisiyim bilgisayar bölümü okuyorum bu projeyi ödev olarak bağlantı şemasını atabilirmisiniz

  3. mehmet

    merhaba sezgin bey bu gprs/gsm ile gps/gsm olan modüller var farkı nedir.

  4. mehmet karahan

    bu malzemeleri bulabileceğim bir yer var mı. yardımcı olurmusunuz

  5. orkut göküş

    merhablar bir konuda sizden kaynak isteyeceğim. ben aldığım gps verilerin
    tek tek google map e girmekten ziyade anlık olarak fgoogle map üzeriden göstermek istiyorum. gps verilerini alıyorum aa gerisi konuusnda bilgim yok bu konuda bilginiz var mı acaba çalışambilmem için nerden başlamam lazım veya bir ders kaynağı varsa yazabilir misinz acaba teşekküreler iyi çalışmalar
    orkgks@gmail.com

  6. mehmet yuce

    Merhaba komple maaliyetler ne kadar acaba

  7. fatih

    merhaba sezgin bey

    umarım yanlış anlamazsınız ama benim yardım isteyeceğim bir konu var benzer olduğundan böyle bir konun aktına yorum atmak istedim iletşim bilgilerinizi bulmadım

    öncelikle ben bi makinanın elektiriği kesildiğinde bilgisyarım veya bi internet sitesi üzerinden bu makinanın elektiriğin kesildiğinde görebileceğim bir sistem yapacağım. bunu eski yolla yapmaya kalktığımda çok uğraştırıcı oluyor. açıkçası arduino konusunda pek bir bilgim yok bu konuda sizden yardımlarınızı isteyecektim. konunun üzerinden tekrak geçmek gerekirse

    10 adet gibi bir pano var buraya gelen elektirik kesildiğinde bana bildirilmesini istiyorum (bilginiz varsa internet sitesi benim için mükemmel bir işlev olur) sadece kesildi bilgisini alabilsem yeter.

    bana bu konu hakkında yardımız için mail hesabıma dönüş sağlarsanız çok memnun kalırım

    fatih_kanidagli@hotmail.com

  8. gökay

    usta apn ayarlarını nasıl yapıyoruz anlatabilirmisin

  9. Mehmet

    hocam;
    Ublox NEO-6M GPS Module hakkında projede yapar mısın.

  10. nusret

    Selam. bu GSM+GPRS modülü nerden alabilirim, bulamadım internette :))

    1. Sezgin GÜL

      direnç.net de var ama arduino üzerine takmalı değil. Robotisanda sım 900 modeli var shield halinde onunla yapabilirsin.

      1. sena

        Robotisandaki sım 900 modeli nin burdaki modelle farklılıkları neler kodda bi düzeltme yapmam gerekiyormu sim 900 modelini aldığımda ..

  11. halit

    Aliexpresten hazir gps takip cihazi getirtip kaydettirsek daha ucuza malolur

  12. emrah sinekli

    nRF24L01 modülü işimi görmez mi peki hocam öğrenciyim biraz aşıyor gsm modülünün ücreti

    1. Sezgin GÜL

      nRF24L01 modül rf modül yani konum bilgisi sadece gps modüllerle alınıyor.

  13. emrah sinekli

    yani sadece ethernet shiel işimi görmez mi ucuz bişey yapmak için

    1. Sezgin GÜL

      ethernet shield de internete bağlı olman gerekir. O da arabada olmaz. Bu projedeki gps-gprs modülü kullansan daha kolay ve sorunsuz takip edebilirsin.

  14. emrah sinekli

    peki hocam ben araç atkip sistemi yapsam ethernet shield mi gerekli yoksa gsm shield mi?

  15. emrah sinekli

    merhaba
    ben Arduino Ethernet Shield + gps modül kullanarak bilgisayarıma koordinatları alabilirmiyim ?

    1. Sezgin GÜL

      tabi alabilirsin. Bu projedeki gibi web adresi tanımlayarak bir internet sitene bu php sayfasını eklersen oradan koordinatları görebilirsin. Arduino Ethernet Shield kullanmana da gerek yok norma arduino uno veya megada işini görür

  16. enes ünal

    sim e numara kaydetme işini bir lcd ekran vasıtasıyla nasıl yapabiliriz. bu sistemde numaraları kodlar içinde kaydediyorsunuz herhalde.

    1. Sezgin GÜL

      char phone_number[]=”012345678″; // telefon numaranızı girin
      yukarıdaki kısım tel numarası girildiği yer. Yani yapmak istediğiniz numarayı istediğiniz zaman değiştirmek mi ?

  17. emra tuna

    directupload.net/images/160219/bbuugvzd.jpg bunun aynsı ama

    S2-1040S-ZZ1K0C yazıyor

    1. Sezgin GÜL

      aldığın yerde kütüphane linki varsa onu indirip denedin mi normalde kütüphanesi var

  18. Emra Tuna

    Yardımcı olursanız sevinirim suan hersey hazır ama hiç bir işlem yapamıyorum

    1. Sezgin GÜL

      modelini yazarmısın

  19. emra tuna

    imei kaydı yapılmamıs ise bunu kaydettirme sansım varmı veya degistirme

    1. Sezgin GÜL

      projede kaydetme işlemi yazıyor fakat modüle göre farklı yöntemlerle kayıt edilebiliyor.

  20. emra tuna

    exit status 1
    ‘power_on’ was not declared in this scope hatası veriyor hocam birde

    1. Sezgin GÜL

      ime kaydı yapılmamış olabilir bir de kendi kütüphanesi varsa onunla çalıştır

  21. emra tuna

    hocam bende directupload.net/images/160219/bbuugvzd.jpg bu shield var ve bunla sizin verdiginiz kodlar calısmıyor yardımcı olurmusunuz

    1. emrah

      Sezgin hocam bende sim900 var bunu IMEI nasıl değiştirebilirim IMEI kayıt değil yardımcı olursanız sevinirim

  22. Ramazan

    Pil ne kadar dayanır bu sisteme acaba?

    1. Sezgin GÜL

      normal pil hemen biteceğinden lipo pil kullanıp aküden şarj ettirebilirsiniz

  23. ibrahim

    Php kodları düzgün gözükmüyor. Düzeltirseniz daha iyi olur 🙂

    1. Sezgin GÜL

      Düzeltildi link eklendi.

  24. savaş koç

    merhabalar elimde araç takip cihazı var gps gprs antenleri ile birlikte bunu nasıl kullanabilirim çalınmasından korktuğum eşya var onun içine koymak isityorum ancak verileri nasıl elde edeceğim pek bilmediğim hatta hiç bilmediğim bir konu yardımcı olursanız çok iyi olur teşkkürler

    1. Sezgin GÜL

      modeline göre pin bağlantılarını ayırmanız gerekiyor. ve yazılıma uyarlamak için de modelin kütüphanesi olması lazım ki arduino ile uyumlu olması da önemli bu konuda. Ayrıca harici sd kart modülü de kullanmalısınız o da uğraştırır sizi. Bence arduino uyumlu üzerine takılabilir modül kullanın kolay olur

  25. A.Oğuzhan

    Merhaba bir sorum olacak haritada kendi girdiğiniz koordinatların dışına çıkarsa bildirim vermesini sağlayabilirmiyiz.

    1. Sezgin GÜL

      olabilir yazılıma koordinat sınırlarını girin gelen veriye göre eşleme yapıp uygulamayı gerçekleştirin

  26. Ali Seyit

    Bu projede haritaya aktarım olayını nasıl yaptınız bende böyle bir proje yapmak istiyorum ama gpsden aldığı verileri direk android uygulamada google maps üzerinde göstersin istiyorum

    1. Sezgin GÜL

      Google maps kullanıyor. Aslında alınan koordinat haritanın konumunda gösteriyor. Yani harita güncel değil resim gibi düşün. Bu php kodunu siteye bir siteye gömersen ordan telefon üzerinden de veri alırsın

      1. berk p

        Peki biz belli bir alandan gezinme görüntüsü almak istiyorsak alabilir miyiz,örneğin evimizde dolaşırken ayrıntılı olarak nerelerde dolaşıyoruz güncel olarak alabilir miyiz?

        1. Sezgin GÜL

          Tabi alabilirsiniz ama küçük alanlarda çok farklılık göremeyebilirsiniz.

  27. berk p

    Merhaba bu devrede sim kartın görevi nedir sim kartsız yapamaz mıyız?
    Araç içindeki gps (yol ve konum görebildiğimiz) sağlayıcılar simsiz çalışmıyor mu?

    1. Sezgin GÜL

      Simsiz olan modüller de var onlar sadece gps modül olarak geçer onlarında IM lerinden konum bilgisi alırsınız. Buradaki sim kartta gsm üzerinden veri alınıyor.

  28. atakan

    ne kadara geliyo tüm mazemeler

    1. Sezgin GÜL

      yaklaşık 150 € maliyeti çıkar.