15 LoRaWAN Practice Exercises
15.1 Learning Objectives
By completing these exercises, you will be able to:
- Calculate LoRaWAN range, airtime, and duty cycle limits for different spreading factors and environments
- Design ADR strategies that optimize battery life for stationary and mobile deployment scenarios
- Evaluate and justify device class selection (A, B, C) based on latency, power, and application constraints
- Architect multi-gateway deployments balancing coverage redundancy, capacity, and cost
- Diagnose common LoRaWAN deployment failures including frame counter resets, ADR misconfiguration, and duty cycle violations
Key Concepts
- Spreading Factor Calculation: Mathematical process of determining optimal SF given target range, link budget, and duty cycle constraints for a deployment scenario.
- Battery Life Formula: Energy budget calculation combining average current draw (sleep + TX + RX weighted by duty cycle) to predict battery longevity in years.
- Coverage Planning: Iterative process of gateway placement, link budget verification, and coverage overlap analysis to achieve target service area.
- Duty Cycle Budget: Per-channel transmit time allocation ensuring regulatory compliance while meeting application message rate requirements.
- Frame Counter Management: Persistent storage and recovery of uplink/downlink frame counters across device reset cycles to prevent authentication failures.
- OTAA Join Procedure: Step-by-step process of device activation including join request construction, DevNonce generation, and session key derivation from AppKey.
- Troubleshooting Methodology: Systematic approach to diagnosing LoRaWAN issues including RF path analysis, network server log review, and ADR state inspection.
These practice exercises cover LoRaWAN concepts from basic architecture to advanced deployment scenarios. Each exercise builds practical skills like calculating airtime, choosing spreading factors, and designing gateway placement. Working through these problems prepares you for real LoRaWAN project planning.
“Time to put your LoRaWAN knowledge to the test!” Sammy the Sensor said. “These exercises are like real-world puzzles. Can you figure out where to place gateways on a 100-acre farm? Can you calculate whether SF7 or SF12 gives better battery life for your sensor? The only way to learn is by doing the math yourself!”
“My favorite exercise is gateway placement,” Lila the LED said. “You have to balance coverage area, redundancy, and cost. Putting one gateway in the center of a farm is cheap but risky – if it fails, everything goes dark. Two overlapping gateways cost more but provide automatic backup. Finding the sweet spot is the fun part!”
Max the Microcontroller added, “The spreading factor calculations are really practical. At SF7, you can send hundreds of messages per hour under duty cycle limits. At SF12, only about 14. If your sensor needs to report every 5 minutes, you better hope ADR keeps it on SF7 or SF8! These exercises teach you to plan for worst-case scenarios.”
“Battery life calculations are my specialty,” Bella the Battery said. “You need to account for sleep current, wake-up time, transmission duration at each spreading factor, and the number of messages per day. A small change in spreading factor can mean the difference between three years and ten years of battery life. Try the exercises and see for yourself!”
15.2 Exercise 1: LoRaWAN Range Testing and Optimization
Objective: Calculate how environmental factors and spreading factors affect LoRaWAN range in real-world deployments
How much range do we actually get with different spreading factors?
The Friis equation for path loss is:
\[P_{\text{RX}} = P_{\text{TX}} + G_{\text{TX}} + G_{\text{RX}} - 20\log_{10}(d) - 20\log_{10}(f) - 32.44\]
Rearranging for maximum distance with minimum required SNR:
\[d_{\text{max}} = 10^{\frac{P_{\text{TX}} + G_{\text{TX}} + G_{\text{RX}} - S_{\text{RX}} - 20\log_{10}(f) - 32.44}{20}}\]
For LoRaWAN at 868 MHz with \(P_{\text{TX}} = 14\text{ dBm}\), \(G = 2\text{ dBi}\) each:
SF7 (\(S_7 = -123\text{ dBm}\)): \[d_7 = 10^{\frac{14 + 2 + 2 - (-123) - 20\log_{10}(868) - 32.44}{20}} = 10^{\frac{141 - 58.77 - 32.44}{20}} = 10^{2.49} \approx \mathbf{309\text{ km (free-space)}}\]
SF12 (\(S_{12} = -137\text{ dBm}\)): \[d_{12} = 10^{\frac{14 + 2 + 2 - (-137) - 58.77 - 32.44}{20}} = 10^{\frac{155 - 91.21}{20}} = 10^{3.19} \approx \mathbf{1549\text{ km (free-space)}}\]
Range ratio: \(\frac{1549}{309} = 5.0\times\) — SF12 provides 5x the free-space range of SF7. These theoretical distances assume zero obstructions; real-world urban environments with buildings, vegetation, and multipath reduce ranges to approximately 2 km (SF7) and 10-15 km (SF12), with the SF12/SF7 advantage shrinking to 2-3x in practice.
Tasks:
- Using range estimation principles, calculate the maximum range for:
- Urban environment with SF7 vs SF12
- Rural environment with standard antenna (2 dBi) vs high-gain antenna (6 dBi)
- Indoor environment with different TX power settings (14 dBm vs 20 dBm)
- Document the trade-offs: For each scenario, note the airtime (from spreading factor tables) and calculate how many messages per hour you can send while staying under 1% duty cycle limit (36 seconds per hour)
- Design a sensor deployment: You have 50 soil moisture sensors to deploy across a 100-acre farm. Determine optimal SF settings and gateway placement to achieve 5-year battery life
Expected Outcome:
- Understanding that SF12 provides approximately 5x more range than SF7 in free-space (2-3x in practice) but uses 24-32x more airtime
- Recognition that duty cycle limits (1% EU, 4% US) constrain message frequency at higher SFs
- Practical gateway placement strategy balancing coverage and power consumption
Solution Hints:
- SF7 range: ~2 km urban, SF12 range: ~15 km rural
- At SF7 (56 ms airtime), 1% duty cycle allows ~640 messages/hour
- At SF12 (1320 ms airtime), 1% duty cycle allows only ~27 messages/hour
- For 100 acres (~0.4 km2), one gateway with 2 km radius provides full coverage
15.3 Exercise 2: Adaptive Data Rate (ADR) Simulation
Objective: Analyze how ADR dynamically optimizes spreading factor based on signal quality and calculate the resulting battery life improvements
Tasks:
- Scenario setup: Simulate three LoRaWAN end devices at different distances from gateway:
- Device A: 500m away (strong signal, RSSI -80 dBm)
- Device B: 3 km away (medium signal, RSSI -110 dBm)
- Device C: 10 km away (weak signal, RSSI -130 dBm)
- Manually determine optimal SF for each device using the rule: RSSI > -100 dBm -> SF7, RSSI -100 to -120 dBm -> SF10, RSSI < -120 dBm -> SF12
- Calculate battery life improvement: Using airtime values from the chapter (SF7: 56ms, SF10: 370ms, SF12: 1320ms), compute how much longer Device A’s battery lasts compared to if all devices used SF12
- Test ADR response: What happens if Device A moves from 500m to 5km? How many uplink messages before network server adjusts SF?
Expected Outcome:
- Device A uses SF7 (56ms airtime), Device B uses SF10 (370ms), Device C uses SF12 (1320ms)
- Device A battery lasts 23x longer than if forced to SF12
- Understanding that ADR takes 20-30 uplinks to converge on optimal SF
- Recognition that mobile devices shouldn’t use ADR (signal strength changes too quickly)
Solution Calculation:
Battery life comparison for Device A:
- With SF12: 1320ms airtime per message
- With SF7: 56ms airtime per message
- Ratio: 1320/56 = 23.6x longer battery life with SF7
ADR convergence:
- Default ADR needs 20 uplinks to calculate optimal SF
- At 1 uplink/15 minutes: 20 x 15 = 300 minutes = 5 hours
- During movement, SF may oscillate as signal changes
15.4 Exercise 3: LoRaWAN Class Comparison for Use Cases
Objective: Evaluate and justify device class selection (A, B, C) based on application requirements for latency, power, and operational constraints
Tasks:
- Analyze three IoT scenarios:
- Smart water meter: Sends reading once per hour, never needs downlink commands, must run 10 years on battery
- Smart street light: Needs to turn on/off within 5 seconds of command, plugged into mains power
- Industrial valve actuator: Sends status every 10 minutes, must respond to emergency close command within 2 minutes, battery-powered with solar charging
- For each scenario, determine:
- Which LoRaWAN class (A, B, or C)?
- Estimated power consumption (use Class A: 15 uA sleep, Class B: 50 uA, Class C: 15 mA continuous RX)
- Downlink latency (Class A: minutes-hours, Class B: seconds-minutes via beacon windows, Class C: <1 second)
- Calculate battery life: If device sends 50-byte message with SF10 (370ms airtime), compute battery life for 2000 mAh battery:
- Water meter (Class A, 1 msg/hour)
- Valve actuator (Class B, 6 msg/hour with ping slot every 128 seconds)
Expected Outcome:
- Water meter -> Class A (10+ year battery life)
- Street light -> Class C (mains powered, instant response)
- Valve actuator -> Class B (2-3 year battery, 2-minute response acceptable)
- Understanding power consumption trade-offs between listening modes
Solution Table: | Scenario | Class | Downlink Latency | Battery Life | |———-|——-|——————|————–| | Water meter | A | 1 hour (next uplink) | 10+ years | | Street light | C | <1 second | N/A (mains) | | Valve actuator | B | 2 minutes (ping slot) | 2-3 years |
15.5 Exercise 4: LoRaWAN Gateway Coverage Planning
Objective: Design a multi-gateway deployment for reliable coverage
Tasks:
- Campus deployment scenario: Deploy LoRaWAN network for university campus (1 km x 1 km) with:
- 200 parking sensors (Class A, outdoor, SF7-SF10)
- 50 building environmental sensors (Class A, indoor, SF10-SF12)
- 20 smart locks (Class B, indoor, must respond within 30 seconds)
- Calculate minimum gateway count:
- Outdoor range: 2 km radius per gateway (SF7-SF10)
- Indoor penetration: -10 dB loss through walls (reduces range by ~50%)
- Overlap requirement: Every end device must reach at least 2 gateways (redundancy)
- Determine gateway placement: Sketch campus map and mark gateway locations to achieve:
- 100% outdoor coverage with 2x redundancy
- 90%+ indoor coverage (acceptable dead zones in basements)
- Load balancing (no gateway handling >100 devices)
- Capacity planning: Gateway supports 8 channels x 6 SFs = 48 concurrent transmissions. With 270 devices sending avg 1 msg/5 min, calculate channel utilization
Expected Outcome:
- Minimum 4-6 gateways needed for 1 km2 campus with redundancy
- Strategic placement at building rooftops for maximum coverage
- Understanding that indoor sensors need higher SF -> longer airtime -> more gateway capacity consumed
- Channel utilization stays <30% to avoid congestion
Solution Approach:
Gateway placement strategy:
1. Place first gateway at campus center (covers ~3 km2 outdoor)
2. Add 3 gateways at corners for 2x redundancy
3. Add 1-2 gateways inside large buildings for indoor coverage
Capacity calculation:
- 270 devices x 1 msg/5 min = 54 msgs/min = 0.9 msgs/sec
- Average airtime: (56 + 370 + 1320) / 3 = ~580 ms
- Channel utilization: 0.9 x 0.58 = 0.52 channels busy
- With 48 concurrent channels: 0.52/48 = 1.1% utilization
- Conclusion: Network has 30x capacity headroom
15.6 Exercise 5: Troubleshooting LoRaWAN Deployments
Objective: Diagnose root causes of common LoRaWAN deployment failures and formulate preventive strategies
Scenario: A smart agriculture deployment has the following issues:
- Problem 1: 30% of devices stopped reporting data after firmware update
- Symptoms: Devices show “TX complete” but network server receives nothing
- Hint: Frame counter reset
- Problem 2: Battery life is only 6 months instead of expected 5 years
- Symptoms: All devices using SF12 despite being within 2 km of gateway
- Hint: ADR disabled or not working
- Problem 3: Devices work fine for 30 minutes, then stop for 2 hours
- Symptoms: Messages transmitted but immediately rejected
- Hint: Duty cycle violation
Tasks:
- For each problem, identify the root cause
- Propose a fix
- Explain how to prevent this in future deployments
Expected Solutions:
Problem 1 - Frame Counter Reset:
- Cause: ABP devices reset FCnt to 0, but network server expects higher value
- Fix: Enable “FCnt reset allowed” on network server, or switch to OTAA
- Prevention: Always use OTAA in production
Problem 2 - ADR Not Working:
- Cause: ADR disabled in firmware, or devices marked as mobile
- Fix: Enable ADR, verify devices are stationary profile
- Prevention: Default ADR enabled for stationary sensors
Problem 3 - Duty Cycle Violation:
- Cause: Devices transmitting too frequently at high SF
- Fix: Reduce transmission frequency or lower SF
- Prevention: Calculate duty cycle budget before deployment
15.7 Working Code: LoRaWAN Deployment Calculator
Use this Python tool to automate the calculations from the exercises above. It computes airtime, duty cycle limits, battery life, and gateway capacity for any LoRaWAN configuration.
"""LoRaWAN Deployment Calculator -- airtime, battery, and capacity."""
import math
# LoRa airtime parameters (EU868, BW=125kHz, CR=4/5)
SF_PARAMS = {
7: {"symbol_ms": 1.024, "max_payload": 222, "sensitivity_dBm": -123},
8: {"symbol_ms": 2.048, "max_payload": 222, "sensitivity_dBm": -126},
9: {"symbol_ms": 4.096, "max_payload": 115, "sensitivity_dBm": -129},
10: {"symbol_ms": 8.192, "max_payload": 51, "sensitivity_dBm": -132},
11: {"symbol_ms": 16.384, "max_payload": 51, "sensitivity_dBm": -134.5},
12: {"symbol_ms": 32.768, "max_payload": 51, "sensitivity_dBm": -137},
}
def lora_airtime_ms(sf, payload_bytes, preamble=8, header=True, cr=1, bw=125):
"""Calculate LoRa packet airtime in milliseconds (SX1276 formula)."""
t_sym = SF_PARAMS[sf]["symbol_ms"]
t_preamble = (preamble + 4.25) * t_sym
# Payload symbol count
de = 1 if sf >= 11 else 0 # low data rate optimize
ih = 0 if header else 1
numerator = 8 * payload_bytes - 4 * sf + 28 + 16 - 20 * ih
denominator = 4 * (sf - 2 * de)
n_payload = 8 + max(math.ceil(numerator / denominator) * (cr + 4), 0)
t_payload = n_payload * t_sym
return t_preamble + t_payload
def duty_cycle_max_msgs(sf, payload_bytes, duty_pct=1.0):
"""Max messages per hour under duty cycle limit."""
airtime = lora_airtime_ms(sf, payload_bytes)
allowed_ms_per_hour = duty_pct / 100 * 3_600_000
return int(allowed_ms_per_hour / airtime)
def battery_life_years(sf, payload_bytes, msgs_per_day,
battery_mAh=2000, tx_mA=40, sleep_uA=2):
"""Estimate battery life in years for Class A device."""
airtime = lora_airtime_ms(sf, payload_bytes)
# Add RX1+RX2 window time (~1.5s total at ~12mA)
rx_time_ms = 1500
rx_mA = 12
daily_tx_mAh = tx_mA * (airtime / 1000) * msgs_per_day / 3600
daily_rx_mAh = rx_mA * (rx_time_ms / 1000) * msgs_per_day / 3600
daily_sleep_mAh = (sleep_uA / 1000) * 24 # sleep for rest of day
daily_total = daily_tx_mAh + daily_rx_mAh + daily_sleep_mAh
years = (battery_mAh * 0.8) / (daily_total * 365) # 80% usable
return years, airtime, daily_total
# Exercise 1: Range and airtime comparison
print("Exercise 1: Spreading Factor Comparison")
print("=" * 60)
print(f"{'SF':>4s} {'Airtime':>10s} {'Max msgs/hr':>12s} {'Sensitivity':>12s}")
print(f"{'':>4s} {'(50 bytes)':>10s} {'(1% duty)':>12s} {'(dBm)':>12s}")
print("-" * 60)
for sf in range(7, 13):
at = lora_airtime_ms(sf, 50)
max_m = duty_cycle_max_msgs(sf, 50)
sens = SF_PARAMS[sf]["sensitivity_dBm"]
print(f"SF{sf:>2d} {at:>8.1f} ms {max_m:>10d} {sens:>10.1f}")
# Exercise 2: ADR battery impact
print(f"\nExercise 2: Battery Life by SF (50-byte payload, 24 msgs/day)")
print("=" * 60)
for sf in [7, 8, 10, 12]:
years, at, daily = battery_life_years(sf, 50, 24)
print(f" SF{sf:>2d}: {years:>5.1f} years "
f"(airtime {at:.0f}ms, {daily:.3f} mAh/day)")
# Exercise 4: Gateway capacity
print(f"\nExercise 4: Gateway Capacity Analysis")
print("=" * 60)
devices = 270
msg_interval_min = 5
msgs_per_sec = devices / (msg_interval_min * 60)
avg_airtime_ms = sum(lora_airtime_ms(sf, 50) for sf in [7, 8, 9, 10]) / 4
channels = 8
concurrent = channels * 6 # 8 channels x 6 SFs
utilization = (msgs_per_sec * avg_airtime_ms / 1000) / concurrent * 100
print(f" Devices: {devices}, interval: {msg_interval_min} min")
print(f" Message rate: {msgs_per_sec:.2f} msgs/sec")
print(f" Avg airtime: {avg_airtime_ms:.0f} ms")
print(f" Gateway capacity: {concurrent} concurrent slots")
print(f" Utilization: {utilization:.1f}%")
print(f" Headroom: {concurrent / (msgs_per_sec * avg_airtime_ms / 1000):.0f}x")This calculator automates the manual computations from each exercise. Run it with your own deployment parameters to validate your design before purchasing hardware.
A smart city deployed 500 parking sensors using LoRaWAN Class A. The specification promised 5-year battery life on 2× AA lithium batteries (3,000 mAh total), but after 8 months, 120 sensors (24%) reported low battery warnings.
Step 1: Expected battery life calculation
Design specification: - Transmission: 1 message every 5 minutes (when occupancy changes, average 12× per hour) - Payload: 12 bytes (sensor ID, status, battery voltage) - Spreading factor: SF10 (urban environment, 2 km from gateway) - Sleep current: 5 µA - TX current: 120 mA - RX current: 15 mA
Airtime at SF10 (12-byte payload): 370 ms Daily transmissions: 12/hour × 24 hours = 288 messages/day
Daily energy consumption: - TX: 120 mA × 0.37 s × 288 = 12.7 mAh/day - RX windows (2× 1 sec): 15 mA × 2 s × 288 = 8.6 mAh/day - Sleep: 0.005 mA × 24 hours = 0.12 mAh/day - Total: 21.4 mAh/day
Expected battery life: 3,000 mAh × 0.8 (usable) / 21.4 mAh/day = 112 days (only 3.7 months!)
Step 2: Identify the discrepancy
The specification claimed 5 years (1,825 days), but calculations show only 112 days. The actual field failure at 240 days (8 months) is between the calculation and the spec — something else is happening.
Step 3: Investigate actual device behavior
Network server logs revealed the problem: - Design assumed: 12 messages/hour when occupancy changes - Actual behavior: Sensors transmitted continuously every 15 seconds (240 messages/hour = 20× more than design!) - Root cause: Firmware bug — sensor was configured for “report on change” but also had a 15-second heartbeat enabled
Recalculated consumption at 240 messages/hour: - 5,760 messages/day (instead of 288) - Daily consumption: 21.4 × (5,760/288) = 428 mAh/day - Battery life: 2,400 mAh / 428 = 5.6 days — but sensors lasted 8 months!
Step 4: The actual problem
Further investigation found sensors were using SF12 instead of SF10 due to ADR not converging (urban interference). SF12 airtime: 1,320 ms (3.6× longer than SF10): - TX energy at SF12: 120 mA × 1.32 s × 5,760 = 913 mAh/day - Total: 922 mAh/day - Battery life: 2,400 / 922 = 2.6 days — still doesn’t match 8 months!
Step 5: The real culprit
The sensors were duty cycle limited! At SF12 with 1,320 ms airtime, EU868 1% duty cycle allows only 27 messages/hour. The sensors tried to send 240/hour but only 27 succeeded, with the rest queued and eventually dropped. Battery consumption: - Actual transmissions: 27/hour × 24 = 648/day - TX: 120 mA × 1.32 s × 648 = 102.7 mAh/day - RX: 15 mA × 2 s × 648 = 19.4 mAh/day - Total: 122 mAh/day - Battery life: 2,400 / 122 = 19.7 days — still wrong!
Final answer: Checked actual sensors and found they were solar-powered with 200 mAh backup batteries, not the 3,000 mAh primary cells specified. The 8-month failure was during winter (reduced solar charging). The real battery life calculation: 200 mAh / 122 mAh/day = 1.6 days of no-sun operation, which matches 8-month winter failure (consecutive cloudy days exhausted backup).
Lesson: Battery life problems cascade. Check: firmware behavior, actual SF used, duty cycle limits, and verify hardware matches spec!
Select the appropriate LoRaWAN device class based on application requirements for downlink latency, power consumption, and use case constraints.
| Application Type | Downlink Needs | Battery/Power | Recommended Class | Justification |
|---|---|---|---|---|
| Soil moisture sensors | None (uplink only) | Battery, 10-year life | Class A | No downlinks needed; minimal power consumption |
| Smart water meters | Rare (firmware updates 1×/year) | Battery, 15-year life | Class A | Firmware updates can wait hours for next scheduled uplink |
| Street lighting control | Frequent (on/off commands) | Mains powered | Class C | Requires <1 second response to dim/on/off commands |
| Industrial valve actuators | Moderate (emergency close in 2 min) | Battery + solar | Class B | Scheduled ping slots provide 128-second worst-case latency |
| Asset trackers (moving) | Occasional (geofence updates) | Battery, 2-year life | Class A | ADR disabled for mobile; downlinks during regular uplinks acceptable |
| Smart parking sensors | None (report occupancy) | Battery, 8-year life | Class A | Pure telemetry application; no bidirectional need |
| HVAC thermostats | Frequent (setpoint changes) | Mains powered | Class C | User expects instant response to temperature adjustments |
| Agricultural irrigation | Scheduled (nightly watering plans) | Solar + battery | Class B | Predictable downlink timing aligns with daily schedules |
Power consumption comparison (2,000 mAh battery):
| Class | Listening Behavior | Average Current | Battery Life (1 msg/hour) | Best For |
|---|---|---|---|---|
| A | RX windows after TX only (2 sec/hour) | 8 µA | 9-12 years | Sensors, meters |
| B | Ping slots every 128 sec + RX after TX | 45 µA | 15-20 months | Scheduled control |
| C | Continuous RX except when TX | 12 mA | 5-7 days | Mains-powered actuators |
Decision rule:
- If battery-powered AND downlinks can wait → Class A (99% of sensors)
- If battery-powered AND downlinks need <5 min latency → Class B
- If mains-powered AND downlinks need <10 sec latency → Class C
- Never use Class C on batteries unless runtime <1 week is acceptable
What they did wrong: A smart building operator deployed 2,000 Class A LoRaWAN temperature sensors with 10-year battery life. After 18 months, a critical security vulnerability required a firmware update. They attempted over-the-air (OTA) updates via LoRaWAN downlinks and discovered the update would take 347 days per device to complete.
Why Class A breaks OTA:
Firmware size: 64 KB = 65,536 bytes LoRaWAN downlink max payload (SF12): 51 bytes per message Fragments needed: 65,536 / 51 = 1,285 fragments
Class A receive windows: Only after each uplink transmission Sensor uplink interval: Once per hour (to preserve battery) Downlinks per day: 24 (one per uplink)
If every downlink succeeds (unrealistic): 1,285 fragments / 24 per day = 53.5 days per sensor
With realistic 70% downlink success rate (urban environment): 53.5 / 0.7 = 76 days per sensor
For 2,000 sensors sequentially: 76 × 2,000 = 152,000 days = 416 years!
The correct approach:
- Secondary radio for OTA: Add BLE or Wi-Fi for firmware updates (sensors connect to smartphone app or local gateway when in range)
- Increase uplink frequency temporarily: Shift sensors to 1 message/minute for 24 hours during update window (burns 3 months of battery life but completes OTA in 1 day)
- Class B for OTA-capable sensors: Use scheduled ping slots to receive fragments every 128 seconds (still takes 7-10 days per sensor, but feasible)
- Physical access: For critical updates, send technicians with USB programmers
Post-incident solution: The building operator added ESP32 boards with BLE to 50 “update stations” throughout the building. Sensors automatically connected to nearest station when within 10-meter range, received firmware in 90 seconds, and disconnected. 2,000 sensors updated in 3 weeks as occupants moved them past stations naturally.
Lesson: Class A’s power efficiency comes from minimal RX time. Don’t design Class A deployments assuming you can push large data volumes via downlink!
15.8 Summary
These exercises covered:
- Range Planning: SF selection based on distance and environment
- ADR Strategy: Enabling ADR for stationary devices, disabling for mobile
- Class Selection: Class A for sensors, Class C for mains-powered actuators
- Gateway Deployment: Redundancy, indoor coverage, capacity planning
- Troubleshooting: Frame counters, ADR, duty cycle issues
15.10 Knowledge Check
Common Pitfalls
Battery life calculations that only account for TX current dramatically overestimate lifetime. Class A opens two receive windows after each uplink — RX current (5–15 mA) multiplied by window duration is significant. Include all active states in calculations.
Time on air (milliseconds to seconds per packet) is not the same as message interval (minutes to hours). Duty cycle compliance depends on time on air within each duty cycle window. Calculate: ToA / duty_cycle_period × 100% to verify compliance.
Outdoor coverage predictions don’t account for building penetration loss (typically 10–20 dB). Indoor deployments require adding penetration margin to link budgets and potentially denser gateway deployment.
Device PCB antennas may have negative gain (−3 to 0 dBi), while gateway antennas provide 2–12 dBi. Using wrong antenna gain values leads to over/underestimating range in link budget exercises.
15.11 What’s Next
| Direction | Chapter | Description |
|---|---|---|
| Previous | LoRaWAN Common Pitfalls | Avoid common deployment mistakes |
| Next | LoRaWAN Simulation Lab | Hands-on simulation exercises |
| Overview | LoRaWAN Overview | Complete chapter index |
| Related | LoRaWAN Architecture | Detailed protocol specifications |
| Related | ADR Optimization | Advanced ADR tuning strategies |