> For the complete documentation index, see [llms.txt](https://docs.antares.id/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.antares.id/en/code-and-library-examples/esp32-lora/sending-simple-data-to-antares.md).

# Sending Simple Data to Antares

***

In this project you will be directed to send dummy data from the Lynx-32 **Development Board** to the Antares IoT Platform using **LoRa connectivity** with the **LoRaWAN protocol**.

The LoRaWAN protocol is divided into two classes, Class A and Class C, each class has its own advantages and disadvantages, for more details please visit the following page.

{% content-ref url="/pages/2drjc2iLUddplq9EcqUq" %}
[LoRaWAN Class](/en/code-and-library-examples/esp32-lora/lorawan-class.md)
{% endcontent-ref %}

## Prerequisites

The required materials follow the **General Prerequisites** on the previous page. If you have not prepared the requirements on that page, then you can visit the following page.

{% content-ref url="/pages/cjzKMuyf4Ocds5hTWrBM" %}
[General Prerequisites ESP32 LoRa](/en/code-and-library-examples/esp32-lora/general-prerequisites-esp32-lora.md)
{% endcontent-ref %}

## Follow These Steps

### 1. Launch the Arduino IDE application

### 2. Opening Sample Programme

{% hint style="info" %}
You can open the programme code in the Arduino IDE via**File > Examples > Antares LoRaWAN > send-class-A-ABP.**
{% endhint %}

Here is the programme code of the **send-class-A-ABP** example.

{% code lineNumbers="true" fullWidth="false" %}

```arduino
#include <lorawan.h>

//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 = "Lora-Device-Address"; // Replace with the Device Address that you have in the Antares console
const char *nwkSKey = "Network-Session-Key"; // Replace with the Network Session Key that you have in the Antares console
const char *appSKey = "Application-Session-Key"; // Replace with the Application Session Key that you have in the Antares console

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];
char outStr[255];
byte recvStatus = 0;
int channel;

#if defined (ARDUINO_ESP32_DEV)
const sRFM_pins RFM_pins = {
  .CS = 5,    //LYNX32 to RFM NSS
  .RST = 0,   //LYNX32 to RFM RST
  .DIO0 = 27, //LYNX32 to RFM DIO0
  .DIO1 = 2,  //LYNX32 to RFM DIO1
};
#elif defined (ARDUINO_B_L072Z_LRWAN1)
const sRFM_pins RFM_pins = {
  .CS = PA15,   //STM32L0 to NSS
  .RST = PC0,   //STM32L0 to RST
  .DIO0 = PB4,  //STM32L0 to DIO0
  .DIO1 = PB1,  //STM32L0 to DIO1
};
#else
#error *** ONLY SUPPORTS LYNX32 AND B-L072Z-LRWAN1 ***
#endif

void setup() {

#if defined (ARDUINO_B_L072Z_LRWAN1)
  SPI.setMOSI(PA7);
  SPI.setMISO(PA6);
  SPI.setSCLK(PB3);
  SPI.begin();
#elif !defined (ARDUINO_ESP32_DEV)
  #error *** ONLY SUPPORTS LYNX32 AND B-L072Z-LRWAN1 ***
#endif

  // 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 channel to random
  lora.setChannel(MULTI);

  // Set TxPower to 15 dBi (max)
  lora.setTxPower1(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, 5);
    counter++;
    channel = lora.getChannel();
    Serial.print(F("Ch : "));    Serial.print(channel); Serial.println(" ");
  }

  // Check Lora RX
  lora.update();

  recvStatus = lora.readData(outStr);
  if (recvStatus) {
    int counter = 0;

    for (int i = 0; i < recvStatus; i++)
    {
      if (((outStr[i] >= 32) && (outStr[i] <= 126)) || (outStr[i] == 10) || (outStr[i] == 13))
        counter++;
    }
    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();
  }

}
```

{% endcode %}

### 3. Set LoRaWAN Parameters in Antares

On the Antares Device console page, set LoRa by pressing the **Set LoRa** button as shown below.

<figure><img src="/files/1JKQUSudhC0rTyFG8hO4" alt=""><figcaption></figcaption></figure>

Input LoRaWAN parameters with **Lora Device Class A, Activation Mode ABP, ABP Parameters Inherit** as shown below.

{% hint style="info" %}
When selecting **ABP Parameters Inherit**, the LoRa parameters will be generated by Antares. From the device side, the **Lynx32 Development Board** needs to adjust the LoRa parameters.
{% endhint %}

{% hint style="warning" %}
Don't forget to save **(copy)** the **Network Session Key** and **Application Session Key** parameters before clicking **Set LoRa** to facilitate the next process.
{% endhint %}

<figure><img src="/files/emKdHfdjE9BDfhCSg0Y4" alt=""><figcaption><p>The Form image contains the LoRa Parameter Set.</p></figcaption></figure>

{% hint style="danger" %}
Make sure your antares account has an active LoRa package.
{% endhint %}

### 4. Set LoRaWAN Parameters in the Programme Code

Change the LoRaWAN ABP parameters in the following variables **`*devAddr`** , **`*nwkSkey`** , and **`*appSKey`**. Adjust to the parameters in the Antares console.

```arduino
const char *devAddr = "Lora-Device-Address";
const char *nwkSKey = "Network-Session-Key";
const char *appSKey = "Application-Session-Key"
```

{% hint style="info" %}
The **\*devAddr** parameter that has been generated by Antares can be seen on the device page after completing the **LoRa Set**.
{% endhint %}

{% hint style="info" %}
The parameters **\*nwkSKey** and **\*appSKey** are obtained during Set LoRa in the previous step.
{% endhint %}

<figure><img src="/files/Xw0yWHOZXbHmMru9MRbS" alt=""><figcaption><p>Figure Antares Console Page After Successful LoRa Set.</p></figcaption></figure>

{% hint style="danger" %}
If you forgot to save **\*nwkSkey** and **\*appSKey** in the previous step then look at the accesskey in your antares account then follow the following format.

{% code overflow="wrap" %}

```arduino
Example Accesskey = "aaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbb"; //32 digit accesskey

const char *nwkSKey = "aaaaaaaaaaaaaaaa0000000000000000"; //16 digit first accesskey plus 16 digit zero

const char *appSKey = "0000000000000000bbbbbbbbbbbbbbbb"; //16 digit zero plus 16 digit last acesskey
```

{% endcode %}
{% endhint %}

### 5. Compile and Upload Program

Connect the **Lynx-32 Development Board** to your computer and make sure the **Communication Port** is read.

{% hint style="info" %}
On Windows operating systems, checking can be done through the **Device Manager**.\
If your **Lynx-32 Development Board** is read, the **USB-Serial CH340** will appear with the port adjusting the port availability (in this case it reads **COM4**).
{% endhint %}

<figure><img src="/files/uT6rvzoE0J5ZMIWIndUQ" alt=""><figcaption><p>Device Manager image on Windows.</p></figcaption></figure>

Set up the **Lynx-32** Board by clicking **Tools > Board > ESP32 Arduino** in the Arduino IDE, then make sure the board used is the **ESP32 Dev Module**. Select the port according to the communicaion port that is read (in this case COM4). The result will look like the following picture.

<figure><img src="/files/EYOw2Sw5kp7UHjEyu4jo" alt=""><figcaption><p>Image of the Tools Menu in the Arduino IDE.</p></figcaption></figure>

After all the setup is complete, upload the programme by pressing the arrow icon as shown below. Wait for the compile and upload process to finish.

<figure><img src="/files/dhT3szYRzwvWgUhGp15l" alt=""><figcaption><p>Gambar Icon Verify and Upload pada Arduino IDE.</p></figcaption></figure>

{% hint style="info" %}
**The Tick icon** on the Arduino IDE is just the verify process. Usually used to C**ompile** the programme to find out whether there are errors or not. \
**The Arrow icon** on the Arduino IDE is the verify and upload process. Usually used to **Compile** the programme as well as Flash the programme to the target board.
{% endhint %}

If the programme upload is successful, it will look like the following image.

<figure><img src="/files/J6N4rU0IlmoNIOeEGjfW" alt=""><figcaption><p>Arduino IDE Page bar after successful upload.</p></figcaption></figure>

After uploading the programme, you can view the **serial monitor** to debug the programme. The **serial monitor icon** is shown in the following image.

<figure><img src="/files/BpFIlw4qI3yi2pK0yvdr" alt=""><figcaption><p>Image of the Serial Monitor Icon in the Arduino IDE.</p></figcaption></figure>

Set the **serial baud rate** to 115200 and select BothNL & CR. The result will look like the following image.

{% hint style="danger" %}
Make sure the **serial baud rate** matches the value defined in the programme code. If the **serial baud rate** is not the same between **the programme code** and **the serial monitor**, the ASCII characters will not be read properly.
{% endhint %}

<figure><img src="/files/SG4jQKhgZICv30ixdVwi" alt=""><figcaption><p>Serial Monitor Image.</p></figcaption></figure>

### 6. Check Data in Antares

After uploading the programme successfully, then open the device antares page and see if the lora data has been successfully sent.

<figure><img src="/files/D0uyvKwDPcUgtMfWOVBF" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/rKVg6TNofU1L1W2vNfaD" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
The data sent from the **Lynx-32 Development Board** is in the form of **"counter", "port",** and message in the JSON field **"data"**. While other parameters are supporting parameters generated by the Antares LoRaWAN Infrastructure.
{% endhint %}
