Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Ayo Migrasi TV Digital

    Kami bantu anda untuk memahami lebih jelas mengenai migrasi tv digital, apa sebabnya dan bagaimana efek terhadap kehidupan. Jasa teknisi juga tersedia dan siap membantu instalasi - setting perangkat - pengaturan antena dan distribusi televisi digital ke kamar kos / hotel

  • Bermain DOT Matrix - LOVEHURT

    Project Sederhana dengan Dot Matrix dan Attiny2313. Bisa menjadi hadiah buat teman atau pacarmu yang ulang tahun dengan tulisan dan animasi yang dapat dibuat sendiri.

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • Node Red - Kontrol Industri 4.0

    Teknologi kontrol sudah melampaui ekspektasi semua orang dan dengan kemajuan dunia elektronika, kini semakin leluasa berkreasi melalui Node Red

Kamis, 02 Juni 2022

LoRaWan - Antares - Kini tidak GRATIS lagi ! Trik buat yang ingin belajar

 


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#%%##^@" ...



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();
  }
}




Dapat dilihat dari hasil pada gambar diatas, data akan terkirim ke Gateway LoRaWan Antares lebih terkontrol hanya ketika diketikkan kata " Kirim" lalu pencet SEND pada serial monitor. Semoga dapat membantu kalian yang mengalami kegalauan akibat berbayarnya LoRaWan Antares. 
Share:

Jumat, 27 Mei 2022

Tutorial LoRaWan Antares - Menentukan frekuensi terbaik dengan python

 




Operasi sistem IoT di pita spektrum ISM yang tidak berlisensi di satu sisi menguntungkan karena rendahnya biaya lisensi, namun di sisi lain  penggunaan spektrum secara bersama menyebabkan peningkatan kebisingan / noise pada latar (background noise) yang tak terhindarkan, karena banyaknya perangkat baru yg hadir belakangan ini. Masalah gangguan yang meningkat ini juga disadari oleh pihak regulator, di mana dilakukan pengukuran spektrum pita lebar (untuk kisaran 200–3000 MHz) dilakukan di lingkungan perkotaan pada tahun 2016. Dari hasil penelitian ditunjukkan bahwa dibandingkan dengan penelitian data analog yang dikumpulkan pada tahun 2004 rata-rata hunian spektral meningkat secara signifikan yang menunjukkan munculnya sejumlah besar sumber radiasi baru (sehingga lebih padat) yang telah muncul selama periode tersebut. 




Ini dicirikan oleh ketidakpastian yang tinggi dan varians yang cukup besar baik dalam time domain maupun dalam amplitudo yang tidak memungkinkan kualifikasi mereka disebut sebagai white Gaussian noise. Kontributor utama dari radiasi yang baru ini, tentu saja telah diidentifikasi sebagai sistem seluler (GSM, UMTS, dan LTE) dan DVB-T. Namun, ada juga kejadian tak terduga dengan karakteristik acak, yang hampir tidak dapat dijelaskan dengan model statistik, seperti kendaraan yang lewat yang memancarkan gelombang EM dari komunikasi pada ECM dan sinyal yang dipancarkan dari remote control untuk membuka pintu dan gerbang dan dari sistem otomasi rumah. Radiasi dalam ruangan dapat berasal dari peralatan komputer (terutama ruang server), WLAN, atau periferal komputer yang berkomunikasi melalui Bluetooth. Kebisingan latar belakang yang meningkat di dalam gedung ini dapat menjadi sangat berbahaya bagi sistem IoT, yang menurut definisi didedikasikan untuk memperoleh data dari lokasi dalam ruangan dan mengirimkannya melalui modem yang terletak langsung pada meter dan sensor.





Untuk menjaga data tetap terkirim ke server dan gateway IOT, saya telah mengkreasikan script baik di arduino maupun python untuk dapat mengumpulkan data statistik masing-masing frekuensi LoRa yang telah disepakati di Indonesia yaitu frekuensi 921.2 - 922.6 Mhz, dengan jarak tiap channel 200Khz. Tanpa berpanjang lebar saya akan share sciptnya, asalkan pembaca telah mengerti pada pembahasan Hello world dan pengolahan data antares yang bisa dibaca disini dan disini.  

#include <SPI.h>
#include <LoRa.h>

#include <LoRaWanPacket.h>


const int csPin = 10;
const int resetPin = 9;
const int irqPin = 2;

const char *devAddr = "aabbccdd";
const char *nwkSKey = "11111111111111110000000000000000";
const char *appSKey = "00000000000000002222222222222222";


