When I started using LoRa radios it amazed me that there was no discussion of real life range. This article will attempt to solve that by doing real walkabouts in towns and woodlands.

I plan to add more tests to this over time.


The problem with describing range of a LoRa system is that range depends on a number of factors and so any simple summary of range will be incomplete.

In this article I’ll discuss the various things that change range and more importantly I have a very cool test system that I’ll use to make real life range measurements. …

Part 2: Detailed antenna measurements

This is a continuation of the last article about measuring LoRa antennas. In this section I go through the impedance measurements (VSWR or Return Loss) for each antenna in gory detail.

There is one more antenna (called Yagi):

The beam covers the ISM band (900MHz) as well as some higher frequency bands. The label says 698–960MHz & 1710–2700Mhz.

FrSky 900MHz Moxon Zipp 9

This is one of the more interesting antennas. It comes with radiation pattern documentation (+1). Not documented, it ships with an SMA-RP connector so I had to add a barrel SMA-RP -> SMA adapter (-2). $25.99 at Amazon.

Looking at the traces on the back of the antenna it appears to be a dipole with an additional dipole beam that I assume adds some directionality/gain. …

Part 1: Overview and Summary Information

Selecting a LoRa antenna is tough. Measuring an antenna well is a hard task and almost no one does it. Many antennas available via the hobby channels report gain or vswr, maybe at a frequency, that they clearly often pretend to measure.

So, since I have some test equipment and I’ve spent quite a while picking LoRa antennas… I decided to review a bunch of them.

I have a product that requires uniform high-quality LoRa communication and deciding on how to send that data has taken a very long time. Start by analyzing the various available antennas.

Earlier Article

I have an earlier post just like this. It suffered (greatly) because I had no way to capture response curves so photos of a chart from my small handheld antenna tester were it. Not great. Now I have a usb-controllable tester with on-screen results and a half-dozen more antennas. Hence the update. …

The first sensor I connected to my BlueLora was a UV Sensor. It’s nice to know where high levels of UV are for killing Coronavirus, or for bleaching paintings and furniture, or maybe getting skin cancer.

We have a lot of windows and suspected that some had UV coating and some did not. Do we need UV coating? Who knows…. time to find out.


In the above picture, I’ve soldered a Grove connector right into the BlueLora board. The grove pins (at 2mm) are a bit closer together than the 0.1" …

Imagine a wireless network that has a range of miles and which runs on a small battery for months. Now imagine what you could do if each node on the network supported any sensor you want. That’s my BlueLora board.

In the picture above you can see — starting at the left-

  • BlueLora board with OLED and battery and a temperature sensor
  • Bare BlueLora board
  • Jtag/Swd debug adapter board
  • QWIIC addon boards (in and out)
  • Grove addon boards (in and out)

The BlueLora Hardware

The base BlueLora board has a bunch of best-of-breed hardware on it — all designed to provide

  • the long range wireless…

Part 2: Implementing the Services

In part 1, I showed how to start up Bluetooth with advertising. That included source code that set up advertising for a few different Bluetooth services.


A Bluetooth peripheral device is defined by the set of Bluetooth services that it supports. The peripheral advertises those services. A service is like a mini application. There are many standard services: see Bluetooth-Guids.

Each service contains a set of characteristics — which are like ports that are read from and/or written to.

Device Information Service

The Device Information Service is a read-only collection of string data defining the device.

Implementing the service is easy. It’s statically defined and has no actual ‘code’. Since the startup code advertises the DIS that’s all we need. …

Part 1: Getting Started

Creating a Bluetooth Service in Zephyr is a wonderfully easy task. I’ve had a high startup cost doing simple things like PWM drivers in Zephyr, but Bluetooth is just great.


The latest version of my application uses the nrf5x library and C++ code to create a standard procedural application. It has a main() and runs in a single thread. It’s about 25,000 lines of code.

Although it’s very efficient in space and resources the entire application had to be built from the ground up. …

The board I’m working on has 1MB of QSPI flash. That is serial flash that’s directly controlled by the Nordic nrf52840. See here ->

The chip can use any 6 high-speed pins it likes for the flash interface so I’ve chosen pins that make the layout simple. Nordic suggests certain pins for noise/speed reasons and these are mainly from that set.

I had a terrible time getting this working correctly. It’s not hard to get it working well, it’s hard to figure out exactly what to set. So,…

It’s simple in zephyr to read/write raw data to the chip, tougher to get integrated use of qspi functionality where the F_DataX pins produce a 4 pin data bus for speed and easy dma. …

This is about Xamarin/C# but let me begin by describing why.


I just spent about 3 months writing a native (Java) Android application and then started on the iPhone/iOS version. After spending about a month going through samples and learning Swift (the native language for iOS) all I could think was “who the #$@% wants to write anything in Swift”? Just what we need is an entire language that is only supported by Apple.

It wouldn’t be so bad but they consistently ignore industry or common standards to go their own way. A line from Wikipedia -> “Swift supports closures (known as lambdas in other languages)”. If every other language calls it a lambda why call it a closure? …

I’ve been using the Material Designs Icons webfont and can not find a summary of character code vs icon. So, I wrote a simple Net.js application that produces a web page or pdf showing them.

Here’s the code for the Node.js application. If you create a Node.js typescript application using Visual Studio then this code will slot right in. You must install the ttf webfont into Windows before running this.

Here’s a view of what the output looks like:


Mark Zachmann

Entrepreneur, software architect, electrical engineer. Ex-academic.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store