Download Latest Version ExpressLRS 4.1.0 source code.zip (1.8 MB) Google Add to Preferred Sources
Home / 4.1.0
Name Modified Size InfoDownloads / Week
Parent folder
elrs.lua 2026-07-16 30.5 kB
ExpressLRS 4.1.0 source code.tar.gz 2026-07-14 1.6 MB
ExpressLRS 4.1.0 source code.zip 2026-07-14 1.8 MB
README.md 2026-07-14 8.3 kB
Totals: 4 Items   3.5 MB 0

Compatibility

Compatible with all hardware running any ExpressLRS 4.x version

Highlights

Dynamic Power Goes Down

[#3577] The statistical dynamic power algorithm introduced in 4.0 had a tendency to keep the power level high once it raised it, this change allows it to be a little less cautious. The power down threshold has been lowered from +1.5 SD to +0.5 SD, resulting in more opportunities to lower the power when the signal is good enough. A bug was also fixed where the output would get wonky if you lowered the config power while armed and dynpower also was changing the power (#3639)

Set Bindphrase From Handset

[#3554] You can now set a bindphrase on a transmitter or receiver directly from a Lua script. For users that share models by swapping bind phrases, this can be managed directly from the handset without going to wifi now. Lua tool in ZIP in first post

image

Less "Telemetry Lost"

[#3550] How do you know when someone is flying ExpressLRS? Their handset keeps calling out "Telemetry Lost" while they are flying! 🫣 Our behavior of immediately reporting downlink signal instability to the handset upsets a lot of new users, who believe this means they've failsafed, however it only means that we've missed a few telemetry packets. We've switched to a linearly-scaled grace period which will substantially decrease this callout.

image

Tighter PWM timings for 8285

[#3504] The ESP8285 servos twitch and jitter a little, since it has got a lot going on, and all 6 PWM outputs all have to run from a single timer multiplexed in software. This made the timings less accurate than they could be if developers just spent a full week refactoring and hand-tuning the code. 8285 will also stop outputting pulses if the main loop locks up, or the ESP32 browns out (#3681). There should now be less servo jitter on these devices, although they can never be as good as the ESP32-based receivers which run the PWM output in hardware.

image

WebUI VBAT Calibration and Features

[#3644] For receivers with built-in VBAT measurements, a calibration interface has been added to the webui to let you fix that 0.05V error that's been driving you nuts. Many receivers also get updated calibration values, and support was added for multiple simultaneous VBAT sensors.

https://github.com/user-attachments/assets/c9958b73-7491-4fe6-bfde-01f89df70fac

The wifi signal strength is also shown now on the main information page (#3526), and the wifi password box got a revealer so all the friends you have gathered behind you can see your password as you type (#3590). And don't look now, there's also a favicon (#3606).

New Telemetry

  • All VBAT-measuring receivers will also report millivolt-precision voltage as a new sensor e.g. 11.987V vs 12.0V.
  • GPS Time sync using the new CRSF sensor type to set the handset time from a flight controller (e.g Betaflight 2026.06) (#3642) or a serial-connected GPS (#3662)
  • HoTT protocol gets new Aspd sensor (#3528)

Core Refactoring for LR2021

Semtech's new 4th generation LoRa chip is now in production and much work has been done to better generalize our RF paths to support it. The new chip supports LoRa, FLRC, and FSK on both sub-Ghz and 2.4GHz bands, making it the first chip to support all current ExpressLRS modes. Full LR2021 support coming soon.

Minor Changes

  • VTX Admin's "Band" field renamed to "Band/Enabled" and Off is renamed to Disabled, which will hide all the other VTX Admin fields
  • Receiver will now refuse to change modes if the TX requests it to switch to a mode that it does not support. Previously, it would soft lock the connection because the two would be in incompatible modes [#3610]
  • Wait until all channels have been received at least once before sending them to the flight controller. Previously a value of 0 was sent, which was ignored by all major flight controller softwares [#3645]
  • Fix Antenna Mode: Switch favoring one antenna in 1:2 telemetry mode [#3675]
  • For local builds, the last hardware config is saved per-target to save remembering the number [#3449], 8285 firmwares are built with the file suffix the webui expects [#3634], and vite testing can proxy data to a real piece of hardware [#3487]
  • elrs.lua supports nesting folder more than 1 deep if needed [#3474], 16/32 bit integer editing [#3491], hiding irrelevant fields when in MAVLink mode [#3565]
  • Support for "output only" buffered PWM pins [#3624], OLED screen mirrored mode [#3649]

Changes Since RC1

  • Do not display parens in lua subfolder titles [#3696]
  • Add receiver antenna group select [#3684]
** Complete List ** * PWM ISR watchdog and ESP32 PWM stop on brownout [#3681] * Remove isElrs distinction from CRSF parameter read/write [#3680] * Only process/forward MAVLink messages which pass frame check [#3679] * Fix: Antenna Mode Switch not working properly [#3675] * Inhibit VBat telemetry in Mavlink mode [#3670] * Load proper default product with mixed case [#3665] * Add CRSF GPS Date/Time from Serial connected GPS [#3662] * Remove unused small OLED hardware support [#3661] * Fix verbose logging build [#3660] * Implement screen mirror feature for OLED screens [#3649] * Wait for all channels to have data before marking channel data available [#3645] * Multiple Voltage Sources and Calibration UI [#3644] * Add GPS Time (0x03), MAVLink parsing for GPS Time, Temp [#3642] * Fix dynamic power headroom underflow when config power lowered while armed [#3639] * Fix regression in band/modulation consolidation [#3637] * VSCode: create compressed .bin.gz firmware file [#3634] * MAVLink Capa Fix [#3632] * Merge 4.x to master [#3627] * Option in `hardware.json` to set PWM pins as output-only [#3624] * Separate FIFO locations for TX & RX on SX1280 [#3620] * Fixes the joystick which broke in [#3554] [#3614] * Do not switch RX rate if RX cant do rate from SYNC packet [#3610] * Hide VTXAdmin lua fields if disabled [#3608] * Add favicons and improve feature flag handling and cleanup [#3606] * Housekeeping: get rid of some magic numbers [#3605] * Add logging when DCDC is enabled to the LR1121 and SX1280 drivers. [#3598] * Add password revealer to WebUI WiFi page [#3590] * Modulation/Band consolidation [#3587] * PIO ini file cleanup/simplification [#3586] * Simplify the flasher to only use the PIO env for target selection [#3585] * Fix github build deprecation warnings [#3584] * Reduce dynpower SNR down threshold [#3577] * Fix web UI display of band information [#3566] * Hide Switch & TLM screens when in MAVLink mode [#3565] * Update devBLE.cpp -disable hat on BLE HID device [#3561] * Add domain info to Lua Version string [#3556] * Add MSP functions to get/set binding information [#3554] * Fix ESP32 RGB: Prevent I2S MCLK Defaulting to GPIO0 [#3552] * Reduce frequency of "Telemetry Lost" callout [#3550] * Disable autoupload by default in PIO builds [#3545] * RGB LED Fixes [#3536] * Remove unused hardware settings [#3535] * Misreporting FHSS in DEBUG_RCVR_LINKSTATS for LR1121 2G4 [#3533] * Fix CI build so uploads for tags are not overwritten [#3530] * WebUI / Add scripts to allow building WebUI artefacts under Windows VSCode/Pio [#3529] * HoTT Telemetry / Add Aspd sensor for airspeed capable Vario and GPS devices [#3528] * Add wifi signal information to webui [#3526] * Refactor waveform_8266 for possibly tighter timings [#3504] * Add support for int16/int32 to CRSF parameters [#3491] * Allow vite to proxy requests to a real target [#3487] * Don't write every byte of log messages individually [#3479] * elrs.lua: Improvement to Folders/Sub-Folders [#3474] * Save last UnifiedConfiguration as default for target [#3449] * Mavlink dynamic sysIDv3 [#3032]
Source: README.md, updated 2026-07-14