struct LoRa_config
{
  long Frequency;
  int SpreadingFactor;
  long SignalBandwidth;
  int CodingRate4;
  bool enableCrc;
  bool invertIQ;
  int SyncWord;
  int PreambleLength;
};


long LoRa_frek_INA_923_start = 921200000 ;
long LoRa_frek_INA_923_end   = 922600000 ;
long LoRa_frek_step = 200000;
long LoRa_frek_INA_923 = LoRa_frek_INA_923_start;
                                     
static LoRa_config txLoRa = {LoRa_frek_INA_923, 10, 125000, 5, true, false, 0x34, 8};

void LoRa_setConfig(struct LoRa_config config)
{
  LoRa.setFrequency(LoRa_frek_INA_923);
  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();
 
}

void loop() {
  if (runEvery(5000)) {

    Serial.print("Send Message! frekuensi =  ");
    Serial.println(LoRa_frek_INA_923);
    
    LoRa_sendMessage();

  }
}

void LoRa_sendMessage()
{
  LoRa_TxMode();
  LoRaWanPacket.clear();
  LoRaWanPacket.print("coba kirim frek: ");
  LoRaWanPacket.print(String(LoRa_frek_INA_923));
  if (LoRaWanPacket.encode()) 
  {
    LoRa.beginPacket();
    LoRa.write(LoRaWanPacket.buffer(), LoRaWanPacket.length());
    LoRa.endPacket();
  }

  if( LoRa_frek_INA_923 >= LoRa_frek_INA_923_end ) LoRa_frek_INA_923 = LoRa_frek_INA_923_start;
  else LoRa_frek_INA_923 += LoRa_frek_step;
}

boolean runEvery(unsigned long interval)
{
  static unsigned long previousMillis = 0;
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;
    return true;
  }
  return false;
}

Hasilnya akan bisa mengirim data frekuensi ke antares





Untuk script python nya sehingga dapat menampilkan grafik di excel, silahkan rekues ke saya melalui email: ahocool@gmail.com atau whatsapp 08155737755. Hasilnya luar biasa masbroo...saya mendapatkan kesimpulan yaitu frekuensi terbaik di lokasi saya ada pada 2 channel yaitu 921.2 Mhz dan 922 Mhz.








Share:

Belajar LoRaWan Antares - Pengolahan Data Device ( Req - Resp ) Dengan Python & MQTT

 


Setelah saya sukses membuat hello world antara modul LoRa dengan Gateway LoRawan Telkom (baca disini), saya akan lanjut membahas pengolahan data yang "lebih berguna" menggunakan sensor sejuta umat DHT dan dengan protokol IOT paling enteng yaitu MQTT. Untuk memahami bagaimana pemahaman PUB dan SUB dari platform IOT Antares yang menggunakan standar M2M, maka perlu sekali untuk memahami pembahasan sebelumnya di blog ini, diantaranya :


  • Proses PUB dan SUB dari Antares yang menggunakan 1 topik untuk PUB/REQ dan 1 topik untuk SUB/RESP. Jadi ketika data diterima antares, tidak serta merta akan diberikan kepada yag subscribe, jadi butuh REQUEST data dengan payload tertentu dan kemudian menerima RESPONSE pada 1 topik (hanya 1 tiap akun) yg telah di subscribe. Bisa dibaca disini  ,  disini , dan disini
  • Python Paho-mqtt sebagai library paling umum untuk menerima dan mengolah protokol mqtt sehingga dapat dilanjutkan ke proses selanjutnya seperti menyimpan database, membuat grafik atau mengirim ke bot telegram. Bisa dibaca dulu agar mengerti disini dan disini.




Hardware yang kita gunakan masih seperti sebelumnya yaitu breakout board LoRa RFM95 dan arduino uno/nano/pro sebagai pengontrol nya. Sebagai sensor saya gunakan DHT22 yang lebih bagus dari kakaknya DHT11, rangkaiannya kira-kira seperti ini (sesuaikan dengan pin SPI pada arduino yg dipakai) :




Script arduinonya merupakan penggabungan tutorial hello world  sebelumnya dengan menggunakan library LoRaWan Packet yang lumayan stabil untuk pengiriman data. Tanpa menunda-nunda saya bagikan script untuk mengirim suhu dan kelembaban ke Antares melalui LoRaWan :


#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

//Sesuaikan dev address dan key device LoRa
const char *devAddr = "aabbccdd";
const char *nwkSKey = "11111111111111110000000000000000";
const char *appSKey = "00000000000000002222222222222222";

#define DHTTYPE DHT22  //Sensor DHT22
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() {
  if (runEvery(10000)) {

    LoRa_sendMessage();
    Serial.println("Kirim data!");
  }
}

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();
  }
}

