Tutorial LoRa

Silakan download modul Workshop LoRa Antares. Klik. Klik Modul Workshop LoRa Antares

Pendahuluan

Pada tutorial ini, Anda akan menggunakan konektivitas LoRa untuk mengirim data sederhana ke Antares. Modul yang digunakan pada tutorial ini adalah modul LYNX-32 LoRa Antares.


1. Prasyarat

Sebelum memulai, pastikan Anda telah memenuhi syarat sebagai berikut:

a. Install Arduino IDE pada perangkat Anda. Klik Software Arduino IDEjika Anda belum menginstall.

b. Board ESP-32: Download Board ESP-32 pada Arduino IDE. Klik Tutorial Berikut Tutorial Install Board ESP32

c. Library LoRaWAN: Download Library LoraWAN pada Arduino IDE. Klik Download Download Library LoraWAN

*Note: Library hanya untuk board LYNX-32.

d. Membuat aplikasi dan device pada console Antares akun Anda.

2. Langkah-langkah Install Library LoraWAN

Sebelum memulai proses pada software, Anda perlu menginstall Library LoraWAN Arduino Library pada Arduino IDE yang Anda gunakan. Pada Arduino IDE, buka add .ZIP Library dengan klik Sketch > Include Library > add .ZIP Library.

libantaresws2

Kemudian pilih file zip Library LoRaWAN-Arduino-Library.zip pada direktori penyimpanan yang telah Anda download sebelumnya. Lalu klik Open.

librarylorawan

3. Konfigurasi

Cara melakukan konfigurasi adalah sebagai berikut:

a. Masuk pada laman console Antares akun Anda. Klik pada device yang telah Anda buat sebelumnya. Kemudian klik Set LoRa seperti pada gambar berikut.

klik-lora-esp32

Lalu akan muncul kotak dialog Set LoRa Device seperti gambar di bawah. Ikuti pengaturan seperti di bawah.

set-lora-esp32

b. Pada Arduino IDE, konfigurasikan ESP32 Dev Modul sebagai board yang akan Anda gunakan. Klik Tools > Board > ESP Dev Module..

c. Pada Arduino IDE, konfigurasikan Port sesuai dengan Board ESP32 yang Anda gunakan. Klik Tools > Port > COM .....

4. Mengirim Data Sederhana ke Antares

Setelah Anda selesai melakukan konfigurasi, saatnya membuat kode program untuk mengirim data sederhana ke device pada console Antares yang telah Anda buat sebelumnya. Kode Program dapat Anda dapatkan di direktori example pada folder library LoRaWAN Arduino Library yang telah Anda download sebelumnya atau dengan mudah Anda dapatkan dengan klik File > Examples > Antares LoRaWAN > send-class-A-ABP pada Arduino IDE.

Kode program send-class-A-ABP* seperti berikut:

*Note: Jangan lupa untuk ketik devAddr, nwkSKey, dan appSKey yang Anda gunakan pada console Antares akun Anda. Setelah itu upload program dan tunggu beberapa detik.


/**
   Example of ABP device
   Authors:
          Ivan Moreno
          Eduardo Contreras
    June 2019

   This code is beerware; if you see me (or any other collaborator
   member) at the local, and you've found our code helpful,
   please buy us a round!
   Distributed as-is; no warranty is given.
*/
#include 

//ABP Credentials
const char *devAddr = "4ff6c1bd";
const char *nwkSKey = "93df5e92cbaf1efc0000000000000000";
const char *appSKey = "000000000000000002e21425cc8ccfa2";



const unsigned long interval = 10000;    // 10 s interval to send message
unsigned long previousMillis = 0;  // will store last time message sent
unsigned int counter = 0;     // message counter

char myStr[50];
byte outStr[255];
byte recvStatus = 0;
int port, channel, freq;
bool newmessage = false;

const sRFM_pins RFM_pins = {
  .CS = 5,
  .RST = 0,
  .DIO0 = 27,
  .DIO1 = 2,
};

void setup() {
  // Setup loraid access
  Serial.begin(115200);
  delay(2000);
  if (!lora.init()) {
    Serial.println("RFM95 not detected");
    delay(5000);
    return;
  }

  // Set LoRaWAN Class change CLASS_A or CLASS_C
  lora.setDeviceClass(CLASS_A);

  // Set Data Rate
  lora.setDataRate(SF10BW125);

  // Set FramePort Tx
  lora.setFramePortTx(5);

  // set channel to random
  lora.setChannel(MULTI);

  // Set TxPower to 15 dBi (max)
  lora.setTxPower(15);

  // Put ABP Key and DevAddress here
  lora.setNwkSKey(nwkSKey);
  lora.setAppSKey(appSKey);
  lora.setDevAddr(devAddr);
}

