# Case Study 1 - Modul 3
Kelompok:7
Anggota Kelompok:
1. Nugroho Ulil Abshar (2306229310)
2. Syahmi Hamdani (2306220532)
3. Muhammad Hilmi Al-Muttaqi Budiyanto (2306267082)
4. Wilman Saragih (2306161776)
5. Andhika Fadlan Wijanarko (2306267164)
6. Javana Muahmmad Dzaki (2306161826)
7. Muhammad Rifat Faqih (2306250762)
8. Salahuddin Zidane Alghifari (2206028200)
---
Kode yang dijalankan
```cpp
#include <SPI.h>
#include <LoRa.h>
const int csPin = 5;
const int resetPin = 14;
const int irqPin = 2;
float frequency = 433.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();
}
}
// --- Helper Function for Input to reduce repetition ---
String getSerialInput(String prompt) {
// 1. Clear buffer
while (Serial.available()) Serial.read();
// 2. Show Prompt
Serial.println(prompt);
// 3. Wait for input
while (!Serial.available());
// 4. Read and Trim
String input = Serial.readStringUntil('\n');
input.trim();
return input;
}
void changeSyncWord() {
String input = getSerialInput("Masukkan Sync Word (0-255):");
if (input.length() > 0) {
syncWord = input.toInt();
LoRa.setSyncWord(syncWord);
Serial.print("Sync Word diubah menjadi: 0x");
Serial.println(syncWord, HEX);
}
LoRa.receive(); // Enable receive mode
displayMenu();
}
void changeTxPower() {
String input = getSerialInput("Masukkan Transmission Power (2-20 dBm):");
if (input.length() > 0) {
txPower = input.toInt();
LoRa.setTxPower(txPower);
Serial.print("Transmission Power diubah menjadi: ");
Serial.print(txPower);
Serial.println(" dBm");
}
LoRa.receive(); // Enable receive mode
displayMenu();
}
void changeSpreadingFactor() {
String input = getSerialInput("Masukkan Spreading Factor (6-12):");
if (input.length() > 0) {
spreadingFactor = input.toInt();
LoRa.setSpreadingFactor(spreadingFactor);
Serial.print("Spreading Factor diubah menjadi: ");
Serial.println(spreadingFactor);
}
LoRa.receive(); // Enable receive mode
displayMenu();
}
void changeSignalBandwidth() {
String input = getSerialInput("Masukkan Signal Bandwidth (Hz):");
if (input.length() > 0) {
signalBandwidth = input.toFloat(); // Use toFloat for bandwidth
LoRa.setSignalBandwidth(signalBandwidth);
Serial.print("Signal Bandwidth diubah menjadi: ");
Serial.print(signalBandwidth);
Serial.println(" Hz");
}
LoRa.receive(); // Enable receive mode
displayMenu();
}
void changeCodingRate() {
String input = getSerialInput("Masukkan Coding Rate (5-8):");
if (input.length() > 0) {
codingRate = input.toInt();
LoRa.setCodingRate4(codingRate);
Serial.print("Coding Rate diubah menjadi: 4/");
Serial.println(codingRate);
}
LoRa.receive(); // Enable receive mode
displayMenu();
}
void changePreambleLength() {
String input = getSerialInput("Masukkan Preamble Length (6-65535):");
if (input.length() > 0) {
preambleLength = input.toInt();
LoRa.setPreambleLength(preambleLength);
Serial.print("Preamble Length diubah menjadi: ");
Serial.println(preambleLength);
}
LoRa.receive(); // Enable receive mode
displayMenu();
}
void toggleCRC() {
crcEnabled = !crcEnabled;
if (crcEnabled) {
LoRa.enableCrc();
Serial.println("CRC diaktifkan");
} else {
// Note: Some libraries do not support disabling CRC explicitly after init
LoRa.disableCrc();
Serial.println("CRC dinonaktifkan");
}
LoRa.receive(); // Enable receive mode
displayMenu();
}
void toggleIQ() {
IQEnabled = !IQEnabled;
if (IQEnabled) {
LoRa.enableInvertIQ();
Serial.println("Invert IQ diaktifkan");
} else {
LoRa.disableInvertIQ();
Serial.println("Invert IQ dinonaktifkan");
}
LoRa.receive(); // Enable receive mode
displayMenu();
}
void setGain() {
String input = getSerialInput("Masukkan Gain (0 - 6):");
if (input.length() > 0) {
Gain = input.toInt();
// LoRa.setGain(Gain); // UNCOMMENT IF YOUR LIBRARY SUPPORTS THIS
// Standard arduino-LoRa does not have setGain (it uses AGC).
// If compiling fails, keep this commented out.
Serial.print("Gain diatur ke (Virtual): ");
Serial.println(Gain);
}
LoRa.receive(); // Enable receive mode
displayMenu();
}
void setIdle() {
LoRa.idle();
Serial.println("Radio diatur ke mode Idle (Receive berhenti)");
displayMenu();
}
void setSleep() {
LoRa.sleep();
Serial.println("Radio diatur ke mode Sleep (Receive berhenti)");
displayMenu();
}
void sendMessage() {
while (Serial.available()) {
Serial.read();
}
Serial.println("Masukkan pesan yang akan dikirim:");
while (!Serial.available());
String message = Serial.readStringUntil('\n');
message.trim(); // Removes leading/trailing whitespace or \r characters
if (message.length() > 0) {
LoRa.beginPacket();
LoRa.print(message);
LoRa.endPacket(); // Transmission ends here, radio goes to IDLE
Serial.print("Mengirim pesan: ");
Serial.println(message);
} else {
Serial.println("Pesan kosong, tidak dikirim.");
}
LoRa.receive();
displayMenu();
}
void onReceiveCallback(int packetSize) {
Serial.println(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();
}
```
Pastikan Sync Word pada transmitter dan receiver sama dan saling koordinasi dengan kelompok lain agar tidak saling mengganggu.
Dengan kelompok pasangan kalian, satunya menjadi tim A yang akan tetap di tempat, sedangkan yang satunya akan menjadi tim B yang akan bergerak. Pada setiap titik, lakukan 3 kali pengiriman data dengan TX Power (10, 14, 18 dBm). Catat RSSI dan SNR pada setiap penerimaan data.
### 1\. Titik pertama adalah jarak 1 meja, tim A tetap di tempat, tim B berjalan ke meja sebelah. (20 poin)
Dokumentasi:

