#include <LoRa.h>
#include <SPI.h>
#include <NewPing>
#define ss 5
#define rst 14
#define dio0 2
int counter = 0;
void onReceive(int packetSize);
void inisialisasiLoRa();
void ubahSyncWord();
void ubahTransmissionPower();
void ubahSpreadingFactor();
void ubahSignalBandwidth();
void ubahCodingRate();
void ubahPreambleLength();
void enableDisableCRC();
void enableDisableInvertIQSignals();
void aturLNAGain();
void aturIdle();
void aturSleep();
void kirimPesan();
void setup() {
Serial.begin(115200);
LoRa.setPins(ss, rst, dio0); //setup LoRa transceiver module
LoRa.setSyncWord(0xC3);
LoRa.setCodingRate4(8);
while (!Serial) {
; // tunggu koneksi serial
}
while (!LoRa.begin(433E6)) //433E6 - Asia, 866E6 - Europe, 915E6 - North America
{
Serial.println(".");
delay(500);
}
// Mengatur interrupt untuk memanggil onReceive ketika ada data yang diterima
LoRa.onReceive(onReceive);
LoRa.receive();
Serial.println("LoRa Initializing OK!");
Serial.println("Program menu ESP32.");
}
void loop() {
Serial.println("Pilih menu:");
Serial.println("1. Inisialisasi LoRa");
Serial.println("2. Ubah Sync Word");
Serial.println("3. Ubah Transmission Power");
Serial.println("4. Ubah Spreading Factor");
Serial.println("5. Ubah Signal Bandwidth");
Serial.println("6. Ubah Coding Rate");
Serial.println("7. Ubah Preamble Length");
Serial.println("8. Enable/Disable CRC");
Serial.println("9. Enable/Disable Invert IQ Signals");
Serial.println("10. Atur LNA Gain");
Serial.println("11. Atur Idle");
Serial.println("12. Atur Sleep");
Serial.println("13. Kirim Pesan");
Serial.println("Masukkan angka (1-13) untuk memilih menu, atau 0 untuk keluar:");
while (!Serial.available()) {
// Tunggu sampai ada data di Serial
}
String input = Serial.readStringUntil('\n');
int pilihan = input.toInt();
switch (pilihan) {
case 1:
inisialisasiLoRa();
break;
case 2:
ubahSyncWord();
break;
case 3:
ubahTransmissionPower();
break;
case 4:
ubahSpreadingFactor();
break;
case 5:
ubahSignalBandwidth();
break;
case 6:
ubahCodingRate();
break;
case 7:
ubahPreambleLength();
break;
case 8:
enableDisableCRC();
break;
case 9:
enableDisableInvertIQSignals();
break;
case 10:
aturLNAGain();
break;
case 11:
aturIdle();
break;
case 12:
aturSleep();
break;
case 13:
kirimPesan();
break;
}
}
void onReceive(int packetSize) {
// Jika ada paket, bacalah
if (packetSize) {
String received = "";
while (LoRa.available()) {
received += (char)LoRa.read();
}
Serial.print("Pesan diterima: ");
Serial.println(received);
// Kuat sinyal yang diterima oleh penerima
Serial.print("RSSI: ");
Serial.println(LoRa.packetRssi());
// Rasio antara tingkat sinyal dan noise.
Serial.print("SNR: ");
Serial.println(LoRa.packetSnr());
// Perbedaan antara frekuensi yang diterima dan yang seharusnya diterima.
Serial.print("Frequency Error: ");
Serial.println(LoRa.packetFrequencyError());
}
}
void inisialisasiLoRa() {
// Inisialisasi LoRa dengan frekuensi untuk wilayah Asia
LoRa.begin(433E6);
int status = LoRa.begin(433E6); // Frekuensi untuk Asia
if (status) {
// Inisialisasi berhasil
Serial.println("LoRa dimulai.");
LoRa.onReceive(onReceive);
LoRa.receive();
return;
} else {
// Inisialisasi gagal
Serial.println("LoRa gagal memulai.");
return; // Keluar dari fungsi jika inisialisasi gagal
}
}
void ubahSyncWord() {
// Kode untuk Ubah Sync Word
while (true) {
Serial.println("Mengubah Sync Word. Kirim '0' untuk kembali ke menu utama.");
while (!Serial.available()) {
// Tunggu sampai ada data di Serial
}
String input = Serial.readStringUntil('\n');
if (input == "0") {
return; // Kembali ke menu utama
}
int syncWord = input.toInt();
if (syncWord >= 0 && syncWord <= 255) {
// Set Sync Word
LoRa.setSyncWord(syncWord);
Serial.print("Sync Word diubah menjadi: ");
Serial.println(syncWord);
} else {
Serial.println("Nilai Sync Word tidak valid. Harus antara 0 dan 255.");
}
}
}
void ubahTransmissionPower() {
// Kode untuk Ubah Transmission Power
while (true) {
Serial.println("Mengubah Transmission Power. Kirim '0' untuk kembali ke menu utama.");
while (!Serial.available()) {
// Tunggu sampai ada data di Serial
}
String input = Serial.readStringUntil('\n');
if (input == "0") {
return; // Kembali ke menu utama
}
int power = input.toInt();
if (power >= 2 && power <= 20) {
// Set Transmission Power
LoRa.setTxPower(power);
Serial.print("Transmission Power diubah menjadi: ");
Serial.println(power);
} else {
Serial.println("Nilai Transmission Power tidak valid. Harus antara 2 dan 20.");
}
}
}
void ubahSpreadingFactor() {
// Kode untuk Ubah Spreading Factor
while (true) {
Serial.println("Mengubah Spreading Factor. Kirim '0' untuk kembali ke menu utama.");
while (!Serial.available()) {
// Tunggu sampai ada data di Serial
}
String input = Serial.readStringUntil('\n');
if (input == "0") {
return; // Kembali ke menu utama
}
int sf = input.toInt();
if (sf >= 6 && sf <= 12) {
// Set Spreading Factor
LoRa.setSpreadingFactor(sf);
Serial.print("Spreading Factor diubah menjadi: ");
Serial.println(sf);
} else {
Serial.println("Nilai Spreading Factor tidak valid. Harus antara 6 dan 12.");
}
}
}
void ubahSignalBandwidth() {
// Kode untuk Ubah Signal Bandwidth
while (true) {
Serial.println("Mengubah Signal Bandiwth. Kirim '0' untuk kembali ke menu utama.");
while (!Serial.available()) {
// Tunggu sampai ada data di Serial
}
String input = Serial.readStringUntil('\n');
if (input == "0") {
return; // Kembali ke menu utama
}
long bw = input.toFloat();
if (bw == 125E3 || bw == 250E3 || bw == 500E3) {
// Set Signal Bandwidth
LoRa.setSignalBandwidth(bw);
Serial.print("Signal Bandwidth diubah menjadi: ");
Serial.println(bw);
} else {
Serial.println("Nilai Signal Bandwidth tidak valid. Pilih antara 125E3, 250E3, atau 500E3.");
}
}
}
void ubahCodingRate() {
// Kode untuk Ubah Coding Rate
while (true) {
Serial.println("Mengubah Coding Rate. Kirim '0' untuk kembali ke menu utama.");
while (!Serial.available()) {
// Tunggu sampai ada data di Serial
}
String input = Serial.readStringUntil('\n');
if (input == "0") {
return; // Kembali ke menu utama
}
int cr = input.toInt();
if (cr >= 5 && cr <= 8) {
// Set Coding Rate
LoRa.setCodingRate4(cr);
Serial.print("Coding Rate diubah menjadi: 4/");
Serial.println(cr);
} else {
Serial.println("Nilai Coding Rate tidak valid. Harus antara 5 dan 8.");
}
}
}
void ubahPreambleLength() {
// Kode untuk Ubah Preamble Length
while (true) {
Serial.println("Mengubah Preamble Length. Kirim '0' untuk kembali ke menu utama.");
while (!Serial.available()) {
// Tunggu sampai ada data di Serial
}
String input = Serial.readStringUntil('\n');
if (input == "0") {
return; // Kembali ke menu utama
}
long preambleLength = input.toInt();
if (preambleLength >= 6) {
// Set Preamble Length
LoRa.setPreambleLength(preambleLength);
Serial.print("Preamble Length diubah menjadi: ");
Serial.println(preambleLength);
} else {
Serial.println("Nilai Preamble Length tidak valid. Harus minimal 6.");
}
}
}
void enableDisableCRC() {
// Kode untuk Enable/Disable CRC
while (true) {
Serial.println("Disable CRC. Kirim '0' untuk kembali ke menu utama.");
while (!Serial.available()) {
// Tunggu sampai ada data di Serial
}
String input = Serial.readStringUntil('\n');
if (input == "0") {
return; // Kembali ke menu utama
} else if (input == "1") {
// Mengaktifkan CRC
LoRa.enableCrc();
Serial.println("CRC diaktifkan.");
} else if (input == "2") {
// Menonaktifkan CRC
LoRa.disableCrc();
Serial.println("CRC dinonaktifkan.");
} else {
Serial.println("Pilihan tidak valid. Kirim '1' untuk mengaktifkan, '2' untuk menonaktifkan.");
}
}
}
void enableDisableInvertIQSignals() {
// Kode untuk Enable/Disable Invert IQ Signals
while (true) {
Serial.println("Disable Invert IQ Signals. Kirim '0' untuk kembali ke menu utama.");
while (!Serial.available()) {
// Tunggu sampai ada data di Serial
}
String input = Serial.readStringUntil('\n');
if (input == "0") {
return; // Kembali ke menu utama
} else if (input == "1") {
// Mengaktifkan Invert IQ Signals
LoRa.enableInvertIQ();
Serial.println("Invert IQ Signals diaktifkan.");
} else if (input == "2") {
// Menonaktifkan Invert IQ Signals
LoRa.disableInvertIQ();
Serial.println("Invert IQ Signals dinonaktifkan.");
} else {
Serial.println("Pilihan tidak valid. Kirim '1' untuk mengaktifkan, '2' untuk menonaktifkan.");
}
}
}
void aturLNAGain() {
// Kode untuk Atur LNA Gain
while (true) {
Serial.println("Mengatur LNA Gain. Kirim '0' untuk kembali ke menu utama.");
while (!Serial.available()) {
// Tunggu sampai ada data di Serial
}
String input = Serial.readStringUntil('\n');
if (input == "0") {
return; // Kembali ke menu utama
}
int gain = input.toInt();
if (gain >= 0 && gain <= 6) {
// Set LNA Gain
Contoh: LoRa.setGain(gain);
Serial.print("LNA Gain diatur ke: ");
Serial.println(gain);
}
else {
Serial.println("Nilai gain tidak valid. Harus antara 0 dan 6.");
}
}
}
void aturIdle() {
// Kode untuk Atur Idle
while (true) {
Serial.println("Mode Idle. Kirim '0' untuk kembali ke menu utama.");
while (!Serial.available()) {
// Tunggu sampai ada data di Serial
}
String input = Serial.readStringUntil('\n');
if (input == "0") {
return; // Kembali ke menu utama
} else if (input == "1") {
// Mengatur radio ke mode Idle
LoRa.idle(); // Contoh fungsi, ganti dengan perintah idle yang sesuai dari library LoRa Anda
Serial.println("Radio LoRa diatur ke mode Idle (standby).");
} else {
Serial.println("Pilihan tidak valid. Kirim '0' untuk kembali atau '1' untuk mengatur mode Idle.");
}
}
}
void aturSleep() {
// Kode untuk Atur Sleep
while (true) {
Serial.println("Mode Sleep. Kirim '0' untuk kembali ke menu utama.");
while (!Serial.available()) {
// Tunggu sampai ada data di Serial
}
String input = Serial.readStringUntil('\n');
if (input == "0") {
return; // Kembali ke menu utama
} else if (input == "1") {
// Mengatur radio ke mode Sleep
LoRa.sleep(); // Contoh fungsi, ganti dengan perintah sleep yang sesuai dari library LoRa Anda
Serial.println("Radio LoRa diatur ke mode Sleep.");
} else {
Serial.println("Pilihan tidak valid. Kirim '0' untuk kembali atau '1' untuk mengatur mode Sleep.");
}
}
}
void kirimPesan() {
// Kode untuk Kirim Pesan
while (true) {
Serial.println("Kirim Pesan. Kirim '0' untuk kembali ke menu utama.");
while (!Serial.available()) {
// Tunggu sampai ada data di Serial
}
String pesan = Serial.readStringUntil('\n');
if (pesan == "0") {
return; // Kembali ke menu utama
}
Serial.println(pesan);
// Mengirim pesan melalui LoRa
LoRa.beginPacket();
LoRa.print(pesan);
LoRa.endPacket();
Serial.println("Pesan terkirim: " + pesan);
}
}