void loop() {
  // Check interval overflow
  if (millis() - previousMillis > interval) {
    previousMillis = millis();

    sprintf(myStr, "Lora Counter-%d", counter++);


    Serial.print("Sending: ");
    Serial.println(myStr);
    lora.sendUplink(myStr, strlen(myStr), 0);
    port = lora.getFramePortTx();
    channel = lora.getChannel();
    freq = lora.getChannelFreq(channel);
    Serial.print(F("fport: "));    Serial.print(port);Serial.print(" ");
    Serial.print(F("Ch: "));    Serial.print(channel);Serial.print(" ");
    Serial.print(F("Freq: "));    Serial.print(freq);Serial.println(" ");

  }

  // Check Lora RX
  lora.update();

  recvStatus = lora.readDataByte(outStr);
  if (recvStatus) {
    newmessage = true;
    int counter = 0;
    port = lora.getFramePortRx();
    channel = lora.getChannelRx();
    freq = lora.getChannelRxFreq(channel);

    for (int i = 0; i < recvStatus; i++)
    {
      if (((outStr[i] >= 32) && (outStr[i] <= 126)) || (outStr[i] == 10) || (outStr[i] == 13))
        counter++;
    }
    if (port != 0)
    {
      if (counter == recvStatus)
      {
        Serial.print(F("Received String : "));
        for (int i = 0; i < recvStatus; i++)
        {
          Serial.print(char(outStr[i]));
        }
      }
      else
      {
        Serial.print(F("Received Hex: "));
        for (int i = 0; i < recvStatus; i++)
        {
          Serial.print(outStr[i], HEX); Serial.print(" ");
        }
      }
      Serial.println();
      Serial.print(F("fport: "));    Serial.print(port);Serial.print(" ");
      Serial.print(F("Ch: "));    Serial.print(channel);Serial.print(" ");
      Serial.print(F("Freq: "));    Serial.println(freq);Serial.println(" ");
    }
    else
    {
      Serial.print(F("Received Mac Cmd : "));
      for (int i = 0; i < recvStatus; i++)
      {
        Serial.print(outStr[i], HEX); Serial.print(" ");
      }
      Serial.println();
      Serial.print(F("fport: "));    Serial.print(port);Serial.print(" ");
      Serial.print(F("Ch: "));    Serial.print(channel);Serial.print(" ");
      Serial.print(F("Freq: "));    Serial.println(freq);Serial.println(" ");
    }
  }

}
							

Setelah proses upload kode program selesai, silakan periksa data yang masuk pada Device Antares yang telah Anda buat sebelumnya. Jika berhasil maka tampilan pada Device Anda akan seperti berikut ini:

esp32-lora-antares


Menggunakan Shield Workshop Antares
Pendahuluan

Silakan download modul Workshop LoRa Antares. Klik Modul Workshop LoRa Antares

Pada bagian ini, Anda akan menggunakan Shield Workshop Antares pada modul Arduino LoRa. Pada Shield Workshop Antares ini terdapat sensor suhu dan kelembaban (DHT11), relay, LED dan push button. Pada tutorial ini, Anda akan melakukan monitoring suhu dan kelembaban melalui console Antares menggunakan Modul LYNX-32 LoRa.

shieldworkshop

1. Alat dan Bahan

Alat dan bahan yang digunakan diantaranya:

a. Modul LYNX-32 LoRa

b. Shield Workshop Antares

c. Kabel Micro USB Type C

2. Kirim Data Sensor

Sebelumnya, pastikan Anda telah memasang Shield Workshop Antares pada Modul LYNX-32 LoRa dengan benar. Kode program ditunjukkan seperti dibawah ini: Note: Jangan lupa untuk ketik devAddr, nwkSKey, dan appSKey yang Anda gunakan pada console Antares akun Anda. Setelah itu upload program dan tunggu beberapa detik.

#include 
/**
   Example of ABP device
   Authors:
          Ivan Moreno
          Eduardo Contreras
    June 2019

   This code is beerware; if you see me (or any other collaborator
   member) at the local, and you've found our code helpful,
   please buy us a round!
   Distributed as-is; no warranty is given.
*/
#include 
#include "DHT.h"

#define DHTTYPE     DHT11
#define SENSOR_DHT  14

DHT dht(SENSOR_DHT, DHTTYPE);

//ABP Credentials
/*
  Notes:
  - select ABP Activation on ANTARES
  - select inherit to generate your keys
  - nwkSKey: 32 digit hex, you can put 16 first digits by first 16 digits your access key and add 16 digits with 0 (ex : abcdef01234567890000000000000000)
  - appSKey: 32 digit hex, put 16 first digits by 0 and put last 16 digits by last 16 digit your access key (ex : 0000000000000000abcdef0123456789)
*/