Serial Monitor

| TX Power | RSII | SNR |
| :---- | :---- | :---- |
| 3.3 | -50 | 8.25 |
| 3.3 | -103 | -12 |
### 2\. Titik kedua adalah jarak setengah panjang ruangan, tim A tetap di tempat, tim B berjalan sampai setengah panjang ruangan. (20 poin)


| TX Power | RSII | SNR |
| :---- | :---- | :---- |
| 3.3 | -80 | 9.25 |
| - | - | - |
### 3\. Titik ketiga adalah wall obstacle, tim B berjalan ke belakang tembok (lorong antar tempat praktikum dan bagian biomedis) (20 poin)


| TX Power | RSII | SNR |
| :---- | :---- | :---- |
| 3.3 | -77 | 9 |
| - | - | - |
### 4\. Titik keempat adalah tempat parkiran, tim A berjalan ke jendela lantai 7, tim B berjalan ke parkiran. Pastikan kedua tim dapat salimg melihat. (20 poin)
Parkiran dapat dilihat pada gambar berikut:

![Salah satu foto serial monitor]()
| TX Power | RSII | SNR |
| :---- | :---- | :---- | (20 poin)
| - | - | - |
| - | - | - |
### 5\. Berikan foto bukti menyerahkan antenna LoRA pada asisten. (20 poin)
![Foto penyerahan]()