Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
284 commits
Select commit Hold shift + click to select a range
0d7865a
New bluetooth mesh code
SteveEisner Jul 22, 2022
63c8ec7
Fix uplinkId following
SteveEisner Jul 22, 2022
00b2a4f
Update status via mesh network
SteveEisner Jul 23, 2022
8fb9fe6
Fix controller upates; add better debugging
SteveEisner Jul 23, 2022
a3b8c73
easier to read debug
SteveEisner Jul 26, 2022
3b3e98f
Add TimeSync - let's see if it works
SteveEisner Jul 26, 2022
277be7a
Make the Tube mode use the current WLED palette
SteveEisner Aug 3, 2022
d7691f6
Fix Tube mode
SteveEisner Aug 3, 2022
ef348c5
Fix palette error
SteveEisner Aug 3, 2022
6ea37c5
Get QuickESP comms working
SteveEisner Aug 6, 2022
57e91e4
auto-configure the network
SteveEisner Aug 6, 2022
17289ed
Get syncing working & Speed up color changes
SteveEisner Aug 6, 2022
ba12eff
Restore tube tech & finish
SteveEisner Aug 6, 2022
6b1a667
Turn keyboard commands back on.
SteveEisner Aug 7, 2022
d451bf5
Move overlay effects to a Usermod overlay so they work on any pattern
SteveEisner Aug 7, 2022
e90adb5
Update node mesh code for less chattiness and quicker startup
SteveEisner Aug 8, 2022
c7b3e1b
fix post merge
SteveEisner Aug 9, 2022
a6e82f5
more fix after merge
SteveEisner Aug 9, 2022
105aaed
More fixes after merge, update palettes
SteveEisner Aug 9, 2022
c643c64
Handle manual override of colors
SteveEisner Aug 10, 2022
e80840c
Rework mesh sync code to pull message sending up into controller
SteveEisner Aug 10, 2022
8224be1
misc utils
SteveEisner Aug 10, 2022
7e3b1aa
Fix palette fading
SteveEisner Aug 10, 2022
08757fd
Start testing crossfading
SteveEisner Aug 10, 2022
efabb94
Introduce a root relay for commands
SteveEisner Aug 11, 2022
482bb03
Prevent duration divide by zero
SteveEisner Aug 11, 2022
e118939
WLED fixes (and revert changes to .H)
SteveEisner Aug 11, 2022
bf4f8e4
web-based OTA updates + allow wifi connections
SteveEisner Aug 11, 2022
d26bce4
Fix small issues in updater
SteveEisner Aug 11, 2022
2f4b0c4
better debug info; more frequent updates; remove "external buffer" be…
SteveEisner Aug 13, 2022
f15dc0a
Completely back out modifications to core WLED
SteveEisner Aug 13, 2022
e1fb6cb
Better node debugging
SteveEisner Aug 13, 2022
a3c54ee
OPTIONS command
SteveEisner Aug 13, 2022
101a85c
Better debugging output
SteveEisner Aug 13, 2022
046c1a7
Power save mode; Ability to set WLED patterns; better debug overlays;…
SteveEisner Aug 14, 2022
d0ba71b
Add WLED patterns into the list of patterns that are mixed
SteveEisner Aug 15, 2022
0fa995b
Tuning WLED patterns
SteveEisner Aug 15, 2022
c568411
Try to make some patterns a little more interesting
SteveEisner Aug 16, 2022
c2ea3ae
adjust pattern balance
SteveEisner Aug 16, 2022
c574135
replace monochrome palettes
SteveEisner Aug 18, 2022
f5e6e2e
rebalance the effects so the defaults are generally chill
SteveEisner Aug 18, 2022
4ac3fa2
New colors
SteveEisner Aug 18, 2022
a09707b
Auto-updating from a remote server
SteveEisner Aug 19, 2022
54aa079
misc fixes
SteveEisner Aug 20, 2022
1455918
Manual mode and basic settings
SteveEisner Aug 21, 2022
f286a30
Rewrite the transitions engine and fix manual overrides
SteveEisner Aug 21, 2022
9af34b9
More effects
SteveEisner Aug 21, 2022
6bc5ce2
Clean up unused
SteveEisner Aug 22, 2022
7070bfe
Fix OTA updates
SteveEisner Aug 23, 2022
9b2da8d
add roles and master commands
SteveEisner Aug 23, 2022
c809838
Fix master mode and tempo tapping
SteveEisner Aug 23, 2022
60ee627
New autoupdate modes
SteveEisner Aug 23, 2022
acfbe0d
Better power save mode with button override
SteveEisner Aug 23, 2022
a7d5c69
Fix energy-related bugs
SteveEisner Aug 24, 2022
a13b651
ignore compiler files
SteveEisner Aug 24, 2022
087ba06
More on-tube indicators
SteveEisner Aug 24, 2022
723cac4
Invert power save button; smooth transition fades
SteveEisner Aug 24, 2022
13d21e7
Ability to set BPM from any node, using double click
SteveEisner Aug 24, 2022
b48ecb1
better master control; small art role
SteveEisner Aug 25, 2022
5be4a0c
Fix updater mode
SteveEisner Aug 28, 2022
e1347ed
Sound reactive
SteveEisner Aug 28, 2022
fcc2e61
better sound overlay
SteveEisner Aug 28, 2022
39bd106
Better selection mode
SteveEisner Aug 28, 2022
e5e81fd
Playa-ready verison = 10
SteveEisner Aug 28, 2022
afbde13
Draw the overlay -after- power save
SteveEisner Aug 28, 2022
2ac6ce9
Lower power requirements?
SteveEisner Aug 28, 2022
a362459
misc
SteveEisner Aug 28, 2022
753e276
manual mode protection
SteveEisner Aug 28, 2022
0f9bc57
better taps? and art car brightness
SteveEisner Sep 2, 2022
698a26e
Fix after merge
SteveEisner Sep 7, 2022
8b03af7
Initial port of Tubes - palettes and noise functions
SteveEisner Jul 5, 2022
169e8e1
First version of externally-driven displays
SteveEisner Jul 5, 2022
628c786
Light tubes are up and running
SteveEisner Jul 6, 2022
3fb6d77
Re-enable particles; fix misc issues
SteveEisner Jul 13, 2022
c150357
lower default brightness a bit to emphasize effects
SteveEisner Jul 13, 2022
4da3140
Introduce BLE
SteveEisner Jul 18, 2022
5123b0a
Introduce BLE
SteveEisner Jul 18, 2022
2e3704c
More BLE investigation
SteveEisner Jul 21, 2022
0d2519e
Fix BLE initialization
SteveEisner Jul 21, 2022
f640e3b
New bluetooth mesh code
SteveEisner Jul 22, 2022
6436cbf
Fix uplinkId following
SteveEisner Jul 22, 2022
34fb839
Update status via mesh network
SteveEisner Jul 23, 2022
7574f03
Fix controller upates; add better debugging
SteveEisner Jul 23, 2022
e48c8ab
easier to read debug
SteveEisner Jul 26, 2022
40c06da
Add TimeSync - let's see if it works
SteveEisner Jul 26, 2022
a3e018f
Make the Tube mode use the current WLED palette
SteveEisner Aug 3, 2022
75ccf21
Fix Tube mode
SteveEisner Aug 3, 2022
acb4c7f
Fix palette error
SteveEisner Aug 3, 2022
9c3c4f3
Get QuickESP comms working
SteveEisner Aug 6, 2022
6509044
auto-configure the network
SteveEisner Aug 6, 2022
81cdce1
Get syncing working & Speed up color changes
SteveEisner Aug 6, 2022
33fd411
Restore tube tech & finish
SteveEisner Aug 6, 2022
41959bb
Turn keyboard commands back on.
SteveEisner Aug 7, 2022
2df1056
Move overlay effects to a Usermod overlay so they work on any pattern
SteveEisner Aug 7, 2022
39047cb
Update node mesh code for less chattiness and quicker startup
SteveEisner Aug 8, 2022
4feab0c
fix post merge
SteveEisner Aug 9, 2022
59b37a2
more fix after merge
SteveEisner Aug 9, 2022
fc58969
More fixes after merge, update palettes
SteveEisner Aug 9, 2022
b757eae
Handle manual override of colors
SteveEisner Aug 10, 2022
6847c34
Rework mesh sync code to pull message sending up into controller
SteveEisner Aug 10, 2022
738eaa1
misc utils
SteveEisner Aug 10, 2022
db66b58
Fix palette fading
SteveEisner Aug 10, 2022
c0cecec
Start testing crossfading
SteveEisner Aug 10, 2022
8c77c76
Introduce a root relay for commands
SteveEisner Aug 11, 2022
f7ac5a3
Prevent duration divide by zero
SteveEisner Aug 11, 2022
06a0ed2
WLED fixes (and revert changes to .H)
SteveEisner Aug 11, 2022
6f739ab
web-based OTA updates + allow wifi connections
SteveEisner Aug 11, 2022
c4976c3
Fix small issues in updater
SteveEisner Aug 11, 2022
ce90f6b
better debug info; more frequent updates; remove "external buffer" be…
SteveEisner Aug 13, 2022
b52b186
Completely back out modifications to core WLED
SteveEisner Aug 13, 2022
c5a8f4d
Better node debugging
SteveEisner Aug 13, 2022
b4040e4
OPTIONS command
SteveEisner Aug 13, 2022
1554cb1
Better debugging output
SteveEisner Aug 13, 2022
9b86d5c
Power save mode; Ability to set WLED patterns; better debug overlays;…
SteveEisner Aug 14, 2022
5eb46f6
Add WLED patterns into the list of patterns that are mixed
SteveEisner Aug 15, 2022
3d6de1d
Tuning WLED patterns
SteveEisner Aug 15, 2022
bb12182
Try to make some patterns a little more interesting
SteveEisner Aug 16, 2022
5997655
adjust pattern balance
SteveEisner Aug 16, 2022
70a8cea
replace monochrome palettes
SteveEisner Aug 18, 2022
41cb4c0
rebalance the effects so the defaults are generally chill
SteveEisner Aug 18, 2022
4771237
New colors
SteveEisner Aug 18, 2022
2503f8c
Auto-updating from a remote server
SteveEisner Aug 19, 2022
131f0a4
misc fixes
SteveEisner Aug 20, 2022
953d8b7
Manual mode and basic settings
SteveEisner Aug 21, 2022
b623d0a
Rewrite the transitions engine and fix manual overrides
SteveEisner Aug 21, 2022
35ce404
More effects
SteveEisner Aug 21, 2022
8a85504
Clean up unused
SteveEisner Aug 22, 2022
7342d3d
Fix OTA updates
SteveEisner Aug 23, 2022
20d2056
add roles and master commands
SteveEisner Aug 23, 2022
c4435e8
Fix master mode and tempo tapping
SteveEisner Aug 23, 2022
1f0199f
New autoupdate modes
SteveEisner Aug 23, 2022
21442e5
Better power save mode with button override
SteveEisner Aug 23, 2022
fe7fe36
Fix energy-related bugs
SteveEisner Aug 24, 2022
41f2961
ignore compiler files
SteveEisner Aug 24, 2022
b6cb054
More on-tube indicators
SteveEisner Aug 24, 2022
5bfa58e
Invert power save button; smooth transition fades
SteveEisner Aug 24, 2022
e4afdd4
Ability to set BPM from any node, using double click
SteveEisner Aug 24, 2022
b0ea57e
better master control; small art role
SteveEisner Aug 25, 2022
1dc7611
Fix updater mode
SteveEisner Aug 28, 2022
94f65f8
Sound reactive
SteveEisner Aug 28, 2022
c20d602
better sound overlay
SteveEisner Aug 28, 2022
71cdf41
Better selection mode
SteveEisner Aug 28, 2022
90eace2
Playa-ready verison = 10
SteveEisner Aug 28, 2022
868211c
Draw the overlay -after- power save
SteveEisner Aug 28, 2022
ff47197
Lower power requirements?
SteveEisner Aug 28, 2022
06a7698
misc
SteveEisner Aug 28, 2022
8d02979
manual mode protection
SteveEisner Aug 28, 2022
2c68877
better taps? and art car brightness
SteveEisner Sep 2, 2022
ad76031
Fix after merge
SteveEisner Sep 7, 2022
9c7f169
Permanently store power_save option
SteveEisner Oct 7, 2022
2866585
Merge branch 'merge_upstream' of https://github.com/SteveEisner/WLEDt…
SteveEisner Oct 7, 2022
5a8d3c2
Merge branch 'main' into merge_upstream
SteveEisner Oct 7, 2022
7c3fca0
Merge remote-tracking branch 'upstream/main'
SteveEisner Jul 21, 2023
3fd6ec6
Update to latest version of WLED
SteveEisner Jul 21, 2023
505ed5a
Fix tasks
SteveEisner Aug 13, 2023
eafe2fa
Merge remote-tracking branch 'upstream/main'
SteveEisner Aug 13, 2023
2d29a18
Documented the branch
SteveEisner Aug 13, 2023
d687f83
Remove use of "this"
SteveEisner Aug 14, 2023
6ca660a
Register Dig Unos (and Dig2Go)
SteveEisner Aug 14, 2023
887dc96
Fix mistaken refactor that was crashing
SteveEisner Aug 15, 2023
36bd5b3
fix bug due to refactor
SteveEisner Aug 15, 2023
daea6d3
Fix more errors introduced by refactor
SteveEisner Aug 15, 2023
5c6497a
Merge remote-tracking branch 'upstream/fx-blending'
SteveEisner Aug 16, 2023
2e940ee
Try to not do multiple changes at the same time, to prevent a jumpy t…
SteveEisner Aug 16, 2023
1f4cf27
Fix the previous fix
SteveEisner Aug 16, 2023
bc6e438
Fix issues that could cause crashes if flashed with wrong version
SteveEisner Aug 23, 2023
77b3b89
Make the powersave option persistent
SteveEisner Aug 23, 2023
cedcf65
Wizmote controls
SteveEisner Aug 23, 2023
ee3c8d4
Release version 12
SteveEisner Aug 23, 2023
77e8580
Fix the wizmote presets to work more reliably
SteveEisner Aug 24, 2023
fbcac46
Fix newly flashed units having no brightness
SteveEisner Aug 24, 2023
09dbcfc
Christmas and Golden modes
SteveEisner Apr 28, 2024
4c87307
Documented the branch
SteveEisner Aug 13, 2023
8533d74
Wizmote controls
SteveEisner Aug 23, 2023
f2ca7b0
Release version 12
SteveEisner Aug 23, 2023
6239c0a
Fix the wizmote presets to work more reliably
SteveEisner Aug 24, 2023
38fc5b5
Fix newly flashed units having no brightness
SteveEisner Aug 24, 2023
1b838f2
Christmas and Golden modes
SteveEisner Apr 28, 2024
ccc5956
Merge remote-tracking branch 'upstream/main'
SteveEisner Apr 28, 2024
e1eddba
Merge branch 'main' of https://github.com/SteveEisner/WLEDtubes
SteveEisner Apr 28, 2024
69f1bd8
Update to V13; always use WLED's own palette and pattern fading
SteveEisner Apr 29, 2024
9a487c6
fix hidden member variable so that brightness is correctly adjusted a…
craiglink Jun 8, 2024
f0da4d8
use WLED_FS macro so that appropriate LittleFS is used based on build…
craiglink Jun 8, 2024
9e7d3c7
add support for ESP32S3
craiglink Jun 17, 2024
453bc88
Merge pull request #26 from craiglink/bug-fixes
SteveEisner Jun 30, 2024
a1fe05e
Update readme.md
SteveEisner Jul 1, 2024
d5eecb1
Fix build errors
SteveEisner Jul 1, 2024
4c0cecb
Merge branch 'main' into buildenv-update
SteveEisner Jul 1, 2024
12b7a82
Set the ESP32S2 SPI bus in the base env so all S2 based devices get t…
craiglink Jul 1, 2024
8408dcd
Merge pull request #27 from craiglink/buildenv-update
SteveEisner Jul 1, 2024
8473190
Merge pull request #28 from craiglink/ESP32S2-spi-fix
SteveEisner Jul 4, 2024
4fa3bed
Revert unintentional changes to upstream
SteveEisner Jul 4, 2024
c08e6f8
Merge remote-tracking branch 'refs/remotes/origin/main'
SteveEisner Jul 4, 2024
e640582
fix espnow syncing
craiglink Jul 8, 2024
31dd6ae
Fix palette size (don't count first 13)
SteveEisner Jul 4, 2024
24453b5
add esp32-c3-athom device
craiglink Aug 7, 2024
8d0218d
- reverts platformio.ini to be closer to main branch ini and package …
craiglink Jul 29, 2024
8421a04
Revert "revert change to later espressif platform and FastLED 3.7"
craiglink Jul 8, 2024
8cba07c
revert change to later espressif platform and FastLED 3.7
SteveEisner Jul 4, 2024
f475538
Merge branch 'SteveEisner:main' into main
craiglink Aug 7, 2024
9b55c6f
Simple Cleanup
craiglink Jul 29, 2024
cfce2e2
fix a few dependencies between variations
craiglink Jul 29, 2024
a509090
Merge pull request #29 from craiglink/package-update
SteveEisner Jul 17, 2024
77b7ad7
Merge branch 'SteveEisner:main' into main
craiglink Aug 7, 2024
3956dfa
add class protections to LightNode
craiglink Jul 29, 2024
88d6e65
Merge pull request #31 from craiglink/tubes-only-platform-upgrade
SteveEisner Jul 31, 2024
446fa23
fix some silly bugs during port.
craiglink Aug 9, 2024
5b7af44
Merge pull request #32 from craiglink/main
SteveEisner Jul 31, 2024
53bb7e8
remove unused build flag
craiglink Aug 9, 2024
ee20e07
actually use PSRAM
SteveEisner Jul 31, 2024
fe48075
clean up RX callback
craiglink Aug 9, 2024
a522feb
add RSSI support back for modern IDF builds
craiglink Aug 2, 2024
247cd2b
Rewrites the ESPNow code to use the IDF esp_now api vs QuickEspNow. (…
craiglink Aug 2, 2024
f9a3fc8
add separate debug flag for rx callback logging
craiglink Aug 9, 2024
407c218
Merge pull request #33 from craiglink/rssi
SteveEisner Aug 3, 2024
d59f2f0
remove extra log line
craiglink Aug 9, 2024
deb35f4
add esp32-c3-athom device (#34)
craiglink Aug 7, 2024
568df6e
reduce unnecessary use of heap to create some singleton objects and i…
craiglink Aug 13, 2024
45500b5
Merge pull request #35 from craiglink/sync-bug-fixes
SteveEisner Aug 11, 2024
421063a
Make particles arrary static and not use heap
craiglink Aug 14, 2024
652d155
Merge pull request #37 from craiglink/byref
craiglink Aug 13, 2024
90919e6
Merge pull request #38 from craiglink/static-particle-array
craiglink Aug 14, 2024
565e883
Fix errors when strips have more LEDs than MAX_VIRTUAL_LEDs
SteveEisner Aug 18, 2024
557afa5
PR suggestions
SteveEisner Aug 18, 2024
b6ae6bb
Update explanation of strip blending
SteveEisner Aug 18, 2024
6e9ce67
add support for espnow message filtering
craiglink Aug 19, 2024
594a08c
fix esp8266 build
craiglink Aug 19, 2024
6d7a769
add debug counters to espnow
craiglink Aug 19, 2024
30b4b23
re-enable serial input
craiglink Aug 19, 2024
00dc338
add const to appropriate read-only functions
craiglink Aug 19, 2024
3cf9edf
add exit counter for espnow loop
craiglink Aug 19, 2024
f293d54
add yield to espnow loop for good measure
craiglink Aug 19, 2024
473115b
add yield to espnow loop for good measure
craiglink Aug 19, 2024
00b20b2
Remove infinite loops from pattern generators; add some more debugging
SteveEisner Aug 19, 2024
fcee6ab
some basic constructor cleanup
craiglink Aug 19, 2024
eb87f63
Revert to 5.3.0 IDF for now
SteveEisner Aug 20, 2024
7713d41
restart ESPNOW after WiFi AP stopped
craiglink Aug 20, 2024
3976a57
athom-c3 fixes
craiglink Aug 20, 2024
95ced63
out WLED_RELEASE_NAME macro to info json
craiglink Aug 20, 2024
8570905
yield for c3 network startup
craiglink Aug 20, 2024
1520f79
update base on board variant
craiglink Aug 20, 2024
0304ca7
reduced attenna power seems to make c3 more stable
craiglink Aug 21, 2024
0166dae
default power save off; better help/debugging
SteveEisner Nov 27, 2024
077377e
Create RUBY mode
SteveEisner Feb 2, 2025
247b940
Pin certain libs, since their projects have moved on for 15 and we're…
SteveEisner Jul 27, 2025
e1796ca
override WLED and check in platformio_override.ini since everyone nee…
SteveEisner Aug 13, 2025
a80fe81
Enable CHRISTMAS mode and weight holiday palette selection
SteveEisner Feb 20, 2026
3ee799f
Remove explicit ATHOM C3 pin overrides in tubes env
SteveEisner Feb 20, 2026
b8fb0f0
Add ESP32 GLEDOPTO and tubes build environments
SteveEisner Feb 20, 2026
ad862cc
fastled bug fixes
craiglink Aug 22, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
.vscode

esp01-update.sh
platformio_override.ini
replace_fs.py
wled-update.sh

Expand Down
10 changes: 10 additions & 0 deletions platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,16 @@ board_build.partitions = ${esp32.default_partitions}
; board_build.f_flash = 80000000L
; board_build.flash_mode = dio

[env:esp32_quinled_diguno]
extends = env:esp32dev
build_flags = ${env:esp32dev.build_flags} -D RLYPIN=12 -D BTNPIN=0 -D DATA_PINS=16 -D DMTYPE=1 -D I2S_SDPIN=19 -D I2S_WSPIN=4 -D I2S_CKPIN=18
-D USERMOD_AUDIOREACTIVE
lib_deps = ${env:esp32dev.lib_deps}
https://github.com/blazoncek/arduinoFFT.git
upload_speed = 690000
board_build.f_flash = 80000000L
board_build.flash_mode = qio

[env:esp32dev_qio80]
board = esp32dev
platform = ${esp32.platform}
Expand Down
17 changes: 17 additions & 0 deletions platformio_override.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
[platformio]
default_envs = esp32dev
extra_configs =
platformio_tubes.ini

[env:golden]
extends = env:esp32_quinled_dig2go_tubes
build_flags = ${env:tubes.build_flags} -D GOLDEN

[env:christmas]
extends = env:esp32_quinled_dig2go_tubes
build_flags = ${env:tubes.build_flags} -D CHRISTMAS

[env:ruby]
extends = env:esp32_quinled_dig2go_tubes
build_flags = ${env:tubes.build_flags} -D RUBY

202 changes: 202 additions & 0 deletions platformio_tubes.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
[tubes_no_mic]
; these settings create a basic template for tubes build from
; from which all other tube envs should build
; the base build does not support
; -- mic (audio reactive)
; -- ir remotes
; For devices with those inputs use the [tubes] settings
; which adds those back in
platform = espressif32@5.3.0
platform_packages =
;platform_packages = ;framework-arduinoespressif32 @ 3.20017.0
build_unflags =
-D LOROL_LITTLEFS
-D CONFIG_ASYNC_TCP_USE_WDT
build_flags =
-g
-O2
-D FASTLED_ALL_PINS_HARDWARE_SPI
-D ARDUINO_USB_CDC_ON_BOOT=0 ;; this flag is mandatory for "classic ESP32" when building with arduino-esp32 >=2.0.3
-D WLED_WATCHDOG_TIMEOUT=0
-D USERMOD_TUBES
-D CONFIG_ASYNC_TCP_RUNNING_CORE=-1
; Disable a bunch of unnecessary integrations
-D WLED_DISABLE_BLYNK
-D WLED_DISABLE_MQTT
-D WLED_DISABLE_LOXONE
-D WLED_DISABLE_ALEXA
-D WLED_DISABLE_INFRARED
-D WLED_DISABLE_CRONIXIE
-D WLED_DISABLE_HUESYNC
-D WLED_DISABLE_WEBSOCKETS
-D WLED_DISABLE_ADALIGHT
-D WLED_DISABLE_ESPNOW
-D WLED_DISABLE_SERIAL
-D IRTYPE=0
lib_ignore =
ESPAsyncTCP
ESPAsyncUDP
IRremoteESP8266
lib_deps =
fastled/FastLED @ ^3.7.3
makuna/NeoPixelBus @ ^2.8.0
https://github.com/Aircoookie/ESPAsyncWebServer.git#v2.2.1

[tubes]
extends = tubes_no_mic
build_flags =
${tubes_no_mic.build_flags}
${esp32.AR_build_flags}
lib_deps = ${tubes_no_mic.lib_deps}
IRremoteESP8266 @ ^2.8.6
https://github.com/kosme/arduinoFFT#v2.0.2


[env:esp32_quinled_dig2go]
; basis quinled dig2go without any tubes support
extends = env:esp32_quinled_diguno
build_unflags = ${env:esp32_quinled_diguno.build_unflags}
-D WLED_DISABLE_INFRARED
-D IRTYPE
lib_ignore = ${env:esp32_quinled_diguno.lib_ignore}
lib_deps = ${env:esp32_quinled_diguno.lib_deps}
IRremoteESP8266 @ 2.8.6


[env:esp32_quinled_dig2go_tubes]
extends = env:esp32_quinled_dig2go
platform = ${tubes.platform}
platform_packages = ${tubes.platform_packages}
build_unflags =
${tubes.build_unflags}
${env:esp32_quinled_dig2go}
-D WLED_RELEASE_NAME
build_flags = -D WLED_RELEASE_NAME=DIG2GO_TUBES
${tubes.build_flags}
${env:esp32_quinled_dig2go.build_flags}
-D FASTLED_ESP32_SPI_BUS=HSPI
-D NUM_STRIPS=1 -D DEFAULT_LED_COUNT=150
-D CHRISTMAS # REMOVE
lib_ignore =
ESPAsyncTCP
ESPAsyncUDP
${env:esp32_quinled_dig2go.lib_ignore}
lib_deps =
${tubes.lib_deps}



# ------------------------------------------------------------------------------
# ESP32 S3 Matrix M1
# ------------------------------------------------------------------------------
[env:esp32-s3-matrix-m1]
; builds using the default WLED settings
extends = env:esp32s3dev_8MB_PSRAM_opi
board_build.arduino.memory_type = qio_qspi ;; use with PSRAM: 2MB or 4MB
board_upload.flash_size = 4MB
board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
build_unflags = ${env:esp32s3dev_8MB_PSRAM_opi.build_unflags}
-D ARDUINO_USB_CDC_ON_BOOT=1
-D ARDUINO_USB_MSC_ON_BOOT=0
-D ARDUINO_DFU_ON_BOOT=0
build_flags = ${common.build_flags} ${esp32s3.build_flags} -D WLED_RELEASE_NAME=ESP32-S3_MATRIX_M1
-D WLED_WATCHDOG_TIMEOUT=0
-D ARDUINO_USB_CDC_ON_BOOT=1
-D ARDUINO_USB_MODE=1
-D BOARD_HAS_PSRAM ; tells WLED that PSRAM shall be used
-D WLED_USE_PSRAM
-D ABL_MILLIAMPS_DEFAULT=250
-D NUM_STRIPS=1 -D PIXEL_COUNTS=64 -D DEFAULT_LED_COUNT=64
-D DEFAULT_LED_COLOR_ORDER=1 -D LEDPIN=14
lib_deps = ${esp32s3.lib_deps}
lib_ignore = ${env:esp32s3dev_8MB_PSRAM_opi.lib_ignore}
IRremoteESP8266

[env:esp32-s3-matrix-m1_tubes]
extends = env:esp32-s3-matrix-m1
platform = espressif32@6.8.1
platform_packages =
;platform = ${tubes.platform}
;platform_packages = ${tubes.platform_packages}
board_build.partitions = tools/WLED_ESP32_4MB_noOTA.csv
build_unflags = ${env:esp32-s3-matrix-m1.build_unflags}
${tubes_no_mic.build_unflags}
build_flags =
${tubes_no_mic.build_flags}
${env:esp32-s3-matrix-m1.build_flags}
-D IRTYPE=0
-D FASTLED_ALL_PINS_HARDWARE_SPI
lib_ignore =
${tubes_no_mic.lib_ignore}
${env:esp32-s3-matrix-m1.lib_ignore}
lib_deps =
${tubes_no_mic.lib_deps}

# ------------------------------------------------------------------------------
# ESP32 C3 Athom
# ------------------------------------------------------------------------------
[env:esp32-c3-athom]
extends = env:esp32c3dev
lib_ignore = IRremoteESP8266
${env:esp32c3dev.lib_ignore}
build_flags = ${env:esp32c3dev.build_flags}
-D LEDPIN=10
-D BTNPIN=9
-D WLED_DISABLE_INFRARED
-D IRTYPE=0

[env:esp32-c3-athom_tubes]
extends = env:esp32-c3-athom
platform = espressif32@6.8.1
upload_speed = 115200
platform_packages =
;platform = ${tubes_no_mic.platform}
;platform_packages = ${tubes_no_mic.platform_packages}
build_unflags = ${env:esp32-c3-athom.build_unflags}
${tubes_no_mic.build_unflags}
build_flags = ${env:esp32-c3-athom.build_flags} -D WLED_RELEASE_NAME=ESP32-C3_ATHOM_TUBES
${tubes_no_mic.build_flags}
-D FASTLED_ESP32_SPI_BUS=HSPI
-D NUM_STRIPS=1 -D DEFAULT_LED_COUNT=150
-D WLED_WIFI_POWER_SETTING=WIFI_POWER_8_5dBm
-D LOLIN_WIFI_FIX
lib_ignore = ${env:esp32-c3-athom.lib_ignore}
${tubes_no_mic.lib_ignore}
lib_deps =
${tubes_no_mic.lib_deps}


# ------------------------------------------------------------------------------
# ESP32 GLEDOPTO
#
# LEDs: GRB @ pin 16
# Button: GPIO 0
# SR: i2S SD 26, WS 5, SCK 21, MCLK unused
# ------------------------------------------------------------------------------
[env:esp32-gledopto]
extends = env:esp32dev
lib_ignore = IRremoteESP8266
${env:esp32c3dev.lib_ignore} ; ok to keep this line if it exists, harmless
build_flags =
-D LEDPIN=16
-D BTNPIN=0
-D WLED_DISABLE_INFRARED
-D IRTYPE=0

[env:esp32-gledopto_tubes]
extends = env:esp32-gledopto
platform = platformio/espressif32 @ 6.7.0
platform_packages =
framework-arduinoespressif32@3.20016.0 ; Arduino-ESP32 2.0.16
build_unflags = ${env:esp32-gledopto.build_unflags}
${tubes_no_mic.build_unflags}
build_flags = ${env:esp32-gledopto.build_flags}
${tubes_no_mic.build_flags}
-D FASTLED_ESP32_SPI_BUS=HSPI
-D NUM_STRIPS=1 -D DEFAULT_LED_COUNT=150
-D WLED_WIFI_POWER_SETTING=WIFI_POWER_8_5dBm
-D LOLIN_WIFI_FIX
lib_ignore = ${env:esp32-gledopto.lib_ignore}
${tubes_no_mic.lib_ignore}
lib_deps = ${env:esp32-gledopto.lib_deps}
${tubes_no_mic.lib_deps}
92 changes: 81 additions & 11 deletions readme.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,89 @@
<p align="center">
<img src="/images/wled_logo_akemi.png">
<a href="https://github.com/Aircoookie/WLED/releases"><img src="https://img.shields.io/github/release/Aircoookie/WLED.svg?style=flat-square"></a>
<a href="https://raw.githubusercontent.com/Aircoookie/WLED/master/LICENSE"><img src="https://img.shields.io/github/license/Aircoookie/wled?color=blue&style=flat-square"></a>
<a href="https://wled.discourse.group"><img src="https://img.shields.io/discourse/topics?colorB=blue&label=forum&server=https%3A%2F%2Fwled.discourse.group%2F&style=flat-square"></a>
<a href="https://discord.gg/QAh7wJHrRM"><img src="https://img.shields.io/discord/473448917040758787.svg?colorB=blue&label=discord&style=flat-square"></a>
<a href="https://kno.wled.ge"><img src="https://img.shields.io/badge/quick_start-wiki-blue.svg?style=flat-square"></a>
<a href="https://github.com/Aircoookie/WLED-App"><img src="https://img.shields.io/badge/app-wled-blue.svg?style=flat-square"></a>
<a href="https://gitpod.io/#https://github.com/Aircoookie/WLED"><img src="https://img.shields.io/badge/Gitpod-ready--to--code-blue?style=flat-square&logo=gitpod"></a>
# WLED-based LED Sticks
These portable LED light poles make pretty lights for a dance party - and better yet:

</p>
They're **portable**! Convenient tripod bases keep them standing at attention, and a 10Ah USB battery (like the one you charge your phone with) will power them for about 8 hours.

# Welcome to my project WLED! ✨
They're **versatile**! You can deploy them in a [wide open space at Burning Man](https://youtu.be/UtXL0ScNUoE), in a [private event space](https://youtu.be/B6OBde7zRN4), or right next to each other [in your living room](https://youtu.be/UmiRBCOAMBg). (Click into these links for videos of them in action.)

They're **coordinated**! If you put them next to each other, they sync using near-field radio. And they'll even daisy-chain, meaning the furthest ones can be really far apart as long as there are some in the middle to relay the signal.

![IMG_1521](https://github.com/SteveEisner/tubes/blob/master/assembly/poles_in_use.jpg)

They're **sturdy**! I built over 100 of them and have deployed them at parties in all kinds of weather, from hot & dusty windstorms to torrential rain. They've been tossed in a truck, carried around as totems, knocked or blown over, and almost all of 'em are still working. Just don't let people use them like light sabers (lesson learned.)

They're also **in progress** with lots of things that could be improved. But for now:

* they play patterns from an expanding set of "genetically-driven" combinations
* they stay in sync or deliberately drift from each other in pleasing ways
* they operate internally at a certain BPM - allowing them to sync to music

## How do they work?

Each light tube is running custom software on an ESP32 microcontroller. The software is running a generative light program, based on the popular software WLED, that has a simple "DNA" specifying its pattern, color, effects overlay, offset, and so on.

The patterns run on a clock that's synced to a specific BPM and counts out the 4/4 rhythm of most dance music, so they morph and change on individual beats, measures, and phrases. After several beat phrases pass, a pole's DNA is mutated a little, which can cause it to change color, or adopt a new pattern, etc.

On-board radio lets a light pole broadcast its DNA and clock timer; when others hear the signal, they can choose to follow along by updating their own pattern DNA to match it. The method of coordination is pretty simple right now: each pole has an 8-bit ID, and lower-ID poles obey higher-ID poles.

If they're all close enough, they'll soon start doing the same thing as a group and keeping their clock timers in sync. In case they're not close enough, poles also re-broadcast all the signals they receive and obey. This lets them pass along a signal through the group until all of them have found it.

Some randomness and chaos is intentional. Radio isn't 100% reliable, so they sometimes fall out of contact and then re-connect. And in some cases, the poles will deliberately offset their own clock a bit so that they are clearly doing the same thing but not exactly at the same time. Each tube is actually running several copies of the software and smoothly "cross-fading" between them, to avoid any jarring transitions.

## Credits

The form factor was inspired by [Mark Lottor's Hexatron](http://www.3waylabs.com/projects/hex/). The color schemes were inspired by [the work of Christopher Schardt](https://americanart.si.edu/exhibitions/burning-man/online/christopher-schardt) and many were found on [cpt-city](http://soliton.vm.bytemark.co.uk/pub/cpt-city/). My most recent versions use the excellent [WLED](https://github.com/Aircoookie/WLED) codebase and run as a usermod. My older code was written using [FastLED](http://fastled.io/) and I still use some original patterns that are evolved versions of FastLED examples. The mesh networking is based on [Chuck Sommerville's led-swarm](https://github.com/chucks13/LED-swarm), and still follows its [theory](https://github.com/chucks13/LED-swarm/blob/master/theory.txt) for radio connection. When I kicked off this project, I used [Paul Stoffregen's WS2812Serial](https://github.com/PaulStoffregen/WS2812Serial) for smooth animation, and of course [his Teensy CPU](https://www.pjrc.com/teensy/teensyLC.html) made the whole thing possible. Standing on the shoulders of these giants let me create these in about a month, in time to debut at Burning Man 2019 and appear at many parties since!

## WLEDtubes branch changes

This is a WLED-based update to my [2019 light tube project](https://github.com/SteveEisner/tubes), which ran on Teensy + FastLED + nRF24L01 radios.

Most of the changes are in the usermod `usermods/Tubes`:
* Tubes is installed as an overlay function, which allows it to run WLED "underneath" but completely control the output.
* Its final output is a composition of multiple layers: it starts with WLED's output, then optionally overwrites with its own patterns, then runs a particle effects library on top of that.
* It stores a curated playlist of composite effects. Some are WLED stock FX, others are custom-built. It moves randomly through that playlist.
* At the time of writing, WLED could not correctly fade transitions between 2 FX. Tubes makes up for that by being able to fade between 1 WLED FX and 1 custom overlay pattern, or between 2 custom overlays. As it moves through the playlist, it ensures that it never plays two WLED FX in a row.
* The particle library runs on top of everything (including WLED FX) and introduces a variety of patterns & blit effects.
* If the user changes effects or palettes in the WLED web UI, Tubes will honor that & stop overlaying for a little while. It will eventually time out and revert to full overlay mode.
* Everything runs on a custom clock that is synced to a specific BPM. The BPM can be changed (manually now, automatic eventually) so that the effects perfectly sync to nearby music. WLED FX don't sync yet but could be speed-adjusted.
* An ESP-Now based mesh network is created, so all devices running this usermod stay in sync with each other, without Wi-Fi.

Mesh networking is based on a unidirectional broadcast protocol:
* Every device (node) is assigned a random 12-bit ID. This ID can change at any time, although in practice it only changes upon reboot.
* A node begins with the assumption that it is the only node, and therefore it is the leader, which means it's the one controlling patterns, palettes, and effects.
* As a node operates, it regularly broadcasts its status via ESP-Now, in case other device nodes are nearby. Nodes also continuously listen for ESP-Now broadcasts with node status.
* Status messages are identified by the node's ID. If a node receives a broadcast from a lower ID, it ignores it.
* When a node receives a broadcast from a higher ID, it assumes that other node must be the leader. It syncs its status to the leader's status & stops broadcasting its own status
* When a node receives a broadcast from the same ID, it assumes there's been an ID assignment collision and randomizes its own ID. (This happens sometimes even in a 12-bit space.)
* Nodes are assumed to be unstable; they can move or be turned off (or crash.) Status packets include both a current status and 30+ seconds of future states. All nodes can continue to run in sync even if they don't hear from the leader during this time.
* If a node hasn't heard from the leader in a long time (20 sec or more), it assumes the leader has permanently left. It reverts to being its own leader again until it hears from a new leader with higher ID.
* To help boost the leader's effective range, a following node will occasionally relay the leader's commands using the leader's ID. This helps sync devices that are out of range of the leader, but within range of a follower. The effective range of a single ESP32 device has been measured at hundreds feet; relays allow for an even larger mesh range.
* There's a protocol for explicit control, with commands that can be sent to specific nodes or all nodes. This allows a single master remote to directly control the entire mesh.
* This has been tested on 75+ devices in proximity, but theoretically can expand until it saturates ESPNow bandwidth (hundreds of devices? thousands? not sure)

The Tubes usermod uses several sub-libraries and helper functions:
* beats.h: an 8-bit bpm library that helps the Tubes run patterns at a specific bpm
* node.h: the ESP-Now based mesh network
* particle.h: a particle effects overlay library
* firmware.sh: successful firmware+config mass-autoupdater
* master.h: a remote that overrides & controls all ESP-Now nodes (run from a separate device)
* timer.h: a tiny library to help with timed events

There are several left-over modules that aren't used any more.
* bluetooth.h: a failed initial attempt to sync over BLE (now unused)
* updater.h + update_server.h: a failed attempt to write a peer-to-peer firmware auto-updater (unreliable)
* sound.h: an initial attempt to create some sound-reactive effect overlays

Also, there a few changes to core library files:
* New brighter, more vivid color palettes (palettes.h + wled00/FX_fcn.cpp)
* New button-press code to allow a single button to handle Wi-Fi protection (it's only turned on by explicit button press) and "Power-save" for battery operation (wled00/button.cpp)
* Fleet provisioning for flashing dozens of WLED controllers (wled00/wled_serial.cpp disabled to allow it)

# Original README: Welcome to WLED! ✨

A fast and feature-rich implementation of an ESP8266/ESP32 webserver to control NeoPixel (WS2812B, WS2811, SK6812) LEDs or also SPI based chipsets like the WS2801 and APA102!

Now with new magical sync powers!

## ⚙️ Features
- WS2812FX library with more than 100 special effects
- FastLED noise effects and 50 palettes
Expand Down
6 changes: 6 additions & 0 deletions tools/WLED_ESP32_4MB_noOTA.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0x2F0000,
spiffs, data, spiffs, 0x300000,0xF0000,
coredump, data, coredump,,64K
Loading