boolean runEvery(unsigned long interval)
{
  static unsigned long previousMillis = 0;
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;
    return true;
  }
  return false;
}





Dan hasil yang didapatkan berupa data JSON string pada console web antares.




Lalu bagaimana cara mengunduh atau mengambil data dari web antares tadi ? Sebenernya pada python telah dibuatkan library untuk mengunduh data antares secara http yang telah saya bahas disini : https://www.aisi555.com/2020/08/solderpiraspberry-pi-ke-antares-semakin.html . Namun kali ini saya ingin menggunakan protokol MQTT agar lebih memahami proses SUB dan PUB pada antares yang berbeda dengan broker MQTT pada umumnya. Secara singkat proses untuk mendapatkan data dari database antares sebagai berikut:


1. Gunakan broker MQTT antares dan dengan topik yang FIX gak bisa diutak-atik. Sesuaikan script dibawah dengan User key pada akun antares yang digunakan.

broker = 'mqtt.antares.id'
port = 1883
topicsubantares = "/oneM2M/resp/antares-cse/1111111111111111:2222222222222222/json"  
topicpubantares = "/oneM2M/req/1111111111111111:2222222222222222/antares-cse/json"


2. Jika ingin mengunduh data terakhir dari sebuah device, maka dikirimkan (PUB) ke topik yang cuman ada satu itu. Pesan request JSON nya seperti ini :

def antares_request_last(client: mqtt_client):
    data_raw = ("{"
      "\"m2m:rqp\": {"
      "\"fr\": \"1111111111111111:2222222222222222\","
      "\"to\": \"/antares-cse/antares-id/APP_NAME/Cevice_Name/la\","
      "\"op\": 2,"
      "\"rqi\": 123456,"
      "\"ty\": 4"
      " }"
      "}")
    ret=client.publish(topicpubantares,data_raw)


3. Response dari antares akan dikirim ke topik SUB (fix 1 saja untuk 1 akun) dengan format seperti berikut:

   "m2m:rsp" : {
      "rsc" : 2000,
      "rqi" : "123456",
      "pc" : {
         "m2m:cin" : {
            "rn" : "cin_TQ_E2xnzT42t3zsS",
            "ty" : 4,
            "ri" : "/antares-cse/cin-TQ_E2xnzT42t3zsS",
            "pi" : "/antares-cse/cnt-pqq6TLDSTvqCizzB",
            "ct" : "20220526T080631",
            "lt" : "20220526T080631",
            "st" : 0,
            "cnf" : "text/plain:0",
            "cs" : 239,
            "con" : "{\"type\":\"uplink\",\"port\":1,\"data\":{\"suhu\":30.1,\"h
umi\":79.2},\"counter\":6,\"radio\":{\"gps_time\":1337562409369,\"hardware\":{\"
snr\":0.5,\"rssi\":-106},\"modulation\":{\"bandwidth\":125000,\"spreading\":10},
\"delay\":0.05295205116271973,\"freq\":922,\"size\":40}}"
         }
      },
      "to" : "1111111111111111:2222222222222222",
      "fr" : "/antares-cse"
   }


4. Dari data  diatas maka dibutuhkan pemahaman bahasa python dan konsep parsing Dictionary atau JSON string untuk dapat mengolah data lebih jitu. 


def parsing_data(datae):
    datanya = json.loads(datae['m2m:rsp']['pc']['m2m:cin']['con'])
    gps_time = math.floor(datanya['radio']['gps_time']/1000) +25200
    waktu = datetime(1980, 1, 6) + timedelta(seconds=gps_time - (35 - 19))
    #print(type(datanya['radio']['gps_time']))
    print(waktu)
    print('Suhu       = ' + str(datanya['data']['suhu']) + ' Celcius ')
    print('Kelembaban = ' + str(datanya['data']['humi']) + ' % Rh\n\n')   



Script python lengkapnya akan saya bagikan jika pembaca membutuhkannya, dan yang ingin bertanya langsung aja ke email: ahocool@gmail.com atau whatsapp ke 08155737755. Hasilnya bisa dilihat pada video singkat berikut ini :





Share:

Rabu, 25 Mei 2022

LoRaWan - Antares id "Hello World" dengan SX1276 / RFM95 di Frekuensi AS923-2

 


