Pengertian
Lora adalah Sebuah perangkat yang menggunakan teknik modulasi spektrum dengan konsumsi daya yang kecil dan jarak jangkuan yang jauh, setidak nya pengertian ini bisa kita dapat kan dari sebuah situs resmi lora, yaitu https://www.semtech.com/lora/what-is-lora.
Dulu kita mungkin mengenal yang nama nya infrared untuk sebuah komunikas data dengan jarak yang sangat dekat, setelah itu muncul lagi komunikasi yang lebih jauh dengan menggunakan bluetooth. Lagi-lagi jarak nya belum terlalu cukup, maka muncul wifi di freq 2.4Ghz, nah jarak ini juga tidak terlalu jauh maka muncul teknologi LoRa, yang memiliki jarak bervariasi. Bahkan ada jarak komunikasi nya sampai 40Km. Keren bukan?
Manfaat Lora
Ketika kami mikroavr.com mencoba membuat modul Node Lora sendiri dan Lora Gateway, banyak pertanyaan muncul, apa sih manfaat dari LoRa itu sendiri?
Manfaat nya bisa di gunakan untuk controlling dan monitoring dengan jarak jauh. Sebagai contoh;
- monitoring suhu dan kelembaban di beberapa titik kemudian di kirim data ke gateway.
- Atau misal nya menghidupkan dan mematikan alat control dari jarak jauh.
- Monitoring variable listrik dari beberpa titik
- Monitoring PH, kelembaban tanah untuk pertanian,
- Dan monitoring lain nya
Untuk Lebih jelas nya bisa teman-teman lihat pada gambar di bawah ini,
Topology sederhana Lora
Contoh Multi Node Lora
Sekarang saat nya kita mencoba nih, bagaiaman cara nya agar esp32 lora gateway bisa menerima dari beberapa node. Di contoh percobaan kita ini, kita hanya menggunakan dua arduino Lora dan satu gateway. Data yang kita kirim adalah adalah millis, data millis yang di hasilkan setiap node dan dikirim ke gateway, Bagaiaman kah program nya? sebelum program, teman-teman download dulu library nya di link berikut di bawah ini https://github.com/sandeepmistry/arduino-LoRa
Node 1
#include <SPI.h> // include libraries #include <LoRa.h> const long frequency = 923E6; // LoRa Frequency const int csPin = 10; // LoRa radio chip select const int resetPin = 9; // LoRa radio reset const int irqPin = 2; // change for your board; must be a hardware interrupt pin void setup() { Serial.begin(115200); // initialize serial while (!Serial); LoRa.setPins(csPin, resetPin, irqPin); if (!LoRa.begin(frequency)) { Serial.println("LoRa init failed. Check your connections."); while (true); // if failed, do nothing } Serial.println("LoRa init succeeded."); Serial.println(); Serial.println("LoRa Simple Node"); Serial.println("Only receive messages from gateways"); Serial.println("Tx: invertIQ disable"); Serial.println("Rx: invertIQ enable"); Serial.println(); LoRa.onReceive(onReceive); LoRa_rxMode(); } void loop() { if (runEvery(2000)) { // repeat every 1000 millis String message = "001,"; // id message += millis(); // kirim data millis, message += "#"; // tanda akhir data LoRa_sendMessage(message); // send a message } } void LoRa_rxMode(){ LoRa.enableInvertIQ(); // active invert I and Q signals LoRa.receive(); // set receive mode } void LoRa_txMode(){ LoRa.idle(); // set standby mode LoRa.disableInvertIQ(); // normal mode } void LoRa_sendMessage(String message) { LoRa_txMode(); // set tx mode LoRa.beginPacket(); // start packet LoRa.print(message); // add payload LoRa.endPacket(); // finish packet and send it LoRa_rxMode(); // set rx mode } void onReceive(int packetSize) { String message = ""; while (LoRa.available()) { message += (char)LoRa.read(); } Serial.print("Node Receive: "); Serial.println(message); } boolean runEvery(unsigned long interval) { static unsigned long previousMillis = 0; unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; return true; } return false; }
Node 2
#include <SPI.h> // include libraries #include <LoRa.h> const long frequency = 923E6; // LoRa Frequency const int csPin = 10; // LoRa radio chip select const int resetPin = 9; // LoRa radio reset const int irqPin = 2; // change for your board; must be a hardware interrupt pin void setup() { Serial.begin(115200); // initialize serial while (!Serial); LoRa.setPins(csPin, resetPin, irqPin); if (!LoRa.begin(frequency)) { Serial.println("LoRa init failed. Check your connections."); while (true); // if failed, do nothing } Serial.println("LoRa init succeeded."); Serial.println(); Serial.println("LoRa Simple Node"); Serial.println("Only receive messages from gateways"); Serial.println("Tx: invertIQ disable"); Serial.println("Rx: invertIQ enable"); Serial.println(); LoRa.onReceive(onReceive); LoRa_rxMode(); } void loop() { if (runEvery(2000)) { // repeat every 1000 millis String message = "002,"; // id node message += millis(); // kirim data millis message += "#"; LoRa_sendMessage(message); // send a message } } void LoRa_rxMode(){ LoRa.enableInvertIQ(); // active invert I and Q signals LoRa.receive(); // set receive mode } void LoRa_txMode(){ LoRa.idle(); // set standby mode LoRa.disableInvertIQ(); // normal mode } void LoRa_sendMessage(String message) { LoRa_txMode(); // set tx mode LoRa.beginPacket(); // start packet LoRa.print(message); // add payload LoRa.endPacket(); // finish packet and send it LoRa_rxMode(); // set rx mode } void onReceive(int packetSize) { String message = ""; while (LoRa.available()) { message += (char)LoRa.read(); } Serial.print("Node Receive: "); Serial.println(message); } boolean runEvery(unsigned long interval) { static unsigned long previousMillis = 0; unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; return true; } return false; }
ESP32 Gateway
esp32 lora gateway
Program node di atas memiliki id masing-masing 001 dan 002, kemudian frequency nya di setting di 923Mhz, bisa di perhatikan di program nya. Program terakhir adalah program di gateway, di esp32 nya, yuk, seperti ini program nya
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(20, 4); #include <SPI.h> // include libraries #include <LoRa.h> const long frequency = 923E6; // LoRa Frequency const int csPin = 5; // LoRa radio chip select const int resetPin = 25; // LoRa radio reset const int irqPin = 33; // change for your board; must be a hardware interrupt pin String id, Data, Data1, Data2; void setup() { lcd.autoAddress(); lcd.begin(); Serial.begin(115200); // initialize serial while (!Serial); LoRa.setPins(csPin, resetPin, irqPin); if (!LoRa.begin(frequency)) { Serial.println("LoRa init failed. Check your connections."); while (true); // if failed, do nothing } Serial.println("LoRa init succeeded."); Serial.println(); Serial.println("LoRa Simple Gateway"); Serial.println("Only receive messages from nodes"); Serial.println("Tx: invertIQ enable"); Serial.println("Rx: invertIQ disable"); Serial.println(); LoRa.onReceive(onReceive); LoRa_rxMode(); } void loop() { if (runEvery(2500)) { // repeat every 5000 millis lcd.clear(); lcd.setCursor(3,0); lcd.print("me gateway"); lcd.setCursor(0,2); lcd.print("01: "); lcd.print(Data1); lcd.setCursor(0,3); lcd.print("02: "); lcd.print(Data2); } } void LoRa_rxMode(){ LoRa.disableInvertIQ(); // normal mode LoRa.receive(); // set receive mode } void LoRa_txMode(){ LoRa.idle(); // set standby mode LoRa.enableInvertIQ(); // active invert I and Q signals } void LoRa_sendMessage(String message) { LoRa_txMode(); // set tx mode LoRa.beginPacket(); // start packet LoRa.print(message); // add payload LoRa.endPacket(); // finish packet and send it LoRa_rxMode(); // set rx mode } void onReceive(int packetSize) { int len_ID, len_DT; String message = ""; while (LoRa.available()) { message += (char)LoRa.read(); } len_ID = message.indexOf(","); len_DT = message.indexOf("#"); id = message.substring(0,len_ID); // parsing id Data = message.substring(len_ID+1, len_DT); // parsing data if(id == "001"){ Data1 = Data; Serial.print("001, "); Serial.println(Data1); } if(id == "002"){ Data2 = Data; Serial.print("002, "); Serial.println(Data2); } } boolean runEvery(unsigned long interval) { static unsigned long previousMillis = 0; unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; return true; } return false; }
Nah program di atas akan memparsing id dan data dari data node, untuk memilah yang mana data dari 001 dan 002. Kemudian data nya akan di tampilkan di LCD 20×4.
Teman-teman mikro kemungkinan besar akan error jika compile program di esp32 nya, karena kita menggunakan library i2c lcd auto scan, untuk dapatkan tutorial dan library nya bisa clik link di bawah ni
Untuk video pengujian nya sebagai berikut,
Hal penting Lora
- Data yang dikirim kan sesungguh nya bebentuk public, semua bisa akses jika menggunakan LoRa dengan tipe dan frequecy yang sama
- Seberapa banyak kah Gataway Menampung Node? dari pengujian kami tergantung cepat nya durasi pengiriman data dari node, LoRa gateway bekerja secara interrupt, pin DIO0 akan aktif jika ada data baru, pin DIO0 ini terhubung ke pin interrupt, jadi gataway bener bener mendengar data baru, jika ada data baru langsung di proses oleh gataway, selama proses data, data baru nya tidak akan di terima. Seandai nya data dari dikirim per 5 menit, maka memungkinkan menerima data dari node jumlah yang lebih banyak. Untuk itu ESP32 sangat cocok di gunakan untuk gateway karena processor nya 32bit dengan speed 240Mhz.
- Tipe antenna akan sangat mempengaruhi jarak dari node ke gataway.
Semoga tulisan sederhana di atas bermanfaat, Thanks
Perlu Lora Custome dengan jumlah yang cukup? cukup clik link di bawah ini,
Refrensi: