Teknologi LoRa Kini
LoRa kini semakin berkembang karena komunikasi antar perangkat yang terpisah jauh bisa menggunkanan chip ini. Chip LoRa yang low energy. Penerapan teknologi ini bisa di aplikasikan di berbagai bidang seperti:
- Monitoring Banjir
- Monitoring perternakan dan Pertanian
- Drone
- Alat nafigasi untuk petualang di hutan yang tidak ada koneksi internet
- Dan di berbagai bidang lain nya
LoRa selalu di perhatikan karena dua hal, yaitu Jarak dan Low Energy ( Berapa lama tahan dengan batre yang ada ). Semakin jauh jarak yang di tempuh dan semakin lama habis nya konsumsi batre akan menunjukkan seberapa baik LoRa yang di design.
Khusus jarak tempuh komunikasi LoRa ini, penulis belum banyak memiliki refrensi, apakah antenna, power dll.
Nah kali ini, kita akan mencoba mengirim data sensor suhu DS18b20 menggunakan LoRa. Lora yang kita gunakan adalah LoRa buatan kita sendiri ( Design hardware ), Satu nya menggunakan LoRa shield yang support Arduino Uno, dan satu nya lagi menggunakan LoRa esp32. Kebetulan mimin suka design hardware IOT ^_^.
Kelengkapan Praktek
Untuk mengirim data suhu ini, mimin berharap teman-teman sudah mempunya basic seperti,
- add library ke Arduino IDE
- add board ESP32 ke Arduino IDE
- pemahaman dasar tentang pemrograman Arduino
Library yang penting di add di Arduino IDE nya adalah sebagai berikut,
- Arduinojson ( https://github.com/bblanchon/ArduinoJson)
- DallasTemperature.h ( https://github.com/milesburton/Arduino-Temperature-Control-Library )
- Arduino Lora ( https://github.com/sandeepmistry/arduino-LoRa )
Kirim Data Suhu LoRa
Setelah semua di atas terpenuhi. Langkah selanjut nya adalah mengirim data sensor suhu DS18b20 dengan LoRa SX1276. Jika teman-teman menggunakan LoRa shield mikroavr. output Sensor DS18b20 di hubungkan ke pin D8 arduino Uno.
Konfig pin nya sebagai berikut
Arduino Uno | DS18b20 | LoRa |
D8 | output | |
D5 | RST | |
D6 | SS | |
D3 | DIO0 |
Program LoRa Kirim Suhu
// Include the libraries we need #include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into port 2 on the Arduino #define ONE_WIRE_BUS 8 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); #include <SPI.h> #include <LoRa.h> const long frequency = 923E6; // LoRa Frequency const int resetPin = 5; // LoRa radio reset const int csPin = 6; // LoRa radio chip select const int irqPin = 3; // interrupt pin #include <ArduinoJson.h> StaticJsonDocument<200> doc; String json_lora; void setup(void) { // start serial port Serial.begin(115200); sensors.begin(); LoRa.setPins(csPin, resetPin, irqPin); while (!LoRa.begin(frequency)) { Serial.println("LoRa init failed."); delay(1000);// if failed, do nothing } Serial.println("LoRa sukses"); LoRa.onReceive(onReceive); LoRa.onTxDone(onTxDone); LoRa_rxMode(); } void loop(void) { sensors.requestTemperatures(); // Send the command to get temperatures float tempC = sensors.getTempCByIndex(0); // Check if reading was successful if(tempC != DEVICE_DISCONNECTED_C) { Serial.print("suhu: "); Serial.println(tempC); doc["id"] = "001"; doc["suhu"] = tempC; serializeJson(doc, json_lora); Serial.println(json_lora); LoRa_sendMessage(json_lora); json_lora = ""; } delay(1000); } 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(true); // finish packet and send it } void onTxDone() { Serial.println("TxDone"); LoRa_rxMode(); } void onReceive(int packetSize) { String message = ""; while (LoRa.available()) { message += (char)LoRa.read(); } Serial.print("Node Receive: "); Serial.println(message); }
Ketika kode di atas, buka Serial monitor, maka akan menampilkan seperti gambar berikut,
Program di atas akan mengirimkan data LoRa dalam bentuk JSON, data pertama berupa ID dan data kedua berupa suhu. Data ini akan kita parsing di gateway nya. Seperti apa kah pembacaan data di gateway nya?
Menerima Data Suhu dengan LoRa
Gateway LoRa kita menggunakan ESP32. Jadi pastikan Board ESP32 sudah ter instal di Arduino IDE teman-teman. Untuk kode nya adalah sebagai berikut.
#include <SPI.h> // include libraries #include <LoRa.h> const long frequency = 923E6; // LoRa Frequency const int csPin = 33; // LoRa radio chip select const int resetPin = 32; // LoRa radio reset const int irqPin = 25; // interrupt pin #include <ArduinoJson.h> String buf_message; String message; void setup() { Serial.begin(115200); // initialize serial while (!Serial); LoRa.setPins(csPin, resetPin, irqPin); while (!LoRa.begin(frequency)) { Serial.println("LoRa init failed. Check your connections."); delay(1000);// if failed, do nothing } delay(1000); 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.onTxDone(onTxDone); LoRa_rxMode(); } void loop() { if (buf_message != message) { Serial.print("JSON: "); Serial.println(buf_message); DynamicJsonDocument doc(200); deserializeJson(doc, buf_message); String id = doc["id"]; float suhu = doc["suhu"]; Serial.print("id:"); Serial.print(id); Serial.print(", "); Serial.print("suhu:"); Serial.println(suhu); buf_message = message; } } 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(true); // finish packet and send it } void onReceive(int packetSize) { while (LoRa.available()) { message += (char)LoRa.read(); } buf_message = message; //Serial.println(message); message = ""; } void onTxDone() { Serial.println("TxDone"); LoRa_rxMode(); } boolean runEvery(unsigned long interval) { static unsigned long previousMillis = 0; unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; return true; } return false; }
Upload kode di atas, dan bukan serial monitor, nanti akan tertampil seperti gambar berikut ini
Hal yang panting dari program ini adalah di bagian void loop nya.
void loop() { if (buf_message != message) { Serial.print("JSON: "); Serial.println(buf_message); DynamicJsonDocument doc(200); deserializeJson(doc, buf_message); String id = doc["id"]; float suhu = doc["suhu"]; Serial.print("id:"); Serial.print(id); Serial.print(", "); Serial.print("suhu:"); Serial.println(suhu); buf_message = message; } }
Ketika ada data baru maka akan langsung di proses di void loop, dan di parsing dengan library arduinojson.
Semoga tulisan mengirim data sensor Suhu dengan LoRa ini bermanfaat bagi teman-teman. Jika membutuhkan LoRa custome sesuai kebutuhan teman-teman, bisa langsung klik tombol whatsapp di bawah ini.