---
# System prepended metadata

title: '  TP_Jartel3_AzkaNabihan_2306250541'

---

# TP Modul 10 - Propagasi

Pembuat: ED

```
Nama  : Azka Nabihan Hilmy
NPM   : 2306250541
```

**JAWABAN TANPA REFERENSI YANG SESUAI DIANGGAP MENDAPATKAN 0 POIN (UNLESS SPECIFIED OTHERWISE)**

### A. Teori dan Analisis (60 poin)

1. Menurut anda apa 10 method terpenting pada library Arduino LoRA, jelaskan secara singkat fungsi dari masing-masing method tersebut! [10 poin]

- LoRa.begin(frequency) : menginisialisasi modul LoRa pada frekuensi yang ditentukan, harus dipanggil sebelum komunikasi.
- LoRa.beginPacket() : Memulai paket data yang akan dikirim, semua data yang akan dikirim harus ditulis setelah method ini dipanggil.
- LoRa.endPacket(async) : Menyelesaikan dan mengirimkan paket data yan sedang dibangun.
- LoRa.parsePacket(size) :Memeriksa apakah ada paket LoRa yang diterima. Mengembalikan panjang paket yang diterima, atau 0 jika tidak ada paket.
- LoRa.print(data) atau LoRa.write(data) : menulis data ke dalam packet yang sedang dibangung.
- LoRa.available() : mengembalikan jumlah byte yang tersedia untuk dibaca dari paket yang diterima.
- LoRa.read() : membaca satu byte data berikutnya dari paket yagn diterima.
- LoRa.setPins(ss, rst, dio0) : mengatur pin yang terhubung ke pin NSS, RESET, dan DIO0 LoRa.
- Lora.setSpreadingFactor(sf) :  mengatur spreading factor (SF), sf yang tinggi meningkatkan jangkauan dan sensitivitas, tetapi mengurangi laju data. 
- LoRa.setSyncWord(sw) : pengenal agar penerima hanya memproses paket dari pengirim dengan sync word yang sama.

Referensi : 
- [1]“ESP32 with LoRa using Arduino IDE | Random Nerd Tutorials,” Jun. 23, 2018. https://randomnerdtutorials.com/esp32-lora-rfm95-transceiver-arduino-ide/
‌- [2]“How to use LoRa with Arduino - Emerging Technologies,” My Blog, Jul. 16, 2025. https://emergingtechs.org/how-to-use-lora-with-arduino/ (accessed Nov. 25, 2025).
- [3]S. Mistry, “Arduino LoRa,” GitHub, Apr. 03, 2022. https://github.com/sandeepmistry/arduino-LoRa
‌
‌
   
2. Sebutkan method-method minimal yang diperlukan untuk mengirimkan data string "Hello World" dari satu modul LoRA ke modul LoRA lainnya [10 poin]

- LoRa.setPins() : mengatur pin SPI modul LoRa yang terhubung ke arduino
- LoRa.begin(frequency) : menginisialisasi modul radio dan mengaturnya pada frekuensi yagn sah.
- LoRa.beginPacket() : memulai proses pembentukan paket data LoRa
- LoRa.print("Hello World") : menulis data string ke dalam buffer paket yagn sedang disiapkan.
- LoRa.endPacket() : menyelesaikan dan mengirimkan paket data LoRa.

Referensi : 
- [1]“ESP32 with LoRa using Arduino IDE | Random Nerd Tutorials,” Jun. 23, 2018. https://randomnerdtutorials.com/esp32-lora-rfm95-transceiver-arduino-ide/
- [2]“Part 2 - Hands On | Digilab UI,” Digilabdte.com, 2025. https://learn.digilabdte.com/books/telecommunication/page/part-2-hands-on
‌

3. Belajar dan jelaskan RSSI dan SNR [10 poin]
RSSI (Received Signal Strength Indicator) : indikator kekuatan sinyal yang diterima untuk pengukuran data sinyal radio yang diterima oleh receiver. Dinyatakan dalam dBm (decibel-miliwatts). RSSI selalu berupa bilangan negatif.
Interpretasi nilai : 
- nilai yang mendekati  0 menunjukkan sinyal yang sangat kuat
- nilai yang jauh dari 0 menunukkan sinyal lemah.
Tujuan untk membeirkan indikasi jarak dan membantu dalam optimasi penempatan antena.