Lora bukanlah barang yang asing bagi saya karena telah cukup lama mengenal modul modem RF nya kira-kira 7 tahun yang lalu, dan berhasil mengirimkan data text / terminal serial antar 2 modul lora (point to point) yang saya letakkan dari ujung ke ujung jembatan Suramadu. Kala itu modul yang digunakan masih menggunakan frekuensi 433 Mhz yang cukup terjangkau harganya,  namun setelah praktek sederhana ini saya merasa tak ada yg spesial dari sekedar kirim-kiriman data jarak jauh. Kemudian ketika konsep IOT saya sudah lumayan mendapatkan pencerahan dan lebih memilih wifi sebagai koneksi paling murah meriah, maka modul ini jadi terlupakan dan entah terselip dimana. Apalagi kemudian pemerintah baru men-standarkan dan meregulasi frekuensi lora sesuai dengan pembagian regional ITU - Lora aliance yaitu di 923Mhz pada tahun 2019.

Ketiadaan gateway lora pada tahun dimana saya mencoba lora juga menjadi kendala untuk oprek-oprek, dan saat itu pernah membantu seorang mahasiswa menyeting GW Lora dragino yang ternyata harganya sangat memberatkan kantong mahasiswa. Baik TTN ( the things network) maupun Lora alliance tidak muncul juga gatewaynya saat saya getol2nya mengoprek modul lora 433Mhz. Sampai suatu ketika saya mendapatkan request pembaca untuk menengok perkembangan gateway LoraWan yang dipasang telkom bersama mitratel. Lalu meluncurlah saya ke websitenya Telkom iot dan mendapatkan Lorawan nya ternyata telah di deploy dan memancar dilokasi yang tak jauh dari kediaman saya.


 





Peta diatas terasa sangat familiar bagi saya, perasaan de-ja-vu pun muncul...yahh karena telkom surabaya adalah mantan terindah buat saya. Cieee...cieee....ya iyalah hampir 9 tahun saya berkutat dengan map dan coverage persis dengan gambar diatas. Dan benar saja lingkaran merah yang menyatakan sinyal Lorawan nya besar, itu berada pada titik lokasi STO Telkom yang memiliki tower BTS / Radio. Yahhh..kenangan mantan memang menyakitkan, namun saya harus MOVE ON dan segera mencari modul Lora dengan frekuensi sesuai standar di Indonesia.



  

Banyak modul Lora yang beredar di pasaran online, dan saya sangat berhati-hati agar tidak salah membeli karena dana sedang tipis-tipisnya. Apalagi ada yg memberitahu saya kalau modul lora berbasis esp32 TTG / LilyGo sedang kosong dipasaran. Pilihan datang ke breakout board Lora berbasis SX1276 atau RFM95 yang lumayan terjangkau, namun belum siap pakai karena harus melakukan penyesuaian ke microcontroller yang digunakan. Namun setelah diyakinkan oleh seller online nya dan seharian membaca di internet, saya memutuskan untuk membelinya dan menyandingkannya dengan Arduino nano yang teronggok tak terpakai di gudang. Rangkaian / skematik yg saya gunakan kira-kira tak jauh dari yang bisa didapatkan di internet.



Library yang pertama saya gunakan adalah library LoraId milik antares yang tersedia di sketch arduino, maupun library lainnya yang terdapat pada modul training di website antares. Sesuai pengalaman sebelumnya saat saya membahas library Antares, muncul keraguan kalau library ini tidak bisa langsung pakai dan harus saya oprek terlebih dahulu. Dan benar saja modul lora yang sukses saya koneksikan ke arduino, ternyata tidak mengirimkan data ke console web antares. 



  

Bahkan saya harus berkeliling kota, nostalgia pekerjaan 10 tahun yang lalu yaitu mencari sinyal sesuai peta coverage yang diberikan Telkom. Namun tetap saja hasilnya zonk ! Saya menggunakan script example yang ada pada librarynya Lora-antares, namun kenapa gagal ya ?



Pulang dengan tangan hampa dan wajah terbakar panasnya matahari Surabaya, saya teringat bagaimana proses yg saya lakukan ketika dulu, saya pernah menemukan bug pada library antares yang pernah saya bahas disini.  Saya menggunakan mode koneksi ke gateway secara ABP (Activation by Personalization) sehingga id dan key saya tetap gak berubah, dibanding saya harus menggunakan Autentifikasi lewat OTAA. Jadi kira-kira analisa saya, kenapa tidak bisa terhubung ke gateway antares,  seperti ini:


  1. NwkSkey, ApkSkey dan DevAdress kemungkinan salah format
  2. Frekuensi yang digunakan tidak tepat
  3. Library nya kacau ayuk diubah aja


Berdasarkan tutorial dari librarynya antares, key dan id dari device lora di console antares, mirip dengan yang diajarkan sebelumnya untuk library lainnya, yaitu seperti script ini :


  // Put Antares Key and DevAddress here
  lora.setAccessKey("your Access Key");
  lora.setDeviceId("your Device Id");


