#include <lorawan.h> // Mengimpor library lorawan untuk fungsi LoRaWAN
// Kredensial ABP
const char *devAddr = "669dd80b"; // Alamat perangkat LoRaWAN
const char *nwkSKey = "669dd80b610dd1bba4a5b011e8002249"; // Kunci jaringan LoRaWAN
const char *appSKey = "669dd80be09eafff281b1c0ee0fb66c0"; // Kunci aplikasi LoRaWAN
const unsigned long interval = 10000; // Interval pengiriman pesan (10 detik)
unsigned long previousMillis = 0; // Waktu pengiriman pesan terakhir
unsigned int counter = 0; // Penghitung pesan
char myStr[50]; // Buffer untuk string pesan sementara
char msg[100]; // Buffer untuk pesan dalam format JSON
char outStr[255]; // Buffer untuk pesan yang diterima
byte recvStatus = 0; // Status penerimaan pesan
int channel; // Kanal LoRa
// Pin untuk sensor ultrasonik
const int trigPin = 5; // Pin Trigger sensor ultrasonik
const int echoPin = 18; // Pin Echo sensor ultrasonik
// Pin RFM95 untuk berbagai board
#if defined (ARDUINO_ESP32_DEV)
const sRFM_pins RFM_pins = {
.CS = 2, // Pin NSS untuk RFM pada ESP32
.RST = 18, // Pin RST untuk RFM pada ESP32
.DIO0 = 14, // Pin DIO0 untuk RFM pada ESP32
.DIO1 = 12, // Pin DIO1 untuk RFM pada ESP32
};
#elif defined (ARDUINO_B_L072Z_LRWAN1)
const sRFM_pins RFM_pins = {
.CS = PA15, // Pin NSS untuk RFM pada STM32L0
.RST = PC0, // Pin RST untuk RFM pada STM32L0
.DIO0 = PB4, // Pin DIO0 untuk RFM pada STM32L0
.DIO1 = PB1, // Pin DIO1 untuk RFM pada STM32L0
};
#else
#error *** HANYA MENDUKUNG LYNX32 DAN B-L072Z-LRWAN1 *** // Pesan kesalahan jika board tidak didukung
#endif
void setup() {
#if defined (ARDUINO_B_L072Z_LRWAN1)
SPI.setMOSI(PA7); // Mengatur pin MOSI untuk SPI pada STM32L0
SPI.setMISO(PA6); // Mengatur pin MISO untuk SPI pada STM32L0
SPI.setSCLK(PB3); // Mengatur pin SCLK untuk SPI pada STM32L0
SPI.begin(); // Memulai komunikasi SPI
#elif !defined (ARDUINO_ESP32_DEV)
#error *** HANYA MENDUKUNG LYNX32 DAN B-L072Z-LRWAN1 *** // Pesan kesalahan jika board tidak didukung
#endif
Serial.begin(115200); // Memulai komunikasi serial dengan baud rate 115200
delay(2000); // Menunggu 2 detik
if (!lora.init()) { // Menginisialisasi modul LoRa
Serial.println("RFM95 tidak terdeteksi"); // Menampilkan pesan error jika RFM95 tidak terdeteksi
delay(5000); // Menunggu 5 detik
return; // Keluar dari setup jika modul tidak terdeteksi
}
// Mengonfigurasi LoRaWAN
lora.setDeviceClass(CLASS_A); // Mengatur kelas perangkat LoRaWAN
lora.setDataRate(SF10BW125); // Mengatur kecepatan data
lora.setChannel(MULTI); // Mengatur kanal LoRa
lora.setTxPower1(15); // Mengatur daya transmisi
lora.setNwkSKey(nwkSKey); // Mengatur kunci jaringan
lora.setAppSKey(appSKey); // Mengatur kunci aplikasi
lora.setDevAddr(devAddr); // Mengatur alamat perangkat
// Mengatur pin sensor ultrasonik
pinMode(trigPin, OUTPUT); // Menetapkan pin Trigger sebagai OUTPUT
pinMode(echoPin, INPUT); // Menetapkan pin Echo sebagai INPUT
Serial.println("LoRaWAN setup selesai"); // Menampilkan pesan bahwa setup LoRaWAN selesai
}
// Fungsi loop dijalankan berulang kali
void loop() {
// Memeriksa apakah interval waktu telah berlalu
if (millis() - previousMillis > interval) {
previousMillis = millis(); // Memperbarui waktu terakhir pengiriman
// Mengukur jarak menggunakan sensor ultrasonik
digitalWrite(trigPin, LOW); // Menetapkan pin Trigger ke LOW
delayMicroseconds(2); // Menunggu 2 mikrodetik
digitalWrite(trigPin, HIGH); // Menetapkan pin Trigger ke HIGH
delayMicroseconds(10); // Menunggu 10 mikrodetik
digitalWrite(trigPin, LOW); // Menetapkan pin Trigger kembali ke LOW
long duration = pulseIn(echoPin, HIGH); // Mengukur durasi sinyal echo
long distance = (duration / 2) / 29.1; // Menghitung jarak berdasarkan durasi sinyal echo
sprintf(myStr, "Lora Counter-%d", counter); // Membuat string pesan penghitung
// Membuat pesan JSON dengan data jarak
snprintf(msg, sizeof(msg), "{\"counter\": %d, \"distance\": %ld}", counter, distance);
Serial.print("Mengirim: "); // Menampilkan pesan yang akan dikirim
Serial.println(myStr);
Serial.println(msg);
// Mengirim pesan uplink melalui LoRa
lora.sendUplink(msg, strlen(msg), 0, 5);
Serial.println("Pesan dikirim"); // Menampilkan pesan konfirmasi pengiriman
counter++; // Meningkatkan penghitung pesan
channel = lora.getChannel(); // Mendapatkan kanal LoRa saat ini
Serial.print(F("Ch : "));
Serial.print(channel);
Serial.println(" ");
}
// Memeriksa data yang diterima
lora.update(); // Memperbarui status LoRa
recvStatus = lora.readData(outStr); // Membaca data yang diterima
if (recvStatus) { // Jika ada data yang diterima
int counter = 0;
for (int i = 0; i < recvStatus; i++) { // Memeriksa setiap byte data yang diterima
if (((outStr[i] >= 32) && (outStr[i] <= 126)) || (outStr[i] == 10) || (outStr[i] == 13))
counter++;
}
if (counter == recvStatus) { // Jika semua byte adalah karakter printable
Serial.print(F("String yang diterima: ")); // Menampilkan string yang diterima
for (int i = 0; i < recvStatus; i++) {
Serial.print(char(outStr[i])); // Menampilkan setiap karakter
}
} else { // Jika ada byte non-printable
Serial.print(F("Hex yang diterima: ")); // Menampilkan data dalam format hex
for (int i = 0; i < recvStatus; i++) {
Serial.print(outStr[i], HEX);
Serial.print(" ");
}
}
Serial.println(); // Menampilkan baris baru di serial monitor
}
}