SNR (Signal to Noise Ratio) : pengukuran kualitas sinyal yang diterima dengan membandingkan daya sinyal yang berguna dengan noise power yang tidak diinginkan.
Interpretasi nilai : 
- SNR Positif berarti daya sinyal lebih besar daripada daya kebisingan.
- SNR Negatif berarti daya sinyal lebih kecil daripada daya kebisingan.
Tujuan untuk membeirtahu seberapa jelas sinyal tersebut.

Referensi : 
- [1]LINK-PP, “What is Signal-to-Noise Ratio (SNR)? The Key to Clear Communication,” L-p.com, Jul. 28, 2025. https://resources.l-p.com/glossary/snr-signal-to-noise-ratio-and-its-impact-on-signal-quality
- [2]]“fix-mix,” fix-mix. https://www.metageek.com/training/resources/understanding-rssi/

4. Belajar dan jelaskan free path loss dan fresnel zone, serta hubungannya dengan nomor A3  [10 poin]

Free Space Path Loss adalah model yang menghitung attenuation daya sinyal elektromagnetik saat merambat melalui ruang bebas, diasumsikan tidak ada hambatan, pantulan, atau interferensi sinyal lainnya. Energi gelombang elektromagnetik menyebar di area yang semakin luas saat jarak bertambah. FPSL meningkat seiring dengan : 
- Peningkatan Jarak (d) antara pemancar dan penerima.
- Peningkatan Frekuensi (f) dari sinyal radio.

Fresnel Zone adalah wilayah elips di ruang tiga dimensi yang mengelilingi garis lurus antara antena pemancar dan penerima (disebut Line of Sight / LoS). Jika Zona Fresnel terhalang, sinyal mengalami kerugian tambahan akibat difraksi dan refleksi.

- Dampak pada RSSI dengan pengaruh FSPL : FSPL secara langsung mengurangi daya sinyal yang diterima. Semakin besar FSPL (karena jarak jauh atau frekuensi tinggi), semakin rendah nilai RSSI yang didapatkan.
- Dampak zona fresnel : Jika Zona Fresnel terhalang, akan terjadi kerugian tambahan di luar FSPL. Kerugian ini membuat RSSI turun drastis dan tidak stabil.

- Dampak pada SNR dengan pengaruh FSPL : karena SNR dihitung dari rasio daya sinyal terhadap kebisingan, penurunan daya sinyal akibat FSPL akan menurunkan nilai SNR.
- Dampka pada SNR dengan pengaruh Zona Fresnel : Hambatan zona fresenel dapat menurunkan SNR dan membuatnya tidak stabil. 

Referensi : 
- [1]LINK-PP, “What is Signal-to-Noise Ratio (SNR)? The Key to Clear Communication,” L-p.com, Jul. 28, 2025. https://resources.l-p.com/glossary/snr-signal-to-noise-ratio-and-its-impact-on-signal-quality
- [2]]“fix-mix,” fix-mix. https://www.metageek.com/training/resources/understanding-rssi/
- [3]K. B. R. Cafe, “Understanding the Fresnel Zone.” Available: https://www.rfcafe.com/references/electrical/fresnel-zone.htm
- [4]electronics notes, “Free Space Path Loss | Details & Calculator | Electronics Notes,” Electronics-notes.com, 2019. https://www.electronics-notes.com/articles/antennas-propagation/propagation-overview/free-space-path-loss.php
‌
‌
5. Belajar dan jelaskan LoS, NLoS, dan multipath propagation, serta hubungannya dengan nomor A3 [10 poin]

- Line Of Sight (LoS) : terjadi ketiak ada jalur visual atau jalur gelombang radio yang jelas dan tidak terhalang antara antenan pemancara dan antena penerima. Menggambarkan sinyal utama menempuh jalur terpendek dan paling langsung. Hubungan dengag RSSI dan SNR : 
    - RSSI mencapa nilai tertinggi karne sinyal mengalami kerugian minimum.
    - SNR mencapai nilai terbaik akrena sinya tiba dengan kuat dan minim gangguan.

- Non-Line of Sight (NLoS) : terjadi ketika ada objek fisik yang sepenuhnya menghalangi jalur langsung antara pemancara dan penerima. Hubungan dengag RSSI dan SNR : 
    - RSSI : nilai RSSI menurun secara signifikan dibandingkan LoS karena sinyal mengalami kerugian tambahna yang besar.
    - SNR : Nilai SNR menurun karena sinyal yang sampai lemah dan mungkin dipenuhi oleh noise relatif yang tinggi.

