LoRa power negotiation (P2P)

Saving power with LoRa: A simple transmission power “negotiation” mechanism

I’ve just wrapped up my first LoRa-based project: Cat at the Door — a peer-to-peer system using Heltec WiFi LoRa 32 V3 boards.

Since one of the two devices is battery-powered, reducing energy consumption was a key goal. To achieve that, I implemented a lightweight transmission power “negotiation” control between the two devices.

Here’s how it works:

  • Each time a packet is received, the RSSI is compared to a predefined window.
  • If it’s too low or too high, a character ( < or > ) is appended to the reply, telling the sender to adjust power up or down by one level.
  • If replies are missed (beyond a first threshold), the device assumes the other might be out of range and steps up to max power.
  • If replies are still missed at max power (beyond a second threshold), the system gives up and falls back to a “nominal” level — assuming the other device might be off.

Interestingly, the two devices stabilize at different transmission levels, likely due to asymmetries in positioning, power, chip’s temperature, or antenna performance.

Despite being rudimentary, this approach:

  • Saves energy by avoiding excess transmission power
  • Handles edge cases without permanently using high power

This was my first time working with LoRa (and I used MicroPython, though that’s not central to this trick).
I’m sure more elegant solutions exist — if you’ve tackled this before or have suggestions, I’d love to hear your thoughts!