LoRa up close: chirps, spreading factor, time on air and range
Meshtastic and Reticulum sit on the same physics: a modulation that reads a signal weaker than the noise floor and pays for it in time. This note is about that physics: how a chirp works, where the range comes from, what every knob in the settings does, what the hardware is made of and what gets built on top β from LoRaWAN to drones and satellites.
Three words that keep getting mixed upβ
Most arguments about LoRa start with one word being used for different things.
| word | what it really is | who made it |
|---|---|---|
| LoRa | A modulation, the physical layer. A way of turning bits into a radio wave. It knows nothing about addresses, networks or encryption β only "what a byte sounds like on air" | Developed by the French company Cycleo, which Semtech bought in 2012. Chips are made by Semtech and its licensees |
| LoRaWAN | A protocol and architecture on top of LoRa. Device addresses, keys, gateways, a network server, device classes, adaptive data rate. An open standard | The LoRa Alliance, a consortium of companies |
| "raw" LoRa | Bytes over radio with no protocol on top. This is how Meshtastic and Reticulum work: they take only the modulation and build their own network | Anyone |
LoRa is the alphabet, LoRaWAN is a language. You can write your own language in that alphabet: Meshtastic, Reticulum, ExpressLRS and hundreds of home-made projects do exactly that. And the other way round: hearing a LoRa signal does not mean understanding what is in it β that depends on the protocol on top.
what the modulation gives
Range and resilience
The signal is read even when it is weaker than the noise. Plus robustness against interference, reflections and frequency offset β all properties of the chirp itself.
what it does not give
No addresses, no encryption
The chip hands over the received chunk of bytes and the signal level β and that is it. Who writes to whom, how to protect it and what to do about collisions is up to the protocol on top.
what it costs
Time and speed
Range is bought with signal duration. That is not an engineering oversight but a straight trade: the longer a symbol sounds, the farther it is heard and the less data gets through.
The physics: what a chirp isβ
Ordinary radio sends bits by changing something in the carrier: amplitude, frequency or phase. The weaker the signal, the harder those changes are to see against the noise. LoRa does it differently β and that is where all of its "magic" lives.
A chirp is a whistle: a signal whose frequency sweeps evenly from the bottom to the top of the allotted band. One whistle is one symbol. The data is encoded in where the whistle starts: it begins somewhere in the middle, climbs to the top of the band, jumps down and runs back up to the starting point. The starting point is the number being sent.
Switching SF on the diagram shows the key point: the higher the SF, the more possible starting points (2SF) β and the longer each symbol lasts. The receiver does not have to catch subtle changes of amplitude or phase; it only has to find where the whistle began. And the whistle is spread over the whole band and the whole symbol time, so a narrow interferer does not kill it, while a frequency offset shifts every symbol equally and is easy to compensate.
How much data is in one whistle
Exactly SF bits. At SF7 the whistle starts from one of 128 positions β 7 bits. At SF12 there are 4096 positions β 12 bits. Not much? Indeed: an SF12 symbol carries a byte and a half and lasts 33 milliseconds.
- SF7 β 27 = 128 positions β 7 bits per symbol
- SF10 β 210 = 1024 positions β 10 bits
- SF12 β 212 = 4096 positions β 12 bits
Where the robustness comes from
The symbol's energy is spread over the whole band and its whole duration. A narrowband interferer spoils only part of the whistle β the rest is enough to find the start. Reflections from buildings arrive late, but the shape of the whistle stays recognisable. And a slow frequency drift shifts all the symbols together, so it can be seen and subtracted.
That is why LoRa lives in cities full of tower blocks and in forests, where narrowband modulations fall apart.
How the receiver pulls the signal out of the noiseβ
The most beautiful part. The receiver does not try to "hear a quiet signal" β it adds up all of the whistle's energy over the whole symbol. Random noise does not add up like that.
How big the gain isβ
The practical measure of that gain is the minimum signal-to-noise ratio at which a symbol can still be read. Negative numbers mean the signal is weaker than the noise:
| SF | required SNR | sensitivity, 125 kHz | in plain words |
|---|---|---|---|
| SF7 | β7.5 dB | β β123 dBm | The signal is already 5β6 times weaker than the noise |
| SF8 | β10 dB | β β126 dBm | Ten times weaker |
| SF9 | β12.5 dB | β β129 dBm | Almost twenty times |
| SF10 | β15 dB | β β132 dBm | Thirty times |
| SF11 | β17.5 dB | β β134.5 dBm | Sixty times |
| SF12 | β20 dB | β β137 dBm | A hundred times weaker than the noise β and still readable |
Sensitivity is for a typical SX127x-family receiver; newer chips do a few decibels better. Exact numbers are in the datasheet of the particular chip.
An ordinary Wi-Fi receiver gives up when the signal drops to about β90 dBm. LoRa at SF12 still works at β137 dBm. A 47 dB difference is a signal 50 thousand times weaker. The price is a speed a hundred thousand times lower.
Spreading factor β the main knobβ
If you turn only one thing in the settings, make it SF. It sets everything: speed, range, time on air and how much battery one message eats.
symbol time T = 2SF / BW β every +1 to SF doubles the symbol time
| SF | symbol | bit rate (125 kHz, CR 4/5) | sensitivity | typical use |
|---|---|---|---|---|
| SF7 | 1.024 ms | 5,469 bit/s | β123 dBm | City, nearby nodes, lots of traffic |
| SF8 | 2.048 ms | 3,125 bit/s | β126 dBm | The default compromise in many home-made projects |
| SF9 | 4.096 ms | 1,758 bit/s | β129 dBm | Suburbs |
| SF10 | 8.192 ms | 977 bit/s | β132 dBm | Villages, hills |
| SF11 | 16.384 ms | 537 bit/s | β134.5 dBm | On a 250 kHz band this is Meshtastic's LongFast |
| SF12 | 32.768 ms | 293 bit/s | β137 dBm | Mountains, long haul, range records |
The rule worth remembering: +1 to SF means a symbol twice as long and roughly +2.5 dB of sensitivity. In free space 2.5 dB is about a third more range. In a city or a forest noticeably less, because there the obstacles matter more than the distance.
It seems logical to set SF12 "so it surely gets through". But time on air grows many times over, so the battery drains faster, the duty-cycle limit is used up in a few messages and β worst of all β a long packet is far more likely to collide with someone else's. In a dense network SF12 often works worse than SF9.
Bandwidth, coding, preambleβ
The other knobs get turned less often, but each has a price β and this is where the answers to "why can't my neighbour hear me" hide.
bandwidth
Wider is faster but deafer
Typical values: 125, 250, 500 kHz. Doubling the bandwidth halves the symbol β and costs about 3 dB of sensitivity, because twice as much noise gets into a wider band.
It is the same trade-off as SF, from the other side. Meshtastic, for example, takes a wide 250 kHz band and compensates with a high SF11.
coding rate
From 4/5 to 4/8
Forward error correction: for every 4 data bits it adds 1 to 4 redundant ones. At 4/5 the packet gets a quarter longer, at 4/8 twice as long.
It saves you from short bursts of interference: an impulse spoiled a few symbols and the code restored them. Against a uniformly weak signal it barely helps: that is SF's job.
preamble
The βwake upβ whistles
Every packet is preceded by a series of identical chirps β typically eight. The receiver latches on to them and synchronises. A longer preamble gives a receiver that only peeks at the air now and then a better chance to wake up in time, but also adds time on air.
sync word
The most common reason for βI hear nothingβ
A byte that splits the air into "private" and "public" networks. Devices with different sync words practically cannot hear each other, even when frequency, bandwidth and SF match. The classic case: LoRaWAN uses one value, most home-made networks another.
Low data rate optimisation is mandatory when a symbol is longer than 16 ms (SF11 and SF12 at 125 kHz). It compensates for crystal drift; if one node has it on and the other off, there will be no link. IQ inversion is the trick LoRaWAN uses to separate directions: devices do not hear each other, only the gateway. Ready-made firmware sets both up by itself; in home-made projects you have to do it by hand.
Time on air: the formula everything follows fromβ
Time on air is not just "how long it flies". It is at once battery consumption, the allowed duty cycle being spent and the probability of colliding with someone else's packet. That is why this quantity decides how many nodes a network can carry.
A packet has four parts: the preamble (typically 8 whistles plus 4.25 sync symbols), the header, the data and the checksum. Everything is counted in symbols rather than bytes β and each symbol lasts its 2SF/BW.
Tpreamble = (8 + 4.25) Γ Tsymbol
ndata = 8 + β (8Β·PL β 4Β·SF + 28 + 16Β·CRC) / (4Β·(SF β 2Β·DE)) β Γ (CR + 4)
Tpacket = Tpreamble + ndata Γ Tsymbol
Here PL is the payload in bytes, CR = 1β¦4 for coding rates 4/5 to 4/8, and DE = 1 when low data rate optimisation is on. Rounding up means the data is always padded to a whole block β which is why one extra byte sometimes costs five whole symbols.
time on air Β· the Semtech formula, live
- time on air
- 2.30 s
- channel bit rate
- 293 bit/s
- symbol time
- 32.768 ms
- pause at a 1 % limit
- 3.8 min
Coding rate 4/5, explicit header, CRC on, 8-symbol preamble. Low data rate optimisation switches on by itself when a symbol is longer than 16 ms.
| payload bytes | SF7 Β· 125 kHz | SF9 Β· 125 kHz | SF11 Β· 250 kHz | SF12 Β· 125 kHz |
|---|---|---|---|---|
| 20 | 57 ms | 185 ms | 330 ms | 1.32 s |
| 50 | 98 ms | 329 ms | 575 ms | 2.30 s |
| 100 | 174 ms | 554 ms | 944 ms | 3.94 s |
| 237 (Meshtastic's ceiling) | 374 ms | 1.17 s | 1.97 s | 8.53 s |
Computed with the formula above: CR 4/5, explicit header, CRC on, 8-symbol preamble. The SF11 Β· 250 kHz column is exactly Meshtastic's LongFast preset.
A full packet at SF12 occupies the air for 8.5 seconds. All that time no node within range can transmit anything. A dozen chatty SF12 nodes β and the air is used up. That is where all of Meshtastic's limits on message length come from, and all the advice "do not use SF12 unless you must".
Link budget: how many decibels you have to spareβ
All radio connectivity comes down to one piece of arithmetic: how much power went out, how much was lost on the way and whether enough is left for the receiver to hear.
margin = transmitter power + antenna gain β path loss β |receiver sensitivity|
A 43.8 dB margin β workable: 10β20 dB is what you reserve for the unexpected.
By default the diagram shows a typical European link: 25 mW (+14 dBm), +2 dBi whips, 10 km line of sight at 868 MHz. The path eats 111 dB and more than forty decibels of margin remain. That looks like a lot. But in the real world it is eaten by terrain, trees, walls, rain and your own body if you hold the device in your hand: the "obstacles" slider shows how fast. So engineers reserve another 10β20 dB for the unexpected β and that is why a calculated hundred kilometres becomes five in practice. The same arithmetic for your own numbers is in the link budget calculator.
what adds decibels
Antenna and height
Antenna gain works both ways β on transmit and on receive. Swapping a stubby antenna for a proper whip easily gives 3β5 dB, that is 40β80 % more range.
what eats them
Everything solid
A wall β 5β15 dB. Trees in leaf β up to 10β20 dB per hundred metres. A human body next to the antenna β a few decibels. A poor cable β a few more.
what deceives
The free-space calculation
The free-space formula knows nothing about the ground. Within a few kilometres above the earth reflections and diffraction kick in, and real losses are usually 10β30 dB higher.
Real range: terrain and the Fresnel zoneβ
The most common disappointment goes like this: "there is line of sight, but no link". The reason is usually the same, and beginners are almost never told about it.
A radio wave does not travel as a thin beam but as a three-dimensional spindle around the straight line. That spindle is the Fresnel zone, and it has to be clear. If a hill, a roof or a row of trees gets into it, the signal drops even when the antennas formally "see" each other.
The practical consequence: raising the antenna by a few metres often gives more than any radio setting. It does not "add power" β it pulls the spindle out from under the obstacle. That is why one node on a hill changes a network more than a dozen on windowsills. The zone radius for your own path is in the Fresnel zone calculator, and the horizon for your masts in the line-of-sight calculator.
Two formulas worth knowing
mid-path zone radius, m β 8.66 Γ β(d / f)
d β distance in km, f β frequency in GHz
horizon, km β 4.12 Γ (βhβ + βhβ)
h β antenna heights in metres
Two 10-metre masts see each other at most 26 km apart β already allowing for the radio wave bending slightly around the earth. Raise one of them to a hundred metres and the horizon moves out to 54 km.
What to expect in reality
| where the node stands | real range |
|---|---|
| Dense city buildings | 0.5β2 km |
| Suburbs, low-rise | 2β6 km |
| Village, fields, line of sight | 8β20 km |
| Node on a hill or tower | 30β80 km |
| Balloon or mountain to the ground | hundreds of km |
The range records you read about are almost always made from a great height and in the slowest mode. They are honest results β just not about a node on a balcony.
Hardware: what is actually on the boardβ
A LoRa modem is one transceiver chip plus support parts. All the chirp "magic" is baked into silicon: the microcontroller only says "send these bytes at this SF" and gets the finished result back.
Chip familiesβ
| chip | range | features | where you find it |
|---|---|---|---|
| SX1276 / SX1278 | 137β1020 MHz | The classic everything grew up on. Receive β 10 mA, transmit up to +20 dBm | RFM95, older Heltec and TTGO boards, most home-made builds |
| SX1262 / SX1268 | 150β960 MHz | The next generation: receive β 4.6 mA, transmit up to +22 dBm, better sensitivity and immunity to adjacent signals | Modern boards, E22 modules, almost everything new |
| SX1280 | 2.4 GHz | LoRa in the worldwide band. Faster but noticeably shorter range. Can measure distance by time of flight | ExpressLRS for drones, local sensors |
| LR1110 / LR1120 | sub-GHz; LR1120 also 2.4 GHz | A transceiver with built-in GNSS and Wi-Fi scanning for geolocation without a separate GPS. Its sibling LR1121 has the same multi-band radio but no geolocation | Trackers where power saving matters |
Current figures are approximate, from datasheets; the details depend on supply voltage and amplifier mode.
What one message costs
Transmitting at full power draws about 120 mA. Multiply by time on air:
- SF7 β 374 ms β about 0.012 mAh per packet
- SF12 β 8.53 s β about 0.28 mAh per packet
So a 2000 mAh battery theoretically gives about 160 thousand packets at SF7 β and only seven thousand at SF12. And that is before the microcontroller, GPS and constant listening.
Two details that break the link quietly
Temperature-compensated oscillator (TCXO). At SF11 and SF12 the symbol is long, and an ordinary crystal can drift with temperature so far that the receiver loses sync. Long-range boards fit a TCXO β which is why cheap modules sometimes work at low SF and stay silent at high SF.
Channel activity detection (CAD). A mode in which the chip checks in a few milliseconds whether there is a preamble on air, spending almost no energy. "Listen before talk" is built on it β in Meshtastic among others.
Switching on transmit without an antenna means reflecting all the power back into the amplifier. It does not like that and may burn out. This is not superstition but the first rule of working with any radio.
The antenna β the cheapest upgradeβ
No setting gives as much as a proper antenna, correctly oriented and raised. And no mistake costs as much as a wrong one.
The practical consequence of the "doughnut" radiation pattern: a drone right overhead or a node one floor up can be heard worse than the same node a kilometre to the side. And one more thing: the antennas at both ends must be oriented the same way β vertically. One vertical and the other horizontal costs about 20 decibels for nothing. The whip and radial lengths for your frequency are in the Ground Plane antenna calculator.
free
Put it higher
Every metre of height pulls the Fresnel zone out from under obstacles and pushes the horizon back. The cheapest decibels in the world.
almost free
Stand it upright
The same polarisation at both ends. An antenna laid on its side "so it does not stick out" costs more than any other mistake.
costs money
A directional antenna
For a fixed link between two points a Yagi gives +8β12 dB and cuts interference from the sides. Useless for a moving node: it has to be aimed.
1. Transmit without an antenna. 2. Fit an antenna for the wrong band β a 433 MHz one on 868 MHz or the other way round. 3. Run two metres of cheap thin cable and wonder where half the power went.
LoRaWAN: what gets built on topβ
The most widespread protocol on top of LoRa. It is built for one scenario: millions of cheap sensors, each waking a few times a day, saying one sentence and going back to sleep for years.
The key idea of the architecture: a device knows nothing about gateways and does not "connect" anywhere. It simply shouts into the air. Whoever heard it forwards it, and the server drops duplicates and works out who it is dealing with. So a device can move between cities without noticing: there is nothing to break, because there is no connection.
class A
The most frugal
The device transmits whenever it wants and then briefly opens its receiver twice β about one and two seconds later. Outside those windows it is deaf, so the server cannot reach it first and waits for the next uplink. Runs for years on a battery.
class B
The compromise
Gateways send regular beacons, the device syncs to them and opens extra receive windows on a schedule. It can be reached with a predictable delay β at the cost of higher consumption.
class C
Always on
The receiver is on all the time, paused only for the device's own transmissions. Minimal latency, maximal consumption. For mains-powered devices: meters, locks, lighting.
Security and adaptationβ
Two keys, not one
LoRaWAN encryption is AES-128, but there are two keys: the network key checks the packet's integrity and that it belongs to the network, the application key encrypts the content itself. So the network operator sees that a packet is genuine but not what is inside.
A device joins the network either through a join procedure with key exchange or with pre-provisioned keys β the second option is simpler and less secure.
Adaptive data rate
The server sees what margin packets arrive with and tells the device to lower its SF if the link is solid. The gain is twofold: the device saves battery, the network saves airtime.
That is why a stationary sensor's SF slides down by itself over time, while a moving one stays high β the server cannot keep up.
A gateway cannot listen and transmit at the same time, and it is subject to the same duty-cycle limits. So in LoRaWAN a packet "down" costs much more than a packet "up". Networks where every sensor waits for an acknowledgement hit this ceiling long before any other.
Meshes, drones, satellitesβ
LoRaWAN is the best known, but far from the only thing built on this modulation.
networks without infrastructure
Meshtastic and Reticulum
They take only the modulation and build their own network on top, without gateways or servers. Meshtastic is a ready-made chat with flood relaying, Reticulum a full network stack with cryptographic addressing. Both run on the same cheap boards.
drone control
ExpressLRS
An unexpected use: the same modulation turned inside out. Instead of range at the cost of time β minimal latency: tiny packets of a few bytes, hundreds of times a second, at low SF and often on 2.4 GHz. The same hardware, the opposite trade-off.
distance measurement
Ranging on 2.4 GHz
2.4 GHz chips can measure a signal's round-trip time, that is the distance between two nodes to within metres. This is used for indoor positioning, where GPS does not work.
links from space
Satellites and balloons
Several operators receive LoRa straight from low orbit: a sensor in a field talks to a satellite with no ground infrastructure at all. There is a separate frequency-hopping mode for this, which copes better with Doppler shift and a crowded channel.
One modulation serves both a sensor that speaks twice a day on a battery lasting ten years and a drone controller with a few milliseconds of latency. The difference lies entirely in the settings and the protocol on top. So the question "what is LoRa's range / speed" has no answer until you say which trade-off you mean.
Regulation: duty cycle and powerβ
LoRa lives in licence-free bands β the same ones used by baby monitors, weather stations and gate remotes. Nobody pays for access, but there are rules, and they are built right into how devices behave.
The main European rule is the duty cycle: the share of time you are allowed to transmit. Typically it is one per cent. That sounds harmless until you count it in seconds: after every transmission you must stay silent 99 times longer than you transmitted.
This is not theory but firmware behaviour: the stack counts the airtime used and simply does not send the next packet until the pause is over. So "the message vanished" sometimes means "the limit is used up" rather than "no signal". The pause for any packet is shown by the time-on-air calculator above.
| what is sent | time on air | pause at a 1 % limit |
|---|---|---|
| 20 bytes at SF7 | 57 ms | 5.6 s |
| 237 bytes at SF7 | 374 ms | 37 s |
| 50 bytes at SF12 | 2.30 s | 3.8 min |
| 237 bytes at SF12 | 8.53 s | 14 min |
How it looks by regionβ
| region | band | typical power | how airtime is limited |
|---|---|---|---|
| Europe, including Ukraine | 868 MHz | 14 dBm (25 mW) | Duty cycle: typically 1 %, up to 10 % and higher power on one narrow sub-band |
| Europe | 433 MHz | 10 dBm | Duty cycle too; the band is narrower and noisier, but the longer wave bends around obstacles better |
| USA, Canada | 902β928 MHz | up to 30 dBm | No duty cycle, but frequency hopping and limits on dwell time per channel |
| Asia, Oceania | 920β923 MHz | depends on the country | "Listen before talk" is often required |
The exact limits on power, duty cycle and allowed sub-bands are set by national rules and they change. Before adding an amplifier or turning up the power, check them against the regulations in force. Buy the board for your band too: the "wrong" frequency cannot be fixed in the settings.
The limits: collisions and network capacityβ
The last thing people usually keep quiet about: LoRa has no conductor. Devices transmit whenever they like, and now and then they speak at the same time.
This is called the capture effect, and it is what saves real networks: in real life signals are rarely of equal strength. But it does not cancel the statistics β the more devices, the more collisions, and they grow faster than linearly.
How many nodes one channel carries
For uncoordinated networks the classic ALOHA estimate applies: about 18 % of channel time can be used productively; beyond that collisions eat more than the extra load adds.
For SF12 and a 100-byte packet (3.94 s): an hour has 3600 seconds of channel time, about 648 of them useful β roughly 160 packets per hour. If every node speaks once an hour, that is about 160 nodes per channel. At SF7 the same channel carries twenty times more.
Why meshes hit the ceiling sooner
In LoRaWAN a packet sounds on air once, after that a wire carries it. In a mesh every relaying node transmits the same packet again. One message in a network with three levels of relaying means five to seven real transmissions.
So a LoRa mesh is always a compromise: it gives coverage without infrastructure but pays for it by using the same scarce airtime many times over.
Every decision in LoRa comes down to one thing: the air is shared and slow. Hence the ceiling on packet size, the limit on hops, the advice to use a lower SF, the duty cycle, and the reason networks with thousands of sensors are designed so each one speaks as rarely as possible. These are not flaws of the technology β they are its price for range.
Glossaryβ
- Chirp β a whistle: a signal whose frequency sweeps evenly through the whole band. One chirp is one symbol.
- CSS β Chirp Spread Spectrum, the modulation itself. What people call LoRa.
- SF Β· spreading factor β 7β12. How many bits a symbol carries and at the same time how long it is. Each +1 doubles the time.
- BW Β· bandwidth β 125 / 250 / 500 kHz. Wider is faster, but 3 dB deafer with every doubling.
- CR Β· coding rate β 4/5 to 4/8. Redundant code against short interference.
- Preamble β a series of identical chirps at the start of a packet that the receiver latches on to.
- Sync word β a byte that separates "private" and "public" networks. Different values β nodes do not hear each other.
- Time on air β how long a packet actually occupies the air. The key quantity in all of LoRa.
- SNR β how much stronger the signal is than the noise. In LoRa it can be negative β and that is normal.
- RSSI β the absolute received signal level in dBm. Together with SNR it shows link quality.
- Sensitivity β the weakest signal the receiver can still decode: from β123 to β137 dBm depending on SF.
- Link budget β power plus antennas minus losses minus sensitivity. How many decibels are to spare.
- Fresnel zone β the spindle around the straight line that has to be clear. Line of sight alone is no guarantee.
- Duty cycle β the share of time you may transmit. Typically 1 % in Europe.
- CAD β a cheap mode in which the chip checks for a preamble on air, spending almost no energy.
- LoRaWAN β a protocol and architecture on top of LoRa: gateways, a network server, classes, two keys, adaptive data rate.
Sensitivity and current figures are typical values from Semtech datasheets; time on air is computed with the Semtech formula. Before relying on them in practice, check them against your chip's documentation and your region's rules.
- Meshtastic up close β a ready-made chat on "raw" LoRa: managed flooding, channels, node roles
- Reticulum up close β a network stack where the address is a key and LoRa is just one of the carriers
- Four internets β Reticulum, I2P, Yggdrasil and Nostr side by side: who sits on which floor