- Multipath Propagation : terjadi ketika sinyal radio yang dikirim dari pemancar tiba di penerima melalui dua atau lebih jalur. Sinyal utama dan sinyal lai tiba di penerima pada waktu yagn sedikit berbeda, perbedaan waktu kedatangan. . Hubungan dengag RSSI dan SNR : 
    - RSSI  : sangat tidak stabil.
    - SNR : menurun dengan sangat bervariasi

Referensi : 
- [1]Inside GNSS and Inside GNSS, “Multipath vs. NLOS signals,” Inside GNSS - Global Navigation Satellite Systems Engineering, Policy, and Design, Nov. 18, 2013. https://insidegnss.com/multipath-vs-nlos-signals/
- [2]“LOS vs NLOS: Understanding Line of Sight in Wireless Communication,” Rfwireless-world.com, 2025. https://www.rfwireless-world.com/terminology/los-vs-nlos-understanding-line-of-sight
‌

7. Belajar dan jelaskan Coding Rate, preamble length, dan sync word [10 poin]

Coding Rate (CR) : mekanime Forward Error Correction yang digunakan dalam LoRa untuk menambkan redundansi pada data yang akan dikirimkan. Fungisnya untuk mendeteknsi dan mengoreksi keasalahn bit yang mungkin tejradi selama transmisi akibat interferensi atau noise. 

Preamble Length : Menentukan panjang urutan simbol yagn dikirimkan sebelum data (payload) ygn sebenearnya, memungkinkan receiver untuk mendeteksi sinyal dan sinkronisasi.  PL lebih panjang membutuhkwan waktu transmisi lebih lama, PL lebih pendek membuat transmisi lebih cepat tetapi risiko receiver gagal mendekteksi sinyal menjadi lebih tinggi.

Sync Word : nilai 8 bit yang diletakkan pada header paket LoRa. Berfungsi sebagai pengenal unik untuk jaringan, tujuannya untuk memastikan bahwa receiver hanya memproses paket yang ditujukan untuk jaringannya. Jika sync word antara pengirim dan peneirma cocok, receiver akan memprosees paket tersebut.

Referensi : 
- [1]S. Lee, “The Ultimate Guide to Code Rate,” Numberanalytics.com, 2025. https://www.numberanalytics.com/blog/ultimate-guide-to-code-rate (accessed Nov. 27, 2025).
- [2]A. Wilson, “Long Or Short Preamble Type: Advantages and Disadvantages [Explained] | New Scitech,” Newscitech, Dec. 23, 2021. https://newscitech.com/long-or-short-preamble/ (accessed Nov. 27, 2025).
- [3]“LoRaSerial Hookup Guide - SparkFun Learn,” Sparkfun.com, 2025. https://learn.sparkfun.com/tutorials/loraserial-hookup-guide/all (accessed Nov. 27, 2025).
‌
‌

---

### B. Praktik (40 poin) [Bagian B tidak memperlukan referensi]