const char *devAddr = "4ff6c1bd";
const char *nwkSKey = "93df5e92cbaf1efc0000000000000000";
const char *appSKey = "000000000000000002e21425cc8ccfa2";


const unsigned long interval = 10000;    // 10 s interval to send message
unsigned long previousMillis = 0;  // will store last time message sent
unsigned int counter = 0;     // message counter
String dataSend = "";

char myStr[50];
byte outStr[255];
byte recvStatus = 0;
int port, channel, freq;
bool newmessage = false;

const sRFM_pins RFM_pins = {
  .CS = 5,
  .RST = 0,
  .DIO0 = 27,
  .DIO1 = 2,
};

float getTemperature()
{
  float t = dht.readTemperature();
  if (isnan(t)) return 0;
  return t;
}

float getHumidity()
{
  float h = dht.readHumidity();
  if (isnan(h)) return 0;
  return h;
}

void setup() {
  // Setup loraid access
  Serial.begin(115200);
  dht.begin();

  delay(2000);
  if (!lora.init()) {
    Serial.println("RFM95 not detected");
    delay(5000);
    return;
  }

  // Set LoRaWAN Class change CLASS_A or CLASS_C
  lora.setDeviceClass(CLASS_A);

  // Set Data Rate
  lora.setDataRate(SF10BW125);

  // Set FramePort Tx
  lora.setFramePortTx(5);

  // set channel to random
  lora.setChannel(MULTI);

  // Put ABP Key and DevAddress here
  lora.setNwkSKey(nwkSKey);
  lora.setAppSKey(appSKey);
  lora.setDevAddr(devAddr);
}

void loop() {
  // Check interval overflow
  if (millis() - previousMillis > interval) {
    previousMillis = millis();

    int t,h;
    t = getTemperature();
    h = getHumidity();
    Serial.println("Temperature : " + (String)t+" C");
    Serial.println("Humidity    : " + (String)h+" %");

    dataSend = "{\"Temp\": " + (String)t + ", \"Humd\": " + (String)h +"}";
    dataSend.toCharArray(myStr,50);

    Serial.print("Sending: ");
    Serial.println(dataSend);
    lora.sendUplink(myStr, strlen(myStr), 0);
    port = lora.getFramePortTx();
    channel = lora.getChannel();
    freq = lora.getChannelFreq(channel);
    Serial.print(F("fport: "));    Serial.print(port);Serial.print(" ");
    Serial.print(F("Ch: "));    Serial.print(channel);Serial.print(" ");
    Serial.print(F("Freq: "));    Serial.print(freq);Serial.println(" ");

  }

  // Check Lora RX
  lora.update();

  recvStatus = lora.readDataByte(outStr);
  if (recvStatus) {
    newmessage = true;
    int counter = 0;
    port = lora.getFramePortRx();
    channel = lora.getChannelRx();
    freq = lora.getChannelRxFreq(channel);

    for (int i = 0; i < recvStatus; i++)
    {
      if (((outStr[i] >= 32) && (outStr[i] <= 126)) || (outStr[i] == 10) || (outStr[i] == 13))
        counter++;
    }
    if (port != 0)
    {
      if (counter == recvStatus)
      {
        Serial.print(F("Received String : "));
        for (int i = 0; i < recvStatus; i++)
        {
          Serial.print(char(outStr[i]));
        }
      }
      else
      {
        Serial.print(F("Received Hex: "));
        for (int i = 0; i < recvStatus; i++)
        {
          Serial.print(outStr[i], HEX); Serial.print(" ");
        }
      }
      Serial.println();
      Serial.print(F("fport: "));    Serial.print(port);Serial.print(" ");
      Serial.print(F("Ch: "));    Serial.print(channel);Serial.print(" ");
      Serial.print(F("Freq: "));    Serial.println(freq);Serial.println(" ");
    }
    else
    {
      Serial.print(F("Received Mac Cmd : "));
      for (int i = 0; i < recvStatus; i++)
      {
        Serial.print(outStr[i], HEX); Serial.print(" ");
      }
      Serial.println();
      Serial.print(F("fport: "));    Serial.print(port);Serial.print(" ");
      Serial.print(F("Ch: "));    Serial.print(channel);Serial.print(" ");
      Serial.print(F("Freq: "));    Serial.println(freq);Serial.println(" ");
    }
  }

}
							

Setelah proses upload kode program selesai, silakan periksa data yang masuk pada Device Antares yang telah Anda buat sebelumnya. Jika berhasil maka tampilan pada Device Anda akan seperti berikut ini:

setlora4