Most wireless communication choices in electronics come with a trade-off. Bluetooth gives you low power consumption but a range measured in metres. Wi-Fi gives you high data throughput but requires a router and consumes significant power. GSM and 4G modules provide nationwide coverage but incur high per-message costs and draw large amounts of current. For sensor networks, agriculture monitoring, asset tracking, and remote data logging, none of these options fits cleanly.
LoRa fills that gap. It transmits small packets of data over several kilometres on a single battery charge, without a SIM card, a router, or a subscription fee. Understanding how to run a LoRa module range test and interpret the results is the first practical skill in building long-range wireless sensor systems.
This guide covers how LoRa works, how the SX1278 module operates, how to set up a basic transmitter and receiver pair on Arduino or ESP32, and how to conduct a structured range test that produces reliable, repeatable results.
Sourcing components? The ThinkRobotics RF & LoRa modules collection includes SX1278 modules, supporting electronics, and compatible development boards for long-range communication builds.
What Is LoRa and How Does It Work
LoRa stands for Long Range. It is a wireless modulation technique developed by Semtech based on Chirp Spread Spectrum (CSS) technology. Unlike standard digital radio, which transmits at a fixed carrier frequency, LoRa spreads the signal across a wide frequency band using a chirp — a signal that continuously sweeps up or down in frequency over time.
This spreading technique gives LoRa two properties that make it exceptional for low-power, long-range applications.
- Below-noise detection: A LoRa receiver can decode signals that are up to 20 dB below the noise floor — a standard receiver requires the signal to be above the noise to decode it. This directly translates to greater range.
- Interference resistance: The spread-spectrum nature of LoRa makes it resistant to narrowband interference from nearby radio devices.
The trade-off is data rate. LoRa is not designed for streaming audio, video, or large file transfers. It efficiently transmits small packets — precisely what sensor networks need. A temperature reading, a GPS coordinate, a moisture level, or a door open event all fit comfortably within a LoRa packet.
LoRa vs LoRaWAN: LoRaWAN is the network layer built on top of LoRa modulation. It defines how multiple end devices communicate with gateways, how gateways connect to a network server, and how that server routes data to applications. For a simple point-to-point sensor link without a network server, you use raw LoRa modulation without the full LoRaWAN stack.
The SX1278 Module
The SX1278 is a LoRa transceiver chip made by Semtech. It is one of the most widely used LoRa chips in the maker and IoT communities because it operates in the 433 MHz frequency band, which is legal for unlicensed use in India under the Wireless Planning and Coordination (WPC) wing guidelines for short-range devices.
⚠ Important for India: The 868 MHz band (used by LoRaWAN in Europe) and the 915 MHz band (used in North America) are not approved for unlicensed operation in India. The 433 MHz SX1278 is the correct hardware for legal, unlicensed long-range communication within India.
The SX1278 communicates with a microcontroller over SPI. It operates at 3.3V logic, which means it connects directly to an ESP32 without level shifting. Connecting it to a 5V Arduino Uno requires a logic-level shifter on the SPI lines to prevent damaging the module.
Radio ParametersThese four parameters directly affect range and reliability of your LoRa link:
Wiring the SX1278 to ESP32
The SX1278 module uses a standard SPI interface. The connections below apply to a standard 38-pin ESP32 devkit.
| SX1278 Pin | ESP32 Pin | Notes |
|---|---|---|
| VCC | 3.3V | Do NOT connect to 5V or VIN |
| GND | GND | Common ground |
| SCK | GPIO 18 | SPI Clock |
| MISO | GPIO 19 | SPI Master In Slave Out |
| MOSI | GPIO 23 | SPI Master Out Slave In |
| NSS (CS) | GPIO 5 | Chip Select |
| DIO0 | GPIO 26 | Interrupt / TX Done |
| RST | GPIO 14 | Hardware Reset |
⚡ Do not connect VCC to the 5V or VIN pin. The SX1278 operates at 3.3V — connecting it to 5V will permanently damage the module. Also confirm your specific module's pinout against its datasheet, as some breakout boards arrange pins differently. Always attach the antenna before powering the circuit — transmitting without an antenna reflects power into the chip and can damage the output stage.
Want a simpler setup? The ESP32 + SX1278 combo development board integrates Wi-Fi, LoRa, and Bluetooth with an onboard OLED display — no manual SPI wiring required.
Installing the Required Library
Open the Arduino IDE with the ESP32 board package installed. Open the Library Manager and search for LoRa by Sandeep Mistry. Install the latest stable version. This library provides a clean, readable API for the SX1278 and compatible LoRa modules and works with both Arduino and ESP32 hardware.
Open the Arduino IDE → go to Tools → Manage Libraries
Search for
LoRaby Sandeep Mistry and click InstallIf using ESP32, ensure the ESP32 board package is installed via File → Preferences → Additional Board Manager URLs
Upload the transmitter sketch to one ESP32, the receiver sketch to a second ESP32
Transmitter Firmware
Upload this sketch to the first ESP32, which acts as the transmitter node.
#include <SPI.h>
#include <LoRa.h>
// SX1278 pin definitions for ESP32
#define SS_PIN 5
#define RST_PIN 14
#define DIO0_PIN 26
int packetCount = 0;
void setup() {
Serial.begin(115200);
while (!Serial);
LoRa.setPins(SS_PIN, RST_PIN, DIO0_PIN);
// Initialise at 433 MHz — correct for India (unlicensed band)
if (!LoRa.begin(433E6)) {
Serial.println("LoRa initialisation failed. Check wiring.");
while (1);
}
// Radio parameters for range test
LoRa.setSpreadingFactor(10); // SF10: good balance of range & speed
LoRa.setSignalBandwidth(125E3); // 125 kHz bandwidth
LoRa.setCodingRate4(8); // CR 4/8: maximum error correction
LoRa.setTxPower(17); // 17 dBm transmit power
Serial.println("LoRa transmitter ready.");
}
void loop() {
packetCount++;
Serial.print("Sending packet: ");
Serial.println(packetCount);
LoRa.beginPacket();
LoRa.print("Packet: ");
LoRa.print(packetCount);
LoRa.endPacket();
// Wait 3 seconds between transmissions
delay(3000);
}
Receiver Firmware
Upload this sketch to the second ESP32, which acts as the receiver and RSSI logger. The receiver prints the packet content, RSSI (Received Signal Strength Indicator), and SNR (Signal-to-Noise Ratio) for every received packet — these are the two primary metrics in any LoRa range test.
#include <SPI.h>
#include <LoRa.h>
#define SS_PIN 5
#define RST_PIN 14
#define DIO0_PIN 26
void setup() {
Serial.begin(115200);
while (!Serial);
LoRa.setPins(SS_PIN, RST_PIN, DIO0_PIN);
if (!LoRa.begin(433E6)) {
Serial.println("LoRa initialisation failed. Check wiring.");
while (1);
}
// Must match transmitter parameters exactly — any mismatch prevents decoding
LoRa.setSpreadingFactor(10);
LoRa.setSignalBandwidth(125E3);
LoRa.setCodingRate4(8);
Serial.println("LoRa receiver ready. Waiting for packets...");
}
void loop() {
int packetSize = LoRa.parsePacket();
if (packetSize) {
String received = "";
while (LoRa.available()) {
received += (char)LoRa.read();
}
int rssi = LoRa.packetRssi();
float snr = LoRa.packetSnr();
Serial.print("Received: ");
Serial.print(received);
Serial.print(" | RSSI: ");
Serial.print(rssi);
Serial.print(" dBm | SNR: ");
Serial.print(snr);
Serial.println(" dB");
}
}
How to Conduct a LoRa Range Test
A structured range test produces results you can trust and replicate. An unstructured walk with a receiver gives you anecdotal impressions.
Select the Right Test Environment
The most useful test for practical deployments is an open field test with no buildings, trees, or metal structures between the transmitter and receiver. This gives you the theoretical maximum range for your hardware configuration and a baseline to compare against real deployment environments.
An urban or suburban test is equally valuable but yields lower-range numbers due to building attenuation, reflections, and interference. Both tests are worth running if your actual deployment is urban.
Fix the Transmitter, Walk the Receiver
Place the transmitter node at a fixed elevated position — a tripod, a rooftop edge, or a first-floor window ledge all work. Elevation above ground level has a disproportionate effect on LoRa range because ground-level obstacles attenuate the signal heavily at 433 MHz.
Walk the receiver away from the transmitter in a straight line. Open the Serial Monitor on a laptop connected to the receiver ESP32, or log RSSI values to an SD card module if you do not want to carry a laptop.
Record RSSI and SNR at measured distance intervals — a useful step size is every 100 to 200 metres in open terrain. Note GPS coordinates at each measurement point if you have a GPS module, or use a measuring app on your phone for distance measurements.
Interpreting RSSI and SNR
RSSI values for LoRa are negative numbers measured in dBm. A value of −90 dBm is a stronger signal than −120 dBm.
SNR (Signal-to-Noise Ratio) indicates how far above or below the noise floor the signal is arriving. Positive SNR means the signal is above the noise — the normal operating condition. A negative SNR means the signal is below the noise floor but is still recovered by the LoRa CSS demodulator. Packets are typically decodable down to −10 dB SNR at SF10.
Real-World Range Expectations in India
| Environment | Settings | Expected Range | Packet Loss |
|---|---|---|---|
| Open agricultural field | SF10, 125 kHz, 17 dBm, ¼-wave antenna | 3 – 7 km | < 5% |
| Urban (buildings between nodes) | SF10, 125 kHz, 17 dBm | 500 m – 2 km | Varies with density |
| Open field, optimised | SF12, directional antenna, 20 dBm | 10+ km | < 5% in favourable terrain |
Datasheet reference: For a precise technical breakdown of how Spreading Factor, Bandwidth, and Coding Rate interact to determine receiver sensitivity and achievable range, the Semtech SX1278 datasheet provides the full receiver sensitivity tables and link budget calculations directly from the chip manufacturer.
Common Issues During Testing
No packets received despite being in close range
Confirm the frequency is set identically on both modules (433E6 for India). Confirm Spreading Factor, Bandwidth, and Coding Rate match exactly between transmitter and receiver — any mismatch prevents decoding entirely. Confirm the antenna is attached to both modules.
Packets received inconsistently
Check that the antenna is the correct length for 433 MHz. A quarter-wave monopole antenna at 433 MHz is approximately 17.3 cm long. A poorly matched antenna dramatically reduces both transmit power and receive sensitivity. Confirm that the module is at 3.3V and not experiencing voltage drops due to a weak power supply.
RSSI drops sharply beyond a short distance
Antenna orientation matters. Holding the receiver module flat against your body or pointing the antenna toward the ground reduces effective gain. Hold the receiver upright with the antenna vertical and away from your body for consistent readings.
Further reading: For practical LoRa range testing methodology, antenna selection guidance, and real-world deployment case studies, the The Things Network community documentation on LoRa and LoRaWAN is one of the most thorough, freely available references.
Range Test Checklist
- Frequency set to
433E6on both transmitter and receiver - Spreading Factor, Bandwidth, and Coding Rate match exactly on both nodes
- Antenna attached and correct length (~17.3 cm for 433 MHz quarter-wave)
- Module powered at 3.3V — not from a weak or shared regulator
- Transmitter elevated above ground level (rooftop, tripod, window ledge)
- Receiver held upright with antenna vertical and away from body
- RSSI and SNR logged at measured distance intervals (100–200 m steps)
- GPS module or measurement app used to record exact distances
- Both TX and RX Serial Monitor outputs checked at close range first
- Library version is the latest stable release of LoRa by Sandeep Mistry
Legal and Regulatory Notes for India
The 433 MHz band falls under the Short Range Device rules governed by the Wireless Planning and Coordination (WPC) wing of the Ministry of Communications, Government of India. Unlicensed operation is permitted for low-power short-range devices within defined power limits. The SX1278 operating at up to 17 dBm (50 mW) falls within these limits for experimental and non-commercial use.
⚠ For commercial deployment of a LoRa network in India, consult the current WPC regulations and consider using a registered LoRaWAN network operator. Commercial networks on approved frequencies require type approval for the radio hardware under the Indian Wireless Telegraphy Act.
Frequently Asked Questions
No. A gateway is only required when using the full LoRaWAN network stack with a network server. For a direct point-to-point link between two SX1278 modules, both running raw LoRa firmware without a network stack, no gateway is needed. The two modules communicate directly with each other over the air exactly as shown in the firmware examples in this guide.
The SX1276 and SX1278 are closely related chips from Semtech. The SX1276 supports the 433 MHz, 868 MHz, and 915 MHz bands. The SX1278 supports 433 MHz and 470 MHz. Both work at 433 MHz for India and are compatible with the same Arduino LoRa library. The firmware and wiring are identical for both.
Higher spreading factors increase the time a packet spends in the air, called Time on Air (ToA). A packet at SF12 takes roughly 16 times longer to transmit than the same packet at SF7. Since the radio draws its highest current during transmission, longer Time on Air directly increases energy consumption per packet. For battery-powered nodes where range is not the limiting constraint, use the lowest spreading factor that reliably reaches the gateway or receiver to maximise battery life.
Yes, within limits. Two separate LoRa links on the same frequency and spreading factor will collide if they transmit simultaneously. Using different spreading factors for different links provides orthogonality — SF7 and SF10 transmissions on the same frequency do not interfere with each other. This is one of the core capacity advantages of LoRa networks with multiple end devices.
A quarter-wave monopole antenna is the simplest and most common choice. At 433 MHz, the quarter wavelength is approximately 17.3 cm (speed of light divided by frequency, divided by four). Cut a solid copper wire to this length, solder it to the antenna pad on the SX1278 module, and mount it vertically for omnidirectional coverage. A full-wave antenna at 34.6 cm provides approximately 3 dB more gain than the quarter-wave version without requiring a ground plane, which is useful for extending range during testing.
Conclusion
A LoRa module range test is not just a performance benchmark — it is the step that converts theoretical specifications into actual knowledge about what your hardware will do in your specific deployment environment. RSSI and SNR values recorded at measured distances give you the link budget data needed to position gateways, select antenna heights, and predict coverage before a project goes into production.
The SX1278 at 433 MHz is the correct starting point for LoRa development in India, both for legal reasons and for practical range performance. Get the transmitter and receiver pair working at close range first. Then systematically walk the range test, log the values, and let the data tell you what your system can do.
Build Your Long-Range IoT System
SX1278 modules, compatible antennas, ESP32 boards, and everything you need — shipped fast across India.