Terkejutnya saya saat membaca email yang datang dari antares di akhir mei 2022, yang menyatakan platform IOT antares akan meng "upgrade" layanannya ke versi premium berbayar. Padahal bulan mei yang lalu saya sedang getol-getolnya meng "oprek" gateway LoRaWan milik telkom yang jangkauannya nyampe jauh ke berbagai pelosok kota Surabaya. Dan benar saja ketika saya membuat video dibawah ini pada tanggal 1 juni 2022 siang hari, tiba-tiba saja console web antares saya ter-logout sendiri ditengah-tengah rekaman. Panik lah saya dan videonya jadi sedikit terbata-bata di akhir rekaman dan terpaksa saya edit karena isinya banyak misuh-misuh "JA#%%##^@" ...
Breaking news: Telkom akan melakukan migrasi LoRaWan ke Telkomiot.id, Silahkan baca disini
Hal yang serupa terjadi dengan keponakan teman yang sedang skripsi bertopik LoRa di Telkom University Bandung, katanya harga platformya Antares sih terjangkau namun untuk Conectivity nya yang menggunakan LoRa sangatlah mencengangkan, karena walau harga 1 koneksi ke device di antares cuman 56.200 per tahun, namun seharinya dibatasi 10 kali UPLINK saja. Ala mak jang !!!
Awalnya saya bingung juga masalah harga yang keluar di hari libur kelahiran pancasila 1 juni itu, namun setelah dilihat lebih seksama ada 2 jenis pembayaran prepaid yang harus dipahami :
Device yang dimaksud adalah device pada web consolenya antares, dimana selama sebulan dengan merogoh kocek Rp 53.250, kita bebas menggunakan 25 device IOT dengan jalur komunikasi melalui Internet. Jadi para pengguna IOT via wifi dengan modul ESP8266 atau arduino dengan modul GSM SIM800 dapat mengirimkan dan menerima data secara unlimited. Murah dan terjangkau kalau ini menurut saya. Namun kejanggalan terlihat pada Conectivity LoRa yang ditawarkan oleh Antares dengan LoRaWan gatewaynya yang tersedia di hampir semua STO Telkom ( kota besar ) se-NKRI ...
10 UPLINK / hari ???
Langsung saja saya kontak mahasiswa yang sedang bimbingan skripsi ke saya mengenai topik LoRa, awalnya tidak paham..namun...ujungnya lemas tak berdaya, walau saya jelaskan kalau trialnya masih 3 bulan kok untuk pengguna lama maupun baru. Cuman 10 uplink perhari nya ini menyebabkan skripsinya jadi terancam ! Walau dengan trik membuat akun baru yang banyak, namun ini akan merepotkan. Lalu bagaimana solusi buat yang sering melakukan coding Trial- Error ? Begini beberapa kesimpulan yang saya dapat ambil hikmahnya dari kegaduhan ini:
1. Perbaiki kebiasaan coding dengan cek-ricek script dan baru upload ke Arduino setelah yakin benar
Ini sih menertawakan style coding saya, dimana kebiasaan trial-error, copy paste, upload , ulang lagi dst berkali-kali. Ini akan fatal kalau quota LoRaWan saya habis dengan prematur. Jadi buat anda yg memulai belajar, perhatikan style coding anda.
2. Bagi yg ber "uang", lakukan prototyping dengan LoRaWan Gateway sendiri
Kalau model yang satu ini sebaiknya dilakukan secara Gotong Royong atau minta bantuan sponsor dari kampus untuk membelikan Gateway LoRaWan dan dipakai belajar bersama-sama. Jadi ketika sudah sukses dengan LoRaWan di Lab sendiri, baru deh meng-upload versi LoRaWan-Antares.
3. Gunakan UPLINK dengan menunggu perintah input dari serial/tombol, jangan lakukan TX-timer based
Karena memang investasi BTS LoRaWan itu mahal, maka sudah saatnya Telkom memberikan "meteran berbayar" bagi pengguna gatewaynya. Seperti yang kita ketahui LoRaWan adalah protokol yang sharing resource, sehingga node LoRa diharapkan Transmit TX / Uplink nya jarang-jarang apalagi RX / Downlink / penerimaan data pada nodes nya. Sehingga buat yang baru tahap belajar, haram hukumnya untuk mengirimkan TX Uplink secara timer based. Solusinya yang saya sarankan adalah dengan mengirimkan data dengan menunggu perintah yang dikirimkan melalui Serial Monitor di sketch. Perhatikan contoh komunikasi serial berikut :
String a;
void setup() {
// Inisialisasi serial
Serial.begin(9600);
Serial.println("tessss");
}
void loop() {
// cek ada data masuk dari serial monitor
while(Serial.available())
{
a= Serial.readString();
Serial.println(a);
if (a == "aho ganteng")
Serial.println("aho memang ganteng kok !!");
}
}
Maksud dari script diatas adalah membandingkan inputan serial berupa kalimat " aho ganteng " dan kemudian jika benar maka akan dikirimkan jawaban " aho memang ganteng kok !! " . Jangan lupa di gambar diatas ada petunjuk nomer 1 dimana pilih no line ending agar tidak mengirmkan enter atau baris baru pada serial ke arduinonya.
Lalu bagaimana dengan script untuk mengirim data suhu dan kelembaban DHT11 ke antares seperti contoh sebelumnya (dapat dibaca disini ) ? Begini scriptnya kira-kira.
#include <SPI.h>
#include <LoRa.h>
#include "DHT.h"
#include <LoRaWanPacket.h>
//Sesuaikan PIN CS, Reset, DIO0
const int csPin = 10;
const int resetPin = 9;
const int irqPin = 2;
const int dhtPin = 3; //Sesuaikan pin DHT
String input; // variabel menyimpan input
//Sesuaikan dev address dan key device LoRa
const char *devAddr = "xxxxxxx";
const char *nwkSKey = "11111111111111110000000000000000";
const char *appSKey = "00000000000000002222222222222222";
#define DHTTYPE DHT22 //Sensor DHT22 sesuaikan
DHT dht(dhtPin, DHTTYPE);
struct LoRa_config
{
long Frequency;
int SpreadingFactor;
long SignalBandwidth;
int CodingRate4;
bool enableCrc;
bool invertIQ;
int SyncWord;
int PreambleLength;
};
//Frekuensi Telkom LoRawan 922MHZ, sesuaikan dengan BTS GW terdekat
static LoRa_config txLoRa = {922000000, 10, 125000, 5, true, false, 0x34, 8};
void LoRa_setConfig(struct LoRa_config config)
{
LoRa.setFrequency(config.Frequency);
LoRa.setSpreadingFactor(config.SpreadingFactor);
LoRa.setSignalBandwidth(config.SignalBandwidth);
LoRa.setCodingRate4(config.CodingRate4);
if (config.enableCrc)
LoRa.enableCrc();
else
LoRa.disableCrc();
if (config.invertIQ)
LoRa.enableInvertIQ();
else
LoRa.disableInvertIQ();
LoRa.setSyncWord(config.SyncWord);
LoRa.setPreambleLength(config.PreambleLength);
}
void LoRa_TxMode()
{
LoRa_setConfig(txLoRa);
LoRa.idle();
}
void setup()
{
Serial.begin(9600);
while (!Serial);
LoRaWanPacket.personalize(devAddr, nwkSKey, appSKey);
LoRa.setPins(csPin, resetPin, irqPin);
if (!LoRa.begin(txLoRa.Frequency)) {
Serial.println("LoRa init failed. Check your connections.");
while (true);
}
Serial.println("LoRa init succeeded.");
Serial.println();
dht.begin();
}
String SendTempHumid(){ //kirim data pengukuran DHT
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
}
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" °C ");
//yang dikirim data berupa string JSON
return( "{\"suhu\":" + String(t) + ",\"humi\":" + String(h) +"}");
}
void loop() {
while(Serial.available()) // jika ada serial input masuk
{
input = Serial.readString();
Serial.println(input);
if( input == "Kirim"){ // jika perintah yg dikirim berupa "kirim"
LoRa_sendMessage(); //kirim ke LoraWan
Serial.println("Ngirit Kirim data Ke LoRaWan Antares !");
}
}
}
void LoRa_sendMessage()
{
LoRa_TxMode();
LoRaWanPacket.clear();
//Serial.println(SendTempHumid());
LoRaWanPacket.print(SendTempHumid());
if (LoRaWanPacket.encode())
{
LoRa.beginPacket();
LoRa.write(LoRaWanPacket.buffer(), LoRaWanPacket.length());
LoRa.endPacket();
}
}