Overview

Melanjutkan postingan tentang GPS module dan juga mengirim SMS dengan sim800l, maka untuk postingan kali ini akan membahas bagaimana cara mengirim lokasi gps (longitude dan latitude) dengan sim800L v.2. Alur dari kerja alat ini yaitu gps module membaca nilai longitude dan latitude kemudian akan dikirimkan melalui sim800l v.2. Dikarenakan 2 buah modul ini menggunakan serial komunikasi sehingga sebelum pembacaan dari modul ini harus di declarasikan dulu port serial yang mana yang akan aktif dengan memberikan perintah mySerial.listen()

Part

Schematic

schematic send location using SMS and GPS Module

Step by Step

  1. Rangkai seluruh komponen seperti schematic di atas.
  2. Download Library Tiny GPS ++, kemudian tambahkan pada libraries arduino.
  3. Masukkan program berikut untuk tes fungsi dari gps, jangan lupa lihat indikator netework dari gps. Apabila LED indikator network sudah berkedip maka gps modul sudah mendapatkan signal, jika belum tunggu sampai 5 menit.

    #include <TinyGPS++.h>
    #include <SoftwareSerial.h>
    
    SoftwareSerial serial_gps(3, 2); // RX = pin 10, TX = pin 11
    TinyGPSPlus gps;
    double latitude, longitude;
    
    void setup() {
      Serial.begin(9600);
      serial_gps.begin(9600);
      Serial.println("GPS Mulai");
      
    }
    
    void loop() {
      serial_gps.listen();
      while(serial_gps.available()) {
        gps.encode(serial_gps.read());
      }
      if(gps.location.isUpdated()) {
        latitude = gps.location.lat();
        longitude = gps.location.lng();
        String link = "http://www.google.com/maps/place/" + String(latitude) + "," + String(longitude) ;
        Serial.print("Link Google Maps : ");
        Serial.println(link);
        Serial.print("Satellite Count : ");
        Serial.println(gps.satellites.value());
        Serial.print("Latitude : ");
        Serial.println(latitude, 6);
        Serial.print("Longitude : ");
        Serial.println(longitude, 6);
        Serial.print("Speed MPH : ");
        Serial.println(gps.speed.mph());
        Serial.print("Altitude Feet : ");
        Serial.println(gps.altitude.feet());
        Serial.println("");
        
      }
    }
    
  4. Apabila data longitude dan latitude gps sudah di ketahui bisa lanjut ke langkah berikutnya yaitu mengirim SMS ke nomer tujuan. Perintah SMS GSM hanya perlu 4 langkah, yaitu set GSM module ke mode text, kemudian perintah mengisi nomer tujuan, masukkan isi dari SMS, kemudian kirim karakter ENTER untuk mengakiri isi SMS dan sekaligus untuk mengirim SMS. Terlebih dahulu kita buat function/method untuk parsing data balasan dari SIM800, dan berikut function-nya.
    void atCommand(String iCommand, int timing, char myText[])
    {
      String onOff = String(myText);
      Serial.println("###Start###");
      Serial.print("Command Ke ->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ");
      Serial.print(counterCommand);
      Serial.print("   Kirim=>");Serial.println(iCommand);
      while(timing>z)
      {
        mySerial.println(iCommand);
        if(mySerial.find(myText))
        {
          found = true;
          break;
        }
        Serial.print(z);Serial.print(",");
        z++;
      }
      if(found == true)
      {
        autoReset = false;
        
        counterCommand++;
        Serial.println("==============================>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> oke");
      }
      else
      {
        
          mySerial.write("AT+CMGF=1");
          delay(1000);
          mySerial.write("AT+CMGD=1,4");
          delay(1000);
          Serial.print("nautoReset=truen");
          autoReset = true;
          Serial.println("--------============>>>>>>>> AT Command Error");
          Serial.println("--------============>>>>>>>> Proses reset");
          //digitalWrite(resetPin, HIGH);
          //delay(200);
          //digitalWrite(resetPin, LOW);
          //delay(15000);
          counterCommand = 0;
        
      }
      if(counterCommand >=100)
      {
        counterCommand = 0;
      }
      found = false;
      z=0;
     Serial.println("***end***");
      
    }
    
    
    Alur dari function yaitu port software serial mengirim perintah AT-Command sampai waktu yang ditentukan. Apabila port software serial mendapatkan balasan berupa karakter yang sesuai dengan yang diinginkan maka perintah at-command di anggap berhasil. Dan jika balasan yang diberikan tidak sesuai dengan keinginan maka SIM800L akan direset dengan memberikan logika low pada pin RESET sim800l.
  5. Setelah itu program utama sebagai berikut.

    #include <TinyGPS++.h>
    #include <SoftwareSerial.h>
    
    SoftwareSerial serial_gps(3, 2); // RX = pin 10, TX = pin 11
    SoftwareSerial mySerial(5, 4);
    TinyGPSPlus gps;
    double latitude, longitude;
    
    int z,counterCommand;
    boolean found = false;
    boolean autoReset = false;
    
    void setup() {
      Serial.begin(9600);
      serial_gps.begin(9600);
      mySerial.begin(9600);
      Serial.println("GPS Mulai");
      //## urutan AT-Command untuk menghapus ketika alat pertama kali dinyalakan ##//   
      mySerial.listen();
      while(counterCommand<=3)// artinya apabila urutan at command kurang dari 3 maka melakukan di bawah ini
      {
        switch(counterCommand)
        {
          case 0: atCommand("AT",1,"OK");break; // urutan at command 1: tes komunikasi mikro dengan sim
          case 1: atCommand("AT+CMGF=1",1,"OK");break;// urutan 2: setting sim800 dengan mode text
          case 2: atCommand("AT+CMGL="ALL",0",2,"OK");break;//3: baca seluruh pesan yang tersimpan tanpa mengubah status. 
                                                              // maksut dari status yaitu apabia sms belum terbaca maka tidak akan di ubah menjadi
                                                              // terbaca jika menggunakan at command ini 
          case 3: atCommand("AT+CMGD=1,4",1,"OK");break;  // delete seluruh isi sms yg ada pada kartu (untuk berjaga-jaga ketika operatore sms)
        }
      }
    //##############################
      counterCommand = 0;// urutan di jadikan 0 untuk melakukan program yg ada di loop
    
    }
    
    void loop() {
      serial_gps.listen();
      while(serial_gps.available()) {
        gps.encode(serial_gps.read());
      }
      if(gps.location.isUpdated()) {
        latitude = gps.location.lat();
        longitude = gps.location.lng();
        String valLat = String(latitude);
        String valLong = String(longitude);
        String link = "http://www.google.com/maps/place/" + String(latitude) + "," + String(longitude) ;
        Serial.print("Link Google Maps : ");
        Serial.println(link);
        Serial.print("Satellite Count : ");
        Serial.println(gps.satellites.value());
        Serial.print("Latitude : ");
        Serial.println(latitude, 6);
        Serial.print("Longitude : ");
        Serial.println(longitude, 6);
        Serial.print("Speed MPH : ");
        Serial.println(gps.speed.mph());
        Serial.print("Altitude Feet : ");
        Serial.println(gps.altitude.feet());
        Serial.println("");
        mySerial.listen();
        atCommand("AT+CMGF=1",1,"OK");
        atCommand("AT+CMGS="+6281553718364"",1,">");
        atCommand("Latitude:""+valLat+"",Longitude""+valLong+""",1,">");
        Serial.println("Mengirim Char Ctrl+Z / ESC untuk keluar dari menu SMS");
        mySerial.write((char)26);
        delay(10000);
      }
      //delay(10000);
    }
    void atCommand(String iCommand, int timing, char myText[])
    {
      String onOff = String(myText);
      Serial.println("###Start###");
      Serial.print("Command Ke ->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ");
      Serial.print(counterCommand);
      Serial.print("   Kirim=>");Serial.println(iCommand);
      while(timing>z)
      {
        mySerial.println(iCommand);
        if(mySerial.find(myText))
        {
          found = true;
          break;
        }
        Serial.print(z);Serial.print(",");
        z++;
      }
      if(found == true)
      {
        autoReset = false;
        
        counterCommand++;
        Serial.println("==============================>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> oke");
      }
      else
      {
        
          mySerial.write("AT+CMGF=1");
          delay(1000);
          mySerial.write("AT+CMGD=1,4");
          delay(1000);
          Serial.print("nautoReset=truen");
          autoReset = true;
          Serial.println("--------============>>>>>>>> AT Command Error");
          Serial.println("--------============>>>>>>>> Proses reset");
          //digitalWrite(resetPin, HIGH);
          //delay(200);
          //digitalWrite(resetPin, LOW);
          //delay(15000);
          counterCommand = 0;
        
      }
      if(counterCommand >=100)
      {
        counterCommand = 0;
      }
      found = false;
      z=0;
     Serial.println("***end***");
      
    }
    
    
    Program di atas akan membaca dan mengirim lokasi (longitude dan latitude GPS module) setiap 10 detik sekali. 
  6. Dan untuk hasil sebagai berikut.
    at command send long lat gps via sms
    received value long lat GPS

Selamat mencoba... jika kesulitan untuk memprogram bisa tinggalkan jejak di bawah..