# Mengambil Data GNSS (Global Navigation Satellite System)

Pada project ini Anda akan diarahkan untuk mengambil data GNSS (Global Navigation Satellite System) berupa data lokasi dan waktu menggunakan board **NB-LYNX-7000** yang dipasang dengan GPS Antenna.

## Prasyarat

Material yang dibutuhkan mengikuti **Prasyarat Umum** pada laman sebelumnya. Jika Anda belum menyiapkan kebutuhan pada laman tersebut, maka Anda dapat mengunjungi laman berikut.

{% content-ref url="prasyarat-umum-nb-lynx-7000" %}
[prasyarat-umum-nb-lynx-7000](https://docs.antares.id/contoh-kode-dan-library/nb-iot/nb-lynx-7000/prasyarat-umum-nb-lynx-7000)
{% endcontent-ref %}

## Langkah Kerja

### 1. Setup Peralatan

Hal yang perlu Anda lakukan pertama kali adalah melakukan setup peralatan dengan cara menghubungkan board NB-LYNX-7000 dengan GPS Antenna. Selanjutnya board dapat dihubungkan ke perangkat laptop/komputer Anda menggunakan kabel USB-C.&#x20;

{% hint style="info" %}
Anda perlu menghubungkan GPS Antenna pada port antena GPS yang terletak pada board NB-LYNX-7000
{% endhint %}

Berikut adalah rangkaian peralatan yang sudah dihubungkan ke laptop/komputer.&#x20;

<figure><img src="https://content.gitbook.com/content/rRkxjRLeqOm0pNhLfsus/blobs/3Ld4p9iLYGVDzw6qdd7n/1_Rangkaian%20(1).jpg" alt="" width="563"><figcaption><p>NB-LYNX-7000 yang Dihubungkan dengan GPS Antenna</p></figcaption></figure>

### 2. Jalankan Arduino IDE

### 3. Menginputkan Kode Program

Untuk mengambil data GNSS, Anda perlu menginputkan kode program di bawah pada Arduino IDE.&#x20;

{% code lineNumbers="true" %}

```arduino
#include <Arduino.h>

// Configurable macros
#define SIM7000_POWER_KEY 27

String sendCommand(String command, uint32_t timeout, char delimiter)
{
 while (Serial2.available())
  Serial2.read();

 uint32_t T = millis();
 String res = "";
 Serial.print("[SYS CMD] ");
 Serial.print(command);
 Serial.println("=========");
 Serial2.print(command);
 while ((millis() - T) < timeout)
 {
  while (Serial2.available())
  {
   res = Serial2.readStringUntil(delimiter);
   res.trim();
   if (res.length() > 0)
   {
    Serial.print("[SYS RES] ");
    Serial.println(res);
    return res;
   }
  }
 }
 return "TIMEOUT";
}

String receiveAddCommand(int32_t timeout)
{
 String res = "";
 uint32_t T = millis();
 while ((millis() - T) < timeout)
 {
  while (Serial2.available())
  {
   res = Serial2.readStringUntil('\0');
   res.trim();
   if (res.length() > 0)
   {
    Serial.print("[SYS RES] ");
    Serial.println(res);
    return res;
   }
  }
 }
 return res;
}

bool checkResponse(String response, String expected_response)
{
 if (response.indexOf(expected_response) != -1)
  return true;
 else
  return false;
}

bool sim7000_powerOn()
{
 pinMode(SIM7000_POWER_KEY, OUTPUT);
 delay(100);
 digitalWrite(SIM7000_POWER_KEY, LOW);
 delay(1000);
 digitalWrite(SIM7000_POWER_KEY, HIGH);
 delay(1000);
 for (uint8_t i = 0; i < 5; i++)
 {
  String response = sendCommand("AT\r\n", 200, '\n');
  if (checkResponse(response, "AT"))
  {
   sendCommand("ATE0\r\n", 200, '\n');
  }
  else if (checkResponse(response, "OK"))
  {
   return true;
  }

  delay(1000);
 }
 return false;
}

bool sim7000_powerOnGNSS()
{
 if (!checkResponse(sendCommand("AT+CGNSPWR=1\r\n", 200, '\n'), "OK"))
  return false;
 if (!checkResponse(sendCommand("AT+CGNSURC=1\r\n", 200, '\n'), "OK"))
  return false;

 return true;
}

void sim7000_parseGNSS(String input)
{
 // Serial.println(input);
 int firstCommaIndex = input.indexOf(",");
 int secondCommaIndex = input.indexOf(",", firstCommaIndex + 1);
 int thirdCommaIndex = input.indexOf(",", secondCommaIndex + 1);
 int fourthCommaIndex = input.indexOf(",", thirdCommaIndex + 1);
 int fifthCommaIndex = input.indexOf(",", fourthCommaIndex + 1);
 int sixthCommaIndex = input.indexOf(",", fifthCommaIndex + 1);

 int isGnssRun = input.substring(0, firstCommaIndex).toInt();
 if (isGnssRun == 0)
 {
  Serial.println("[SIM7000] GNSS is not running");
  return;
 }
 
 int isGnssFix = input.substring(firstCommaIndex + 1, secondCommaIndex).toInt();
 if (isGnssFix == 0)
 {
  Serial.println("[SIM7000] GNSS is not fixed");
  return;
 }

 Serial.print("Latitude : ");
 Serial.println(input.substring(thirdCommaIndex + 1, fourthCommaIndex));
 Serial.print("Longitude : ");
 Serial.println(input.substring(fourthCommaIndex + 1, fifthCommaIndex));
 Serial.print("Altitude : ");
 Serial.println(input.substring(fifthCommaIndex + 1, sixthCommaIndex));

 Serial.print("Date & Time : ");
 String datetime = input.substring(secondCommaIndex + 1, thirdCommaIndex);
 Serial.print(datetime.substring(6, 8));
 Serial.print("/");
 Serial.print(datetime.substring(4, 6));
 Serial.print("/");
 Serial.print(datetime.substring(0, 4));
 Serial.print(" ");
 Serial.print(datetime.substring(8, 10));
 Serial.print(":");
 Serial.print(datetime.substring(10, 12));
 Serial.print(":");
 Serial.print(datetime.substring(12, 14));
 Serial.print("\n");
}

bool gnssSetup()
{
 Serial2.begin(9600);
 Serial2.flush();
 Serial.println("[SIM7000] Turning ON...");
 if (sim7000_powerOn())
  Serial.println("Success");
 else
 {
  Serial.println("Failed");
  Serial.println("Hold PWRKEY for 3 seconds and press RST");
  return false;
 }

 Serial.println("[SIM7000] Turning ON GNSS...");
 if (sim7000_powerOnGNSS())
  Serial.println("Success");
 else
 {
  Serial.println("Failed");
  return false;
 }

 return true;
}

void setup()
{
 Serial.begin(115200);
 if (!gnssSetup())
 {
  while (1)
   delay(1000);
 }
}

void loop()
{
 String res = "";
 while (Serial2.available())
 {
  res = Serial2.readStringUntil('\0');
  res.trim();
  if (checkResponse(res, "+UGNSINF:"))
  {
   res.replace("+UGNSINF:","");
   sim7000_parseGNSS(res);
  }
 }
}


```

{% endcode %}

### 4. Penjelasan Kode Program

Supaya board **NB-LYNX-7000** dapat berkomunikasi dengan platform Antares, digunakan modul **SIM7000**. SIM7000 merupakan modul komunikasi seluler yang dikembangkan oleh SIMCom Wireless Solutions. Modul ini menerapkan beberapa protokol yang memungkinkan perangkat untuk terhubung ke jaringan menggunakan **AT command**. Berikut dijelaskan beberapa AT command yang digunakan pada kode program.

```
AT<CR><LF>
```

Pada kode program terdapat command "AT\r\n" yang dikirimkan sebagai starting point atau tahap inisialisasi modul SIM7000. \r merupakan carriage return , sedangkan \n merupakan line feed. Command ini dikirimkan untuk mendapatkan respons “OK”.

```
ATE0<CR><LF>
```

Pada kode program terdapat command "ATE0\r\n" yang dikirimkan setelah mendapatkan respons “OK”. Command ini digunakan untuk menonaktifkan echo mode yang menandakan bahwa inisialisasi telah berhasil.

```
AT+CGNSPWR=<mode><CR><LF>
```

Pada kode program terdapat command "AT+CGNSPWR=1\r\n" yang digunakan untuk melakukan power control modul GNSS. Parameter “1” digunakan untuk menyalakan power supply GNSS.&#x20;

{% hint style="info" %}
Berikut parameter \<mode> lainnya yang dapat digunakan.

* 0 = Mematikan power supply GNSS
* 1 = Menyalakan power supply GNSS
  {% endhint %}

```
AT+CGNSURC=<Navigation mode><CR><LF>
```

Pada kode program terdapat command "AT+CGNSURC=1\r\n" yang digunakan untuk menampilkan data navigasi. Parameter “1” digunakan untuk menampilkan data navigasi setiap kali GNSS menerima sinyal dari satelit.&#x20;

{% hint style="info" %}
Berikut beberapa parameter \<Navigation mode> lain yang dapat digunakan

* 0 = Mematikan data navigasi yang ditampilkan
* 1 = Menampilkan data navigiasi setiap kali GNSS menerima sinyal
* 2 = Menampilkan data navigasi sekali setiap GNSS telah menerima sinyal sebanyak 2 kali
* …
* 256 = Menampilkan data navigasi sekali setiap GNSS telah menerima sinyal sebanyak 256 kali
  {% endhint %}

### **5. Upload Program ke Board NB-LYNX-7000**

Pertama, Anda harus mengatur board yang digunakan dengan memilih **ESP32 Dev Module** pada bagian **Tools > Board > esp32**.

<figure><img src="https://content.gitbook.com/content/rRkxjRLeqOm0pNhLfsus/blobs/YLPSFZ2viz51R15mMOEH/2_Board.png" alt=""><figcaption><p>Pemilihan Board</p></figcaption></figure>

Setelah itu, Anda perlu mengatur port yang digunakan dengan membuka **Tools > Port > COM(X)**. Nilai X menyesuaikan dengan nomor port yang digunakan oleh board NB-LYNX-7000.

<figure><img src="https://content.gitbook.com/content/rRkxjRLeqOm0pNhLfsus/blobs/iEyYxDiI5ZkpVC7E2q2m/2_Port.png" alt=""><figcaption><p>Pemilihan Port</p></figcaption></figure>

Setelah Anda mempersiapkan kode program, selanjutnya Anda dapat meng-upload kode program tersebut dengan menekan tombol upload seperti ditunjukkan pada gambar di bawah.

<figure><img src="https://content.gitbook.com/content/rRkxjRLeqOm0pNhLfsus/blobs/l8hf2H2OXeR76Yc8Ii0Y/4_Upload%20Button.png" alt="" width="563"><figcaption><p>Upload Kode Program</p></figcaption></figure>

Jika kode program sudah berhasil di-upload, Anda dapat membuka Serial Monitor dengan menekan icon seperti ditunjukkan pada gambar di bawah. Icon tersebut dapat Anda temukan pada bagian atas sebelah kanan.

<figure><img src="https://content.gitbook.com/content/rRkxjRLeqOm0pNhLfsus/blobs/a1zNj8cdQQiLckWnWBtj/5_Serial%20Monitor.png" alt="" width="132"><figcaption><p>Ikon Serial Monitor</p></figcaption></figure>

Anda perlu mengatur baud rate Serial Monitor menjadi 115200 supaya output-nya dapat terbaca.

<figure><img src="https://content.gitbook.com/content/rRkxjRLeqOm0pNhLfsus/blobs/UFdYyobinlxy8FcUKIYf/6_Baud%20Rate.png" alt=""><figcaption><p>Baud Rate</p></figcaption></figure>

Tampilan Serial Monitor akan menjadi seperti pada gambar di bawah yang menandakan proses inisiasi modul SIM7000 dan proses menyalakan GNSS untuk mendapatkan data navigasi.

<figure><img src="https://content.gitbook.com/content/rRkxjRLeqOm0pNhLfsus/blobs/gP0jchVczWDydXgjdN1u/2_GNSS.png" alt=""><figcaption><p>Output Serial Monitor yang Menunjukkan Proses Inisiasi Modul SIM7000 dan Menyalakan GNSS</p></figcaption></figure>

Selanjutnya, GPS Antenna akan bekerja untuk menerima sinyal dari satelit untuk mendapatkan data GNSS berupa informasi navigasi yang terdiri dari latitude, longtitude, altitude, dan date & time.&#x20;

{% hint style="info" %}
GPS Antenna terkadang membutuhkan waktu yang cukup lama untuk menerima sinyal dari satelit hingga pada akhirnya data GNSS berhasil diterima. Pada kondisi ini, Anda dapat menunggunya beberapa saat.
{% endhint %}

{% hint style="info" %}
Jika sudah menunggu beberapa saat namun data GNSS belum berhasil diterima, maka besar kemungkinan GPS Antenna tidak menerima cukup sinyal dari satelit.
{% endhint %}

Ketika GPS Antenna tidak menerima cukup sinyal dari satelit, tampilan pada serial monitor akan menjadi seperti pada gambar di bawah.

<figure><img src="https://content.gitbook.com/content/rRkxjRLeqOm0pNhLfsus/blobs/5gCWsnV6wmFcAN2WkVKN/2_GNSS%20Not%20Fixed.png" alt=""><figcaption><p>Output Serial Monitor Ketika Antenna Tidak Menerima Cukup Sinyal</p></figcaption></figure>

{% hint style="info" %}
Jika GPS Antenna tidak menerima cukup sinyal dari satelit, Anda dapat membawa GPS Antenna ke ruangan terbuka atau dengan mendekatkannya ke jendela.
{% endhint %}

Ketika antena telah menerima cukup sinyal, maka data GNSS yang akan ditampilkan pada serial monitor menjadi seperti pada gambar di bawah.

<figure><img src="https://content.gitbook.com/content/rRkxjRLeqOm0pNhLfsus/blobs/TMaoE4LnNvBXISjR2yUn/3_GNSS%20Accuired.png" alt=""><figcaption><p>Output Serial Monitor ketika Telah Berhasil Menerima data GNSS</p></figcaption></figure>

Pada kondisi ini, GPS Antenna akan terus menerus menerima sinyal dari satelit untuk menampilkan data GNSS pada serial montior.