1. Berikan screenshot anda berhasil compile kode A2, jangan lupa menginstall library yang diperlukan. Referensi [ini](https://randomnerdtutorials.com/esp32-lora-rfm95-transceiver-arduino-ide/). [10 poin]
![image](https://hackmd.io/_uploads/rJ8AmNSWWg.png)


2. Berikan screenshot berhasil compile kode yang dilampirkan, dan jelaskan seluruh fungsi dari kode tersebut! [30 poin]

```cpp
#include <SPI.h>
#include <LoRa.h>

const int csPin = 5;  
const int resetPin = 14; 
const int irqPin = 2;   

float frequency = 923.0E6;
uint8_t syncWord = 0xE0;  
int txPower = 17;        
int spreadingFactor = 7;  
long signalBandwidth = 125E3; 
int codingRate = 5;       
int preambleLength = 8;   
bool crcEnabled = true;   
bool invertIQSignals = false; 
bool IQEnabled = true;   
int Gain = 0;

void setup() {
  Serial.begin(115200);
  while (!Serial);
  initLoRa();
  displayMenu();
}

void loop() {
  if (Serial.available() > 0) {
    char choice = Serial.read();
    processMenuChoice(choice);
  }
}

void initLoRa() {
  LoRa.setPins(csPin, resetPin, irqPin);

  if (!LoRa.begin(frequency)) {
    Serial.println("Inisialisasi LoRa gagal. Periksa koneksi.");
    while (true);
  }

  LoRa.setTxPower(txPower);
  LoRa.setSpreadingFactor(spreadingFactor);
  LoRa.setSignalBandwidth(signalBandwidth);
  LoRa.setCodingRate4(codingRate);
  LoRa.setPreambleLength(preambleLength);
  LoRa.enableCrc();
  LoRa.setSyncWord(syncWord);

  LoRa.receive();

  LoRa.onReceive(onReceiveCallback);

  Serial.println("Inisialisasi LoRa berhasil.");
}

void displayMenu() {
  Serial.println("\n--- Menu Komunikasi LoRa ---");
  Serial.println("a. Inisialisasi LoRa");
  Serial.println("b. Ubah Sync Word");
  Serial.println("c. Ubah Transmission Power");
  Serial.println("d. Ubah Spreading Factor");
  Serial.println("e. Ubah Signal Bandwidth");
  Serial.println("f. Ubah Coding Rate");
  Serial.println("g. Ubah Preamble Length");
  Serial.println("h. Enable/Disable CRC");
  Serial.println("i. Enable/Disable Invert IQ");
  Serial.println("j. Atur Gain");
  Serial.println("k. Atur Idle");
  Serial.println("l. Atur Sleep");
  Serial.println("m. Kirim Pesan");
  Serial.println("Pilih opsi (a-k): ");
}

void processMenuChoice(char choice) {
  switch(choice) {
    case 'a': 
      initLoRa(); 
      break;
    case 'b': 
      changeSyncWord(); 
      break;
    case 'c': 
      changeTxPower(); 
      break;
    case 'd': 
      changeSpreadingFactor(); 
      break;
    case 'e': 
      changeSignalBandwidth(); 
      break;
    case 'f': 
      changeCodingRate(); 
      break;
    case 'g': 
      changePreambleLength(); 
      break;
    case 'h': 
      toggleCRC(); 
      break;
    case 'i': 
      toggleIQ(); 
      break;
    case 'j': 
      setGain(); 
      break;
    case 'k': 
      setIdle(); 
      break;
    case 'l': 
      setSleep(); 
      break;
    case 'm': 
      sendMessage(); 
      break;
    case '\n':
    case '\r':
      break;
    default:
      Serial.println("Pilihan tidak valid. Silakan coba lagi.");
      displayMenu();
  }
}

void changeSyncWord() {
  Serial.println("Masukkan Sync Word (0-255):");
  while (!Serial.available());
  syncWord = Serial.parseInt();
  LoRa.setSyncWord(syncWord);
  Serial.print("Sync Word diubah menjadi: 0x"); 
  Serial.println(syncWord, HEX);
  displayMenu();
}

void changeTxPower() {
  Serial.println("Masukkan Transmission Power (2-20 dBm):");
  while (!Serial.available());
  txPower = Serial.parseInt();
  LoRa.setTxPower(txPower);
  Serial.print("Transmission Power diubah menjadi: "); 
  Serial.print(txPower);
  Serial.println(" dBm");
  displayMenu();
}

void changeSpreadingFactor() {
  Serial.println("Masukkan Spreading Factor (6-12):");
  while (!Serial.available());
  spreadingFactor = Serial.parseInt();
  LoRa.setSpreadingFactor(spreadingFactor);
  Serial.print("Spreading Factor diubah menjadi: "); 
  Serial.println(spreadingFactor);
  displayMenu();
}

void changeSignalBandwidth() {
  Serial.println("Masukkan Signal Bandwidth (7.8E3, 10.4E3, 15.6E3, 20.8E3, 31.25E3, 41.7E3, 62.5E3, 125E3, 250E3, 500E3):");
  while (!Serial.available());
  signalBandwidth = Serial.parseFloat();
  LoRa.setSignalBandwidth(signalBandwidth);
  Serial.print("Signal Bandwidth diubah menjadi: "); 
  Serial.print(signalBandwidth);
  Serial.println(" Hz");
  displayMenu();
}

void changeCodingRate() {
  Serial.println("Masukkan Coding Rate (5-8):");
  while (!Serial.available());
  codingRate = Serial.parseInt();
  LoRa.setCodingRate4(codingRate);
  Serial.print("Coding Rate diubah menjadi: 4/"); 
  Serial.println(codingRate);
  displayMenu();
}

void changePreambleLength() {
  Serial.println("Masukkan Preamble Length (6-65535):");
  while (!Serial.available());
  preambleLength = Serial.parseInt();
  LoRa.setPreambleLength(preambleLength);
  Serial.print("Preamble Length diubah menjadi: "); 
  Serial.println(preambleLength);
  displayMenu();
}

void toggleCRC() {
  crcEnabled = !crcEnabled;
  if (crcEnabled) {
    LoRa.enableCrc();
    Serial.println("CRC diaktifkan");
  } else {
    Serial.println("Catatan: Menonaktifkan CRC mungkin tidak didukung");
  }
  displayMenu();
}

void toggleIQ() {
  IQEnabled = !IQEnabled;
  if (IQEnabled) {
    LoRa.enableInvertIQ();
    Serial.println("Invert IQ diaktifkan");
  } else {
    LoRa.disableInvertIQ();
    Serial.println("Invert IQ dinonaktifkan");
  }
  displayMenu();
}

void setGain() {
  Serial.println("Masukkan Gain (0 - 6):");
  while (!Serial.available());
  Gain = Serial.parseInt();
  LoRa.setGain(Gain);
  Serial.print("Gain diubah menjadi: "); 
  Serial.println(Gain);
  displayMenu();
}

void setIdle() {
  LoRa.idle();
  Serial.println("Radio diatur ke mode Idle");
  displayMenu();
}

void setSleep() {
  LoRa.sleep();
  Serial.println("Radio diatur ke mode Sleep");
  displayMenu();
}

void sendMessage() {
  Serial.println("Masukkan pesan yang akan dikirim:");
  while (!Serial.available());
  
  String message = Serial.readStringUntil('\n');
  
  LoRa.beginPacket();
  LoRa.print(message);
  LoRa.endPacket();
  
  Serial.print("Mengirim pesan: ");
  Serial.println(message);
  displayMenu();
}

void onReceiveCallback(int packetSize) {
  if (packetSize == 0) return;

  String incoming = "";
  while (LoRa.available()) {
    incoming += (char)LoRa.read();
  }

  Serial.println("\n--- Paket Diterima ---");
  Serial.println("Payload: " + incoming);
  Serial.println("RSSI: " + String(LoRa.packetRssi()));
  Serial.println("SNR: " + String(LoRa.packetSnr()));
  Serial.println("-------------------");

  displayMenu();
}
```

> [!TIP]
> Menonton video playlist LoRa/LoRaWAN tutorials pada [more resource daste](https://learn.digilabdte.com/books/telecommunication/page/more-resources), soal postest dan CS akan berbasis pada video-video tersebut.


![image](https://hackmd.io/_uploads/rJ8AmNSWWg.png)

- Inisialisasi variabe global
    - import libarary SPI.h dan LoRa.h
    - mendefinisikan pin yagn diguankan untuk koneksi SPI dan kontrol
    - Mendefinisikan nilai awal untuk paramter kritis LoRa seperti frequency, syncWord, txPower, spreadingFactor, signalBandwidht.

- Fungsi setup dan loop
    -  Memulai komunikasi serial (Serial.begin(115200)), lalu memanggil initLoRa() untuk menyiapkan radio, dan displayMenu()
    -  Loop : Terus memeriksa Serial Monitor. Jika pengguna mengetikkan karakter dan menekannya, karakter tersebut dibaca dan diteruskan ke fungsi processMenuChoice().

-  Fungsi initLoRa() : Fungsi ini adalah tempat modul LoRa dikonfigurasi dengan parameter awal.
-  Fungsi menu handler : Berfungsi untuk memprint daftar opsi yang tersedia dan mengarahkan pilihan pengguna ke fungsi yang sesuai.
-  Fungsi change... (b, c, d, e, f, g, i, j) : Setiap fungsi ini memungkinkan pengguna untuk memasukkan nilai baru melalui Serial Monitor dan langsung menerapkan perubahan tersebut pada modul LoRa. 
    - changeSpreadingFactor(): Mengambil input numerik dan memanggil
    - LoRa.setSpreadingFactor()—kunci untuk menyeimbangkan jangkauan dan laju data.
    - setSleep(): Memanggil LoRa.sleep() untuk menempatkan radio dalam mode daya ultra rendah
    
- fungsi sendMessage() : Menggunakan urutan LoRa.beginPacket(), LoRa.print(message), dan LoRa.endPacket() untuk mengirimkan data ke modul LoRa lain.

- Fungsi onReceiveCallback(int packetSize) : callback function yang dieksekusi ketika data masuk:

 