Lalu menurut contoh pada modul tutorial, setAccessKey didapatkan dengan melihat pair key dari id userkey di console antares yang berformat : 1111111111111111:2222222222222222 . Jadi 16karakter:16karakter. Namun saat di jalankan maka dilihat pada debug terminal, format dari  NwkSkey dan ApkSkey sesuai dengan literatur yang saya baca yaitu 128bit atau 32 karakter. Sedangkan format device ID nya benar.




Kecurigaan muncul dari saat proses ADD DEVICE lalu SETLORA. Ternyata sudah disediakan NwkSkey dan ApkSkey namun tidak ditampilkan pada console. Dilalahnya pair userkey bukanlah seperti key 128 bit yang ditampilkan pada layar.



Kacau bukan ? Apakah tebakan saya benar dan berhasil mengirimkan pesan ke Gateway? Oooo..tentu tidak semudah itu kawan! Ternyata masih zonk dan kemudian saya melanjutkan kecurigaan dengan frekuensi. Benar saja ada perbedaan tabel frekuensi antara library pada sketch arduino dan tutorial web antares. Dan menurut keputusan kominfo, frekuensi gateway telkom ada pada rentang 921.2 Mhz - 922.6 Mhz dengan jarak tiap channel 200kHz. Ahhh pusing banget harus oprek librarynya antares dan saya kemudian beralih ke 2 library yang saya temukan di Internet yaitu :

  1. Lorawan Packet  by Ricaun disini
  2. Arduino-LoRa by Sandeep Mistry disini


Jadi saya install ke dua library diatas yang saling  berhubungan, dan script testingnya pun sangat mudah dipahami seperti berikut :




#include <SPI.h>
#include <LoRa.h>

#include <LoRaWanPacket.h>
// sesuaikan pin yang dipakai
const int csPin = 10;
const int resetPin = 9;
const int irqPin = 2; // DIO0
//sesuaikan key dan address device lora antares
const char *devAddr = "xxxxxxxx";
const char *nwkSKey = "11111111111111110000000000000000";
const char *appSKey = "00000000000000002222222222222222";

unsigned int counter = 1; 

struct LoRa_config
{
  long Frequency;
  int SpreadingFactor;
  long SignalBandwidth;
  int CodingRate4;
  bool enableCrc;
  bool invertIQ;
  int SyncWord;
  int PreambleLength;
};
//frekuensi  SF BW dan sebagainya
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(115200);
  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();

  LoRa_sendMessage();
}

void loop() {
  if (runEvery(10000)) {

    LoRa_sendMessage();
    counter++;
    Serial.println("Send Message!");
  }
}

void LoRa_sendMessage()
{
  LoRa_TxMode();
  LoRaWanPacket.clear();
  LoRaWanPacket.print("Hello World");
  LoRaWanPacket.print(" data ke-");
  LoRaWanPacket.print(String(counter));
  if (LoRaWanPacket.encode()) 
  {
    LoRa.beginPacket();
    LoRa.write(LoRaWanPacket.buffer(), LoRaWanPacket.length());
    LoRa.endPacket();
  }
}

boolean runEvery(unsigned long interval)
{
  static unsigned long previousMillis = 0;
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;
    return true;
  }
  return false;
}

Hasilnya diluar dugaan saya dapat mengirim pesan ke gateway dengan lancar. Saya menggunakan frekuensi yang FIX sesuai dengan tabel frekuensi yang digunakan oleh gateway Lora nya Telkom.




Lalu bagaimana dengan librarynya telkom antares? Kalau ini sih saya gak akan bagikan disini karena sangat membingungkan untuk dijelaskan melalui tulisan. Namun intinya dapat saya ceritakan kalau library nya telkom antares / LoraId kurang bagus saat TX dibandingkan dengan  library lorawan packet. Ada pesan yang tidak nyantol ke antares jika menggunakan library bawaan, ketimbang lorawan packet yang selalu sukses. Namun dengan oprekan tambal sulam yg saya lakukan di library LoRa antares, saya dapat mengirimkan pesan downlink secara MQTT menuju arduino saya melalui LORA GATEWAY. Jarak lokasi rumah dengan titik BTS Gateway LoraWAN di telkom sekitar 1 km.





Wahh..jadi gatel nihh pengen lanjut cek sinyal lora keliling Surabaya...tunggu episode berikutnya yaa...







Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (8) arduino (25) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (25) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (58) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (5) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (7) radio (17) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) transistor (2) troubleshoot (3) tulisan (93) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika