Low Cost LoRaWan Field Tester

When deploying a LoRaWan network, we need to verify what is the coverage. Eventually before deploying a Hotspot for Helium network we need to find the best place to reach as much peers as possible. A field tester is a simple, mobile, tool to help you decide the best location and monitor the coverage in a zone.

There are many different existing solutions on the market, I have used some of them in the past like the Adeunis field tester. The problem of the existing device is usually the price and the absence of backend application to report the network seen signal. The solutions are usually around 200 – 400€ and I was looking for making something less expensive for makers and hotspot owners.

Thanks to the Seeed Wio Terminal, a low cost Arduino like terminal with a cool TFT screen and buttons, it makes it a nice platform to make a LoRaWan Field tester with a good UI.

Access the project

This project has been released open-source, you can find it on my Github repository Wio LoRaWan Field Tester.


The solution involved different components:

  • The WioTerminal, sending the communication and displaying the results
  • The gateways / Hotspot receiving the traffic
  • The network server relaying the traffic to the application server and enriching with the network signal informations
  • The application server, building the downlink message for returning the network signal information to the Wio Terminal.

If we take a look in detail of the communications, we get:

In this schema, there is also an integration message for the uplink (6) but it is not proceeded by backend. The Field tester also scan for downlink until it gets nothing or the expected last communication report so you can have multiple uplink (6) consecutively.

As another precision, as we can have some retries due to ack loss but received by the backend, we can have multiple downlink (7) for a single sequence ID. In a such case, the last one is kept. You can see the value changing on the screen.


Hardware parts

The hardware needed to build the LoRaWan field tester is the following:

  • 1x Wio Terminal ($29) on seeed
  • 1x RFM95 LoRaWan module ($3) on aliexpress
  • 1x 868 / 915 antenna ($0,5-$3) on aliexpress / mouser …
  • 1x LiPo battery ($2) on aliexpress
  • 1x LiPo connector ($0.1) on aliexpress

Basically the total parts cost is about $35.


The basic version of the schematic is the following. With this DiY version you can power the circuit with an USB-C power bank connected to the USB-C Wio terminal connector.

Minimal schematics to make the Field tester working with a Wio Terminal

Basically, you don’t need to connect all the 40 pins, you can restrict to pin 1 – 24. This is a simple and working version of the LoRaWan field tester. A more advanced version with gerber files is available on the github project (or coming soon).

Required Software

You need to have an Arduino environment and the following packages and library installed

  • Wio Terminal toolchain
  • MCCI LoRaWAN LMIC library (by IBM, Matthjs Kooljman…) version 3.3.0
  • FlashStorage by Various version 1.0.0

You also need to setup the LMIC library for your corresponding radio-zone by going to Document/Arduino/libraries/MCCI_LoRaWAN_LMIC_library/project_config directory and edit lmic_project_config.h file:

// Select your radio zone and coutry
//#define CFG_eu868 1
#define CFG_us915 1
//#define CFG_au915 1
#define CFG_sx1276_radio 1

Create device credentials and integration

For HELIUM network

At first you need to create an Integration go to this menu and select HTTP type of integration. The fill the form like the following:

Create an integration for LoRaWAN field tester

The URL to provide is https://dev.disk91.com/fieldtester/helium/v3 type is POST. You can use the backend, no problem. After setting this, you can click on “add integration”.

Then you need to create a LABEL and attach the integration to it. So go to LABEL menu and Add Label button.

Set a name for the label like “Disk91 field tester” then select the integration previously created in the Attachments list.

Then you can click on Add Label & Manage button.

Now we need to make in important setting: we need to tell the console to buy all the messages coming from the hotspot and not only one. By default only one of the messages is considered so you can’t know the number of hotspots receiving the message or the min and max RSSI when only one is obtained. This will have a consequence, for each of the messages, you won’t pay a single DC but one per hotspot. (you also pay for downlinks and acks)

For making this setting, you need to click on Label Settings button in the label management page, then click on Packets tab and select unlimited packets. Once done, Apply Changes.

These configuration prepared, now you can register you device. Go to Devices from the main menu and click on Add Device.

Add device in Helium console

you need to set a name to the device. You don’t need at this step to use the Dev EUI, App EUI, App key, we will get it from another way more easier for our settings.

What you need to do is to link the device with the Label we have created. So in the Attach label box, type the first letters of the label name and select it from the list.

Then click on submit.

Your device is now ready for being used. We will later have to configure the Dev EUI / App EUI and App key into the device to make it connected to the network. For getting the IDs in the right format to be copied and past in the key file, you just need to go to the device screen :

Get the device credentials from helium console

By clicking on the double arrows you see on the screen capture, you display the byte array in a format you can easily copy and past into the configuration file. You can do the same for the App Key once you have clicked on the eye icon. The helium setup is now done.

The things network configuration

To be updated sooner


The project itself have some configuration settings you must performed:

Edit file config.h if you want to modify the configuration:

//#define DEBUG                       // enable logs on serial

#define WITH_SPLASH         1         // Enable splash screen
#define WITH_SPLASH_HELIUM  1         //   display helium logo
#define WITH_SPLASH_TTN     1         //   display TTN logo

Edit the key.h file to put you own credentials

#define __DEVEUI { 0x7B, 0xC9, 0xFF, 0x47, 0xE6, 0x49, 0x41, 0xA7 }
#define __APPEUI { 0xD3, 0x77, 0x5B, 0x2C, 0x39, 0x93, 0x58, 0x20 }
#define __APPKEY { 0xE5, 0xC1, 0xD9, 0x44, 0xB4, 0x0D, 0x5D, 0x1C, 0x8B, 0xFB, 0x14, 0x8B, 0x1E, 0x8C, 0x2C, 0xA5 }

Don’t ask… these keys has been invalidated. The keys are all in the msb order.

Now, you can compile and Upload.

Using it

The way to use it is described more in details in the LoRaWan Field Test, Github project page So just to make is simple, here are the way the different button can be used for setting up the device:

easily change the LoRaWan field tester settings from the Wio terminal buttons

27 thoughts on “Low Cost LoRaWan Field Tester

    • You can also get some on Amazon, they are a bit more expensive but you won’t have the custom to be paid. Even at $40, the field tester solution like that one is still low cost 😉

  1. I received my Wi terminal today and setup everything and backend ready with helium console. Now I am waiting for the pcb kit to come from france. it cost me nearly 80 euros only for board with shipping and taxes to uk. I hope the bug of 1 hotspot will be fixed soon.

  2. I have mine running and it’s working great! How long will you offer the backend service? Is it possible to share the backend setup so we could run our own instance?

    • There is no limit for the backend as it is mutualized with other service I have. This is also the reason why I can’t open-source it, it is based on too much private code. By-the-way, you can find the payload details in the github project and make you own one for sure.

  3. Hello Paul. I am trying to alter the config to run on the channels used here in Australia by TTN: AU915 CH 8 to 15. The E5 module uses the same command set as the Rising HF 076 modem and my approach was to add the commands to set the channel frequencies during the initialisation. I have enabled debugging so I can see the error messages. Any AT commands sent to the LoRa E5 module return an Error. I may still have something wrong in my environment setup, but I am running in Arduino and have made the library changes you specify. Do you have any thoughts on what may be causing this?

  4. If you are re-compiling in Arduino and get errors: i.e the Debug monitor shows commands are failing and the keyboard is slow to update, check that you have not missed a vital step: in the Arduino Environment select TOOLS / ROLE and select SLAVE. This important step flips the Tx & Rx lines on the serial comms to the device. If the Role is left on Master, you have TX-TX and RX-RX instead of TX-RX and RX-TX

    • Yes, this is written in the DEVELOPMENT.md file
      (please open issues on GitHub … better than comment on blog post to follow the commit)

  5. For those interested in using the tester in Australia, the defaut channeling will leave the unit running on channels 0 to 7. If you want to use it on Sub Band 1 (CH 8-15) as used by TTN, make the following changes:

    – enable debugging so you can check comms with the LoRa E5 module

    – enter your device keys at lines 25 to 27
    – set the Zone to 6 at line 28

    Arduino Environment
    – from the Arduino menu select Tools / Mode and select Slave
    – this reverses the TX & Rx lines to accomodate an error in pinout on the Lora E5 module
    – of you don’t do this, all of your modem commands will fail, which you will detect in the logs. The other symptom will be a very slow response on the Tester display when you press buttons: this becasue teh various commands to the modm are failing and it is waiting for the 2 second timeout to elapse
    LoRaComE5.cpp: line 251-253
    – change from

    } else if ( loraConf.zone == ZONE_AU915 ) {
    sendATCommand(“AT+DR=AU915″,”+DR: AU915″,”+DR: ERR”,””,DEFAULT_TIMEOUT,false,NULL);
    } else {

    – change to

    } else if ( loraConf.zone == ZONE_AU915 ) {
    sendATCommand(“AT+DR=AU915″,”+DR: AU915″,”+DR: ERR”,””,DEFAULT_TIMEOUT,false,NULL);// set data rate to match band plan
    sendATCommand(“AT+CH=0,916.8,0,5″,”+CH: 0,9168″,”+CH: ERR”,””,DEFAULT_TIMEOUT,false,NULL);// set freq for ch 0
    sendATCommand(“AT+CH=1,917.0,0,5″,”+CH: 1,9170″,”+CH: ERR”,””,DEFAULT_TIMEOUT,false,NULL);// set freq for ch 1
    sendATCommand(“AT+CH=2,917.2,0,5″,”+CH: 2,9172″,”+CH: ERR”,””,DEFAULT_TIMEOUT,false,NULL);// set freq for ch 2
    sendATCommand(“AT+CH=3,917.4,0,5″,”+CH: 3,9174″,”+CH: ERR”,””,DEFAULT_TIMEOUT,false,NULL);// set freq for ch 3
    sendATCommand(“AT+CH=4,917.6,0,5″,”+CH: 4,9176″,”+CH: ERR”,””,DEFAULT_TIMEOUT,false,NULL);// set freq for ch 4
    sendATCommand(“AT+CH=5,917.8,0,5″,”+CH: 5,9178″,”+CH: ERR”,””,DEFAULT_TIMEOUT,false,NULL);// set freq for ch 5
    sendATCommand(“AT+CH=6,918.0,0,5″,”+CH: 6,9180″,”+CH: ERR”,””,DEFAULT_TIMEOUT,false,NULL);// set freq for ch 6
    sendATCommand(“AT+CH=7,918.2,0,5″,”+CH: 7,9182″,”+CH: ERR”,””,DEFAULT_TIMEOUT,false,NULL);// set freq for ch 7
    } else {

    Now compile the code and send it to the tester. If there are no errors, it will reboot straight to the display. Set the mode to AUTO 1 Min and watch to see that the unit joins teh network and starts to send packets. Remember to take it outside if you want to see the GPS coordinates.

    • I’ll add you proposal in the github repository, thank you for sharing this.
      Just to have a better understanding, is that an option for AU915 or the mandatory configuration ?

    • Hi, just found this discussion re the AU915 settings for the TTN. Your instructions will be invaluable. BTW Channels 8-15 in AU915 are called sub-band 2. Extract from TTN: Note that The Things Network uses 2nd Sub-Band only (channels 8 to 15 and 65).

    • I’m adding the sub channel selection. For you information with E5 we need to unactivate the channels as all the channels are pre-defined. So the sub-band selection is basically disabling unused channel it I well understood the documentation. You will find it in binaries with tag 1.0 soon pushed.

  6. AU915 offers 8 sub-bands and users are free to choose any of them. The first sub band would be treated as the default. The Things Network has chosen to use the second sub band, which uses 916.8 to 918.2. Adding support for all sub bands would make the frequency selection overly complex. Instead, allowing users to over-write the frequencies in the Sketch is a simple work around.

  7. Hi there. I’m also in Australia and have received my Wio Terminal and Lora-E5 chassis today. I flashed the firmware using the drag and drop method and have configured it in the Helium console successfully, however the GPS never gets a lock? The screen is always red with no satellites detected. Do I need to configure the code to use a particular satellite system for Australia or should it autodetect? Any ideas? Cheers. John

    • Are you outdoor ? Gps only work outdoor. Then GPS may take 2-5 minutes to get all the needed ephemeris to get a precise enough location

      • Yes, I was outdoors. 🙂 I tried a couple of times – including a trip in the car with the Wio Terminal facing out the open sunroof…

      • did you recompile the firmware on your own ? if it is the case, make sure you followed each step of the developper.md file.
        If you are using a prebuilt version and LoRa E5, please take a look to the led, is that blinking?
        Do you see the red gps dot blinking sometime ?

  8. Hi Paul,
    Please, help me with the schematic – how and where to connect the LORA-E5 module instead of RFM 95 on Wio Lora WAN tester board. If LORA-E5 module occupied UART where is connected GPS? If you can, send me the design files of board with LoRa-E5 module and GPS connected.

    • LoRa E5 is proprietary to Seeed, two different design for the same purpose. You choose the one you want. GPS is connected to SoftSerial on LoRa-E5.

  9. Hi Paul, what should I check to fix / figure out why my Field Tester never sees more than 1 hotspot.
    Device does connect to Console – I have the device connected to an Integration point as decribed on this web page – I have All Packets enabled – I have a Label created but dont think in the new Conole this is relevant.

    I have a data only gateway (LPS8) and another active hotspot in my apartment.and see at least 2 other hotspots (3 in total) but only 1 hotspot registers on the Field Tester or on Console.

    • This is a long time bug with Helium. It seems to apply for Europe and less for USA. Only one is reported whatever the label configuration is. Sometime you get two, not much more.

      • Thank you so much for the quick reply. On that point, I am a little surprised as with a T-beam board I am getting up to 6 hotspots (at the Console), or is this different to Field Tester?

        Is Helium working on this bug? 🙂

      • Really ? that is interesting. I never get more than 2 with any devices.
        Please continue this discussion on DM (twitter or Discord) … more convenient than blog comment area

  10. Hi, I have a TTN V3 service on my deploy accessible online and I would like to understand if the backend dev.disk91.com can integrate with my deploy. only works with the TTN instance provided by The Things Network. Does it only work with the TTN instance provided by The Things Network?


Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.