diff --git a/search/search_index.json b/search/search_index.json index 021afe73d..856ea23b1 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Welcome to WLED MoonModules & Sound Reactive","text":""},{"location":"#welcome-to-wled-moonmodules","title":"Welcome to WLED MoonModules","text":"
MoonModules/WLED is a fork from Aircoookie/WLED which contains latest merge of v0.14 of WLED with additional features.
This fork is created by members of the Atuline/WLED team to make development against v0.14 possible while still preserving Atuline/WLED v0.13 as a stable and supported version. The Atuline/WLED fork is also called WLED SR (Sound Reactive).
More info here.
"},{"location":"#good-to-know","title":"Good to know","text":"Disclaimer: using this software is the users responsibility as it is not bug free. Therefore contributors of this repo are not reliable for anything including but not limited to spontaneous combustion of the entire led strip, the house and the inevitable heat death of the universe
Join the Discord server to discuss everything about WLED MM and SR!
WLED Aircoookie welcome \ud83d\udc47
"},{"location":"#welcome-to-my-project-wled","title":"Welcome to my project WLED! \u2728","text":"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!
"},{"location":"#features","title":"\u2699\ufe0f Features","text":"See the getting started page!
On this page you can find excellent tutorials made by the community and helpful tools to help you get your new lamp up and running!
"},{"location":"#user-interface","title":"\ud83d\uddbc\ufe0f User interface","text":""},{"location":"#compatible-hardware","title":"\ud83d\udcbe Compatible hardware","text":"See here!
"},{"location":"#other","title":"\u270c\ufe0f Other","text":"Licensed under the MIT license Credits here!
Join the Discord server to discuss everything about WLED!
Check out the WLED Discourse forum! You can also send me mails to dev.aircoookie@gmail.com, but please only do so if you want to talk to me privately. If WLED really brightens up your every day, you can
Disclaimer
If you are sensitive to photosensitive epilepsy it is not recommended that you use this software. In case you still want to try, don't use strobe, lighting or noise modes or high effect speed settings. As per the MIT license, I assume no liability for any damage to you or any other person or equipment.
"},{"location":"2D/HUB75/","title":"HUB75 support","text":"WLED-MM now features support for LED matrix panels using the HUB75 format
You can use either a regular ESP32 with a suitable adapter board such as ESP32 Trinity or rorosaurus/esp32-hub75-driver or the dedicated Adafruit Matrix Portal S3
This support is supplied by the ESP32-HUB75-MatrixPanel-DMA library, so see here for more details about supported hardware
Support for HUB75 in WLED-MM should be considered experimental at the moment, but we welcome early feedback on this new feature - please share your experience in the 2D channel
"},{"location":"2D/HUB75/#setup","title":"Setup","text":""},{"location":"2D/HUB75/#required-software-build","title":"Required Software Build","text":""},{"location":"2D/HUB75/#adafruit-matrix-portal-s3","title":"Adafruit Matrix Portal S3","text":"Please use the dedicated adafruit_matrixportal_esp32s3 build as this is pre-configured for the pins needed for HUB75 output
"},{"location":"2D/HUB75/#huidu-hd-wf2-esp32-s3","title":"Huidu HD-WF2 ESP32-S3","text":"You must use a build with WLED_ENABLE_HUB75MATRIX defined, for example, esp32_4MB_V4_S. If you do not see Hub75 options in the list of LED types, you are not using the correct build
If you are using a board such as the ESP32 Trinity or other boards wired for the default pinout of the ESP32-HUB75-MatrixPanel-DMA driver, this is selected by default
If you are using the rorosaurus/esp32-hub75-driver or any other board using the SmartMatrix default pinout then you will need to do a custom build with ESP32_FORUM_PINOUT defined
If you are using any other config, you currently need to edit wled00/bus_manager.cpp to add a new elif block and define to your build - it is not possible to set the HUB75 pin config in LED preferences at the moment
"},{"location":"2D/HUB75/#configuration","title":"Configuration","text":""},{"location":"2D/HUB75/#panel-size-and-chain-length","title":"Panel size and chain length","text":"First, you must set the LED output to match the correct Hub75Matrix option for the panel size you are using. The chain length is the number of panels connected. Note: currently only a horizontal chain of panels is supported. You can used 2D setup to configure physical panel positions.
Next, you need to go into the 2D Configuration and create a single matrix with the total size of your hub75 setup. e.g a chain of 2 panels with 32x32 pixels each, would be created as a 64x32 matrix in the 2D configuration page
"},{"location":"2D/HUB75/#hub75-known-problems-and-limitations","title":"HUB75 Known Problems and Limitations","text":"This page is a work in progress
Check WLEDSR - 2D Support for original content
"},{"location":"WLEDSR/%28temporary%29-WLEDSR-improvements-and-bugfixes-from-0.13.2-to-0.13.3/","title":"(temporary) WLEDSR improvements and bugfixes from 0.13.2 to 0.13.3","text":""},{"location":"WLEDSR/%28temporary%29-WLEDSR-improvements-and-bugfixes-from-0.13.2-to-0.13.3/#user-interface-and-generic-features","title":"User Interface and generic features","text":"-D WLED_WATCHDOG_TIMEOUT=30
to activateXY()
function which returns the index number of the X-Y coordinate on the matrix has been added.As documented in FastLED, leds[0] should end up being at the top left of your array:
Don't enable serpentine setting if your pixels are\nlaid out all running the same way, like this:\n\n 0 > 1 > 2 > 3 > 4\n |\n .----<----<----<----'\n |\n 5 > 6 > 7 > 8 > 9\n |\n .----<----<----<----'\n |\n 10 > 11 > 12 > 13 > 14\n |\n .----<----<----<----'\n |\n 15 > 16 > 17 > 18 > 19\n\nEnable serpentine setting if your pixels are\nlaid out back-and-forth, like this:\n\n 0 > 1 > 2 > 3 > 4\n |\n |\n 9 < 8 < 7 < 6 < 5\n |\n |\n 10 > 11 > 12 > 13 > 14\n |\n |\n 19 < 18 < 17 < 16 < 15\n
matrixWidth
and matrixHeight
are new 'LED Settings'.matrixWidth
is the number of pixels per row.matrixHeight
is the number of pixels per column.The dev branch has a new XY() function (thanks Sutaburosu) in FX.cpp, which supports multiple layouts.
There are 5 orientation flags as follows:
By comparison, the author's aliexpress purchased 16x16 array needs to be configured as:
Serpentine | Rowmajor | Flipmajor\n
Note: When an X,Y value goes out of bounds, this routine writes to an LED beyond SEGLEN, and as a result, we need to use the setPixels() routine to write to the display.
Note: Working with this can be confusing, so here's a simulator you can play around with to get familiar with XY() at Wokwi.
"},{"location":"WLEDSR/2D-Functionality/#multiple-panels-202106dev","title":"Multiple panels (202106/dev)","text":"When you want to create larger matrices, the standard available panels are not big enough. They typically are 16x16 or 8x32 pixels. To support large matrices, they should be connected together. This is now supported in WLED SR (currently in dev version). Multiple panels can be specified in the LED-Preferences screen by checking Multiple Panels and then defining the number of horizontal and vertical panels. First panel should be top left, extending to the right, the extending down, until bottom right.
For example if you create a 32x32 matrix by connecting 4 8x32 panels together you have 4 horizontal panels and 1 vertical panel. Alternatively if you have 4 16x16 panels, you have 2 horizontal and 2 vertical panels. In the latter case, panel ordering is:
0 1
2 3
The XY() function supports this by first determining in which panel an (x,y) coordinate should be displayed and then within a panel it's position is determined as described above (using flipmajor, serpentine etc.).
In the 8x32 example above, 0<x<8 is displayed in the first panel, 8<x<16 in the second panel and so on. For each panel, the first led number is calculated. E.g. if each panel has 256 leds then the second panel first led is led[256]. The values of x and y are then corrected by the width and the height of the panel to find the place within the panel (major and minor values)
"},{"location":"WLEDSR/2D-Support/","title":"2D Support","text":""},{"location":"WLEDSR/2D-Support/#introduction","title":"Introduction","text":"In order to accommodate 2D effects we have modified how Segment settings are used and added 2D Matrix and panel variables on the Led Preferences settings. Note: Currently only working in dev. You are invited to test this and give feedback on Beta testing discord channel
"},{"location":"WLEDSR/2D-Support/#2d-architecture","title":"2D architecture","text":"WLED SR distinguishes between the following levels * 2D Segment (dev) * 2D Matrix (dev) * 2D Panel (dev)
An effect is plotted on a segment. A segment is a rectangle on a matrix (logical level). A matrix is implemented by one or more identical led panels, with a specific layout (e.g. first led bottom left, serpentine, physical level).
Note: 2D effects can also be projected on a 1D LED Strip instead of a 2D Panel. e.g. for a led strip of 144 leds you can define width=height=12 and each zone of 12 leds is a row of a matrix. Rows are then side by side instead of above each other. Some 2D effects, e.g. graphic equalizer look still pretty cool on strips (as is the other way around with 1D effects on a 2D matrix like NoiseMove or Sparkle).
"},{"location":"WLEDSR/2D-Support/#2d-segments","title":"2D Segments","text":"As WLED supports multiple segments, all effects and therefore also 2D effects are first projected on a segment. In 1D, a segment is a zone on a LED strip and is specified by Start Led and a Stop Led (note that Stop Led is one led after the last led in the segment).
In 2D, a segment is a rectangle on a 2D matrix and 2D effects plot on this rectangle using x,y coordinates of the SEGMENT. A rectangle can be defined in the Segment UI where the start led specifies the top-left and the stop led specifies the bottom-right of the rectangle. Multiple segments can be specified this way. Segments can overlap. In fact overlapping creates very nice effects.
See Segment start stop charts to easy find matrix start and stop values
"},{"location":"WLEDSR/2D-Support/#rotation-and-reversexy","title":"Rotation and ReverseX/Y","text":"A segment can be rotated 90\u00ba degrees and reversed on the X or Y-axis and can be specified in the Segment-UI. The SegmentRotation branch of dev supports this and is currently in beta-test. This will move to dev and release over time.
The following table shows the effect setting these values:
Value Rotation Reverse X Reverse Y Effect 0 - - - 0\u00ba rotation and no reverse 1 - - + Reverse horizontal 2 - + - Reverse vertical 3 - + + 180\u00ba rotation 4 + - - 90\u00ba rotation 5 + - + 90\u00ba and reverse horizontal 6 + + - 90\u00ba and vertical 7 + + + 270\u00ba rotation"},{"location":"WLEDSR/2D-Support/#2d-matrices-and-panels","title":"2D Matrices and panels","text":"See Led Preferences
"},{"location":"WLEDSR/2D-Support/#technical","title":"Technical","text":"(Created by Harry Baas)
"},{"location":"WLEDSR/2D-Support/#examples","title":"Examples","text":""},{"location":"WLEDSR/2D-Support/#16x16-matrix_1","title":"16x16 matrix","text":"To get the (x,y) coordinates from the start and stop led: * Segment top left = (start%matrixWidth, start/matrixWidth) * Segment bottom right = (stop%matrixWidth, stop/matrixWidth)
Example of 1 segment (default) covering a whole 16x16 matrix: * start = 0, stop = 255 * top left = (0,0) * bottom right = (15,15) * width = height = 16
Example of a segment covering a middle part rectangle of the 16x16 matrix: * start = 20, stop = 235 * top left = (4,1) * bottom right = (10,14) * width = 7 * height = 14
Example of a segment covering the left part of the 16x16 matrix: * start = 0, stop = 241 * top left = (0,0) * bottom right = (0,15) * width = 1 * height = 16
"},{"location":"WLEDSR/2D-Support/#16-x-12-matrix","title":"16 x 12 matrix","text":"matrixWidth = 16, matrixHeight = 12.
Total led count 192 leds
left and right binmap effect. In the middle noisemove.
Add the following Api command into a preset. This will show the Saw effect rotated and reversed in 16 8*8 segments.
After that you, if you select all 16 segments and select another effect, this effect will also be populated to all 16 segments, resulting in surprising new effects
{\"on\":true,\"bri\":89,\"transition\":7,\"mainseg\":0,\"seg\":[{\"id\":0,\"start\":0,\"stop\":232,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":false,\"rev2D\":false,\"mi\":false,\"rot2D\":false},{\"id\":1,\"start\":8,\"stop\":240,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":true,\"rev2D\":false,\"mi\":false,\"rot2D\":false},{\"id\":2,\"start\":16,\"stop\":248,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":false,\"rev2D\":false,\"mi\":false,\"rot2D\":false},{\"id\":3,\"start\":24,\"stop\":256,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":true,\"rev2D\":false,\"mi\":false,\"rot2D\":false},{\"id\":4,\"start\":256,\"stop\":488,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":false,\"rev2D\":true,\"mi\":false,\"rot2D\":false},{\"id\":5,\"start\":264,\"stop\":496,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":true,\"rev2D\":true,\"mi\":false,\"rot2D\":false},{\"id\":6,\"start\":272,\"stop\":504,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":false,\"rev2D\":true,\"mi\":false,\"rot2D\":false},{\"id\":7,\"start\":280,\"stop\":512,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":true,\"rev2D\":true,\"mi\":false,\"rot2D\":false},{\"id\":8,\"start\":512,\"stop\":744,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":false,\"rev2D\":false,\"mi\":false,\"rot2D\":false},{\"id\":9,\"start\":520,\"stop\":752,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":true,\"rev2D\":false,\"mi\":false,\"rot2D\":false},{\"id\":10,\"start\":528,\"stop\":760,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":false,\"rev2D\":false,\"mi\":false,\"rot2D\":false},{\"id\":11,\"start\":536,\"stop\":768,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":true,\"rev2D\":false,\"mi\":false,\"rot2D\":false},{\"id\":12,\"start\":768,\"stop\":1000,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":false,\"rev2D\":true,\"mi\":false,\"rot2D\":false},{\"id\":13,\"start\":776,\"stop\":1008,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":true,\"rev2D\":true,\"mi\":false,\"rot2D\":false},{\"id\":14,\"start\":784,\"stop\":1016,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":false,\"rev2D\":true,\"mi\":false,\"rot2D\":false},{\"id\":15,\"start\":792,\"stop\":1024,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":true,\"rev2D\":true,\"mi\":false,\"rot2D\":false},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0}]}
In order to be able to use leds[i] in WLED, we add the following global variable:
uint32_t ledData[MAX_LEDS]; // See const.h for a value of 1500.\n
In many routines, we are adding the following code so that we don't have lossy data when copying led information from one element to the next:
CRGB *leds = (CRGB*) ledData;\n\n // leds[i] code in here\n\n setPixels(leds);\n return FRAMETIME;\n
This works with SEGMENTS in that two different animations don't clash. The questions I have are:
If the latter, would that not be very inefficient, and if inefficient, would it not make more sense to use:
if (!SEGENV.allocateData(sizeof(CRGB)*SEGLEN)) return mode_static(); //Allocates based on the size of a CRGB\n CRGB* leds = reinterpret_cast<CRGB*>(SEGENV.data);\n\n // leds[i] code in here\n\n setPixels(leds);\n return FRAMETIME;\n
That being said, an associate with embedded system support says that dynamic memory allocation is NOT a good thing to perform on embedded systems.
Thoughts?
In the meantime, and I quote: \"When allocating memory the danger is always that that memory isn't deallocated properly, and thus leaks memory. Running out of RAM happens very fast on embedded devices that's why it's discouraged.\"
"},{"location":"WLEDSR/Adding-Sliders/","title":"Sliders in WLED","text":""},{"location":"WLEDSR/Adding-Sliders/#introduction","title":"Introduction","text":"This page provides WLED programmers information on adding another slider to WLED. This information is not yet complete, as it doesn't yet deal with icons, EEPROM or IR. I will also be researching how to programmatically show/hide these sliders.
"},{"location":"WLEDSR/Adding-Sliders/#updating-html_uih","title":"Updating html_ui.h","text":"Please see https://mm.kno.wled.ge/WLEDSR/Modifying-Sound-Reactive-WLED on how to generate html_ui.h since the UI was changed in v0.10.0-alpha-lw.
The information below describes the way html_ui.h was generated before the UI change and is deprecated.
This file is compressed and is taken from data\\index.htm. Please see Aircoookie's page on 'adding your own effect:
https://github.com/Aircoookie/WLED/wiki/Add-own-functionality
To serve your changes by the internal webserver, you will need to follow these or similar steps to gzip compress the index.html file:
Here's a link to my Google document containing the changes required:
https://docs.google.com/document/d/1m6dm3O_aXgJLGDJfM6E-4CHzzvU8bsaHqrs7VmisYko/edit
"},{"location":"WLEDSR/Adding-a-Sound-Settings-page-to-the-UI/","title":"Adding a new Settings Page","text":""},{"location":"WLEDSR/Adding-a-Sound-Settings-page-to-the-UI/#introduction","title":"Introduction","text":"This page outlines the methods we used and the files that must be modified to add a Sound Settings page to the WLED UI.
"},{"location":"WLEDSR/Adding-a-Sound-Settings-page-to-the-UI/#new-settings_soundhtm","title":"NEW settings_sound.htm","text":"I first added a new file in the data folder named settings_sound.htm
. I did a copy/paste from settings_leds.htm
to have a base for the new settings page. Let's break down this file. * At the top, we have our standard HTML beginning lines with the TITLE of the page between the <title>
tags. * Inside of the <script>
tags we have a few functions that are necessary for the page to function. * function H()
is our help button function. When called, the UI will direct you to the relevant wiki page inside the window.open()
function. * function B()
is our back button function. When called, the UI will direct you to the previous main settings page via window.open(\"/settings\",\"_self\")
. * function GetV()
injects the values from the relevant settings stored in EEPROM to the settings page. * Inside the <style>
tag we @import
the relevant style.css
file. This closes our <head>
tag. * When the body of the page is loaded, function GetV()
is called. This can vary depending on the functions that need to be called when the page loads. * Inside the <body>
tag we have our form. This form holds the layout for the settings page. * Our squelch and gain settings have the names \"SQ\" and \"GN\" respectively. These names refer to the name given to the setting in xml.cpp
and are used to retrieve and save these settings from/to EEPROM.
This file holds the settings page button layout. We want to add an entry so we can access our new settings page. This was pretty straight forward. I added the following line, in the position I wanted it to appear on the page, using the previous entries as an example.
<form action=\"/settings/sound\"><button type=\"submit\">Sound Settings</button></form>\n
I also made some changes to the style of the buttons so they all show on the same page. This was not necessary but I feel it gave a more polished look."},{"location":"WLEDSR/Adding-a-Sound-Settings-page-to-the-UI/#modify-xmlcpp","title":"Modify xml.cpp","text":"This is our map, so to speak. Each setting is given a unique 2 character string that will be used to reference it in the UI. In our case, \"SQ\" and \"GN\". This file is also the map for the XML response when querying the API. Our settings aren't used in the API at this time so I won't go into that right now.
There are two important functions in xml.cpp that relates to our task which are void sappend()
and void sappends()
* sappend()
takes a numeric setting and appends it to the string buffer. Valid cases for this function are: * 'c', a check box * 'v', a numeric value * 'i', the selected index * sappends()
takes a string setting and appends it to the string buffer. Valid cases for this function are: * 's', a string setting * 'm', a message to be displayed
Around line 192 in xml.cpp we have the function getSettingsJS()
which retrieves the settings values from EEPROM based on the current sub-page which is defined in wled_server.cpp.
We want to add a sub-page so we need to change the following line from if (subPage <1 || subPage >7)
to if (subPage <1 || subPage >8)
. At the end of this function, after the last sub-page (previously 7) we have the following code block around line 522:
if (subPage == 8)\n{\n sappend('v',\"SQ\",soundSquelch);\n sappend('v',\"GN\",sampleGain);\n }\n
Here we can see our SQ and GN settings are loaded from EEPROM and filled in to their respective form field using the v case from the sappend()
function."},{"location":"WLEDSR/Adding-a-Sound-Settings-page-to-the-UI/#modify-setcpp","title":"Modify set.cpp","text":"This file handles storing the settings entered into EEPROM. Similar to xml.cpp, we want to add a settings page so we need to tell WLED there is an additional page in the handleSettingsSet()
function. I changed the following line from if (subPage <1 || subPage >7) return;
to if (subPage <1 || subPage >8) return;
.
Lastly, I added the following code block after the last defined sub-page around line 361:
//SOUND SETTINGS\nif (subPage == 8)\n{\n int t;\n t = request->arg(\"SQ\").toInt();\n if (t > 0) soundSquelch = t;\n t = request->arg(\"GN\").toInt();\n if (t > 0) sampleGain = t;\n}\n
"},{"location":"WLEDSR/Adding-a-Sound-Settings-page-to-the-UI/#modify-wled_servercpp","title":"Modify wled_server.cpp","text":"This file serves the webpage for the WLED frontend. We want to add a settings page so we will add the following block of code around line 82, using the previous block as an example. Notice the sub-page defined in xml.cpp is referenced as well as the NEW setting page URL defined in settings.htm.
// add sound settings page\nserver.on(\"/settings/sound\", HTTP_POST, [](AsyncWebServerRequest *request){\n handleSettingsSet(request, 8);\n serveMessage(request, 200,F(\"Sound settings saved.\"),\"Redirecting...\",1);\n});\n
In the serveSettings()
function around line 383 we need to add else if (url.indexOf(\"sound\")> 0) subPage = 8; // add sound settings page
, so the webserver knows to load those settings. And finally we need to add a case around line 406 for our new sub-page like this case 8: request->send_P(200, \"text/html\", PAGE_settings_sound, settingsProcessor); break;
.
Finally, we need to add our new settings page to cdata.js
in the tools folder. This file holds the framework for modifying the compressed *.h
files that serve the WLED frontend. This is the file nodejs looks to when running npm run build
to compress the *.htm
files in the data folder into *.h
files which are compiled with the firmware.
I used the previous entries as an example and added the following code block around line 243:
{\n file: \"settings_sound.htm\",\n name: \"PAGE_settings_sound\",\n prepend: \"=====(\",\n append: \")=====\",\n method: \"plaintext\",\n filter: \"html-minify\",\n mangle: (str) =>\n str\n .replace(/\\<link rel=\"stylesheet\".*\\>/gms, \"\")\n .replace(/\\<style\\>.*\\<\\/style\\>/gms, \"%CSS%%SCSS%\")\n .replace(\n /function GetV().*\\<\\/script\\>/gms,\n \"function GetV() {var d=document;\\n\"\n ),\n},\n
Those are the steps I took to modify the WLED settings pages and add a page for the sound reactive related settings in the UI. Once those were completed, I ran npm install
and npm run build
to compress the new UI and include it in the firmware. After compiling the new firmware, I needed to reset the EEPROM via http://WLED/settings/sec?
-> Factory reset.
Generally we recommend using I2S digital sound input - like INMP441, SPH0645, ICS-43434, or PDM I2S microphones. Additionally there are solutions for line-in via I2S. For example, boards/shields with \"es7243\" chip should work already (we have a special driver for these), and we're investigating \"es8388\".
Below are a number of popular Arduino compatible analog microphones that have been tested.
Model Compatibility Notes MAX9814 Good+ Best to set the gain to 40dB. MAX9812 Fair Only 20dB gain, but worked OK. MAX4466 bad Is very sensitive to 3.3V noise and voltage dropout due to Wifi activity. Avoid powering your LED strip from ESP32, as the strip causes a lot of noise on the 3.3V/5V power lines. INMP401 Good Some Chinese ones are not reliable. Clap Sensors (LM393, KY-038, KY-037) unusable these sensors may have an \"analogue output\" but the signal quality is extremely poor. Don't use them as a microphone, they were designed for other purposes.See also
\u21d2 Sound setting examples for common microphones
\u21d2 noise and spikes on analog microphones
If you are using the MAX9814, you need to connect gain to vdd to set the gain to 40dB as the default 60db has far too much background noise.
"},{"location":"WLEDSR/Analog-Audio-Input-Options/#dont-waste-your-money-on-cheapest-hardware","title":"Don't waste your money on cheapest hardware","text":"Important: there are some inexpensive sound sensors you can buy from Aliexpress or elsewhere (such as LM393, KY-038 or KY-037). Typically these have an on/off output only (detecting \"sound\" or \"silence\"), sometimes there is an additional \"analog data out\" with very low quality. They may or may not work adequately. For more information on our microphone test results, see our Arduino Compatible Microphones document.
"},{"location":"WLEDSR/Analog-Audio-Input-Options/#use-squelch","title":"Use Squelch","text":"If the LED's are active when the ambient volume is low while running volume only effects beginning with a single '*', you can increase the background noise filtering (or squelch) by navigating to the 'Config | Sound Settings' and increase the Squelch value. You can also make it more sensitive by lowering that Squelch value. In addition, there is a gain setting, which is required especially for the much lower signal level provided by the line-in configuration. Gain, Squelch and AGC are affecting all soundreactive, volumereactive and frequency (FFT) reactive effects.
"},{"location":"WLEDSR/Analog-Audio-Input-Options/#good-to-know","title":"good to know","text":"Note 1: Do NOT connect input devices to 5V (or Vin). The power should be connected to the 3.3V pin.
Note 2: A piezo vibration sensor (from aliexpress) was successfully hooked up and tested. This piezo hack is not possible any more, as piezo impulses would be filtered out as random noise.
Note 3: On the ESP32, the default ADC pin is GPI36 (also known as VP), while the ESP8266 uses A0. On ESP32, any GPIO related to ADC1 can be used - see next note.
Note 4: If your ESP32 doesn't have pin 36, any of the other ADC1 (and not ADC2) pins should work.
Note 5: On the ESP32, the ADC and I2S pins are defined in audio_reactive.h. You can also select them in the sound settings UI.
"},{"location":"WLEDSR/Analog-Audio-Input-Options/#wiring","title":"Wiring","text":""},{"location":"WLEDSR/Analog-Audio-Input-Options/#the-following-schematics-are-provided-as-an-example-only-there-are-many-ways-to-achieve-the-same-results-these-are-only-a-few-of-those-ways","title":"The following schematics are provided as an example only. There are many ways to achieve the same results. These are only a few of those ways.","text":"Microphone Wiring Example (MAX9814) Line In Wiring ExampleSome folks have mentioned that they don't need this line-in circuit, which is fine. Here's an explanation of that circuit.
The 680 ohm resistors provide termination so that you don't get reflection on the incoming signals. The 100nf capacitors remove any DC offset from the incoming signal. Remember that the ESP goes from 0V to 3.3V. Beyond that lay dragons. Finally, the 1M resistors provide DC centering of the incoming (now) AC only signal halfway between 0 and 3.3V.
Note 1: If you are just using a single L or R channel for the line-in, disconnect the capacitor for the other channel, or the resultant sample will be significantly reduced in amplitude.
Note 2: Providing a 'T' connector so that you can hear the music as it goes into the circuit is highly recommended. In the author's case, there was considerable static when the ESP32 was powered by the computer's USB port, but was fine when the ESP32 was powered by a USB powerbank.
"},{"location":"WLEDSR/Analog-Audio-Input-Options/#dual-input-wiring","title":"Dual Input Wiring","text":"The following diagram shows one way of connecting a 3.5mm jack and an analog microphone to the ESP8266/32 while being able to change your desired input with a simple SPDT switch.
The left and right channels of the TRS Jack are connected together to sample both channels simultaneously as one channel.
Connect the output of the capacitor to the ADC pin for your board.
"},{"location":"WLEDSR/Analog-Audio-Input-Options/#pins-used","title":"Pins Used","text":"On the ESP32, the default ADC pin used is GPI36 (also known as VP), while the ESP8266 uses A0. Power is connected to the 3.3V pin. On ESP32 The ADC pin can be configured on the sound settings page; any GPIO associated with ADC1
(i.e. GPIO32 to GPI39) can be used.
The volume and frequency reactive routines (starting with a single or double *), support a squelch or background noise suppression. This can be configured on the Sound Settings page.
"},{"location":"WLEDSR/Analog-Audio-Input-Options/#gain","title":"Gain","text":"Line-in signals are typically much lower than that of some of the microphones. Rather than use an auto gain function, you can manually adjust the gain from 1 to 255, which translate to a gain factor from 0.1 up to 6.5 gain. That's equivalent to a range of -20dB up to +16dB.
"},{"location":"WLEDSR/Analog-Audio-Input-Options/#problems-encountered","title":"Problems Encountered","text":"Noise - Some recommendations to reduce noise
Spikes - We've often seen spikes when using an analog microphone in conjunction with WLED. There's an article that should shed light on the issue at ESP32 microcontroller generates noise on microphone.
Use this basic code to read and calculate the average from the INMP401/MAX4466/MAX9814 microphone on an ESP32 or ESP8266
micLev
variable is the DC Offset value that you can use for zeroing your samples./* ESPSample\n *\n * By: Andrew Tuline\n *\n * Updated: Feb, 2019\n *\n * Basic code to read and calculate average from the Sparkfun INMP401/MAX4466/MAX9814 microphone\n * on an ESP32 or ESP8266.\n * \n * Use the Arduino Serial plotter to view the output. Compare results to those found at:\n * \n * https://github.com/atuline/WLED/blob/assets/docs/Microphones.pdf\n *\n * Note that the ESP32 employs a 12 bit A/D, while the ESP8266 has a 10 bit A/D. Also note\n * the anomalous spikes on the ESP8266.\n * \n * The micLev variable is the DC Offset value that you can use for zeroeing your samples.\n * \n */\n\n#ifdef ESP8266\n#define MIC_PIN A0 // ESP8266 pin A0\n#else\n#define MIC_PIN 36 // ESP32 pin also known as 'VP'.\n#endif\n\nvoid setup() {\n delay(1000);\n Serial.begin(115200); // Initialize serial port for debugging.\n} // setup()\n\nvoid loop() {\n analog_sample();\n} // loop()\n\nvoid analog_sample() {\n static float micLev; // Needs to be a float, or smoothing calculation below will be very inaccurate.\n int micIn = analogRead(MIC_PIN);\n micLev = ((micLev*31)+micIn)/32; // Smooth out the data to get average value (used for zeroeing).\n Serial.print(micIn); Serial.print(\" \");\n Serial.print(micLev); Serial.println(\" \");\n} // analog_sample()\n
Original code can be found here."},{"location":"WLEDSR/Arduino-IDE-Compile-%28Outdated%29/","title":"Arduino IDE Compile (Outdated)","text":""},{"location":"WLEDSR/Arduino-IDE-Compile-%28Outdated%29/#compiling-from-a-fresh-install-of-the-arduino-ide","title":"Compiling from a fresh install of the Arduino IDE","text":"Note: Around October 2020, mismatching library version issues made it increasingly difficult to compile WLED with the Arduino IDE. Your best bet is to use VS Code with Platform IO. In the meantime, here's the old Arduino IDE instructions:
If you already have ESP8266/32 drivers installed, please ensure your drivers are recent:
Note: Before attempting to compile WLED, make sure you can select your ESP board and compile a basic sketch such as: \"File | Examples | 01.Basics | Blink\"
"},{"location":"WLEDSR/Arduino-IDE-Compile-%28Outdated%29/#wled-library-pre-requisites","title":"WLED library pre-requisites:","text":"WLED makes use of a LOT of 3rd party libraries and is NOT easy to compile, especially for anyone new to Arduino. Although the WLED distribution contains several of these libraries, it doesn't include them all. Additional libraries you need to install are:
See the next section to find/install these libraries.
"},{"location":"WLEDSR/Arduino-IDE-Compile-%28Outdated%29/#install-libraries-that-are-included-in-the-library-manager","title":"Install libraries that are included in the Library Manager","text":"To install libraries that are not in the library manager, you would typically:
Your library should now be included if you go \"Sketch | Include Libraries\" and navigate down to Contributed libraries.
Download and install ESPAsyncTCP
Download and install ESPAsyncWebServer
Download and install ESPAsyncUDP
Note: AirCoookie has since created a fork of ESPAsyncWebServer, and the original ESPAsyncWebServer will no longer work with WLED. If you have the original installed, you can edit wled.h and comment out the line as follows:
// #define WLED_ENABLE_WEBSOCKETS
If you add the library manually or with git you will most likely need to restart, yes restart the Arduino IDE before it will be recognized. For more information on libraries, see: https://www.arduino.cc/en/Guide/Libraries.
When you are done, if you navigate to 'File | Examples' and scroll all the way down, you should see:
"},{"location":"WLEDSR/Arduino-IDE-Compile-%28Outdated%29/#download-wled","title":"Download WLED","text":"If you have 'git' installed, navigate to where you want to store your project and run:
git clone https://github.com/atuline/WLED.git WLED-Reactive
Once you have:
You should now be able to compile and upload WLED to your ESP device.
If this feels like a treasure hunt, it is. Now, imagine what the authors of WLED had to go through just to get this all working together. We just figured out how to compile it and to get some sound reactive code running.
"},{"location":"WLEDSR/Connectivity-Issues/","title":"Connectivity Issues","text":"We've sometimes been unable to connect to one or more of our WLED enabled devices. Here are some things to try:
Note: This page has been brought to you by our Discord friend @tuantrung2905. Thanks for your continued and persistent testing efforts!
"},{"location":"WLEDSR/Contributing-Code-to-SR-WLED/","title":"Contributing Code to SR WLED","text":"We learned a long time ago that adding new code can make for a LOT of testing. If you offer to help out with this fork, please keep in mind that we support:
If you'd like to contribute, you would need to be able to perform a significant amount of testing and future maintenance (see above) so your new code doesn't unintentionally break other functionality.
"},{"location":"WLEDSR/Contributing-Code-to-SR-WLED/#what-functionality-to-add","title":"What functionality to add:","text":"dev
branch! Do not create a PR for master
unless there is a very good reason.We still have the occasional issue with our dev/master branches where we lose connectivity with the web server. This was most prevalent with the ESP8266 branch in AP mode, and precipitated a re-write for that platform. As a result of this ongoing issue, we are sensitive to new functionality being added without adequate testing.
In conclusion, the most important factors are commitment, teamwork, communication, documentation, testing, testing and more testing. Oh yea, and a bit of new code as well, just so long as it's thoroughly tested across the range of supported environments.
"},{"location":"WLEDSR/Contributing-Code-to-SR-WLED/#can-i-help","title":"Can I help?","text":"Yes! This is a community project, and contributions are welcome! We're always up for a good PR(see above).
Just remember that any code you add will need to be maintained when we attempt to incorporate future versions of WLED. It's easy to add new code; maintaining it across multiple versions of WLED is a whole other matter. Be sparing with your additions.
"},{"location":"WLEDSR/Contributors-and-credits/","title":"Contributors and credits","text":"I2S digital sound modules utilize the industry-standard 24-bit I\u00b2S interface. The I\u00b2S interface allows to connect them directly to an ESP32 (but NOT an ESP8266). The INMP441, and also the recently tested ICS-43434 (thanks to Serg74) work very well with SR WLED, and they perform much better than any analog device at a comparable price.
from INMP441, ICS-43434 from PDM (e.g. SPM1423) from Other to ESP32 GPIO L/R SEL SEL Gnd ground => left channel. Don't leave this pin unconnected! SD DATA DOUT 32 serial data WS CLK LRCK 15 left right clock SCK -- BCLK 14 serial clock -- -- MCLK 0 master clock (if needed) VDD 3V3 VDD 3.3V power don't use 5V! GND GND GND Gnd ground, 0V
ESP32 pins in the table are just examples. In fact any available GPIO can be used for I\u00b2S on ESP32. * SD can be either an in/out pin (gpio < 34) or an input-only pin (gpi >= 34), * while WS and SCK must be in/out pins (gpio < 34).
See also \u21d2 Sound setting examples for common microphones
"},{"location":"WLEDSR/Digital-Microphone-Hookup/#microphone-type-sr-wled-sound-settings","title":"Microphone type (SR-WLED sound settings) )","text":"Generic I2S
for INMP441, ICS-43434, and other non-PDM devicesGeneric I2S PDM
for PDM microphones like SPM1423SPH0645
for adafruit SPH0645ES7243
for Lyra-T mini, and other board that have the ES7243 chipGeneric I2S with Mclk
only for devices that have an addition pin for 'master clock'Important: please make sure that your I2S device provides sound input on the LEFT audio channel! For the INMP441 this is achieved by wiring the 'L/R' connection to GND (ground). Only exception is the \"ES7243\" driver, which is always using the RIGHT audio channel.
"},{"location":"WLEDSR/Digital-Microphone-Hookup/#pins","title":"Pins","text":"Since 0.12.0, you can change I2S GPIO pins in the Sound Settings interface; on ESP32 any available GPIO can be used for I\u00b2S. The 'SD' signal could also be mapped to an input-only (GPI) pin (*), if you are low on GPIO pins. You'll need to reboot when done with pin assignment - don't forget to \"save\". To reboot, please press 'reset' on your ESP32. Unfortunately a restart by software (\"soft reboot\") is not always sufficient to activate new driver settings.
"},{"location":"WLEDSR/Digital-Microphone-Hookup/#line-in","title":"Line-in","text":"In addition to I2S microphones, there are solutions available for line-in via I2S. We already have driver support for Boards/Shields with \"es7243\" chip, and we're investigating \"es8388\".
Other I2S ADC (analog-to-digital-converter) devices and microphones that have a standard I2S interface may already work with WLED-SR, by using one of the I2S \"Generic\" drivers (Generic I2S
, Generic I2S PDM
, or Generic I2S with Mclk
). It is important however that sound input comes on the LEFT audio channel. Please keep in mind that this is a spare-time open source project - we do our best to make generic drivers but we cannot test with all available devices.
(*) Due to a problem that was fixed very recently, its not possible to use input-only GPI pins in older releases of SR WLED. There will be no warning if you try to do so. This problem is solved in the latest release version of SR WLED.
In old releases, you need to change GPIO pins used by defining I2S_WS
, I2S_SD
, and I2S_SCK
in your PlatformIO config, or by editing the values in audio_reactive.h.
We do not have these digital microphones running on an ESP8266.
Having problems getting the INMP441 running with WLED? Here's a test sketch (which you can compile with the Arduino IDE): https://pastebin.com/Ua7s7LYF . If you are still having a problem with that sketch, change the line with ONLY_LEFT to ONLY_RIGHT. If that works, you'll need to go into audio_source.h and change that line.
Initial I2S support by @spedione
"},{"location":"WLEDSR/Digital-Microphone-Hookup/#some-i2s-audio-modules-and-boards","title":"Some I2S audio modules and boards","text":""},{"location":"WLEDSR/Digital-Microphone-Hookup/#imnp441","title":"IMNP441","text":"This is the IMNP441; you can find it in many shops including Amazon and Aliexpress. It works very well with SR WLED.
"},{"location":"WLEDSR/Digital-Microphone-Hookup/#ics-43434","title":"ICS-43434","text":"
Here's the first board I've seen with the ICS-43434 at: https://www.tindie.com/products/serg74/digital-i2s-microphone-ics-43434-add-on/
"},{"location":"WLEDSR/Digital-Microphone-Hookup/#i2s-adc-for-line-in","title":"I2S ADC for Line-In","text":"
It is recomended to capture audio using a digital input for Line-In rather than the analog solution, see this guide Line-Input
"},{"location":"WLEDSR/Digital-Microphone-Hookup/#es7243-based-boards","title":"ES7243 based boards","text":"
with I2S on-board microphone and I2S Line-In (SR WLED support not available yet, but is supported in MoonModules)
ESP32 Lyra-T V4.3
Ai-Thinker ESP32 Audio Kit v2.2
"},{"location":"WLEDSR/Digital-Microphone-Hookup/#other-ideas-needs-some-work-to-make-it-work","title":"Other Ideas (needs some work to make it work)","text":""},{"location":"WLEDSR/Digital-Microphone-Hookup/#use-a-second-esp32-as-bluetooth-audio-to-i2s-device","title":"use a second esp32 as bluetooth audio to I2S device","text":"
In principle, its possible to have a second ESP32 that provides sound input to WLED via I2S.
the library from pschatzmann has examples for how to connect an I2S DAC for playing music from Bluetooth on a speaker. The main difference for SR-WLED should be to put the \"bluetooth ESP\" into \"I2S slave\" mode (instead of being the \"I2S Master\"). There is some information on this website: https://www.eevblog.com/forum/microcontrollers/esp32-as-i2s-(audio)-slave
make sure the \"I2S slave\" device is sending 24bit or 16bit Phillips Standard data format.
Use this code to read and calculate the average from the INMP441/ICS-43434 microphone on an ESP32 or ESP8266
/* \n * ESP32 I2S Noise Level Example.\n * \n * By: maspetsberger\n * \n * Updated by: Andrew Tuline\n * \n * This example calculates a mean noise level.\n * \n * Tie the L/R pin to ground. Other pins are listed below.\n * VDD goes to 3.3V\n * GND goes to Gnd \n * \n */\n\n#include <driver/i2s.h>\n\n#define I2S_WS 15 // aka LRCL\n#define I2S_SD 32 // aka DOUT\n#define I2S_SCK 14 // aka BCLK\n\nconst i2s_port_t I2S_PORT = I2S_NUM_0;\nconst int BLOCK_SIZE = 64;\nconst int SAMPLE_RATE = 10240;\n\nfloat mean = 0;\nbool INMP_flag = 0;\n\nvoid setup() {\n\n Serial.begin(115200);\n\n Serial.println(\"Configuring I2S...\");\n esp_err_t i2s_err;\n\n // The I2S config as per the example\n const i2s_config_t i2s_config = {\n .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_RX), // Receive, not transfer\n .sample_rate = SAMPLE_RATE, // 16KHz\n .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT, // could only get it to work with 32bits\n .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, // LEFT when pin is tied to ground.\n .communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),\n .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, // Interrupt level 1\n .dma_buf_count = 8, // number of buffers\n .dma_buf_len = BLOCK_SIZE // samples per buffer\n };\n\n // The pin config as per the setup\n const i2s_pin_config_t pin_config = {\n .bck_io_num = I2S_SCK, // BCLK aka SCK\n .ws_io_num = I2S_WS, // LRCL aka WS\n .data_out_num = -1, // not used (only for speakers)\n .data_in_num = I2S_SD // DOUT aka SD\n };\n\n // Configuring the I2S driver and pins.\n // This function must be called before any I2S driver read/write operations.\n i2s_err = i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL);\n if (i2s_err != ESP_OK) {\n Serial.printf(\"Failed installing driver: %d\\n\", i2s_err);\n while (true);\n }\n i2s_err = i2s_set_pin(I2S_PORT, &pin_config);\n if (i2s_err != ESP_OK) {\n Serial.printf(\"Failed setting pin: %d\\n\", i2s_err);\n while (true);\n }\n Serial.println(\"I2S driver installed.\");\n\n delay(1000); // Enough time to see these messages. This need to be BEFORE the INMP test.\n\n getINMP();\n if (mean != 0.0) {\n Serial.println(\"INMP is present.\");\n INMP_flag = 1;\n }\n\n} // setup()\n\n\n\nvoid loop() {\n\n if (INMP_flag) {\n getINMP();\n Serial.print(abs(mean)); Serial.print(\" \");\n Serial.println(1600);\n\n } else {\n // Analog Read here!!\n }\n\n} // loop()\n\n\n\nvoid getINMP() {\n // Read multiple samples at once and calculate the sound pressure\n int32_t samples[BLOCK_SIZE];\n int num_bytes_read = i2s_read_bytes(I2S_PORT, \n (char *)samples, \n BLOCK_SIZE, // the doc says bytes, but its elements.\n portMAX_DELAY); // no timeout\n\n int samples_read = num_bytes_read / 8;\n if (samples_read > 0) {\n\n for (int i = 0; i < samples_read; ++i) {\n mean += samples[i];\n }\n mean = mean/BLOCK_SIZE/16384;\n } \n}\n
"},{"location":"WLEDSR/End-user-guide/","title":"End user guide","text":""},{"location":"WLEDSR/End-user-guide/#introduction","title":"Introduction","text":"As WLED Sound Reactive is a fork of WLED, a general End User Guide can be found here.
This page will show Sound Reactive specific information (in the near future)
"},{"location":"WLEDSR/First-Time-Setup/","title":"First Time Setup","text":""},{"location":"WLEDSR/First-Time-Setup/#introduction","title":"Introduction","text":"The sound reactive version of WLED provides all of the functionality of WLED with a few caveats:
Start out with a small strip of ~30 LED's before setting up a large installation.
Grounding may also be a problem. For example, my line-in setup picked up a lot of noise when my ESP32 board was connected to the USB port on my PC, but NO noise when powered by a USB power bank.
After uploading WLED to the ESP, use your phone and connect to the WLED-AP using the password 'wled1234'. Click 'Login to network' when the notification about this shows up. You are then transfered to the WLED's start page, and here we should click \"WIFI SETTINGS\" to connect to the local network. Fill in the settings for your local Wifi network, and then click 'Save & Connect'. The device will reboot and if everything worked it will now be connected to the local network. Finding it's IP-address can be done via the network routers administration page, or via an mobile app like Fing were you can find a new device called \"wled-WLED\". Open this IP in a webbrowser to access WLED's control page.
"},{"location":"WLEDSR/First-Time-Setup/#wifi-and-leds","title":"Wifi and LEDs","text":"Disclaimer: The information below is for the latest release version of SR WLED. If you use an older release, please divide _Gain values by 4._
Here's a starting point table of Squelch and Gain settings for different input types:
Input (I2S digital) Squelch Gain Type comments INMP441 6 60 Generic I2S ICS-43434 16 30 Generic I2S SPM1423 tbd tbd Generic I2S PDM M5StickC, M5AtomU SPH0654 tbd tbd SPH0654 ES7243 tbd tbd ES7243 ESP32 Lyra-T Mini Line-In CS5343 tbd tbd Generic I2S with Mclk MCLK to GPIO0 Input (ADC analog) Squelch Gain Type MAX9814 @40dB 10 80 Generic Analog Line-In 8 120 Generic Analog INMP411 20 80 Generic Analog MAX4466 16 120 Generic Analog"},{"location":"WLEDSR/First-Time-Setup/#analog-or-i2s-digital","title":"Analog or I2S Digital?","text":"We recommend using an I2S digital microphone, like INMP441, ICS-43434, or PDM microphones.
Analog input (Microphone or Line-in) is also possible, however you might have power fluctuation (3.3V) and noise issues when using these. Analog devices are handled by the \"ADC1\" unit of your ESP32. Problems can be expected when connecting \"analog buttons\" (Potentiometer) to the same ADC1 unit.
Finally Analog Microphones often work best when placed very close to the sound source, while digital ones like the INMP441 can easily pick up sound from several meters apart. With the analog MAX4466, we found that 30-50cm is an optimal distance.
"},{"location":"WLEDSR/First-Time-Setup/#agc","title":"AGC","text":"Automatic gain control (AGC) is not enabled by default in SR WLED, because of so many different input types and ambient noise in different environments. We don't know what your 'quiet' is. In addition, the LED's should NOT be reacting when it IS quiet, so it's up to you to first make those adjustments. In addition, sensitivity can be further adjusted with either the Intensity or Speed slider in many of the animations.
While an improved autonomous gain control (iAGC) feature is available since version 0.13.1, it is still very important that you first find a good Squelch setting for your environment. Afterwards you can enable AGC and let the controller adjust input levels automatically.
"},{"location":"WLEDSR/First-Time-Setup/#noise-and-spikes","title":"Noise and Spikes","text":"While providing a lot of functionality, the ESP8266 and the ESP32 boards (typical ones) we have been using, have experienced a lot of spurious noise on their ADC pins. This has also been discussed at length on various ESP related forums. Methods that may help remediate this include:
Disable the WiFi sleep mode.
Use shielded wiring for your analog sampling pin.
We've had a lot of fun creating our audio reactive fork of WLED, and we've got more to come.
"},{"location":"WLEDSR/Future-Directions/#wish-list","title":"Wish List","text":"Topic Notes Skills Required \u2714\ufe0f Dynamic sliders/controls Allow additional sliders to be hidden by default, or displayed depending on the effect. Javascript, XML, JSON, HTML, CSS \u2714\ufe0f Improved default values for sliders Allow improved default values for sliders and on a per SEGMENT basis. Javascript, XML, JSON, HTML Add 2D Library support Add a full 2D library for FastLED functionality C, System \u2714\ufe0f Add SEGMENT support for 2D Improve SEGMENT capabilities Everything Improved/documented QA process We need to be able to better test our significant updates. A test/release plan would be a good start. ITIL Coordinated light show To have delayed/coordinated lighting effects in different devices. To run on Android. Kotlin (for Android), C Multi-pin To support SR WLED with SEGMENTS and multi-pin per-device squelch + gain see https://github.com/atuline/WLED/issues/221 for users who configure several sound inputs (use one at a time) it might be useful to have squelch/gain settings for each device. C++Our focus for new functionality should be specific to sound reactivity. Otherwise, we should get some idea as to if/when AirCoookie is planning to implement this functionality.
"},{"location":"WLEDSR/Future-Directions/#outstanding-issues","title":"Outstanding Issues","text":"Issue Notes"},{"location":"WLEDSR/Home/","title":"Introduction","text":"The WLEDSR help you can find here have been copied from https://github.com/atuline/WLED/wiki.
In this section you will find everything related to sound for versions <= 0.13
These pages are here temporarily: Aim is to migrate them step by step to 0.14 general and MM specific pages (Sound Reactive).
"},{"location":"WLEDSR/Home/#wled-sound-reactive-introduction","title":"WLED Sound Reactive Introduction","text":"This is a FORK of the original WLED code as found at wled.me. It provides basic sound reactivity for both the ESP8266 and ESP32 platforms as well as FFT sound reactivity for the ESP32.
Due to the performance limitations of the ESP8266, we decided to separate the ESP8266 and ESP32 code in order to provide a more stable build for the ESP8266. Beginning with version 0.10.2 and moving forward, ESP8266 support has been removed from the master branch. It receives very limited support and updates and is located at ESP8266 Branch.
We have also disabled functionality for other interfaces, such as Alexa, Blynk, Cronixie, Huesync, Infrared. If you would like to enable them, you will need to modify wled.h, compile and upload to your device. If you have any issues, please engage the Discord community, as we only support functionality for the web interface.
"},{"location":"WLEDSR/Home/#features","title":"Features","text":"We do our best to perform upstream merges with the original WLED. Our fork includes:
Other members of the WLED Discord group have provided code and testing support as well. Thanks all!
"},{"location":"WLEDSR/Home/#knowledge-and-pre-requisites","title":"Knowledge and Pre-Requisites","text":"Before attempting to compile this fork of WLED with Platform IO (the Arduino IDE is no longer viable for this project), make sure you CAN compile the one from wled.me.
If you are unable to compile WLED, please consider flashing your device with binaries instead.
"},{"location":"WLEDSR/Home/#hardware-used","title":"Hardware used","text":"Using the WLED 0.10 codebase, our code has been tested with:
For more information, see our Analog Audio Input Options or Digital Audio Input Options page.
"},{"location":"WLEDSR/Home/#default-pins-used","title":"Default pins used","text":"Please consider joining the WLED Discord groups where we have dedicated channels to discuss this project, your projects, and answer any questions you may have.
Join Discord to discuss beta testing of our sound reactive fork of WLED.
Join Discord to discuss AirCookie's WLED.
We can also be found on reddit at r/soundreactive.
"},{"location":"WLEDSR/Home/#support-forums","title":"Support Forums","text":"IMPORTANT: Before attempting to compile this fork of WLED, make sure you can compile the original WLED - instructions are here. If you are unable to compile WLED, please consider flashing your device with binaries instead.
If you managed to compile original WLED, test your new skills and compile the soundreactive fork of WLED.
"},{"location":"WLEDSR/Installing-and-Compiling/#installing-pre-built-binaries","title":"Installing pre-built binaries","text":""},{"location":"WLEDSR/Installing-and-Compiling/#downloading-usb-drivers","title":"Downloading USB Drivers","text":"Download the CH340 drivers at https://www.wemos.cc/en/latest/ch340_driver.html
"},{"location":"WLEDSR/Installing-and-Compiling/#flashing-from-binary","title":"Flashing From Binary","text":"The Sound Reactive WLED binaries for ESP32 are located here.
SR WLED releases are also included in this web-based installer: https://wled-install.github.io
"},{"location":"WLEDSR/Installing-and-Compiling/#flashing-esp32-binaries-with-esptool","title":"Flashing ESP32 Binaries with esptool","text":"Warning: We had to change the partition size on the ESP32 in order to 'fit' all the new features. This means that the 'old way' of upgrading/flashing, no longer work unfortunately. You cannot use ESPHome Flasher, and you cannot use OTA from a build prior to v0.13.0-b5.
esptool.exe erase_flash
esptool.exe write_flash 0x0 esp32_bootloader_v4.bin
esptool write_flash 0x10000 WLEDSR_0.13.X_soundReactive_esp32dev.bin
Note: If you Flash via another method, you will definitely need to perform a Factory Reset. Cycling the power is also a requirement if you're doing anything with I2S.
"},{"location":"WLEDSR/Installing-and-Compiling/#flashing-esp8266-binaries","title":"Flashing ESP8266 Binaries","text":"You can find some unofficial SR WLED binaries, including intermediate development builds for ESP32, here:
"},{"location":"WLEDSR/Installing-and-Compiling/#installation-services","title":"Installation services","text":"Please keep in mind that these sites are not maintained by the SR WLED team. You may find old outdated binaries, or binaries that might not work on generic ESP32 hardware. So please compare build number and dates, and read descriptions before installing one of these.
"},{"location":"WLEDSR/Installing-and-Compiling/#compiling-from-platform-io","title":"Compiling from Platform IO","text":""},{"location":"WLEDSR/Installing-and-Compiling/#getting-started","title":"Getting started","text":"\u21db first read https://mm.kno.wled.ge/advanced/compiling-wled/ \u2192 use source code from https://github.com/atuline/WLED/tree/master \u2192 start with one of the sound reactive compile environments, like env:soundReactive_esp32dev
\u2192 read wled00/wled.h
, add your own settings to wled00/my_config.h
\u2192 put your own compile environment(s) into platformio_override.ini.
SoundReactive has some additional compile time options - see wled00/audio_reactive.h
and wled00/audio_source.h
.
Note: We have long since stopped compiling WLED with the Arduino IDE.
"},{"location":"WLEDSR/Installing-and-Compiling/#disabled-feature-of-wled","title":"Disabled Feature of WLED","text":"Some features of \"standard WLED\" are by default disabled in SR WLED. These extended features have shown negative impacts on performance and stability - we need all available \"power\" to run sound analysis. For example, they possibly use too much memory (FLASH or RAM), can lead to lags in animations, or may cause slow responses to sound input.
The same is true for many WLED usermods: they might work (like 4LineDisplay), but could have side-effects on our sound reactive features so we disabled them in our \"official\" firmware builds.
"},{"location":"WLEDSR/Installing-and-Compiling/#how-to-shoot-yourself-in-the-foot","title":"How to Shoot Yourself in the Foot","text":"If you're keen to use a disabled WLED feature, in your personal build of SR-WLED:
-D DISABLE_...
flag in your build environment (platformio.ini, or platformio_override.ini), and comment it out or remove it.If a feature has been disabled explicitly in wled.h, then there is usually a good technical reason for that decision. Please don't write bug reports for feature that were disabled explicitly.
If you still want that feature, you can un-disable it like this
Add to your wled00/my_config.h
// re-activate Alexa support. Yes I know this is not supported officially. \n// I don't mind if animations will sometimes \"stutter\" and lag behind the sound.\n#ifdef WLED_DISABLE_ALEXA\n #undef WLED_DISABLE_ALEXA\n#endif\n\n// re-activate MQTT support. Yes I know this is not supported officially. \n// I am ready to take good care of my hung, non-responsive device if necessary.\n#ifndef WLED_ENABLE_MQTT\n #define WLED_ENABLE_MQTT\n #ifdef WLED_DISABLE_MQTT\n #undef WLED_DISABLE_MQTT\n #endif\n#endif\n\n// re-activate IR receiver support. Yes I know this is not supported officially. \n// I can live with my LEDs flickering sometimes, and effects stuttering randomly.\n#ifdef WLED_DISABLE_INFRARED\n #undef WLED_DISABLE_INFRARED\n#endif\n
"},{"location":"WLEDSR/LED-Preferences/","title":"2D LED Preferences","text":""},{"location":"WLEDSR/LED-Preferences/#led-preferences-for-sound-reactive-wled","title":"LED Preferences for Sound Reactive WLED","text":"The sound reactive fork of WLED supports multiple layouts of a 2D matrix led panel as well as multiple identical 2D matrix led panels. Many effects were written with a 16x16 panel in mind, so some 2D effects may not display properly on a panel/matrix of a different size.
"},{"location":"WLEDSR/LED-Preferences/#2d-matrix","title":"2D Matrix","text":"2D effects are projected on a 2 dimensional matrix.
A specific led is identified by led[x,y] where led[0,0] is in the top left corner (logical layer)
Setting name Value Range Description Master/Dev Width 1..x Width of the matrix Master Height 1..y Height of the matrix MasterNote: width x height should match LED count!
"},{"location":"WLEDSR/LED-Preferences/#2d-panels","title":"2D Panels","text":"A matrix is made of 1 or more identical physical led panels (physical layer)
Setting name Value Range Description Master/Dev Multiple panels Y/N No if only one panel, yes if more than one Dev Horizontal panels 1..x Number of panels side by side Dev Vertical panels 1..y Number of panels above each other DevNote: Panel width = matrix width / horizontal panels and panel height = matrix height / vertical panels
Note: Total panels = horizontal * vertical
"},{"location":"WLEDSR/LED-Preferences/#2d-panel-layout","title":"2D Panel layout","text":"Specify how a led panel is wired.
This is in most cases different from the logical layer (first led top left). Parameters here translate the logical layer (led[x,y]) to the physical layer (led[0] .. led[n]).
Setting name Value Range Description Master/Dev First led position Top/Bottom & Left/Right Where is the first led positioned Dev (replacing flipmajor/minor) Orientation Horizontal / Vertical Are rows of leds wired horizontal or vertical Dev (replacing rowMajor) Serpentine Y/N Are rows of leds wired zig-zag or not Master Transpose Y/N Swap the axes (otherwise no swap). Don't use on non-square panels DevNote: If multiple panels are used, they must be identical.
"},{"location":"WLEDSR/LED-Preferences/#example","title":"Example:","text":"I have a 2D matrix of 6 - 8x8 panels. They are connected sequentially with a total of 24 led's wide and 16 led's high.
The first led of each panel starts in the top left corner, the subsequent led is to the right of it (horizontally), and the panel is in a serpentine layout. These should be the settings for that layout:
"},{"location":"WLEDSR/Modifying-Sound-Reactive-WLED/","title":"Modifying Sound Reactive WLED","text":""},{"location":"WLEDSR/Modifying-Sound-Reactive-WLED/#changing-web-ui","title":"Changing Web UI","text":"In order to conserve space, Web UI interface are represented as a series of wled00/html_ui.h, wled00/html_settings.h and wled00/html_other.h files which contain C/C++ strings with specific parts of the Web UI.
These files are automatically created from source files available in wled00/data folder. To generate files, install NodeJS 11.0+ globally. After that, recreate html_*.h files by running in the repo directory:
> npm install\n> npm run build\n
If you want to test changes to the UI, it is easiest to work with the local wled00/data/index.htm file. You just need to enter the IP address of a WLED 0.10.0 or newer instance into the popup. If you accidentally input an incorrect IP or want to test with a different instance, clear the local storage (in Chrome: Developer Tools -> Application -> Local Storage)
If you continuously modify files in the wled00/data directory, you want to monitor these changes to make local html_*.h files being updated automatically. To do this, run this in repo directory:
> npm run dev\n
This will start monitoring wled00/data folder for changes.
WARNING!!! Be careful with changing the javascript in HTML files! For example function GetV() {}
must be the last javascript function in the <script>
element as it will be replaced by automatically generated code to fetch relevant settings from EEPROM. See tools/cdata.js for the replacement rules which run for every *.htm file in wled00/data.
If you'd like some help with your device, these are the types of things we would be asking:
We have disabled (and do not support) additional services such as IR, Alexa, Blynk, MQTT and so on. In order to enable them, you'll need to go into the code (see wled.h), enable the service and then compile/upload. The WLED SR team does not support these services.
If you are referring to code, please provide a link to the version you are referring to.
Is your device working in AP mode?
Got too much noise? Try lowering the current draw/brightness and clean up the wiring.
MAX4466/ESP32 Sampling results - Quiet room
MAX4466/ESP32 Sampling results - Talking
The other analog input options should provide something similar.
"},{"location":"WLEDSR/My--device--is-not-working/#udp-sound-sync-issues","title":"UDP Sound Sync Issues","text":"We received a support request reporting that UDP sound synchronization will take down a Wi-Fi network. The challenge with troubleshooting WiFi is that you need to configure your packet sniffer in monitor mode, something which is very difficult to achieve with most workstations. As a result, we are unable to see a lot of Wi-Fi network traffic.
One setting to change on 'WiFi Setup' is to check on \"Disable WiFi sleep\" mode.
As for UDP support, this article may shed some light on the challenges:
https://superuser.com/questions/1287485/udp-broadcasting-not-working-on-some-routers
In the meantime, UDP Sound sync has been configured to transmit 50 packets per second.
"},{"location":"WLEDSR/News/","title":"News","text":"What's possibly on the horizon (no dates given):
We've since added several 2D routines to WLED and in the process have determined that our ESP32 binary now consumes about 98.5% of flash memory, or in oil industry terms. . . We have reached peak Flash. As a result, we're going to look carefully into ALL of the animations and see which ones consume the most flash and with the least coolness. In the meantime, we've updated SR WLED to support a very recent Master of 0.12.0, which has seen some changes/fixes since it was originally released. Special thanks to THATDONFC for keeping SR WLED in sync with Aircoookie's updates. It's not a small job.
"},{"location":"WLEDSR/News/#january-13-2021","title":"January 13, 2021","text":"During the development of our sound reactive version of WLED, we've had several challenges with WiFi along with the ADC capability of the ESP devices.
"},{"location":"WLEDSR/Noise-and-Spikes/#esp8266","title":"ESP8266","text":"After the code refactoring of WLED from .ino to .cpp files around April 2020, our ESP8266 code lost connection between the user interface and the ESP8266's web server. This eventually culimated in a re-write of a stripped down version of SR WLED dedicated just for the ESP8266. It included the UDP sound sync as a receiver (only), but supported none of the FFT or 2D functionality. This stripped down version seems to be stable, however that platform is now deprecated from further development.
"},{"location":"WLEDSR/Noise-and-Spikes/#esp32","title":"ESP32","text":"Although the ESP32 did lose connection with the web server, it was nowhere near as bad as the ESP8266.
"},{"location":"WLEDSR/Noise-and-Spikes/#both-platforms","title":"Both platforms","text":"On both platforms, we encountered significant spikes when using the analog ADC when the WiFi is active. There are numerous articles on this issue, along with various methods to reduce the noise. We've found that an I2S microphone, such as the INMP441 or ICS-43434 will provide a better response than any of the analog microphones or input methods that we support.
Here's some test results with the analog input, including strong spikes observed very frequently.
Here's some references:
Note: According to atomic14 in the above videos, the I2S microphones do not exhibit the issues found with the analog microphones.
"},{"location":"WLEDSR/Non-Reactive-Animations/","title":"Non-Reactive Animations","text":"Note 1: Due to its limited capability, we have disabled 2D animations on the ESP8266 platform. Note 2: The 2D routines require a minimum of 4 pixels in both directions. If you see blinking red, your 2D settings don't match the requirements. (not required in latest dev) Note 3: As we continue to develop SR WLED, some animations may appear or disappear. It's still a work very much in progress. Some may only appear in the dev branch for now. Note 6: In dev branch, sliders have been renamed from FFT Low to Custom 1, FFT High to Custom 2 and FFT Custom to Custom 3.
See also Reactive animations
See List of effects and palettes for AC Animations.
See ScottrBaileys GIF visualizer for animations of the effects
Effect Description Sliders \u2699\ufe0f ARTI-FX Define your own effects, see here No controls (yet) Flow Stripe Strip with rotating colours. Speed: Controls a speed timer Intensity: Controls another timer Perlin Move Using Perlin Noise for movement. Speed: Speed of elementsIntensity: # of pixelsFFT Low: Fade rate Wavesins Beat waves and phase shifting. Looks OK in 2D'ish as well. Speed: SpeedIntensity: Varying brightnessFFT Low: Starting colourFFT High: Range of coloursFFT Custom: More fun to adjust 2D Colored Bursts Multiple lines. Speed: Speed of linesIntensity: Number of lines 2D DNA A very cool DNA like pattern. Select a palette. Speed: Scroll speedIntensity: Blur 2D DNA Spiral Spiraling DNA pattern. Speed: Speed.Intensity: Frequency 2D Drift A rotating caleidoscope. Speed: Speed of rotation.Intensity: Blur 2D Fire2012 Mark Kriegsman's fire routine. n/a 2D Firenoise Using Perlin Noise for fire. Speed: Yscale.Intensity: Scale 2D Frizzles Moving patterns. Speed: One thingIntensity: Another thing 2D Gameoflife Scrolling game of life. Speed: Speed Intensity: Starting grid 2D Hiphotic A moving plasma. Speed: One directionIntensity: Other direction 2D Lissajous A frequency based Lissajous pattern. Speed: Frequency of cosIntensity: Frequency of sin 2D Matrix The Matrix in 2D. Speed: Affects the speed of the movementIntensity: Number of lines 2D Metaballs A cool plasma type effect. n/a 2D Plasma A plasma effect. Speed: Affects the speed of the movementFFT Low: Shifts the coloursFFT High: Distance from the plasma 2D Plasma Ball A ball of plasma. Speed: Speed. Intensity: 2D Polar Lights The northern lights. Speed: Speed.Intensity: Frequency.FFT Low: Palette rotation 2D Pool Noise Looking at a pool. n/a 2D Pulser Travelling waves. Speed: Speed. Intensity: Blur 2D Sindots Moving/rotating pattern. Speed: Speed. Intensity: Length/size 2D Squared Swirl Boxes moving around. fft3: Blur amount 2D Sun radiation The sun! Doesn't support segments. Speed: VarianceIntensity: Brightness 2D Twister A large twister. Speed: Speed Intensity: Phases 2D Tartan tbd 2D Julia tbd 2D Game of life tbd 2D Black hole tbd 2D Noise tbd"},{"location":"WLEDSR/Non-Reactive-Animations/#2d-clock-overlay","title":"2D Clock Overlay","text":"To configure, go to Time & Macros setting
Time setup: fill in required parameters
Clock: Clock overlay; Analog Clock, check Show 5min marks, uncheck the rest
"},{"location":"WLEDSR/Non-Reactive-Animations/#2d-animations","title":"2D Animations","text":"Oh, and special thanks are in order for urish for creating wokwi, Elliot and his team for soulmatelights and Stepko and ldirko for some awesome 2D animations. With their approval, we were able to convert and publish several of their animations to use with WLED.
"},{"location":"WLEDSR/On-Lossy-Colours/","title":"On Lossy Colours","text":""},{"location":"WLEDSR/On-Lossy-Colours/#issue","title":"Issue","text":"The following code moves the pixels down the line, but as it gets to the end, the intensity decreases significantly:
setPixelColor(i, getPixelColor(i-1));
getPixelColor()
is lossy, whereas setPixelColor()
perfectly sets the intended color. Unfortunately, the raw pixel memory buffer is also lossy, since it has to save the values scaled by master brightness. And unfortunately, if you do s = x\\*b /255
, later doing x = s\\*255/b
won't yield exactly the same result (thanks integer division). To solve this problem, we would need a secondary pixel data buffer.
See: https://github.com/Aircoookie/WLED/issues/820
"},{"location":"WLEDSR/On-Lossy-Colours/#workarounds","title":"Workarounds","text":"As a workaround, you could allocate memory for each function on the fly as a double buffer and use that, or you could hard code an array. Either way, you need to double up on the memory requirements and that is extremely limited with the ESP8266 and not recommended for that platform.
"},{"location":"WLEDSR/On-Lossy-Colours/#allocate-memory","title":"Allocate memory","text":"if (!SEGENV.allocateData(SEGLEN)) return mode_static(); // Allocation failed\nbyte* myVal = SEGENV.data; // Could also be an int or long or whatever.\n
In this case, we are using that byte defined array for some function, but NOT to store full color values. You could then refer to myVal[0]
up through myVal[SEGLEN-1]
within the routine for that function. You could also define a long
, then allocate the memory for it, and then store your colors in the array until you need to transfer them to the NeoPixel buffer at the end of your routine. See the transfer code below. One problem with dynamic memory allocation at the firmware level is that it can become segmented and fail.
"},{"location":"WLEDSR/On-Lossy-Colours/#hard-coded-array","title":"Hard-coded array","text":"First off, I would encapsulate ALL of this with #ifndef
statements because you can't guarantee memory available on an ESP8266. In FX.cpp, you would define globally:
#ifndef ESP8266\nuint32_t ledData[1500]; // Or whatever value.\n#endif\n
Similarly, you would encapsulate all functions and definitions that support that array. In the (encapsulated) animation, you would do the following: uint16_t WS2812FX::mode_myMode(void) {\n\n#ifndef ESP8266\n\n uint32_t* leds = ledData;\n\n// PERFORM ANIMATION MAGIC HERE!!\n\n for (int i = SEGLEN; i > 0; i--) { // You can shift LED's the FastLED way.\n leds[i] = leds[i-1];\n }\n\n for (int i= 0; i < SEGLEN; i++) { // Now send to the NeoPixelBus array\n c.h = (leds[i] >> 16) & 0xFF;\n c.s = (leds[i] >> 8) &0xFF;\n c.v = leds[i] & 0xFF;\n color = c; // Implicit conversion to RGB supplied by FastLED\n setPixelColor(i, color.red, color.green, color.blue);\n }\n#else\n// DO SOMETHING ELSE IF YOU WANT. Maybe a fade_out(32);\n#endif\n\n return FRAMETIME;\n} // mode_myMode()\n
"},{"location":"WLEDSR/Other-Links/","title":"Other","text":""},{"location":"WLEDSR/Other-Links/#sr-wled-interfacing","title":"SR WLED interfacing","text":"Let's investigate persistent variables for the Arduino and how to use them, and then see how we can do so in WLED.
Normally, for a given Arduino sketch you can define variables as follows:
uint8_t var1 = 5; // A persistent global variable that is defined once.\n\n void setup() {\n Serial.begin(115200);\n }\n\n void loop() {\n routine1();\n }\n\n void routine1() {\n uint8_t var2; // A non-persistent local variable.\n static uint8_t var3; // A persistent local variable.\n\n Serial.print(var1); Serial.print(\"\\t\"); Serial.print(var2); Serial.print(\"\\t\"); Serial.println(var3);\n\n var1 = 7;\n var2 = 10;\n var3 = 25;\n\n delay(1000);\n }\n
The first time you run through the loop, we'll see the following, where only var1 has been assigned a non-zero value:
5 0 0\n
At the end of the first loop, all the variables were assigned values. The second time through the loop, var1 was already changed to 7 in the first loop, while var2 is non-persistent and has yet to have a value assigned in this loop. The variable var3 is a 'persistent' local variable, with a value assigned in the first pass of the loop. Output will be:
7 0 25\n
So, we have global and local variables, as well as persistent and non-persistent ones. Local variables require the 'static' keyword in order for them to keep their values (or be persistent) between function calls, while ALL global variables are persistent.
"},{"location":"WLEDSR/Persistent-Variables-and-WLED/#enter-wled","title":"Enter WLED . . .","text":"Although you CAN use the static keyword in a WLED animation to define a persistent variable, that variable will have the same value for ALL of the segments, and may not result in the desired properties. As a result, you may need to define a persistent variable unique to each SEGMENT.
WLED has a SEGMENT runtime structure that supports persistency. The only problem is that it has a limited number of pre-defined variables for generic use by animations (in FX.cpp). The readily available variables (as defined in FX.h) are:
uint16_t SEGENV.aux0; // Available for your routine.\nuint16_t SEGENV.aux1 // Available for your routine.\nbyte* SEGENV.data; // Available for your routine.\n
SEGENV.aux0 and SEGENV.aux1 are both unsigned 16 bit values, which you can use as persistent variables in your routines and will be unique for each SEGMENT. The question is, what if you need:
At that point, you'll need to make use of that *byte SEGENV.data pointer and allocate memory for it and then redefine how it's used. Let's examine some methods to do so and review some of the animations in FX.cpp to do so. WLED has a method called SEGENT.allocateData() which allocates memory for your animation. Here's some examples of how to use that.
"},{"location":"WLEDSR/Persistent-Variables-and-WLED/#basic-memory-allocation","title":"Basic Memory Allocation","text":"In its simplest form, the routine mode_dynamic() just performs a basic request to allocate space for the length of a given SEGMENT with:
` if (!SEGENV.allocateData(SEGLEN)) return mode_static(); // If it fails, WLED runs mode_static().
It doesn't make use of additional variables and is probably a good idea to implement on other animations, especially in a limited environment such as the ESP01 and with a considerable number of LED's.
"},{"location":"WLEDSR/Persistent-Variables-and-WLED/#an-array","title":"An Array","text":"Next up is mode_multi_comet(), which reserves space for 8 uint16_t values for an array of comets.
if (!SEGENV.allocateData(sizeof(uint16_t) * 8)) return mode_static(); //Allocates based on the size of 8 uint16_t variables\n\n uint16_t* comets = reinterpret_cast<uint16_t*>(SEGENV.data); // It then redefined that byte* pointer to uint16_t comets[16].\n\n Now you can use things like:\n\n for (int i=0; i<8; i++) {\n comets[i] = 65535; // Or other uint16_t value.\n }\n
"},{"location":"WLEDSR/Persistent-Variables-and-WLED/#a-structure","title":"A Structure","text":"Finally, we'll look into ripple_base(), which allocates persistent memory for a 'Ripple' structure. First off, we define the structure externally to the animation and call it 'ripple'.
typedef struct Ripple {\n int8_t state;\n uint8_t color;\n uint16_t pos;\n } ripple;\n
From within the ripple_base() routine, we determine the number of ripples we want to support for each segment. In this case, we'll say:
` uint16_t maxRipples = 1 + (SEGLEN >> 2);
Next, we determine how much memory we need, where 'sizeof' returns number of bytes occupied by a variable of a given type.
` uint16_t dataSize = sizeof(ripple) * maxRipples;
Next, we allocate the memory, and then re-define it as our structure:
if (!SEGENV.allocateData(dataSize)) return mode_static();\n Ripple* ripples = reinterpret_cast<Ripple*>(SEGENV.data);\n
Now, we can use our structure, up to maxRipples-1:
for (uint16_t i = 0; i < maxRipples; i++) {\n ripples[i].pos = ???; // uint16_t\n ripples[i].state = ???; // int8_t\n ripples[i].color = ???; // uint8_t\n }\n
"},{"location":"WLEDSR/Persistent-Variables-and-WLED/#a-floating-point-variable","title":"A Floating Point Variable","text":"As an exercise, let's just allocate a single floating point variable:
if (!SEGENV.allocateData(sizeof(float))) return mode_static();\n float* expAdj = reinterpret_cast<float*>(SEGENV.data); // We then redefine that byte* pointer to a float.\n
We should now be able to use the persistent floating point variable 'expAdj' with our routine and it should work with ALL segments indepently of each other.
expAdj = 1.2345;\n
"},{"location":"WLEDSR/Reactive-Animations/","title":"Sound Reactive Animations","text":"Note 1: Effects beginning with \u266a
(*
in list below) are volume only.
Note 2: Effects beginning with \u266b
(**
in list below) use FFT (Fast Fourier Transforms) for frequency detection.
Note 3: We have also not added 2D animations to the ESP8266 platform. ESP8266 is depricated in SR WLED, so we recommend that you use ESP32.
Note 4: The 2D routines require a minimum of 4 pixels in both directions. If you see blinking red, your 2D settings don't match the requirements. (not required in latest dev)
Note 5: As we continue to develop SR WLED, some animations may appear or disappear. It's still a work very much in progress. Some may only appear in the dev branch for now.
Note 6: In dev branch, sliders have been renamed from FFT Low to Custom 1, FFT High to Custom 2 and FFT Custom to Custom 3.
See also Non reactive animations
See List of effects and palettes for AC Animations.
See ScottrBaileys GIF visualizer for animations of the effects
Effect Description Sliders * 2D Swirl Several blurred circles. Looks good with pink plasma palette. Supports AGC. Speed: Speed Intensity: SensitivityFFT Low: Blur * 2D Waverly Noise waves with some sound Speed: AmplificationIntensity: Sensitivity * Gravcenter Volume reactive vu-meter from center with gravity and perlin noise. Speed: Rate of fall Intensity: Sensitivity * Gravcentric Volume reactive vu-meter from center with gravity. Volume provides index to (time rotating) palette colour. Speed: Rate of fall Intensity: Sensitivity * Gravimeter Volume reactive vu-meter with gravity and perlin noise. Speed: Rate of fall Intensity: Sensitivity * Juggles Juggling balls. Speed: Yes Intensity: # of balls * Matripix Similar to Matrix. Speed: yes Intensity: Brightness * Midnoise Perlin noise emanating from center. Speed: Fade rate Intensity: Maximum length * Noisefire A perlin noise based volume reactive fire routine. n/a * Noisemeter Volume reactive vu-meter. Speed: Fade rate Intensity: Width * Pixels Random pixels. Speed: Fade rate Intensity: # of pixels * Pixelwave Pixels emanating from center. Speed: yes Intensity: Sensitivity * Plasmoid Sine wave based plasma. Intensity: # of pixels * Puddlepeak Blast coloured puddles randomly up and down the strand with the 'beat'. Speed: Adjust fade rate. Intensity: Size of puddles FFT High: 256 freq bin select on ESP32. FFT Custom: Volume comparator on ESP32 * Puddles Blast coloured puddles based on volume. Speed: Fade rate Intensity: Size of puddle * Ripple Peak Peak detection triggers ripples. Intensity: Max number of ripples. FFT High: 256 freq bin select on ESP32 FFT Custom: Volume comparator on ESP32 * Waterfall A volume AND FFT version of a Waterfall that has 'beat' support. Speed: Speed Intensity: Adjust colour ** 2D CenterBars A 16x16 spectral analysis routine emanating from the center Speed: Bar Speed Intensity: Ripple time FFT Custom1: Center horizontally FFT Custom2: Center vertically FFT Custom3: Color vertically ** 2D Funky Plank A 2D wall of reactivity running from bottom to top Speed: Scroll Speed FFT Custom1: Number of bands ** 2D GEQ A 16x16 graphic equalizer. Speed: Bar Speed Intensity: Ripple timeFFT Custom1: Number of bands ** Binmap Map bins 3-255 throughout the length of the LEDs. This does not work with UDP sync.Values are not normalized. Intensity: Max volume ** Blurz Flash an fftResult bin per frame and then blur/fade. Speed: Fade Rate Intensity: Blurring ** DJLight An effect emanating from the center to the edges. Speed: Speed ** Freqmap Map the loudest frequency throughout the length of the LED's. Speed: Fade rateIntensity: Starting colour ** Freqmatrix See below See below ** Freqpixels Random pixels coloured by frequency. Speed: Fade rateIntensity: Starting colour and number of pixels ** Freqwave See below See below ** Gravfreq VU Meter from center. Log of frequency is index to center colour. Speed: Rate of fallIntensity: Sensitivity ** Noisemove Using perlin noise as movement for different frequency bins. Speed: Speed of perlin movement Intensity: Fade rate ** Rocktaves Colours the same for each note between octaves, with sine wave going back and forth. Speed: n/aIntensity: n/a ** Waterfall FFT version of a Waterfall. Speed: Speed Intensity: Adjust colourFFT High: 256 freq bin select on ESP32 FFT Custom: Volume comparator on ESP32 ** DJ Light tbd ** 2D Akemi tbd"},{"location":"WLEDSR/Reactive-Animations/#slider-usage","title":"Slider Usage","text":"Please see the brief slider descripion for each effect in the rightmost column above.
"},{"location":"WLEDSR/Reactive-Animations/#speedintensity","title":"Speed/Intensity","text":"These typically reflect the value of their namesake. Intensity would typically be number of LED's lit, or brightness of the LED's
"},{"location":"WLEDSR/Reactive-Animations/#fft-sliders","title":"FFT Sliders","text":"These may get renamed in the future and could be used for FFT routines OR for additional effect adjustments.
"},{"location":"WLEDSR/Reactive-Animations/#peak-detection","title":"Peak Detection","text":"This is NOT beat detection, but rather samples that are louder than a the current average plus a slider adjustable value.
"},{"location":"WLEDSR/Reactive-Animations/#automatic-gain-control","title":"Automatic Gain Control","text":"We are just beginning to add Automatic Gain Control to the routines, starting with 2D Swirl. This setting is only available on the LED Preferences page on the ESP32.
"},{"location":"WLEDSR/Reactive-Animations/#fft-routines","title":"FFT Routines","text":""},{"location":"WLEDSR/Reactive-Animations/#additional-effect-notes","title":"Additional effect notes","text":""},{"location":"WLEDSR/Reactive-Animations/#freqmatrix","title":"Freqmatrix","text":"The temporal tail for this animation starts at the beginning of the Segment rather than in the center of the segment.
Sliders used:
Slider usage is described in the rightmost column for each effect. In general, the sliders are configured for:
This effect maps the major frequencies from the incoming signal to colors in the HSV color space. From the low notes being mapped to red (0) to the high notes being mapped to blue (255) and everything in between. The band you are looking at can be restricted by the FFT Low and FFT High sliders. We are digitizing at 10240Hz, meaning the highest frequency bin that you can find is 5120Hz, which for most music is just fine.
Sliders used:
When you first connect to a WLED device in AP mode, there is some really annoying behavior on the captive portal implementation in Android. The captive portal is the limited browser you are forwarded to in order to login to a web site. What happens is that if you go into 'Effects', you can't scroll up. In order to get around that, click the three dots at the top right of the page, select 'Use Network as is', then open up Chrome and navigate to the site at 4.3.2.1.
"},{"location":"WLEDSR/Running-Sound-Reactive-WLED/#initial-sound-reactive-settings","title":"Initial Sound Reactive Settings","text":"On the \"Sound Settings\" page, configure the Squelch for a value (default is 10) to reduce your background noise for volume reactive effects. Volume reactive effects start with a single '*'. Typically, values between 4 and 20 should suffice. The higher the number, the greater the background noise is suppressed.
Configure the Gain setting (default is 60) to change the \"perceived volume\" of the input signal. More info on Squelch and Gain here.
"},{"location":"WLEDSR/Running-Sound-Reactive-WLED/#initial-2d-settings-esp32-only","title":"Initial 2D Settings - ESP32 Only","text":"When changing any values in the LED settings page, you'll need to update the 2D settings. If not using a 2D matrix, you can set them to 1 x or vice versa. If using a 2D matrix, configure these values for width x height. A value of less than 4 in either dimension will not work with some of the 2D animations.
The serpentine parameter configures whether the LED's are wired up in a continuous/serpentine layout or top to bottom and repeat.
"},{"location":"WLEDSR/Running-Sound-Reactive-WLED/#initial-udp-sync-settings","title":"Initial UDP Sync Settings","text":"Devices can be configured as 'disabled', 'transmit' or 'receive' UDP sound. This is completely independent of the 'Sync' button, which synchronizes effects.
As a result, you can run multiple types of sound reactive animations when UDP Sound Sync is enabled. This feature provides a subset of the sound and FFT data to several 'slave' devices. As a result, some FFT enabled routines will not function in this mode. You must RESET the ESP32 after you enable/disable this on the Sync settings page.
"},{"location":"WLEDSR/Running-Sound-Reactive-WLED/#connect-to-wled","title":"Connect to WLED","text":"See WLED General Led Settings
"},{"location":"WLEDSR/Settings/#led-settings-for-sound-reactive-additions","title":"LED Settings for Sound Reactive Additions","text":"See LED Preferences
"},{"location":"WLEDSR/Settings/#sound-reactive-settings","title":"Sound Reactive Settings","text":"See Sound Settings
"},{"location":"WLEDSR/Squelch-and-Gain/","title":"Squelch and Gain","text":""},{"location":"WLEDSR/Squelch-and-Gain/#introduction","title":"Introduction","text":"In order to accommodate a wide range of audio inputs, ambient environments and string lengths, we have added user configurable squelch (noise reduction/suppression) and gain controls on the LED settings page for the volume reactive animations.
"},{"location":"WLEDSR/Squelch-and-Gain/#squelch","title":"Squelch","text":"Adjust this value on the LED Settings page so that the leds are only activated above a certain 'background noise' level.
"},{"location":"WLEDSR/Squelch-and-Gain/#gain","title":"Gain","text":"Line-in signals are typically much lower than that of some of the microphones. Rather than use an auto gain function, you can manually adjust the gain from 1 to 255, which translate up to almost 6.0 gain.
In addition, the 'Intensity' slider can sometimes adjust an animation to simulate increased gain.
"},{"location":"WLEDSR/Squelch-and-Gain/#how-to","title":"How To","text":"Here's a method to setup squelch and gain for your SR WLED Device.
From faulty microphones to flaky wiring, to WiFi related issues, particularly in AP mode, getting reliable and spike free sound sampling with WLED and in particular analog sampling has been a challenge. Digital microphones such as the INMP441, the ICS-43434 provide the best results.
"},{"location":"WLEDSR/Testing/","title":"Testing","text":"IMPORTANT NOTE:
When testing the UI, make sure to refresh your web browser. It may have cached incorrect information.
"},{"location":"WLEDSR/Testing/#compile","title":"Compile","text":"UDP Sound Sync is a feature to synchronize (share) the sound input of a 'master' device with one or more 'slave' devices. All devices must be running the same release of SR WLED, and they must be in the same local network. Sound Sync is not available in \"upstream\" WLED by Aircookie. Sound Sync is also different from direct LEDs control using protocols like E1.31, DMX, DDP or AdaLight.
UDP Sound Sync does not sync the actual animations, but rather transmits summary audio sampling information to several devices that still run their own animations locally. In a nutshell, it means that several devices can share a single microphone.
"},{"location":"WLEDSR/UDP-Sound-Sync/#setup","title":"Setup","text":"Before configuring UDP Sound Sync, make sure you have gone into the WiFi Preferences and clicked on 'Disable WiFi sleep' at the bottom of the page. It has caused us innumerable problems in the past.
In order to configure UDP sound sync, the \u2018master\u2019 needs to be an ESP32 along with an audio input.
You would then to go the \u2018Sync Interfaces\u2019 page and configure the 'Audio Sync' at the bottom of the page. Transmit
for the ESP32 and Receive
for devices without an audio input (either ESP32's or ESP8266's). Make sure the UDP port is the same on all devices.
This does not sync the actual animations, but rather just the transmission of summary audio sampling information (as best we can).
In order to change the UDP Sync Mode (Disabled/Transmit/Receive), you need to power-cycle the ESP32/ESP8266.
"},{"location":"WLEDSR/UDP-Sound-Sync/#technical","title":"Technical","text":"When an ESP32 is configured for audio transmission, it will connect to a UDP Multicast address, and begin sending a single UDP Multicast packet containing the data used to generate sound-reactive animations out to any other devices that are configured to receive on the same network. The following information is transmitted:
"},{"location":"WLEDSR/UDP-Sound-Sync/#v1-format-used-in-sr-wled-up-to-013x","title":"V1 format, used in SR WLED up to 0.13.x","text":"#define UDP_SYNC_HEADER \"00001\"\nstruct audioSyncPacket {\n char header[6] = UDP_SYNC_HEADER;\n uint8_t myVals[32]; // 32 Bytes\n int sampleAgc; // 04 Bytes\n int sampleRaw; // 04 Bytes\n float sampleAvg; // 04 Bytes\n bool samplePeak; // 01 Bytes\n uint8_t fftResult[16]; // 16 Bytes - FFT results, one byte per GEQ channel\n double FFT_Magnitude; // 08 Bytes\n double FFT_MajorPeak; // 08 Bytes\n};\n
UDP_SYNC_HEADER is a versioning number that's defined in audio_reactive.h
"},{"location":"WLEDSR/UDP-Sound-Sync/#v2-format-wled-version-0140-including-moonmodules-fork","title":"V2 Format - WLED version >= 0.14.0 (including MoonModules fork)","text":"#define UDP_SYNC_HEADER_V2 \"00002\"\n// new \"V2\" AC 0.14.0 audiosync struct - 40 Bytes\nstruct audioSyncPacket_v2 {\n char header[6] = UDP_SYNC_HEADER_V2; // 06 bytes, last byte is '\\0' as string terminator.\n float sampleRaw; // 04 Bytes - either \"sampleRaw\" or \"rawSampleAgc\" depending on soundAgc setting\n float sampleSmth; // 04 Bytes - either \"sampleAvg\" or \"sampleAgc\" depending on soundAgc setting\n uint8_t samplePeak; // 01 Bytes - 0 no peak; >=1 peak detected. In future, this will also provide peak Magnitude\n uint8_t reserved1; // 01 Bytes - reserved for future extensions like loudness\n uint8_t fftResult[16]; // 16 Bytes - FFT results, one byte per GEQ channel\n float FFT_Magnitude; // 04 Bytes - magnitude of strongest peak in FFT\n float FFT_MajorPeak; // 04 Bytes - frequency of strongest peak in FFT\n};\n
The V2 format expects that AGC is performed by the sender, so there is no need to transmit \"AGC\" and \"non-AGC\" samples separately. To save bandwidth, the myvals[]
array was removed, and all numbers are either float
or uint8_t
.
SR-WLED 0.13.3 still sends out V1 format, however it is able to receive and decode V2 format, too.
"},{"location":"WLEDSR/UDP-Sound-Sync/#what-else","title":"What else ?","text":"You might want to take a look at this library, which allows to send and receive WLED Audio Sync data independent from WLED.
When an ESP32 or ESP8266 is configured to receive audio data from another device, the receiver will disable any onboard microphone sampling and FFT processing, in favor of audio data received from the network. Any time a UDP Multicast packet is received from a transmitter, it will be treated as a discrete microphone sample and stored in memory the same way it would be if it were a local microphone.
An ESP8266 will not be able to use any FFT data transmitted from an ESP32, as a result of the differences in hardware and software.
The UDP \u00a0Multicast\u00a0 IP is 239.0.0.1
, and the default UDP port is 11988
.
UDP port can be changed in WLED config pages, for example to have several groups of devices by assigning different UDP ports to each group.
UDP multicast is generally not very reliable with typical \"consumer grade hardware\". Some users found that creating a \"port forwarding rule\" on their local Wifi router helps. For example, you could create a \"dynamic port forwarding rule\" for UDP port 11988.
UDP Sound sync brought to you by @spedione on Discord.
Reference: https://github.com/Aircoookie/WLED/wiki/UDP-Realtime-Control
"},{"location":"WLEDSR/Using-my-PC-for-the-Sound/","title":"Using my PC for the Sound","text":"Q. Is it possible to use my PC for the sound and without using the microphone, or any ADC pins on the board.
The sound reactive fork of WLED was designed as an all-in-one unit that doesn't require the intervention of a PC. You can setup a display and have it run completely independently. It supports your PC's analog line-out signal, several analog microphones, an INMP441 digital microphone, as well as UDP sound sync:
https://mm.kno.wled.ge/WLEDSR/UDP-Sound-Sync
To answer this question, there is not a direct, built in way, except for the line-out signal. Although we support UDP sound sync, someone would have to write a program for their OS of choice to capture the sound from the PC, perform FFT calculations, and UDP transmit the sampled data (the packet matching our sound reactive WLED data structure). That's a non-trivial course of action.
All that being said, there are a couple ways to achieve this:
For windows, there is WledSRServer (https://github.com/Victoare/SR-WLED-audio-server-win) which is a small application that is using the mentioned sound capture, FFT calculation and UDP packet sending mechanism.
There is also LedFx (as found at https://github.com/LedFx/LedFx) which is an another solution for this use case with a different approach. Since WLED supports UDP, DDP, and E1.31 DMX protocols, you can use the sound reactive LedFx running on your PC to control a WLED device. There's an excellent video on setting this environment up at https://www.youtube.com/watch?v=ipSfQdfX4fE.
LedFx will then directly control the LED's on your WLED device, although you can still revert to native WLED animations.
"},{"location":"WLEDSR/WLED-Programming-Notes/","title":"Introduction","text":"This version of WLED contains sound reactive routines, which are prefaced with a * FX_NAME
for volume reactive routines and ** FX_NAME
for FFT routines. Each is controllable by the intensity and/or speed sliders. Some routines also include 3 dedicated FFT control sliders.
**Caveat: As our sound reactive fork of WLED evolves, some of this content may become out of date. We'll update as we become aware of any issues.
Contents:
Caveat: Some information on this page is in our 'dev' branch only and not yet ready for prime time.
"},{"location":"WLEDSR/WLED-Programming-Notes/#http-api-links","title":"HTTP API Links","text":"I hope to work on an Android application in the future, so I'm keeping notes on the HTTP API. * https://tynick.com/blog/01-28-2020/controlling-wled-with-raspberry-pi-using-the-wled-api/ * https://github.com/Aircoookie/WLED/wiki/HTTP-request-API
"},{"location":"WLEDSR/WLED-Programming-Notes/#updating-fxh-line-numbers-will-vary","title":"Updating FX.h (line numbers will vary)","text":"Append the new function(s) and use current functions as templates. Cannot add any functions without accompanying index entry.
"},{"location":"WLEDSR/WLED-Programming-Notes/#wled-support-functions","title":"WLED Support Functions","text":"fade_out(uint8_t rate);
- This is CRITICAL!!!blur(uint8_t blur_amount);
- Can be useful.color_wheel(uint8_t index);
- This has history with NeoPixel library. I use palettes instead.SEGLEN
// uint16_t - Segment length._segment_index
// uint8_t - Current segment being displayed.
SEGMENT.length
// uint16_t - Segment length (but not for ESP8266 :^/ )
SEGMENT.intensity
// uint8_t - You can use this from the slider.SEGMENT.speed
// uint8_t - You can use this from the slider.SEGMENT.palette
// uint8_t - Current palette. Otherwise SEGCOLOR(0) and SEGCOLOR(1).SEGMENT.mode
// uint8_t - Current mode.now
// uint32_t \u2013 Millis counter.SEGENV.call
// uint32_t \u2013 Counter each time a routine is called. Can be used for 'setup'.SEGENV.next_time
// uint32_t \u2013 Millis counter.SEGENV.step
// uint32_t - Counter each time a routine is called.SEGENV.aux0
// uint16_t - Available for use as a SEGMENT specific persistent variable.SEGENV.aux1
// uint16_t - Available for use as a SEGMENT specific persistent variable.You DO NOT use delay statements here, except to keep the watchdog happy. Here is the awesome FastLED method of timing/scheduling (which DOES NOT work with segments):
EVERY_N_MILLISECONDS_I(pixTimer, SEGMENT.speed) {\n pixTimer.setPeriod(256 - SEGMENT.speed);\n // Put your display code here.\n}\n
Here's the standard blink without delay version:
long lastTime = 0;\nint delayMs = 2000; // We want to do something every 2 seconds.\n\nvoid userLoop()\n{\n if (millis()-lastTime > delayMs)\n {\n lastTime = millis();\n //do something you want to do every 2 seconds\n }\n}\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#displaying-the-leds","title":"Displaying the LED's.","text":"We were used to FastLED.show(). Well, no longer, and this has some disadvantages.
CRGB myCol = ColorFromPalette(currentPalette, index, brightness, LINEARBLEND);\nsetPixelColor(myLED, myCol.red, myCol.green, myCol.blue);\n
The next line supports SEGCOLOR(0) and SEGCOLOR(1) if no palette (i.e. default) is selected:
setPixelColor(i, color_blend(SEGCOLOR(1), color_from_palette(index, false, PALETTE_SOLID_WRAP, 0), pixBri));\n
where, i
is the location, index
is the color and pixBri
is the brightness.
Now, onto the disadvantage. . The problem is that you can perform a getPixelColor
and move it to another LED with setPixelColor
. After moving to about 10 pixels, the LED is now black. This is because of the built-in scaling and addressing the memory that's used for DMA transfer. Unfortunately, we don't get a nice lossless leds[location]
as we do with FastLED.
WLED uses the NeoPixelBus library to drive the LED's directly, however, a significant amount of FastLED functionality has been enabled in WLED. Things included:
What is NOT included: * FastLED.show()
* FastLED pixel setup * FastLED power management * Working directly with the leds[x]
array * fill_rainbow
and related routines that directly affect the array * fade
/nscale
, you need to use the WLED equivalent
These will be used so that we can address leds[x] in our routines with the known and lossless FastLED method rather than the lossy NeoPixelBus method. We'll also be using these for ancillary functions, i.e. heat[x] as used in fire2012.
Since you cannot define variable arrays in C, we need other methods to do so for our functions.
The WLED method has been to malloc() some memory as follows:
if (!SEGENV.allocateData(SEGLEN)) return mode_static();\n byte *heat = SEGENV.data;\n heat[value] = 25;\n
For the 2D and FastLED data array functionality, the developers of this fork are not comfortable with the malloc()
method of memory allocation and have decided to create large fixed arrays instead and to create pointers for use with variable-length arrays.
Already declared in FX.cpp:
uint32_t ledData[MAX_LEDS]; // Currently 1500 as defined in const.h. Used for conversion from NeoPixelBus to FastLED. RGB or RGBW.\n uint32_t dataStore[4096]; // For ancillary functions. Can use any data type.\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#using-crgb-color-space","title":"Using CRGB Color Space","text":" CRGB *leds = (CRGB *)ledData; // Define the pointer and override the default data type.\n leds[0] = CRGB::Red;\n leds[1] = ColorFromPalette(currentPalette, index, bright, LINEARBLEND);\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#display-the-crgb-array","title":"Display the CRGB Array","text":"First, define a function and add to FX.h
void WS2812FX::setPixels(CRGB* leds) {\n for (int i=0; i<SEGLEN; i++) {\n setPixelColor(i, leds[i].red, leds[i].green, leds[i].blue);\n } \n}\n
You can now use FastLED address methods, AND it works with segments. Then, you can call this function at the end of your routine as follows:
setPixels(leds);\n return FRAMETIME;\n} // End of your routine.\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#proposed-using-chsv-colour-space","title":"Proposed - Using CHSV Colour Space","text":" CHSV *leds = (CHSV *)ledData;\n leds[i] = CHSV(25, 255,255);\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#proposed-display-the-chsv-colour-space","title":"Proposed - Display the CHSV Colour Space","text":"The leds[]
array is already defined in the CHSV color space.
CRGB color;\n for (int i=0; i<SEGLEN; i++) {\n color = leds[i];\n setPixelColor(i, color.red, color.green, color.blue);\n }\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#current-use-of-the-chsv-colour-space","title":"Current Use of the CHSV Colour Space","text":"As used in one of the FFT animations (** Freqmatrix) in FX.cpp around line 4079.
uint32_t *leds = ledData;\n CHSV c;\n c = CHSV(20, 255, 255);\n leds[i] = (c.h << 16) + (c.s << 8) + (c.v );\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#current-display-of-chsv-array","title":"Current Display of CHSV array","text":" for (int i=0; i<SEGLEN; i++) {\n c.h = (leds[i] >> 16) & 0xFF;\n c.s = (leds[i] >> 8) &0xFF;\n c.v = leds[i] & 0xFF;\n color = c;\n setPixelColor(i, color.red, color.green, color.blue);\n }\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#how-to-use-a-non-dynamically-created-variable-array","title":"How to use a non-dynamically created variable array","text":"We'll use that large dataStore array that was defined globally in FX.cpp. Although it was defined as a unint32_t
, you can still use smaller dynamic arrays and override the data type using pointers with a function:
uint8_t *myArray = (uint8_t *)dataStore; // Just make sure you don't go over.
You can now use it as a 1D or quasi 2D array, i.e.
myArray[5] = 4; // 1D array\n myArray[5*matrixWidth + 4] = 10; // 2D array\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#2d-changes","title":"2D Changes","text":"We have implemented an advanced XY() function to support not only panels of varying sizes and orientations, but also for multiple (identical) panels.
Animations have been written so that the top left led in the panel(s) is, well, at the top left.
We do not (yet) have animation specific orientation settings. If you would like to do so, for any given 2D animation, you'll need to swap the parameters for the XY() function as well as changing the for loop parameter from height to width (or vice versa).
"},{"location":"WLEDSR/WLED-Programming-Notes/#sound-reactive-eeprom-layout","title":"Sound Reactive EEPROM Layout","text":"We've expanded EEPSIZE
in const.h to 4095 for ESP32 and 3300 for ESP8266 due to our additional requirements. We started saving values at 3072 defined as EEP_AUDIO
. Although we'd like to apply SEGMENT specific settings, we may have some challenges with the FFT sliders. We're not sure at this point.
How do we store FFT slider values in EEPROM for WLED presets? WLED Presets are 20-byte blocks (slots) stored in EEPROM. There is space reserved in EEPROM for 25 slots from 400-899. Currently, 18 of the 20 bytes are being used by WLED. This presents a problem for us since, at the time of writing, we have 3 bytes that we need to store for our FFT sliders. We didn't want to attempt to rewrite the entire WLED preset protocol as that would surely introduce unnecessary headaches.
To solve this problem, we reserved 25 5-byte blocks (slots) in EEPROM from 3175-3299. With the space in EEPROM allocated, we can now save/retrieve FFT slider data to/from WLED presets.
Byte Data 0 FFT1 Slider Value 1 FFT2 Slider Value 2 FFT3 Slider Value 3 ZERO (Reserved) 4 ZERO (Reserved)"},{"location":"WLEDSR/WLED-Programming-Notes/#on-frame-rates","title":"On Frame Rates","text":"WLED limits the frame rate, and it's apparently because the LED's start flashing if the frame rate is too high. The standard for maintaining a consistent frame rate when writing any animations is to make sure you add to the end of your animation:
return FRAMETIME;
If you wish to increase the frame rate, have a look at fx.h with:
#define MIN_SHOW_DELAY 15
Also, in fx_fcn.h, there's:
if (nowUp - _lastShow<MIN_SHOW_DELAY) return;
Some animations may break when the users start implementing SEGMENTS. Issues encountered were:
Here's a replacement for EVERY_N_MILLIS()
uint8_t secondHand = millis()/(256-SEGMENT.speed) % 10;\n if (SEGENV.aux0 != secondHand) {\n SEGENV.aux0 = secondHand;\n <rest of code goes here>\n }\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#getpixel-and-setpixel","title":"getPixel and setPixel","text":"In the FastLED world, we could cascade led information with things like:
leds[i+1] = leds[i];\n
That's not an option with WLED (unless you use the *ledData method described above), because it doesn't have the leds[] array. Instead, you have:
setPixelColor(i+1,getPixelColor(i)); \n
The problem, however is that while the FastLED method preserves the original pixel information, the 'WLED' method is lossy, and eventually the cascaded led's will fade out entirely. The workaround, as previously shown, is to create an array used by the segment that preserves the LED information. AirCoookie's method is to allocate memory on the fly for this. For instance:
if (!SEGENV.allocateData(SEGLEN)) return mode_static(); // allocation failed\n SEGENV.data[SEGLEN-1] = 0; // a byte value\n
If you want, you can give it another name with:
if (!SEGENV.allocateData(SEGLEN)) return mode_static(); // allocation failed\n byte* heat = SEGENV.data;\n heat[SEGLEN-1] = 0; // a byte value\n
You now have SEGENV.data[SEGLEN] allocated for your use. Adding a structure for use with your segment is a whole other level of complexity and can be found by examining mode_multi_comet and mode_oscillate among others. Just search for SEGENV.allocateData in FX.cpp.
"},{"location":"WLEDSR/wip/","title":"Work in Progress","text":"This page is work in progress
Check WLED Atuline Wiki for original content
Template text:
"},{"location":"WLEDSR/wip/#fork-specific-info","title":"Fork specific info","text":""},{"location":"WLEDSR/wip/#wled-sr","title":"WLED SR","text":""},{"location":"about/contributors/","title":"Contributors and Credits","text":"This page is to honor the work of all the people who helped to make WLED what it is today!
"},{"location":"about/contributors/#direct-contributors-to-wled-code","title":"Direct Contributors to WLED code","text":"Everyone you see on the Contributors page and: 8bitbrett made the WiFi auto connect QR code with the Aircoookie/WLED logo! adamo made the animated Discord server logo! @blazoncek makes countless new features and improvements to many parts of WLED! @debsahu provided the HomeAssistant autodiscovery and a lot of help with PIO! @ewowi numerous optimizations; 2D, audio and various user mod improvements. MoonModules maintainer. @frenck made an amazing, stable and feature-packed native integration with HomeAssistant! @Moustachauve added palette visualisation and developped the WLED Native app for Android and iOS! @pbolduc DDP UDP synchronization, UI improvements and user mods. @photocromax helped bring the Live visualization feature to life. @raymiec is currently working on creating the best clients for Android and iOS! @scottrbailey added JSON IR remote and gif visualizations for the docs. @softhack007 audio processing, new MCU support, code reviews, and various optimizations. MoonModules maintainer. @StormPie, the creator of the awesome mobile UI! @timothybrown added MQTT authentication! @viknet365 ported the Meteor effect! @wiesendaniel added the configuration for the PlatformIO IDE! @YeonV provided the initial HomeAssistant MQTT light config! @werkstrom added PixelArt converter
This list is incomplete.
"},{"location":"about/contributors/#testing-contributors-and-supporters","title":"Testing, Contributors and Supporters","text":"This list has been redacted for privacy reasons. If you've contributed to the project by testing a lot, helping the community, or sending me a gift, feel free to edit this page and add yourself (maintain alphabetical order) \ud83d\ude04 Thank you very much, your help is truly appreciated! Put two spaces behind your name, else the line break will not appear in the final page! ALDIY - user support, documentation, beta tester @Def3nder @DutchmanNL DrZzs (Justin A.) Dylan L. Fil Quindor (Andries F.) - designed Dig-Quad, Dig-Uno, etc. @Serg74 - designed controllers and shields - contributes code - hosts nightly build binaries Tonyno - tireless user support and documentation Wladi - contributes documentation and maintains WLED FAQ unofficial documentation.
"},{"location":"about/contributors/#used-libraries-and-dependencies","title":"Used Libraries and Dependencies","text":"ESP8266/ESP32 Arduino Core NeoPixelBus by Makuna FastLED library ESPAsyncTCP by me-no-dev ESPAsyncUDP by me-no-dev (as of 0.9.0) ESPAsyncWebServer by me-no-dev ArduinoJSON by bblanchon async-mqtt-client by marvinroger WS2812FX by kitesurfer1404 (modified) IRremoteESP8266 by markszabo (optional) Timezone by JChristensen Blynk library (compacted) E1.31 library by forkineye (modified) Espalexa by Aircoookie (modified) Many included FastLED effects are modified versions of kriegsman's gists!
WLED implements Art-Net\u2122 Designed by and Copyright Artistic Licence Holdings Ltd
WebServer_tng by bbx10 (ESP32, up to 0.8.3) PubSubClient by knolleary (modified, up to 0.8.3)
iro.js colorpicker by James Daniel! Classic UI icons by Linearicons created by Perxis!
If you would like to appear in this list for a contribution you made or be removed from it, feel free to contact me!
"},{"location":"about/privacy-policy/","title":"Privacy Policy","text":"By using the WLED embedded system code, the WLED iOS mobile application, the WLED Android mobile application, web client, or associated Services, no personally identifiable data is collected, transmitted and/or stored on external servers. No data is processed in any way not absolutely required for the operation of the Service.
This https://mm.kno.wled.ge page is hosted using GitHub Pages. While the author of this page does not collect any personally identifiable data, the service provider GitHub \"may collect User Personal Information from visitors to [the] GitHub Pages website, including logs of visitor IP addresses, to comply with legal obligations, and to maintain the security and integrity of the Website and the Service.\" (https://docs.github.com/en/github/site-policy/github-privacy-statement#github-pages) This is outside the influence of the author.
"},{"location":"about/privacy-policy/#overview-of-collected-data","title":"Overview of collected data","text":"The embedded system internally stores configuration data, including, but not limited to the user's WiFi credentials. This data is deletable by the user. External read access to sensitive data is blocked. No user or configuration data is sent to any system outside the users local network, unless the user modifies the Software or network configuration.
The mobile apps internally store data regarding connected devices, including, but not limited to the device's network-local IP addresses.
Using the provided Support services (including, but not limited to GitHub, Discord and E-mail), only the information you choose to disclose will be processed. Privacy policies and Terms of Service of service providers apply.
In accordance with the Service MIT license, THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
If you have inquiries regarding this Policy please feel free to contact me at: dev.aircoookie@gmail,com
"},{"location":"about/roadmap/","title":"Upcoming Features","text":"These are currently on my list of what COULD be implemented, there is no guarantee if and when they will be available!
WLED supports mixing 2D and 1D setup on the same unit, the expected result is that you could use 2D fixture and still chain a strip after or setup a strip and then a matrix after on the same pin.
Note: If the matrix is chained after the strip, then use reversing at the bus level, i.e. check Reversed (rotated 180\u00b0) in LED & Hardware setup. This may also require you reverse segment.
"},{"location":"advanced/audio-reactive/","title":"Audio Reactive WLED","text":""},{"location":"advanced/audio-reactive/#what-is-audio-reactive-wled","title":"What is Audio Reactive WLED?","text":"Audio Reactive WLED is a possibility of using WLED controllers in such a way that the LEDs react to music and light up in time. First time this was implemented by a Sound Reactive Fork. As of WLED version 0.14.0-beta1 an usermod is available for original WLED too. Currently only ESP32 microcontrollers are supported.
"},{"location":"advanced/audio-reactive/#hardware-required","title":"Hardware required","text":"The audio must be \"feed\" into the microcontroller. There are basically two options: using microphones or line-in adapters.
"},{"location":"advanced/audio-reactive/#microphones-supported","title":"Microphones supported","text":"Three microphone types are supported:
"},{"location":"advanced/audio-reactive/#1-analog-microphones","title":"1. Analog microphones","text":"Examples are MAX4466 (not really good) and MAX9814 (slightly better). These microphones are easy to use: you just have to connect 3.3V, GND and the analog output from the microphone to an ADC input (Analog-to-Digital Converter) of ESP32. However, the big disadvantage is the quality: both from the microphones themselves and from the ADCs integrated into microcontrollers, which are actually not well suited for audio processing and highly influenced by the power supply noise.
Analog microphones and analog buttons (potentiometers) rule out each other
WLED can use analog microphones or analog buttons but not both at the same time!
"},{"location":"advanced/audio-reactive/#2-i2s-digital-microphones","title":"2. I2S digital microphones","text":"Examples are INMP441 and ICS-43434/ICS-43432. These have an integrated ADC and already output a digital signal. The advantage is the best possible quality. The disadvantage is higher complexity (you need several PINs for a digital signal). For proper trouble-free operation keep wires between the microphone and ESP32 as short as possible and solder them properly.
There are also some commercial controllers with integrated digital microphone or plug-in capability available. Be sure to setup correct GPIOs according to the information you typically will find printed on the board or in user manual.
"},{"location":"advanced/audio-reactive/#3-pdm-microphones","title":"3. PDM microphones","text":"An example is SPM1423. In principle, these are also digital microphones with an integrated Sigma-Delta ADC. They are slightly cheaper than I2S microphones, require one PIN less and the quality is quite good.
"},{"location":"advanced/audio-reactive/#line-in-options","title":"Line-In options","text":"Similar to microphones there are options for analog or digital line-in adapters. In both cases you use line-out (AUX) or headphone-out signal of your sound system/TV/Smartphone/etc.
"},{"location":"advanced/audio-reactive/#1-analog-line-in-option","title":"1. Analog line-in option","text":"At least a simple analog circuit as shown below is required to prepare the analog line-out signal and to feed it to the ADC converter of ESP32 microcontroller. In this case, the whole thing works like with an analog microphone. The quality is not the best here either because the ESP32 ADC is not particularly good at converting audio signals and the signal conditioning circuitry is very simple, but not very good. In addition, the sensitivity can be quite poor, so that the whole thing only works at a higher volume of the signal.
In some cases, you can do it without this circuit and connect the GND of the audio source and an audio channel (left or right) directly to ESP32 ADC Pin (GND and analog input, e.g. GPIO36 pin on the ESP32). This solution is rather quite dirty workaround and might work well or not at all.
"},{"location":"advanced/audio-reactive/#2-line-in-to-i2s-adapter","title":"2. Line-in to I2S adapter","text":"Line-in to I2S adapter converts the analog line-out or headphone signal into a digital I2S signal that can be proceed by ESP32. There are some general or for WLED specially developed analog-to-I2S adapters based on for example CirrusLogic CS5343, TI PCM1808 or es7243 chips on the market. In this case, the whole thing works like with a digital I2S microphone. The only difference to I2S microphone is that you at least need an extra PIN for MCLK (Master Clock) signal, which can only be generated by the ESP32 on GPIOs 0, 1 or 3. The other complication is that MCLK is a high frequency signal and must be wired extremely accurate and have short wires. Some adapter types also require more additional signals. For stability it is better to use ready-to-use controller with special Line-In to I2S adapter or DIY PCB design where you can integrate general analog-to-I2S adapter directly without long wires.
For some more details please refer to Sound Reactive WLED WIKI
"},{"location":"advanced/audio-reactive/#software-required","title":"Software required","text":"Because audio reactive capability is currently implemented as a usermod, you need WLED compiled with this usermod included or use Sound Reactive WLED fork. The official WEB-based WLED installer does not include original WLED with audio reactive usermod, but offers Sound Reactive WLED as an option. The unofficial WEB-based WLED installer offers more options including original WLED with audio reactive usermod.
"},{"location":"advanced/buildflags/","title":"WLED MoonModules Build Flags","text":"Version at time of page update: WLEDMM 0.14.0-b15.23 - commit 244a613
Sourced by: S\u00f6ren#5281 Organized and updated by: Troy#2642
Flags/functions specific to WLED MoonModules are denoted with the \u263e icon.
"},{"location":"advanced/buildflags/#basic-usage","title":"Basic Usage","text":""},{"location":"advanced/buildflags/#in-my_configh-or-in-the-cc-code","title":"In \"my_config.h\" or in the C/C++ code","text":"For entries with no parameter, prefix with #define
like #define WLED_DEBUG
For entries with a numeric parameter, use the syntax of #define LEDPIN 16
For non-numeric entries use quotes like #define WLED_AP_SSID \"MY-WLED-AP\"
For items with no parameter, prefix with -D
like -D WLED_DEBUG
For entries with a numeric parameter, use the syntax of -D LEDPIN=16
For non-numeric entries use both types of quotes like -D SERVERNAME='\"WLED-C3\"'
lib_ignore = IRremoteESP8266
to your platformio.ini or platformio_override.ini file WLED_DISABLE_WEBSOCKETS Disables the websockets WLED_DISABLE_MQTT Disables MQTT support. Warning: This may break your build unless you disable several other things as well. WLED_DISABLE_SOUND Disables sound features... but why would you do that? :D WLED_DISABLE_2D Disables 2D Features WLED_DISABLE_LOXONE Disable Loxone support"},{"location":"advanced/buildflags/#audio-responsive-build-flags","title":"Audio Responsive build flags","text":"Flag Description SR_SQUELCH Sets the default squelch setting. Recommend 10 SR_GAIN Sets the defauly gain setting. Recommend 40 AUDIOPIN Analog audio pin SR_DMTYPE 0=none/disabled/analog ; 1=generic I2S I2S_SDPIN Default I2S sd/data/dout input pin I2S_WSPIN Default I2S ws/clk/lrck pin I2S_CKPIN Default I2S sck/bclk pin MCLK_PIN Default I2S master clock/mclk pin I2S_USE_16BIT_SAMPLES Use if I2S input are already 16-bit. Likely not the case for most setups. ES7243_SDAPIN I2C SDA pin for ES7243 boards ES7243_SCLPIN I2C SCL pin for ES7243 boards ES7243_ADDR Sets the ES7243 I2c address. Default is usually correct. ES8388_ADDR Sets the ES8388 I2C address. Default is usually correct. SR_DEBUG Turns on sound-reactive specific debug messages UM_AUDIOREACTIVE_USE_NEW_FFT Turns on the new FFT code. \u263e Should be the default currently in most builds. MIC_LOGGER Turns on mic logging for debug purposes. You may be able to graph this output. FFT_SAMPLING_LOG FFT sampling debug log. I2S_USE_RIGHT_CHANNEL Tells I2S to use the right channel. Defaults to the left. I2S_SAMPLE_DOWNSCALE_TO_16BIT Enabled by default unless I2S_USE_16BIT_SAMPLES
is defined."},{"location":"advanced/buildflags/#battery-usermod","title":"Battery usermod","text":"Flag Description USERMOD_BATTERY_MEASUREMENT_PIN Pin to measure the voltage, defaults to GPIO35 on ESP32 and A0 on ESP8266 USERMOD_BATTERY_MEASUREMENT_INTERVAL Interval to measure voltage in ms, defaults to 30s USERMOD_BATTERY_MIN_VOLTAGE Minimal voltage in volt, defaults to 3.2V if use lipo and min voltage is not set, if min voltage is not set and use lipo is set the dafault is 2.6V USERMOD_BATTERY_USE_LIPO Use LiPo discharge curve calculations USERMOD_BATTERY_MAX_VOLTAGE Max voltage in volt, defaults to 4.2V if not set USERMOD_BATTERY_TOTAL_CAPACITY capacity in mAh defaults to 3100mAh if not set USERMOD_BATTERY_CALIBRATION offset or calibration value to fine tune the calculated voltage USERMOD_BATTERY_AUTO_OFF_ENABLED auto-off feature, defaults to true USERMOD_BATTERY_AUTO_OFF_THRESHOLD Percentage theshold to turn power off USERMOD_BATTERY_LOW_POWER_INDICATOR_ENABLED low power indication feature, defaults to true USERMOD_BATTERY_LOW_POWER_INDICATOR_PRESET preset to use when low power threshold is hit - defaults to 0 USERMOD_BATTERY_LOW_POWER_INDICATOR_THRESHOLD percent - defaults to 20 USERMOD_BATTERY_LOW_POWER_INDICATOR_DURATION seconds - defaults to 5"},{"location":"advanced/buildflags/#bh1750-usermod","title":"BH1750 usermod","text":"Flag Description USERMOD_BH1750_MAX_MEASUREMENT_INTERVAL the max frequency to check photoresistorin milliseconds, 10 seconds USERMOD_BH1750_MIN_MEASUREMENT_INTERVAL the min frequency to check photoresistor in milliseconds, 500 ms USERMOD_BH1750_FIRST_MEASUREMENT_AT how many milliseconds after boot to take first measurement, 10 seconds USERMOD_BH1750_OFFSET_VALUE only report if differance grater than offset value, default 1"},{"location":"advanced/buildflags/#boblight-usermod","title":"BOBlight usermod","text":"Flag Description BOB_PORT Boblight port, defaults to 19333"},{"location":"advanced/buildflags/#buzzer-usermod","title":"Buzzer usermod","text":"Flag Description USERMOD_BUZZER_PIN Buzzer pin, defaults to GPIO32"},{"location":"advanced/buildflags/#dht-usermod","title":"DHT usermod","text":"Flag Description USERMOD_DHT_DHTTYPE 11=DHT 11, 21=DHT 21, 22:DHT 22 (AM2302), AM2321 *** default USERMOD_DHT_MEASUREMENT_INTERVAL the frequency to check sensorin milliseconds, 1 minute USERMOD_DHT_FIRST_MEASUREMENT_AT how many seconds after boot to take first measurementin milliseconds, 90 seconds USERMOD_DHT_PIN defaults to 21 onm ESP32 and 4 on esp8266 USERMOD_DHT_MQTT Publish measurements to the MQTT broker USERMOD_DHT_STATS For debug, report delay stats USERMOD_DHT_CELSIUS Display temperatures in Celcius"},{"location":"advanced/buildflags/#bme280-usermod","title":"BME280 usermod","text":"Flag Description Celsius Display temperatures in Celcius"},{"location":"advanced/buildflags/#enclosure-usermod","title":"Enclosure usermod","text":"Flag Description Celsius Display temperatures in Celcius"},{"location":"advanced/buildflags/#mqttswitch-usermod","title":"MQTTSWITCH usermod","text":"Flag Description MQTTSWITCHPINS define MQTTSWITCHPINSe.g. -D MQTTSWITCHPINS=\"12, 0, 2\" MQTTSWITCHINVERT invert the switch pins, default all active high MQTTSWITCHDEFAULTS default behavior, default all off"},{"location":"advanced/buildflags/#multi-relay-usermod","title":"Multi Relay usermod","text":"Flag Description MULTI_RELAY_MAX_RELAYS default to 4 MULTI_RELAY_PINS defaults to -1"},{"location":"advanced/buildflags/#my92xx-usermod","title":"MY92XX usermod","text":"Flag Description DEBUG_MY92XX Enable Debug"},{"location":"advanced/buildflags/#pir-usermod","title":"PIR usermod","text":"Flag Description PIR_SENSOR_PIN defaults to GPIO23 on ESP32 and GPIO13 on ESP8266 PIR_SENSOR_OFF_SEC in milliseconds, defaults to 600ms USERMOD_PIR_SENSOR_SWITCH Enables PIR Usermod"},{"location":"advanced/buildflags/#pwm-fan-usermod","title":"PWM Fan usermod","text":"Flag Description TACHO_PIN defaults to -1 PWM_PIN defaults to -1"},{"location":"advanced/buildflags/#pwm-output-usermod","title":"PWM OUTPUT usermod","text":"Flag Description USERMOD_PWM_OUTPUT_PINS default to 3"},{"location":"advanced/buildflags/#photoresistor-usermod","title":"Photoresistor usermod","text":"Flag Description USERMOD_SN_PHOTORESISTOR_MEASUREMENT_INTERVAL the frequency to check photoresistor in milliseconds, 10 seconds USERMOD_SN_PHOTORESISTOR_FIRST_MEASUREMENT_AT how many milliseconds after boot to take first measurement, 10 seconds USERMOD_SN_PHOTORESISTOR_REFERENCE_VOLTAGE supplied voltage USERMOD_SN_PHOTORESISTOR_ADC_PRECISION defaults to 1024 USERMOD_SN_PHOTORESISTOR_RESISTOR_VALUE defaults to 10k USERMOD_SN_PHOTORESISTOR_OFFSET_VALUE only report if differance grater than offset value, defaults to 5"},{"location":"advanced/buildflags/#sd-card-usermod","title":"SD card usermod","text":"Flag Description WLED_USE_SD_MMC Use when SD card is connected via MMC WLED_USE_SD_SPI Use when SD card is connected via SPI. Use the usermode page to set SPI pins SD_ADAPTER Enables SD card functionality."},{"location":"advanced/buildflags/#st7790-usermod","title":"ST7790 usermod","text":"Flag Description USER_SETUP_LOADED Detects if an external user setup file for the display was used in the library code itself ST7789_DRIVER Enables ST7789 driver TFT_WIDTH TFT display width TFT_HEIGHT TFT display height TFT_MOSI Display MOSI pin TFT_SCLK Display SCLK pin TFT_DC Display DC pin TFT_RST Display reset pin LOAD_GLCD Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH. Default enabled. LOAD_FONT2 Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters LOAD_FONT4 Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters LOAD_FONT6 Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm LOAD_FONT7 Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. LOAD_FONT8 Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. LOAD_FONT8N Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT LOAD_GFXFF FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts TFT_BL Display backlight pin"},{"location":"advanced/buildflags/#stairway-whipe-usermod","title":"Stairway whipe usermod","text":"Flag Description STAIRCASE_WIPE_OFF If enabled, fade out versus doing a reverse wipe in the effect"},{"location":"advanced/buildflags/#temperature-usermod","title":"Temperature usermod","text":"Flag Description TEMPERATURE_PIN defaults to 18 on ESP32 and 14 on ESP8266 USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL the frequency to check temperature in milliseconds, 1 minute"},{"location":"advanced/buildflags/#ttgo-t-display","title":"TTGO T-Display","text":"Flag Description TFT_DISPOFF defaults to 0x28 TFT_SLPIN defaults to 0x10"},{"location":"advanced/buildflags/#autosave-usermod","title":"autosave usermod","text":"Flag Description AUTOSAVE_AFTER_SEC in seconds, default 15s AUTOSAVE_PRESET_NUM defaults to 250 USERMOD_AUTO_SAVE_ON_BOOT defaults to false"},{"location":"advanced/buildflags/#four-line-display-usermod","title":"four line display usermod","text":"Flag Description FLD_PIN_SCL defaults to i2c_scl value FLD_PIN_SDA defaults to i2c_sda value FLD_PIN_CLOCKSPI defaults to spi_sclk value FLD_PIN_DATASPI defaults to spi_mosi value FLD_PIN_CS defaults to spi_cs value FLD_PIN_DC defaults to 19 on esp32 and 12 on esp8266 FLD_PIN_RESET defaults to 26 on esp32 and 16 on esp8266 FLD_TYPE defaults to SSD1306 or SSD1306_SDI if FLD_SPI_DEFAULT is set"},{"location":"advanced/buildflags/#four-line-display-alt-usermod","title":"four line display alt usermod","text":"Flag Description FLD_PIN_SCL defaults to i2c_scl value FLD_PIN_SDA defaults to i2c_sda value FLD_PIN_CLOCKSPI defaults to spi_sclk value FLD_PIN_DATASPI defaults to spi_mosi value FLD_PIN_CS defaults to spi_cs value FLD_PIN_DC defaults to 19 on esp32 and 12 on esp8266 FLD_PIN_RESET defaults to 26 on esp32 and 16 on esp8266 FLD_TYPE defaults to SSD1306 or SSD1306_SDI if FLD_SPI_DEFAULT is set"},{"location":"advanced/buildflags/#encoder-usermod","title":"encoder usermod","text":"Flag Description ENCODER_DT_PIN defaults to 12 ENCODER_CLK_PIN defaults to 14 ENCODER_SW_PIN defaults to 13 USERMOD_ROTARY_ENCODER_GPIO defaults to INPUT_PULLUP"},{"location":"advanced/buildflags/#encoder-alt-usermod","title":"encoder alt usermod","text":"Flag Description ENCODER_DT_PIN defaults to 12 ENCODER_CLK_PIN defaults to 14 ENCODER_SW_PIN defaults to 13 USERMOD_ROTARY_ENCODER_GPIO defaults to INPUT_PULLUP"},{"location":"advanced/buildflags/#vl53l0x-usermod","title":"VL53L0X usermod","text":"Flag Description VL53L0X_MAX_RANGE_MM max range in millimeters to react for motions, defaults to 230 VL53L0X_MIN_RANGE_OFFSET minimal range in millimeters that sensor can detect. Used in long motions to correct brightness calculation, defaults to 60 VL53L0X_DELAY_MS how often to get data from sensor, defaults to 100 VL53L0X_LONG_MOTION_DELAY_MS switch onto \"long motion\" action after this delay,defaults to 1000"},{"location":"advanced/compile-analog/","title":"Compile Analog WLED","text":"Moved, see How to compile WLED
"},{"location":"advanced/compile-arduino-esp32/","title":"Compiling a Custom Arduino-ESP32 Build","text":"Why? Well, WLED is itself reliant on a very big pile of code, and that code is provided in a binary format so you don't need to compile all the code for \"WiFi Support\" (for example) every time you compile WLED. We don't compile it, we just haul it in as a precompiled library.
The downside to this is bloat (we don't use Bluetooth, for example) and some options that are sane for \"all users\" but perhaps not the fastest options for WLED.
We'll be building arduino-esp32 release 2.x with IDF 4.4.x, which is required for S3 and other modern ESP32 variants.
This requires MacOS or Linux. If you're using Windows, then the Windows Subsystem for Linux works great too as it's Ubuntu based, which matches the docs perfectly and works flawlessly with this.
git clone -b release/v4.4 https://github.com/espressif/esp32-arduino-lib-builder
release/v2.x
to make things easier.git clone -b release/v2.x https://github.com/YOUR-GITHUB/arduino-esp32/
esp32-arduino-lib-builder
directory and run ./build.sh
and it should make you a fully default build for all boards and the current IDF for 4.4.x!There's several things that are not obvious when building arduino-esp32 - like \"how do I make my customizations actually get used in the build?\"
I'll be using the ESP32-S3 as the build target here, but the same general idea works for other boards.
Run the menuconfig for your board variant: * ./build.sh -t esp32s3 -b menuconfig
and set your options * Generally, you only will want to modify things in \"Arduino Configuration\" and the menus below it (Arduino TinyUSB, Compiler options, etc) * This will create an sdkconfig
file in the root of esp32-arduino-lib-builder
This file is functionally useless because the build system will use configs/defconfig.common
with configs/defconfig.esp32s3
and then add your sdkconfig
file - which means most of your modifications will be overwritten by the defaults and we do not want that.
To get your new build to use your menuconfig created build file:
esp32-arduino-lib-builder
folder.cd configs
cp defconfig.common defconfig.common.org
to make a backupcp defconfig.esp32s3 defconfig.esp32s3.org
to make a backuprm defconfig.esp32s3
to get rid of the S3 defaultstouch defconfig.esp32s3
to make a blank file so nothing complains during the buildcp ../sdkconfig defconfig.common
to put your options into the build file../build.sh -c /path/to/your/arduino-esp32/ -t esp32s3
/path/to/your/arduino-esp32/
There are other ways to do this, but with this method your previous choices are reflected as the default options when you run menuconfig
again.
NOTE: You could make a blank defconfig.common
file and cp ../sdkconfig defconfig.esp32s3
if you want to make different board configs with menuconfig.
In order to undo this if you things aren't working and you can't remember which options you changed, just cp defconfig.common.org defconfig.common
and cp defconfig.esp32s3.org defconfig.esp32s3
and then menuconfig
will start with the original \"sane\" defaults again.
This is useful because IDF v4.4.7 and above have differences that might cause WLED to break without some patching on your part, at least in MoonModules WLED.
Note the commit and the version tag, then run your build with those included:
Build with ./build.sh -I v4.4.6 -i 3572900 -c /path/to/your/arduino-esp32/ -t esp32s3
instead of ./build.sh -c /path/to/your/arduino-esp32/ -t esp32s3
UNTESTED: You should be able to repeat the steps above for a different target and it'll copy those to the appropriate directories in /path/to/your/arduino-esp32/
to add them to your repo on commit+push.
It does seem easier to build things one at a time, and only the boards you actually use - because it takes a LONG TIME to build all the targets.
"},{"location":"advanced/compile-arduino-esp32/#using-o2-to-build","title":"Using -O2 to build","text":"IF you selected Compiler Options ---> Optimization Level ---> Optimize for performance (-O2)
in menuconfig (which I think you should try!) you may need to adjust esp32-arduino-lib-builder
to get it to build, due to some bugs in how it treats compiler some warnings as errors when they are not.
esp32-arduino-lib-builder
folder.nano esp-idf/CMakeLists.txt
if(NOT BOOTLOADER_BUILD)
block, in the elseif(CONFIG_COMPILER_OPTIMIZATION_PERF)
block, set it like this: elseif(CONFIG_COMPILER_OPTIMIZATION_PERF)\n list(APPEND compile_options \"-O2\")\n list(APPEND compile_options \"-Wno-stringop-truncation\")\n list(APPEND compile_options \"-Wno-stringop-overflow\")\n list(APPEND compile_options \"-Wno-maybe-uninitialized\")\n
If you really want to experiment, you can change -O2
to -O3
or even -Ofast
but only -O2
seems to work for everything in my custom builds. Other compiler flags can be inserted in here as well to various outcomes.If a build is failing due to a compiler warning, you can edit the above block in esp-idf/CMakeLists.txt
to add more -Wno-compiler-warning-that-is-failing
lines to suppress and perhaps get past the particular warning that's causing the build to fail. All options DO need to be added one-per-line or it breaks the build system.
After you've done all this and ./build.sh -I v4.4.6 -i 3572900 -c /path/to/your/arduino-esp32/ -t esp32s3
(or whatever) has succeeded, you can now commit this to your repo and use it in PlatformIO:
cd /path/to/your/arduino-esp32/
git commit -a
git push
In your PlatformIO build for your board:
platform_packages = platformio/framework-arduinoespressif32 @ https://github.com/YOURUSER/arduino-esp32.git#release/v2.x @ 2.0.17+sha.{commit}\n toolchain-riscv32-esp@~12.2\n toolchain-xtensa-esp32s3@~12.2\nboard_build.arduino.upstream_packages = no\n
The \"{commit}\" is a good way to tell PIO to redownload your new modified code as you create and commit new builds. This is 7 characters and shown in your GitHub account with the last commit you did. (Weirdly if you look at your git push
output it'll show 8 characters - you can just use the first 7 and drop the last character.) The \"toolchain\" lines are entirely optional - I'm using a newer compiler here in testing. YMMV, etc.
Version 2.0.17 is the current version as of wiring this, but that can/will likely change in the future, so adjust accordingly. If you change the underlying IDF version, this version won't change automatically - and it doesn't really matter. If you want to be very correct, you can edit arduino-esp32/package.json
with the correct version of arduino-esp32 for your IDF (with IDF v4.4.6 it should be 2.0.14, for example), or whatever custom version you want it to be.
You can figure out the IDF to arduino-esp32 version mapping by looking thru https://github.com/espressif/arduino-esp32/releases if you really want everything to be correct, even if it doesn't actually matter in your actual build in PIO.
"},{"location":"advanced/compile-wled/","title":"Compile WLED","text":"Moved, see How to compile WLED
"},{"location":"advanced/compiling-wled/","title":"Compiling WLED","text":"You want to add custom features to WLED, use non-default pins, or add in a usermod? You've found the right place!
WLED has come to rely on so many dependencies in the latest versions that building with the Arduino IDE is no longer recommended. Instead, installing Visual Studio Code and its PlatformIO (PIO) extension is easier, as it will install the ESP Arduino core, all the required libraries and the correct compilation settings for you automatically.
"},{"location":"advanced/compiling-wled/#preparations","title":"Preparations","text":"git clone https://github.com/Aircoookie/WLED.git
in some folder. (You can also use GitHub Desktop or download the latest source code from https://github.com/Aircoookie/WLED under the Code
dropdown menu as a .zip file.) Alternatively fork the WLED project first and download it from your fork. cd WLED
.npm install\n
platformio ide
and install the PlatformIO extension File -> Open Folder
and open that root WLED folder (the one that contains platformio.ini
, NOT the wled00
folder) Tip
Make sure Git Client is installed on your system. You can get it here.
platformio.ini
.default_envs = travis_esp8266, travis_esp32
to comment it out.; default_envs =
. Please remove BOTH the ;
and the whitespace behind it to correctly uncomment the line. For most ESP8266 boards, the d1_mini
environment is best.Picture Guide
Success!
If you get one of these two errors, hit the checkmark icon once again to compile and that time the code should build without problems!
error: wled00\\wled00.ino.cpp: No such file or directory
FileNotFoundError: [WinError 2] The system cannot find the file specified: '[...].sconsign37.dblite'
Once you've confirmed VSCode with Platformio is set up correctly, you can add/define overrides to allow you to use non-default pins, add a usermod, or add other custom features.
platformio_override.ini.sample
into a new file called platformio_override.ini
. Make sure platformio_override.ini
is in the same folder as platformio.ini
.default_envs = WLED_tasmota_1M
with the line you uncommented in platformio.ini
in the previous steps (from Compilation guide (PlatformIO)). Example: default_envs = d1_mini
platformio.ini
scroll down until you see #-------------------- # WLED BUILDS #--------------------
[env:d1_mini]
platformio_override.ini
overwriting the build environment section that was already there.build_flags =
-D
overrides on this new line, giving each -D
it's own new line.Tip
This step is optional and only recommended if you want to install the same binary to multiple boards. For testing, it is easiest to upload directly from PlatformIO
The .bin file is located in the subfolder /build_output/firmware
in your WLED folder. The binary will have the same name as your environment.
All that's left to do is flash this .bin file onto your ESP board and then connect it to WiFi.
"},{"location":"advanced/compiling-wled/#compilation-guide-arduino-ide-not-recommended","title":"Compilation guide (Arduino IDE, not recommended)","text":"Warning
This method is outdated. The source is no longer officially checked to be buildable with the Arduino IDE. Using PlatformIO is strongly advised.
Follow a guide to setup your Arduino IDE (I am using version 1.8.9) with the ESP8266 libraries. For current compiles I recommend the latest Arduino core version 2.7.4. If you do not wish to install all libraries manually it is recommended to download the PlatformIO extension for VS Code (see above).
Run the following command to build the Web UI files: npm run build
You will need to install a few libraries:
* Please see the installation guide. You might need to enable a define in the library code.
All other dependencies are included with WLED for convenience.
Sketch -> Export compiled Binary
and upload with any ESP flashing tool.)ESP8266:
ESP8266-07 (External Antenna):
ESP-07s (External Antenna):
ESP32:
Warning
Note: These options change the documented access point name and password. The WLED community does not recommend changing these settings unless you are familiar with the risks.
Three compile time defines are available to modify the access point name. These are WLED_AP_SSID
, WLED_AP_PASS
, and WLED_AP_SSID_UNIQUE
. Defining WLED_AP_SSID
will set the SSID to the value of the define. Defining WLED_AP_PASS
will set the password to the value of the define. Defining WLED_AP_SSID_UNIQUE
will append the last 6 digits of the MAC address to the SSID.
WLED_AP_SSID
and WLED_AP_PASS
are string values, and as such need to be defined with \"
surrounding them. For example, #define WLED_AP_SSID \"MyWLED\"
or -D WLED_AP_SSID='\"MyWLED\"'
in the build_flags
of platformio.ini
.
Defining WLED_AP_SSID
will set the SSID to the value of the define. This is useful to set a device specific access point name. For example, if you have multiple WLED devices, you can set the SSID to the device name.
WLED_AP_SSID
is a string value, and as such needs to be defined with \"
surrounding it. For example, #define WLED_AP_SSID \"MyWLED\"
or -D WLED_AP_SSID='\"MyWLED\"'
in the build_flags
of platformio.ini
.
Defining WLED_AP_PASS
will set the password to the value of the define. This is useful to set a device specific access point password. For example, if you have multiple WLED devices, you can set the password to the device name.
Tip
If WLED_AP_PASS
is defined, but WLED_AP_SSID
is not, the compilation will fail. Ensure you define both WLED_AP_SSID
and WLED_AP_PASS
if you wish to change the access point password. Please also change the SSID if you wish to set a custom password.
WLED_AP_PASS
is a string value, and as such needs to be defined with \"
surrounding it. For example, #define WLED_AP_PASS \"MyWLEDPass\"
or -D WLED_AP_PASS='\"MyWLEDPass\"'
in the build_flags
of platformio.ini
.
Defining WLED_AP_SSID_UNIQUE
will append the last 6 digits of the MAC address to the SSID. This is useful to set a device specific access point name with a common prefix. For example, if you have multiple WLED devices, you can set the SSID to ChristmasTree-
followed by the last 6 digits of the MAC address.
WLED_AP_SSID_UNIQUE
is a boolean value, and as such only needs to be defined or not. For example, #define WLED_AP_SSID_UNIQUE
or -D WLED_AP_SSID_UNIQUE
in the build_flags
of platformio.ini
.
For custom devices in platformio_override.ini
:
[env:mywled]\nboard = esp32dev\nplatform = ${esp32.platform}\nplatform_packages = ${esp32.platform_packages}\nbuild_unflags = ${common.build_unflags}\nbuild_flags =\n ${common.build_flags_esp32}\n -D WLED_AP_SSID_UNIQUE\n -D WLED_AP_SSID='\"MyWLED\"'\n -D WLED_AP_PASS='\"MyWLEDPass\"'\nlib_deps = ${esp32.lib_deps}\nmonitor_filters = esp32_exception_decoder\nboard_build.partitions = ${esp32.default_partitions}\n
In my_config.h
:
#define WLED_AP_SSID_UNIQUE\n#define WLED_AP_SSID \"MyWLED\"\n#define WLED_AP_PASS \"MyWLEDPass\"\n
"},{"location":"advanced/custom-features/","title":"Custom Features","text":"Warning
Note: this page is now out of date, see updated functionality in the code (WLED/usermods/EXAMPLE_v2)
This page is intended for those wishing to modify the WLED code to add their own functionality.
"},{"location":"advanced/custom-features/#basics","title":"Basics","text":"Programming is done in the Arduino IDE. There is a special file, usermod.cpp
, to write your own code. (however, if you think your code may be relevant to many users, feel free to code it in directly and open a pull request)
This file has three empty methods: - userSetup()
is called after loading settings but before connecting to WiFi. Use it to start own interfaces if it does not depend on WiFi (IR, Sensors, GPIOs,...). Also you can use it to load custom settings or to specify own server pages with the server.on()
method. - userConnected()
is called once WiFi is connected. Use it to connect to external servers or init interfaces using wiFi. - userLoop()
is called by the main loop()
function.
If you know what you're doing, you may choose to change the value of any global variable declared in wled.h
. However, for basic color and brightness changes, these are the most important:
After updating the color, you must call the colorUpdated(int)
method. If you want to send a notification with the new color to other ESPs, use colorUpdated(NOTIFIER_CALL_MODE_DIRECT_CHANGE)
, otherwise colorUpdated(NOTIFIER_CALL_MODE_NO_NOTIFY)
.
If you'd just like a simple modification that requires timing (like sending a request every 2 seconds), please never use the delay()
function in your userLoop()
! It will block everything else and WLED will become unresponsive and effects won't work! Instead, try this instead:
long lastTime = 0;\nint delayMs = 2000; //we want to do something every 2 seconds\n\nvoid userLoop()\n{\n if (millis()-lastTime > delayMs)\n {\n lastTime = millis();\n //do something you want to do every 2 seconds\n }\n}\n
"},{"location":"advanced/custom-features/#internal-segments-api","title":"Internal Segments API","text":"You can use Segments from your code to set different parts of the strip to different colors or effects. This can be very useful for highly customized installations, clocks, ...
To set a segment, use strip.setSegment(id, start, stop);
, where id is the segment ID, start is the first LED of the segment and stop is the LED after the last one in the segment.
To edit the configuration of a segment, use:
WS2812FX::Segment& seg = strip.getSegment(id);\n//set color (i=0 is primary, i=1 secondary i=2 tertiary)\nseg.colors[i] = ((myWhite << 24) | ((myRed&0xFF) << 16) | ((myGreen&0xFF) << 8) | ((myBlue&0xFF)));\n//set effect config\nseg.mode = myFxI;\nseg.speed = mySpeed;\nseg.intensity = myIntensity;\nseg.palette = myPaletteId;\n
Keep in mind that this will not cause interface updates as of 0.8.6. For that, you still need to use colorUpdated(NOTIFIER_CALL_MODE_DIRECT_CHANGE)
"},{"location":"advanced/custom-features/#create-arti-fx","title":"Create ARTI-FX","text":"It is possible to create your own effects and add them to the FX library. The relevant files for that are FX.cpp
and FX.h
.
Here is a step-by-step guide on how to make your effect:
Take a look at some of the effects in FX.cpp
to see how they are implemented!
Add your own routine in FX.cpp starting with: uint16_t WS2812FX::mode_custom
Add to total number of effects in FX.h line 110: #define MODE_COUNT
Add your mode number (ie#define FX_MODE_CUSTOM 110
) in FX.h around line 200.
Add your mode around line 400 of FX.h, like so: _mode[FX_MODE_CUSTOM] = &WS2812FX::mode_custom;
Add it to the functions in FX.h around line 600:mode_custom(void),
Give it a name at the bottom (10 modes per line) in JSON_mode_names[]
. Wrap your name in quotes just like the others.
Compile, upload and enjoy! Your new effect will automatically be added to the list in the web ui.
If you programmed a nice effect you want to share, submit a pull request!
"},{"location":"advanced/custom-features/#create-a-custom-effect-as-usermod","title":"Create a custom effect as usermod","text":"Since 0.14
This feature was introduced with version 0.14.
It is possible to add new effects in form of a usermod.
Use 255
for the effect ID as it is a placeholder for \"1st available slot\". If you want a permanent ID use whatever is not used by built-in effects or other usermod's effects. It is possible to call addEffect(255,...) multiple times to add more effects without a collision of IDs.
uint16_t mode_blink(void) {\n ...\n return FRAMETIME;\n}\n\nstatic const char _data_FX_MODE_BLINK[] PROGMEM = \"Blink@!,Duty cycle;!,!;!;01\";\n\nclass BlinkUsermod : public Usermod\n{\n public:\n void setup()\n {\n strip.addEffect(255, &mode_blink, _data_FX_MODE_BLINK);\n }\n\n void loop()\n {\n }\n\n uint16_t getId()\n {\n return USERMOD_ID_...;\n }\n};\n
For details about the format of the configuration string see effect metadata.
"},{"location":"advanced/custom-features/#changing-web-ui","title":"Changing Web UI","text":"In order to conserve space, the Web UI interface is represented as a series of wled00/html_*.h
files which contain C/C++ strings with specific parts of the Web UI.
These files are automatically created from source files available in wled00/data
folder. To generate files, install Node.js 20 or higher globally. After that, recreate html_*.h
files by running in the repo directory:
> npm install\n> npm run build\n
If you want to test changes to the UI, it is easiest to work with the local wled00/data/index.htm
file. You just need to enter the IP address of a WLED 0.10.0 or newer instance into the popup. If you accidentally input an incorrect IP or want to test with a different instance, clear the local storage (in Chrome: Developer Tools -> Application -> Local Storage)
If you continuously modify files in the wled00/data directory, you want to monitor these changes to make local html_*.h files being updated automatically. To do this, run this in repo directory:
> npm run dev\n
This will start monitoring wled00/data folder for changes. However, you will probably never need this, as npm run build
is automatically executed before compiling. The html_*.h
files will only be created or updated if changes have been made to the wled00/data
folder. If you still want to recreate the files, you can use this command:
> npm run build -- -f\n
WARNING!! Be careful with changing the javascript in HTML files! For example function GetV() {}
must be the last javascript function in the <script>
element as it will be replaced by automatically generated code to fetch relevant settings from EEPROM. See tools/cdata.js
for the replacement rules which run for every *.htm file in wled00/data
.
Recompile and flash WLED!
"},{"location":"advanced/ddp/","title":"Virtual LEDs via DDP/ArtNet","text":""},{"location":"advanced/ddp/#overview","title":"Overview","text":"Virtual LEDs allow you to remotely \"attach\" LEDs from multiple ESPs or other dedicated hardware to a controlling instanec of WLED. These LEDs can be added to WLED just like physical pins.
On the controlling instance of WLED, go to Config > LED Preferences.
Select DDP RGB (Network) or Art-Net RGB (Network) as the LED type and enter the Length (number of LEDs on the remote WLED or other hardware device), then enter the destinatoon device's IP address.
Multiple remote WLED instances or other controller hardware can be setup this way.
For DDP the controlling WLED instance must be running at least 0.13 firmware while the remotes can be older. As usual, best perfomance is obtained by using an ESP32 for the controlling device. You can use an ESP8266, but only with a small number of LEDs (<300).
Art-Net is only implemented in MoonModules at or above 0.14.0.b1.18.
If your board supports Ethernet, use it. Ethernet is better than WiFi for the most stable performance.
"},{"location":"advanced/ddp/#ddp","title":"DDP","text":"Essentially the same type of transport as Art-Net, but the protocols are not compatible.
If you are using WLED -> WLED virtual LEDs, DDP should give the best performance - although this improvement should be marginal.
If you can't use DDP, Art-Net has a MUCH wider adoption.
"},{"location":"advanced/ddp/#art-net","title":"Art-Net","text":"\ud83c\udf1c
Art-Net universe output starts at zero. This is not currently configurable in WLED. Zero is the commonly expected starting universe for Art-Net. Channel output starts at one and is not currently configurable in WLED. One is the expected first channel in Art-Net.
For RGB LEDs, a full universe (170 RGB pixels) produces 510 channels - channels 511 and 512 will not be transmitted. This is common practice in Art-Net transmit and most implementations will expect this.
Art-Net output follows xLights' implementation of packet sequence numbering and universe-channel alignment, and transmits in RGB order. The first pixel output data will always be 0:1:R, 0:2:G, 0:3:B for universe:channel:colorpart.
This Art-Net implementation does ignore the \"always specify length of data as an even number\" part of the official specifications. If you encounter this issue, please file a bug report. Even Art-Net themselves say that this has been widely ignored and receivers should not expect an even value in the data length part of the packet.
"},{"location":"advanced/ddp/#background","title":"Background","text":"By TroyHacks
First there was DMX (DMX512). It was great for controlling lighting fixtures - \"set light to red\" sort of thing. \"Pan head to the left\". \"Dim the lights.\"
Then someone decided that DMX should work over the network rather than RS485 networks (usually over an XLR-style cable).
So Art-Net and E1.31 were born. DDP came later and improved upon the idea, but DDP isn't as widely supported yet and likely won't be outside of software.
All of these are the same premise as DMX512 - send packets of 8-bit numbers to remote systems. E1.31 and Art-Net are aligned with DMX512 and can send 512 channels per packet/universe, whereas DDP can send up to 1440 channels.
THEN a bunch of idiots (us) got into the game with massive LED panels.
To send LED data over the network, we still use a network form of DMX - E1.31, Art-Net, and DDP are all \"network DMX\".
You can think of an LED strip (or matrix) as a LOT of dimmable lights:
You have a red dimmable light. You have a green dimmable light. You have a blue dimmable light.
That's channels 1,2, and 3 - and they makes up one RGB LED.
A DMX universe is 512 channels (1440 in DDP). You can fit 170 LEDs into 510 channels (170 LEDs each having 3 channels - R, G, and B) or up to 128 RGBW lights. (Cureently WLED supports both RGB and RGBW internally for Art-Net... but you can only select RGB from the GUI.)
...and then you skip to the next universe and start at channel 1 again.
The issue with Art-Net and E1.31 (and DMX512, really) is that the sequence of numbers are just a list of numbers. There's no context to these numbers in the packet so it's up to the receiving end to understand these numbers in a meaningful fashion. DDP can some context - RGB, RGBW, HSL, and grayscale are all possible to identify in addition to unstructured data. DDP can also specify the bits per pixel, allowing 1, 4, 8, 16, 24 or 32-bit values. DMX/Art-Net/E1.31 are always 8-bit, in the range of 0-255.
"},{"location":"advanced/ddp/#using-art-netdmxe131-to-contol-the-wled-interface","title":"Using Art-Net/DMX/E1.31 to contol the WLED interface","text":"This is with WLED set to \"Effect\" in: Settings > Sync Interfaces > Network DMX Input > DMX Mode > \"Effect\"
Using this table:
Channel Property 1 Master Dimmer 2 Effect mode ID 3 Effect speed 4 Effect intensity 5 Effect palette ID 6 Effect option 7 Red Primary 8 Green Primary 9 Blue Primary 10 Red Secondary 11 Green Secondary 12 Blue Secondary 13 Red Tertiary 14 Green Tertiary 15 Blue TertiaryWhen using Art-Net \"Effect\" mode in WLED, those 15 sliders in QLC+ send control data to the 15 parameters in the table.
This is with WLED set to \"Multi RGB\" in: Settings > Sync Interfaces > Network DMX Input > DMX Mode > \"Multi RGB\"
Could you use QLC+ to send data to a matrix or strip? Absolutely! (But you shouldn't. Normally you will use something like xLights or Jinx that \"know\" how to talk to massive amounts of LEDs over the network.)
The catch is that you need THREE sliders (R/G/B) for every LED.
1,2,3 = pixel 1. (set to red) 4,5,6 = pixel 2. (set to green) 7,8,9 = pixel 3. (set to blue) 10,11,12 = pixel 4. (set to white, all sliders up)
With a panel of 768 pixels, you only need... 2304 sliders to set them all. \ud83d\ude04
All of the \"DMX mode\" settings tell WLED how to interperate the incoming DMX data (through whatever Network DMX protocol you're using)
\"Multi RGB\" is for lighting lots of pixels. \"Effect\" is for controlling the WLED instance itself. ...and the others have their own special methods, some combine both \"Effect\" and \"Multi RGB\" functionality.
WLED -> WLED works fine, of course. Mostly tested with the receiving WLED set to \"Multi RGB\". There's better ways to sync control between WLED (like... the \"Sync\" button)
xLights -> WLED works fine with any protocol they both speak, and WLED set to \"Multi RGB\"
Jinx -> WLED works fine with any protocol they both speak, and WLED set to \"Multi RGB\". Jinx has the absolute worst mapping setup, but some of the coolest effects.
WLED -> Jinx technically works, but Jinx only takes a few settings over \"network DMX\" to remote control the GUI. This will require some tinkering and perhaps building a custom WLED for yourself.
"},{"location":"advanced/ddp/#todo","title":"TODO","text":"I've proposed \"DMX into WLED via a physical DMX wire (RS485).\" This would be equivalent to \"Effect\" (and will likely be based on that mapping) so that you could plug WLED boards into a DMX512 cable and have it \"do a thing\" when you push a slider on the lighting control board/software. This feature does not currently exist, but is being worked on.
"},{"location":"advanced/esp32-recovery/","title":"ESP32 Recovery","text":"In Platformio IDE open a new terminal and type: pio run -v -t upload When you see the \"Connecting........\" abort the upload.
Below you can see Esptool commands, that was used by Platformio. Now you able to find all files that we need to build the binary (screenshot for visualization):
Prepare files and memory addresses according picture below:
Click button \u201cCombineBin\u201d. Now you have your binary file with Bootloader.
It is possible to interface WLED with home automation systems and other 3rd party software. You can use any API WLED provides (JSON, HTTP, UDP, MQTT), JSON is preferred. This page is intended for sample code and configs others use to control WLED from various 3rd party software:
HomeAssistant and NodeRED flows
"},{"location":"advanced/home-automation/#domoticz","title":"Domoticz:","text":"Please see here!
"},{"location":"advanced/home-automation/#home-assistant","title":"Home Assistant","text":""},{"location":"advanced/home-automation/#using-the-native-integration","title":"Using the native integration","text":"Compatibility notice
WLED devices are not supported by Home Assistant 2022.2 or later if a CCT bus is configured or White Balance Correction
is enabled.
We hope to resolve this issue as soon as possible. As a temporary workaround you can enable the option Calculate CCT from RGB
in LED settings.
WLED can be configured using the integrations in the Home Assistant frontend.
Menu: Configuration -> Integrations.
In most cases, the WLED devices will be automatically discovered by Home Assistant. Those automatically discovered WLED devices are listed on the integrations page.
If for some reason (e.g., due to lack of mDNS support on your network), the WLED device isn't discovered, it can be added manually.
Click on the +
sign to add an integration and click on WLED. After completing the configuration flow, the WLED integration will be available.
WLED integration documentation
"},{"location":"advanced/home-automation/#using-mqtt","title":"Using MQTT","text":"Alternatively, MQTT can be used (not recommended). Auto discovery is no longer supported since version 0.9 of WLED. In case you want to configure the device manually:
Expand to show MQTT configurationlight:\n - platform: mqtt\n name: \"Kitchen Floor Lights\"\n command_topic: \"wled/all\"\n brightness_command_topic: \"wled/all\"\n rgb_command_topic: \"wled/all/col\"\n rgb_command_template: \"{{ '#%02x%02x%02x' | format(red, green, blue)}}\"\n effect_command_topic : \"wled/all/api\"\n effect_list:\n - \"FX=0\"\n - \"FX=1\"\n - \"FX=2\"\n - \"FX=3\"\n - \"FX=4\"\n - \"FX=5\"\n - \"FX=6\"\n - \"FX=7\"\n - \"FX=8\"\n - \"FX=9\"\n - \"FX=10\"\n - \"FX=11\"\n - \"FX=12\"\n - \"FX=13\"\n - \"FX=14\"\n - \"FX=15\"\n - \"FX=16\"\n - \"FX=17\"\n - \"FX=18\"\n - \"FX=19\"\n - \"FX=20\"\n - \"FX=21\"\n - \"FX=22\"\n - \"FX=23\"\n - \"FX=24\"\n - \"FX=25\"\n - \"FX=26\"\n - \"FX=27\"\n - \"FX=28\"\n - \"FX=29\"\n - \"FX=30\"\n - \"FX=31\"\n - \"FX=32\"\n - \"FX=33\"\n - \"FX=34\"\n - \"FX=35\"\n - \"FX=36\"\n - \"FX=37\"\n - \"FX=38\"\n - \"FX=39\"\n - \"FX=40\"\n
by @acid2000 Config json which is sent via autodiscovery:
{\n \"name\": \"WLED Light\",\n \"stat_t\": \"wled/840d8e989815/c\",\n \"cmd_t\": \"wled/840d8e989815\",\n \"rgb_stat_t\": \"wled/840d8e989815/c\",\n \"rgb_cmd_t\": \"wled/840d8e989815/col\",\n \"bri_cmd_t\": \"wled/840d8e989815\",\n \"bri_stat_t\": \"wled/840d8e989815/g\",\n \"fx_cmd_t\": \"wled/840d8e989815/api\",\n \"fx_stat_t\": \"wled/840d8e989815/api\",\n \"bri_val_tpl\": \"{{value}}\",\n \"rgb_cmd_tpl\": \"{{'#%02x%02x%02x' | format(red, green, blue)}}\",\n \"rgb_val_tpl\": \"{{value[1:3]|int(base=16)}},{{value[3:5]|int(base=16)}},{{value[5:7]|int(base=16)}}\",\n \"qos\": 0,\n \"opt\": true,\n \"pl_on\": \"ON\",\n \"pl_off\": \"OFF\",\n \"fx_val_tpl\": \"{{value}}\",\n \"fx_list\": [\n \"[FX=00] Solid\", \"[FX=01] Blink\", \"[FX=02] Breathe\", \"[FX=03] Wipe\", \"[FX=04] Wipe Random\", \n \"[FX=05] Random Colors\", \"[FX=06] Sweep\", \"[FX=07] Dynamic\", \"[FX=08] Colorloop\", \n \"[FX=09] Rainbow\", \"[FX=10] Scan\", \"[FX=11] Dual Scan\", \"[FX=12] Fade\", \"[FX=13] Chase\", \n \"[FX=14] Chase Rainbow\", \"[FX=15] Running\", \"[FX=16] Saw\", \"[FX=17] Twinkle\", \"[FX=18] Dissolve\",\n \"[FX=19] Dissolve Rnd\", \"[FX=20] Sparkle\", \"[FX=21] Dark Sparkle\", \"[FX=22] Sparkle+\", \n \"[FX=23] Strobe\", \"[FX=24] Strobe Rainbow\", \"[FX=25] Mega Strobe\", \"[FX=26] Blink Rainbow\", \n \"[FX=27] Android\", \"[FX=28] Chase\", \"[FX=29] Chase Random\", \"[FX=30] Chase Rainbow\", \n \"[FX=31] Chase Flash\", \"[FX=32] Chase Flash Rnd\", \"[FX=33] Rainbow Runner\", \"[FX=34] Colorful\", \n \"[FX=35] Traffic Light\", \"[FX=36] Sweep Random\", \"[FX=37] Running 2\", \"[FX=38] Red & Blue\", \n \"[FX=39] Stream\", \"[FX=40] Scanner\", \"[FX=41] Lighthouse\", \"[FX=42] Fireworks\", \"[FX=43] Rain\", \n \"[FX=44] Merry Christmas\", \"[FX=45] Fire Flicker\", \"[FX=46] Gradient\", \"[FX=47] Loading\", \n \"[FX=48] In Out\", \"[FX=49] In In\", \"[FX=50] Out Out\", \"[FX=51] Out In\", \"[FX=52] Circus\", \n \"[FX=53] Halloween\", \"[FX=54] Tri Chase\", \"[FX=55] Tri Wipe\", \"[FX=56] Tri Fade\", \n \"[FX=57] Lightning\", \"[FX=58] ICU\", \"[FX=59] Multi Comet\", \"[FX=60] Dual Scanner\", \n \"[FX=61] Stream 2\", \"[FX=62] Oscillate\", \"[FX=63] Pride 2015\", \"[FX=64] Juggle\", \n \"[FX=65] Palette\", \"[FX=66] Fire 2012\", \"[FX=67] Colorwaves\", \"[FX=68] BPM\", \n \"[FX=69] Fill Noise\", \"[FX=70] Noise 1\", \"[FX=71] Noise 2\", \"[FX=72] Noise 3\", \"[FX=73] Noise 4\",\n \"[FX=74] Colortwinkle\", \"[FX=75] Lake\", \"[FX=76] Meteor\", \"[FX=77] Smooth Meteor\", \n \"[FX=78] Railway\", \"[FX=79] Ripple\"\n ]\n}\n
"},{"location":"advanced/home-automation/#indigo-domotics","title":"Indigo Domotics:","text":"Please see here!
"},{"location":"advanced/home-automation/#openhab","title":"openHAB:","text":"In openHAB 3 based environments you are able to use the native openHAB WLED Binding, which also supports discovery of your WLED devices.
For older openHAB (2.5.x) environmantes the connection can be configured via MQTT broker & Openhab MQTT Binding (2.5x) with configuration files Please find the details here
"},{"location":"advanced/longdata/","title":"Long Data Line configurations","text":"Addressable LEDs are controlled over a data line(s) based on 5V TTL (Transistor-Transistor-Logic) signals. Over long distances (> 5m) keeping those signals \"clean\" and well defined for the LED they're meant to drive can be difficult. While there are many methods used to get good results over 10m and longer runs (in-line resistors, voltage boosters, sacrificial pixels, etc.) they are often problematic and unreliable. There is a method specifically designed to send high speed (~1Mhz) TTL data over long (10's to 100's of meter) distances: using a differential pair.
Commonly known as RS485, differential pair transmission for LED's takes the single data line from your MCU (ESP32, ESP8266, etc) and translates that into a differential signal that is sent across two wires instead of one. A transmitter unit (Tx) at the MCU takes in the single data signal and outputs 2 lines usually called A+ and B-. At the LED strip a matching receiver unit (Rx) takes the A+, B- signals as inputs and outputs clean and accurate 5V LED data that can directly feed the strip. The only thing that needs to connect the TxRx pair is a pair of wires and a common ground. The wires don't carry much current at all (~50mA) and can often be a light wire pair from a length of Cat5e or 22/4 alarm wire.
The distance between the Tx and Rx devices can easily be 30m. With Cat5e UTP wire you can reliably reach 150m or more.
Note, there is no need for a level shifter with the Tx module. Typical transmitters are spec'd for a minimum 2.4V High level input which is well within the output range of a 3.3V MCU. The only other thing to note about the TxRx pair is that they usually require 5V to operate and often have a 120 ohm termination resistor across the A+,B- connections. Those resistors are important to maintain the integrity of the transmitted data.
A TxRx pair can also be used in the middle of a run of LED's when the distance to the next strip is long. Just put a Tx unit at the end of the first strip and the Rx unit at the start of the next strip.
The individual Tx and Rx units are fairly inexpensive and can found on Amazon or via Aliexpress usually for less than $2 USD each (try \"RS485 TTL interface\").
"},{"location":"advanced/longdata/#examples-wiring-diagrams","title":"Examples wiring diagrams","text":"Here are basic wiring diagrams for two of the more common TTL-RS485 boards generally found:
RS485 board defaults to Tx mode:
RS485 board defaults to RX (has extra safety components)
"},{"location":"advanced/mapping/","title":"Mapping","text":"WLED now has the ability to remap your LED strip programmatically.
"},{"location":"advanced/mapping/#what-is-it","title":"What is it?","text":"This allows us to treat the WLED strip as if it is wired in any way - we can then use the mapping feature to address the strip in any order. This allows for matrix support, serpentine runs and such.
"},{"location":"advanced/mapping/#how-do-we-do-it","title":"How do we do it?","text":"Navigate to the edit page for your WLED device by adding /edit
to its' address - for example, https://my-led-device.local/edit Use this edit page to create a file called ledmap.json
.
ledmap.json
file needs to be a JSON formatted file with the the key being \"map\" and the value being an array of numbers representing the new order of pixels. The position of values in the array is the \"natural\" order of LEDs and the value entered is the new position.
The ArduinoJSON library is *extremely*** white-space sensitive. If your ledmap.json
file is not working, check for white-spaces where they should not be. The LED positions are zero-indexed.
Multiple maps are supported in the latest versions by using ledmapx.json
where x is a number. Maps can be selected in a preset using {\"ledmap\":x,...
.
Use -1 in the map for gaps/blank/nul LEDs.
"},{"location":"advanced/mapping/#examples","title":"Examples","text":"In the below example (formatted multiple ways), we remap a strip of four LEDs from a physical order of 0 1 2 3 into a new order of 0 2 1 3.
{\"map\":[0,2,1,3]}\n\n{\"map\":[\n0,2,1,3\n]}\n\n{\"map\":[\n0,2,\n1,3\n]}\n
This is another example that switches direction every 5 LEDs. It could be formatted any of the three ways demonstrated above.
{\"map\":[0, 1, 2, 3, 4, 9, 8, 7, 6, 5, 10, 11, 12, 13, 14,\n19, 18, 17, 16, 15, 20, 21, 22, 23, 24, 29, 28, 27, 26, 25]}\n
"},{"location":"advanced/mapping/#014-ac","title":"0.14 AC","text":"A ledmap is specified in a dropdown which can have the following values:
Unchanged: nothing will happen (if a ledmap is active, that ledmap will stay active)
width and height define the total width and height of the 2D coordinate space (this overrides 2D configuration settings)
Repository of ledmap examples: WLED-Effects/Ledmaps containing irregular 2D shapes (clouds and cube) and rings remapping (rings). For testing the different ledmaps upload presets.json in this folder to /edit
Example to enable Net debug , compile with the following flags
-D WLED_DEBUG
-D WLED_DEBUG_HOST='\"192.168.x.y\"' ;; to send debug messages over network to host 192.168.x.y - FQDN is also possible
-D WLED_DEBUG_NET_PORT=1878 ;; port for network debugging. default = 7868
To access net debug from the host type the following netcat example :
nc -l 1878 -u
Debug can be switched on and off in the Info tab:
"},{"location":"advanced/net-debug/#fork-specific-info","title":"Fork Specific info","text":""},{"location":"advanced/net-debug/#wled-mm","title":"WLED MM","text":"No need to specify ip address and port in platformio.ini and therefor hardcode in bin/esp32. Go to Sync Interfaces / Net debug and specify there. Set output to network pressing Net Debug in the info tab (default off after reboot).
See release notes v0.14.0-b15/manage netdebug serial logging in settings
"},{"location":"advanced/pir-sensors/","title":"Using PIR Sensors","text":""},{"location":"advanced/pir-sensors/#introduction","title":"Introduction","text":"WLED controllers can be used with PIR (Passive InfraRed) sensors for human presense detection. There are two types of sensors:
With integrated rotary potentiometers to adjust the sensitivity and the hold time. E.g. HC-SR501 type. These sensors can be connected to WLED and configured as a button.
Without integrated possibility to adjust the sensitivity and the hold time. E.g. HC-SR602 type. For these you have to compile WLED with a PIR Sensor Usermod to have these settings in the software.
This sensor type has the following features:
Three pins for connection (GND, supply voltage 5\u202612 V, data signal with 3.3V level). Ground (GND) and the supply voltage can be connected directly to a power supply unit (5 V or 12 V). Data signal can be connected directly to a GPIO of an ESP8266 or ESP32 controller.
Jumper to switch between two modes. In position 1, when a movement is detected, a HIGH level (3.3V) is output on the data signal and the adjustable holding time is maintained. The data signal then goes back to LOW (0V), regardless of whether the movement is still present or not. If the movement continues, the data signal is switched back to HIGH after a blocking time of approx. 2.5 s. In position 2 it works similarly, but the data signal does not go to LOW as long as the movement is still present. Only when the movement no longer exists for an adjustable holding time, the data signal goes to LOW. So, position 2 is what you normally need.
Poti for setting the holding time. If this is turned counterclockwise as far as it will go, the holding time is approx. 3\u20265 s. In the middle position it is approx. 100 s and in the end position clockwise approx. 200 s.
Poti for adjusting the sensitivity. This is approx. 3 to 7 meters and is set lower if you turn the potentiometer clockwise.
In WLED SW you have two options how the sensor can be used:
"},{"location":"advanced/pir-sensors/#option-1-as-a-switch","title":"Option 1: as a switch","text":"You set a button under \u201cConfig->\u201dLED Preferences\u201d so that you can set the GPIO used for the data signal and select \u201cSwitch\u201d. Then, when movement is detected, LEDs are switched on and go out after a holding time without movement.
"},{"location":"advanced/pir-sensors/#option-2-as-a-pir-sensor","title":"Option 2: as a PIR sensor","text":"You can set two presets, one of which is activated when movement is detected, and the other when there is no more movement and the hold time has expired. This gives more flexibility to set what exactly should happen.
"},{"location":"advanced/remote-access-ifttt/","title":"Remote Access / IFTTT","text":"WLED is open-source, DIY software. This means all services are hosted locally on your ESP8266/32. Therefore you can only control your lights from within your local (home) network.
If you need to control WLED from anywhere (the public internet) you can do so in multiple ways, some requiring additional hardware:
"},{"location":"advanced/remote-access-ifttt/#1-home-automation-systems","title":"1. Home Automation systems","text":"If you add your WLED device to your Home Automation system (e.g. Home Assistant or ioBroker), you can control WLED remotely if you have set up remote access for your Home Automation system, for example via Nabu Casa.
"},{"location":"advanced/remote-access-ifttt/#2-amazon-echo-device","title":"2. Amazon Echo device","text":"If you have set up your Alexa device to control WLED, you can just use the Alexa App or another Echo device linked to your account to control your lights (on/off and brightness only)
"},{"location":"advanced/remote-access-ifttt/#3-port-forwarding","title":"3. Port Forwarding","text":"Warning: An insecure HTTP connection is used, please do NOT edit sensitive info like the WiFi settings when connected via port forwarding! This method offers more flexibility, but is also more involved. Keep in mind this causes anyone with your IP address to have access to your ESP8266! Setting up an OTA lock password is a must to prevent attackers from acquiring your WiFi credentials!
To expose WLED to the internet, create a port forwarding rule for your ESP's IP local ip and port (80) in your router configuration. It is not recommended to use port 80 on your public IP address since 80 is scanned constantly by bots good and bad. Use a 5 digit port for better security. If your public IP changes a lot, make sure to also use a dynamic DNS service so your lights are always accessible. Unsure what any of this means or how to do it? Google for \"[your router model] port forwarding\"!
Additionally, this opens up many new possibilities for automation! You can use a service like IFTTT Webhooks to send automated WLED API calls that can do anything from turning on the lights at a set time to changing their color if you get a new email!
"},{"location":"advanced/remote-access-ifttt/#4-hue-sync","title":"4. Hue sync","text":"If you have a Philips hue setup and sync WLED to it, you can control your WLED lights in any way it's possible to control your hue lights (hue App, Alexa (including colors), any other service that uses Philips hue API)
"},{"location":"advanced/security/","title":"Security","text":"WLED was designed in a way that you should be safe to have a router port forwarding to control the system from the public internet. This page will tell you what you can expect by WLEDs security.
"},{"location":"advanced/security/#tldr-what-to-do","title":"TLDR - what to do?","text":"A: If you just operate WLED within a local network and/or with a secured Access Point (change the default password \"wled1234\"!!) you are fine.
If you have configured a port forwarding to control WLED from outside your local subnet, please make sure the setting \"OTA Lock\" is enabled and you have changed the default OTA password \"wledota\"! Also, NEVER edit sensitive data (like WiFi credentials) while connected via the port forwarding!
"},{"location":"advanced/security/#1-is-the-connection-itself-safe","title":"1: Is the connection itself safe?","text":"A: Technically not. The ESP8266 uses unencrypted HTTP traffic. Implementing HTTPS would take too much processing power and memory on this little device. This means an attacker could read your passwords during transmit. Therefore, to be safe, please do NOT change the AP/Client WiFi/OTA password from outside of your LAN via a forwarded port. If you are at home, you should be safe if your WiFi is secured. You can change any other setting while you're away, though. WLED doesn't send your actual password to the settings page, just its length.
"},{"location":"advanced/security/#2-what-do-you-mean-by-secure-then","title":"2: What do you mean by secure then?","text":"A: WLED comes with the ability to carry out a software update via WiFi (OTA). However, no one must be able to flash a malicious new binary firmware to steal your WiFi credentials or make your ESP part of a botnet. Therefore, you should enable the \"OTA Lock\" setting and change its default passphrase \"wledota\".
"},{"location":"advanced/security/#3-can-i-protect-the-light-configuration-or-the-settings-page","title":"3: Can I protect the light configuration or the settings page?","text":"A: Currently not. This is not sensitive information like your WiFi password. Anyone with your IP and port can control the lights. Open an issue if it should ever happen that somebody plays with your lights. I might consider adding an optional password lock then. For now, it is way too cumbersome for what it does.
"},{"location":"advanced/security/#4-i-want-to-do-a-software-update-but-it-says-ota-lock-active","title":"4: I want to do a software update, but it says \"OTA lock active\"?","text":"A: You need to go to the settings page. Untick the \"OTA Lock\" setting and input your passphrase in the field below it. Now apply the settings and reboot. After that you can carry out the software update. Don't forget to re-enable OTA Lock afterwards! To enable, you don't have to enter the passphrase, unless you want to change it. For the lock to work you need to apply and reboot again.
"},{"location":"advanced/security/#5-why-is-this-ota-lock-stuff-that-important","title":"5: Why is this OTA lock stuff that important?","text":"A: Your unencrypted WiFi password is stored in the module's EEPROM. It would be easy to \"update\" the software to a malicious version which sends your password to the attacker. OTA Lock makes sure only those with the passphrase may carry out a software update. And yes, while you can disable OTA lock by doing a factory reset, this would also kill the WiFi connection to the attacker.
"},{"location":"advanced/security/#6-anything-else","title":"6: Anything else?","text":"A: A personal tip from me is not to give anyone your IP to control the software who you do not wish to do so on a regular basis. It is not critical from a security standpoint, but it can be very annoying if someone plays with your lights, or even worse, change your AP credentials to the point where you can no longer access the module except via USB.
"},{"location":"advanced/wiring/","title":"Overview","text":"RGB LEDs can draw a lot of current (amps). While most people usually worry about the dangers from high voltage, low voltage + high amperage can be dangerous too, as it can easily become a fire hazard in certain circumstances. Depending on your setup size (the number of LEDs you want to drive), use these tips to help guide your wiring.
There are plenty of guides out there to help with power supply selection, which is out of scope of this page. Size your power supply to your installation both up and down, so you both provide them with enough current and don't introduce unnecessary risk. It's better to power 30 LEDs from a 10W (2A @5V) power supply than a 100W power supply, as you don't need to worry about the potential for as much energy flowing through small wires.
As you increase the number of LEDs, you increase the amps your power supply will need to be able to provide. The more amps you're working with, the more you need to be cautious about your wiring and fusing.
For example, if you want to power your LEDs off a sealed lead acid battery (e.g. a car battery), you need to be very careful about current. These kinds of batteries can supply hundreds of amps, so you need to ensure that you use fuses along the way to protect against shorts. If you're using USB pocket chargers on the other hand, they tend to be current limited (most provide only 1-2A max) so you can worry less about fusing there.
Make sure to also check out this great list of resources to help you learn!
"},{"location":"advanced/wiring/#small-setups-30-rgb-leds","title":"Small Setups (< 30 RGB LEDs)","text":"WLED has a great built-in automatic current-limiting feature, set to 850mA by default. If you have a very small setup (< 30 LEDs), you can use this feature to help simplify your wiring and keep things safe.
In most circumstances, it's best to power your LED strip directly from the power supply and wire power to your WLED control board in parallel.
{insert diagram here}
With the current limiting feature turned on and for very small setups (on the smaller side of 1-30 LEDs), you can power the LED strip directly through the USB port of D1 mini or similar board. That is, power comes in to the control board through the USB port and out to a 5V pin. Each board will be a little different, so it would be wise to verify that you can do this for your specific board. You want to ensure that there are no voltage regulators, diodes, or other components between the 5V pin and the USB port input that are going to be damaged by the high-current draw of the LEDs. You also want to ensure that any PCB traces are big enough that they don't heat up with increased current. Never try to draw more than 1A through a board's USB port like this; the boards really aren't designed for large amounts of current to flow through them.
When using this technique, make sure to add strain relief to your wires so that they don't flex and break. The easiest way to do this is to use hot glue. While you want to use plenty of hot glue, just be careful to not cover any components that are going to get hot with hot glue.
"},{"location":"advanced/wiring/#medium-setups-30-300-rgb-leds","title":"Medium Setups (30-300 RGB LEDs)","text":"For a medium-sized setup of 30-300 LEDs, you should find a power supply that can provide enough current (see the link above) and make sure to power the strip directly. For setups with more than 150 LEDs, you should consider power injection.
"},{"location":"advanced/wiring/#power-injection","title":"Power injection","text":"Power injection is where you connect multiple wires from your power supply to the strip in multiple places, usually once at the beginning and once at the end. This is needed because the LED strips can only pass a small amount of current through them and you need to ensure that all your power-hungry LEDs get fed enough power. If your LEDs are dim or discolored at one end of the strip, you should add power injection.
When doing power injection, make sure your wires are rated for the amperage you wish to send over them. You should also check the voltage drop if you're doing a particularly long run. As a rough guide, you should never use anything thinner than 22AWG wire for power injection.
For medium-sized setups, you should add fuses if your power supply is over 100W. Considering an inline fuse on each power injection line.
"},{"location":"advanced/wiring/#inline-fuses","title":"Inline Fuses","text":"You should place the fuse as close to the power supply as possible, on the positive lead, so that as much of the current flows through it as possible. That will cause the fuse to blow if the power injection line shorts or if the strip shorts, instead of causing your power injection wire or strip to heat up. Buy a fuse that's rated just over what you expect your LED strip to draw. For example, if you calculate that your LEDs will draw at most 4.5A, buy a 5A fuse.
First match your power injection wire size with the inline fuse's wire. If the inline fuse comes with 16AWG wire (it's usually printed on the wire itself in small type), you should use 16AWG or thicker wire for your power injection wire. If you use thinner wire, you weaken the utility of the inline fuse and risk your power injection wire heating up in the case of a failure.
To wire in an inline fuse, trim back the positive wire (not ground) of your power injection line enough to allow the inline fuse to be spliced in. Place a cut of heat-shrink tubing over the wire so that the cable can be insulated once your solder joint is complete. Strip and bend both wires of your splice so that they create hooks to mechanically reinforce the joint, then solder. Cover with the heat-shrink tubing and you're done! Now you have a beautiful, professional-looking fused power injection line.
"},{"location":"advanced/wiring/#larger-setups-300-rgb-leds","title":"Larger Setups (300+ RGB LEDs)","text":"The more power you're working with, the more you need to be careful about your wiring. If you're using a 150W or higher power supply or multiple power supplies, check out these tips:
"},{"location":"advanced/wiring/#wire-ferrules","title":"Wire ferrules","text":"If you're using stranded wire and lever-lock or screw terminals, all your wire \u2192 terminal connections should be terminated with a wire ferrule of the appropriate wire gauge.
This is because stranded wires can splay and lose tension over time, creating a weaker connection that could lead to sparking. Loose strands can also cause shorts or break off. The same is true for tinned stranded wires: the solder can deform (especially if it's heated), loosening the screw terminal, and cause a weaker electrical connection or complete failure. That said, untinned stranded wire in a screw terminal actually creates a better connection than tinned stranded wire, so for high current applications where they could possibly heat up, don't tin them if you don't have ferrules.
Shrouded wire ferrules also act as strain relief, minimizing mechanical damage if the wire moves at all. This is especially important for any installations that are mobile, could experience vibrations, or are installed/removed seasonally.
"},{"location":"advanced/wiring/#multiple-power-supplies","title":"Multiple power supplies","text":"When doing power injection with multiple power supplies never mix two power supplies on the same LED strip. You can connect grounds together, just never the positive rails. This means you need to segment your LEDs based on power supplies, including your power injection. For the same reasons listed below, never connect multiple power supplies to the same strip for power injection purposes, always fork one power supply and route it to the start/mid/end of the same strip.
Because multiple power supplies could have subtle variations in their positive voltages (e.g. 12.1V and 12.3V), this could lead to power flowing in ways that aren't expected or which could be damaging to your equipment. In general, wired power supplies don't like to be directly connected to other power supplies unless they are explicitly designed for that purpose. This is not true for cell batteries, which are usually fine with being connected in parallel provided all the battery voltage + chemistry are the same.
"},{"location":"advanced/wiring/#even-more-tips","title":"Even more tips","text":"Currently (as of summer 2023) only the microcontrollers from Espressif, types ESP8266 and ESP32 (with dual core) are fully supported. Some of the newer types like ESP32-C3, ESP32-S2 and ESP32-S3 are experimentally supported, but productive use is not recommended yet because some bugs are suspected. In addition, the installation of these newer types is not that easy: there are several hardware variations/boards for which the SW must be specially compiled. It should also be mentioned that some ESP32-C3 boards (so-called C3 mini V1.0.0) are still being sold on the market where WLAN does not work properly.
To try out WLED with 5V addressable strip a simple microcontroller board like ESP8266 D1 mini or ESP32 D1 mini is sufficient. The simplest setup might be like:
However, there are a few other things to keep in mind for a proper setup:
In the following some third-party controllers are listed. Please use a decent and neutral description when adding things to this list.
Gold Member indicates the product owner makes substantial contributions to the WLED community (financial, code, documentation and/or support).
Tip
Lists are in alphabetical order. The position of an item in the list does not indicate how good it is or if it will fit your use case. Please carefully compare all items in the category you are interested in, and you should find the one that suits your needs best in just a few minutes!
"},{"location":"basics/compatible-controllers/#controllers-with-wled-pre-installed","title":"Controllers with WLED pre-installed","text":"Info
Unless otherwise noted, controllers feature everything you need for most WLED setups, except a power supply, wiring and fuses, and of course the LEDs themselves!
Transparency Notice
Warning Products listed below under the name \"Athom\" are offered by the company ATHOM Technology Co., Ltd., based in China, which is not affiliated in any way with the European company Athom B.V., makers of the Homey smart home platform. There is an ongoing legal process against ATHOM Technology Co., Ltd. for possible trademark infringement.
Name Description 8 Port LED Distro This is an 8 port ESP32 based LED distro board running WLED. Distributing both power and data in 1 board. The WT32-ETH01 provides support for Wi-Fi or ethernet connections. It can be used with either 5v or 12v or 24v LED pixels. Also includes a USB-C port for programming, level shifter, 5 amp fuse on every port, multiple voltage inputs with no jumpers to set and phoenix connectors for easy wiring. A1-SLWF-02 ESP8266 WLED controller WLED specifically designed Controller that supports 5V-12V addressable strips from Ukrainian developers. Based on ESP8266. Slim design, sensor button, powered either by type-C or screw-terminal. Screwdriver included. Official store, worldwide, Tindie, for NL/BE/DE A1-SLWF-03 ESP32 WLED controller Built-in digital microphone ICS-43434 for soundReactive WLED, ESP32 + 16M, IR receiver, Sensor button, Type-C plug, DC-plug, Screw-terminal, 5-24V, Pinouts for DIY. Specifically designed Controller that supports 5V-24V addressable strips from Ukrainian developers. Slim design. Screwdriver + adhesive tapes included. Official store, worldwide, Tindie, Aliexpress. ABC! WLED Controller V41 / ESP32 Commercial controller for 5V LED strips. Based on ESP32 uC. Two outputs. Option for digital microphone or line-in-to-I2S Adapter for sound reactive WLED. Ready to use. Additional Relay&Fuse board available. (German shop & shipping only within Germany or to Poland). A similar one is available at WLED.SHOP. ABC! WLED Controller V43 / ESP32 based / 5V-24V Commercial controller board for 5V / 12V / 24V LED strips from creator of LED power, wiring and fuse calculator. Based on ESP32 uC. Preflashed SW. Up to four outputs. Option for digital microphone or line-in-to-I2S Adapter for sound reactive WLED. Automatic 5V/12V/24V recognition (no jumper/switch etc. required). Ethernet adapter is available. Enclosure is available too. German shop & shipping only within Germany or to Poland. ABC! WLED mini Controller V70 / ESP32 based / 5V-12V Commercial controller board for 5V / 12V LED strips from creator of LED power, wiring and fuse calculator. Based on ESP32 uC. Preflashed SW. Up to four outputs. Option for digital microphone or line-in-to-I2S Adapter for sound reactive WLED. Automatic 5V/12V recognition (no jumper/switch etc. required). Enclosure is available. German shop & shipping only within Germany or to Poland. Athom Light Strip Controller Simple controller with enclosure for reliably driving 3 pin 5V LEDs. Uses 2M ESP8266. Athom LS8P ESP32 Music Controller ESP32 based controller with dual output, microphone and IR. Comes with WLED preinstalled Athom High Power Addressable LED Strip Controller Higher power options than the above system. Supports optional clock output. Athom RGBW Light Strip Controller Has outputs for individual color channels. Cadsbi Motion Smart Ready to use solution with 3 output ports, an external antenna, in a high quality metal enclosure cod.m WLED Controller WLED Controller for 5V/12V/24V strips based in ESP32, complete in case, with plug, including level shifter with 2/4 outputs. Commercially available in Germany throughout Europe. Detailed wiring schemes and documentation. Domestic Automation LLC Plug in design makes it the easiest and quickest preinstalled WLED controller to setup! Modular design allows for simple plug-in addition of Motion sensors, Button control, 12V lights and more. Snap track makes for universal mounting. Includes built in fuses and power relay for safety and control. Available on Amazon here E8-WiFi Plus The E8-WiFi Plus is an advanced 8-port WLED pixel controller built on the robust ESP32 microcontroller, designed for maximum performance and flexibility. It comes fully pre-assembled, supporting a wide voltage range from 5V to 24V DC. With a high output current capacity of up to 30A across all 8 outputs, each is fused by a 5A auto fuse. Features include an external antenna for improved WiFi coverage, dual power input for reliability, spring terminals for easy connections, and a micro-SD card slot for standalone operations. An IR receiver is also included, along with extra connectivity options like access to extra GPIOs and the I2C bus. The controller is also compatible with Xlights, to be used in light shows. ESP8266 Pixel Controller DIY board for 5V/12V LED strips with TTL or RS485 output using a Wemos D1 mini, integrated fuse, pluggable terminal block, 3D printed module case ESPthings.io ET-AL01 DIY board for 5 Analog channels and/or up to 5 Digital LED channels (or a combination of the latter as required), Integrated level shifter, 5v/12/24v compatibility, 4x pull-up/down GPIO, serial interface and power distribution terminals. Can be used with Wemos D1-style ESP8266 or ESP32 boards. ESP32 WLED Pico Board ESP32 WLED pico board,super small form factor, ready to buy on Tindie and Tindie EU. Integrated level shifter, exposed pins for extending functionality , on board I2S microphone, Firmware is here. Project page is here Hikari Pocket-sized, battery powered RGBW light HighSet WLED Controller India ESP32 Based Ready to use WLED device for 5V Pixel LEDs with Shift Resistor Pre-Installed & 4 Outputs in Premium Quality Sealed Enclosure, Customized Orders also Welcomed. IOT4WLED Ready to use hardware for WLED! Laterna Based on an ESP32 for digital LED and RBG/RGBW LED strips with support for 5V, 12V and 24V LED strips. (Up to 4 channels) Laterna Mini V3 Small ESP32 based controller with optional digital microphone integrated for digital 5V LED strips. Laterna Stick USB Stick like ESP32 based controller for digital 5V LED strips. LedBox V3 LedBox V3 by StanleyProjects is the ultimate sound-reactive addressable LED controller powered by ESP32-S3. It is compatible with 5-12V addressable LED strips (WS281x, SK6812, etc.), supporting both 3(data) and 4(data,clock) wire signal protocols. It has a digital MEMS microphone, MOSFET, logic-level converter, button, IR demodulator, variable imedance-matching resistor, USB-C port, and a safety resettable fuse, all in a compact 3D printable case. The board can be purchased here and comes flashed with WLED-MM. Luminxa v2.2.2 ESP32 My Baby's Got LED Certified open hardware. Easy plug-and-play WLED board for those that don't want to figure out the hardware - you won't even need a screwdriver to get started. PC power supply (ATX) powers three 5V injection points on 8A fuses. For sale now on Tindie! Full details on the github repo and maker's website. QuinLED Dig2go Designed to be the quickest and easiest 5v addressable LEDs controller available! Powered simply by using a USB-C input (just like your phone!) for a true plug and play experience. Recommended for small projects up to 15W and very complete with built-in \"power cut\" circuit when the LEDs are off to minimize idle power consumption, LED data level-shifter, built in protection circuits (including fuses), IR receiver, high quality digital microphone with audio reactive effects and even has some easy to use expansion ports for extra buttons or for instance an I2C screen! All of this is housed in a high-quality custom plastic case (not 3D printed) and small enough to fit in the palm of your hand! Comes ready to go, pre-flashed with WLED and even combined with power supply and/or LED strip in different bundles! Buy here! QuinLED Dig-Octa The Dig-Octa system is for your medium to very large projects! It comes fully pre-assembled and is the ideal board to drive 5v-24v digitally addressable LEDs. The system is composed of brain- and power-boards and is designed to be fully stackable in various configurations of both types of boards, to perfectly adapt to your needs. Some features are: 8 LED data-channels, built-in level-shifters and resistor switchers, Ethernet and external antenna WiFi, auto 5v-24v compatibility, high current handling (up to 50A to 100A!), fully fused inputs and outputs, dedicated relay circuit, I2C temperature sensor, and much more! Comes pre-flashed with WLED and is highly recommended for medium to very large projects. Buy here! QuinLED Dig-Quad 2021 updated version! DIY/Pre-Assembled board for 4 (5) channel digital LED driving. Integrated level shifters, temperature sensor option, Auto 5v-24v compatibility, pull-up/down GPIO and power distribution terminals with 5x onboard fuses for easy LED power injection. Recommended to use (and comes with) with custom QuinLED-ESP32. Pre-assembled and pre-flashed with WLED available to buy!. Aircoookie's personal recommendation for large-size WLED projects with advanced power and output requirements. QuinLED Dig-Uno 2021 updated version! DIY/Pre-Assembled board for digital LED driving. Integrated level shifters, temperature sensor option, Auto 5v-24v compatibility, pull-up/down GPIO and safety features such as a onboard fuse. Recommended to use (and comes with) with custom QuinLED-ESP32. Pre-assembled and pre-flashed with WLED available to buy!. Aircoookie's personal recommendation for medium-size WLED projects.\\ Simple WLED Board Very simple DIY board, minimum of required components, option for 5V/12V LEDs. Easy to solder (no SMT components). Simple to understand connection schematics and pictures. Can be used with ESP8266 or ESP32 in D1 mini Format. SJM Autoprod rgbw, rgbw2+, rgbw4 Complete, fully-sealed, analog and digital controllers for vehicular use. rgbw has one RGBW channel, rgbw2+ has two analog, RGBW channels plus two/four addressable outputs (requires external 5V source for 5V LEDs). rgbw4 has four analog RGBW channels. 2+ and 4 support 12V or PWM/analog inputs and have internal PTC \"fuses\". WiFi Controlled Desk Lamp Open source PCB for WLED WLED ESP32 Universal Controller ready to buy on Tindie, 100% compatible with WLED project. Integrated level shifter, 2 outputs for LEDs strips, 1 fused out for LED strip, relay for energy-saving, temperature sensor, PWM fan header, USB port for re-programming. Headers for shields to extend functionality. Available shields for controller is here, Firmware is here. WLED Waterproof Controller with external antenna DIY board, designed for use outside permanently and for longer range Wi-Fi connection. No SMD components means it is easier to solder for DIYers. 100% compatible with WLED project. Level shifter, fuse for LED strip, resettable fuse for Wi-Fi module, exposed I2C interface for display or sensors, relay for energy-saving and 1-wire temperature sensor. Build around ESP-07S module. Firmware is here WLED Wemos Mini Shield shield board, ready to buy on Tindie also Tindie EU. Integrated level shifter, 2 outputs for LEDs strips, 1 fused out for LED strip, resettable fuse for the development board, exposed I2C interface for display or sensors. Exposed pins Digital microphones. Works with Wemos D1 mini and D1-style ESP32 boards. Firmware is here. Yet Another WLED Controller Small and simple device for 5V addressable LED strips with minimum components and fully assembled by PCB manufacturing service in standard case. Firmware is here"},{"location":"basics/compatible-controllers/#controllers-wled-can-be-installed-to","title":"Controllers WLED can be installed to","text":"Warning
If the controller does not have a USB port and no firmware supporting wireless updates pre-installed, installing WLED to it requires an FTDI flasher and in some cases, soldering.
Name Chip Description ESPixelStick v3 ESP8266 The ESPixelStick V3 is a WiFi Pixel and DMX single output controller built around the ESP8266 platform. It utilizes industry standard E1.31 sACN and DDP protocols for control of up to 680 WS2811 pixels (4 Universes) or 63 GECE Pixels. The output passes through a built-in RS485 transceiver, allowing for driving DMX and differential Renard inputs (or using a differential receiver for long-distance between board and first pixel). The on board switching regulator allows you to power the ESPixelStick with 5V-24V -- Just match the voltage of the pixels you are using, no voltage configuration is required. Note: Does not come preconfigured with WLED, you must flash the ESP8266 yourself. SP108e v2 ESP8285 Hardware-Modification required and different versions exists! 8285-based 2M Controller that supports addressable RGBWW LED strips, also with CLK line (like ATA102). 5-24v DC input, 85mm x 45mm x 23mm. Vendors list spledapps 'Led Shop' as the supporting mobile application. Board is silk screened with 'SP108e'. No pads are exposed and a second processor is used to control the LEDs. Pin7 of that processor needs to be grounded to hold it in reset state. Then you can connect GPIO0 to GND and TX, RX, VCC, GND for flashing. Connect GPIO2 to R4 for DATA out and GPIO13 to R3 for CLK out. Flashed via PlatformIO, esptool. OTA updates work. Pics of pinout here: https://github.com/psxde/sp108e-led-controller/raw/main/sp108ev2_inside.png SP501e ESP8285 8285-based 1M Controller that supports both Addressable and PWM-based RGBWW LED strips. Note that recent versions have 2M. 5-24v DC input, 55mm x 26mm, sold under BTF lighting, RGBZone, etc. Vendors all list 'Fairynest' as the supporting mobile application. Board is silk screened with 'SP5XXe' but no other markings. Serial pads are exposed on the back-side of the board with GND and GPIO0 right next to each other and thus Flash access fairly straight forward. GPIO 0 must be pulled to GND at boot and throughout the flashing process. I/O configuration: LEDPIN is 'GPIO3' for addressable (note this pin is limited to approx. 250 LEDs), BTNPIN is GPIO 1. PWM pin out for RGBWW: CW: 14, WW: 12, B: 13, R: 15 and G: 4. Flashed via PlatformIO, ESPHome and Tasmotizer. Pics of board here: https://github.com/Operation760/SP501e-RGB-LED-Controller-/blob/master/SP501e_top_bottom_traced.jpg Flashing Connections: https://github.com/tonyn0/sp501e-flashing/blob/main/sp501e%20flash.png SP511e ESP8285 An ESP8285 2MB controller with 3 case buttons, built in mic, IR receiver, 38 key remote, and dual outputs. The dual outputs are connected to the same data pin. There is a step-by-step guide for Installing WLED on SP511E Controller. ESP LED Strip WIFI Control Board [ESP Version] ESP8266 Controller for addressable or analog LEDs (RGBW), 6-27VDC input, no level shifter, reset and boot buttons, enclosure. NOTE: Although this uses high-current transistors, they used jumpers on two of the connections so you are limited to their current rating (3A?)."},{"location":"basics/compatible-controllers/#wled-shields-to-be-use-with-esp8266esp32-controller-boards","title":"WLED shields to be use with ESP8266/ESP32 controller boards","text":"Name Description ABC! WLED Shield, all-purpose, for ESP8266/ESP32 Commercial WLED Shield for 5V/12V LED strips. To be used with ESP8266 or ESP32 in D1 mini format (including ESP32-C3, ESP32-S2 and ESP32-S3). Up to four outputs. Option for digital microphone or line-in-to-I2S Adapter for sound reactive WLED (with ESP32 only!). Automatic 5V/12V recognition (no jumper/switch etc. required). Enclosure is available too. German shop & shipping currently only within Germany or to Poland. ESP-01 WLED shield shield board for ESP-01 board, ready to buy on Tindie. Integrated level shifter, 3 outputs for various configurations, mosfet for 1 analog channel, Firmware is here. WLED Wemos shield shield board, ready to buy on Tindie also Tindie EU or DIY 100% compatible with WLED project and WLED sound reactive fork. Integrated level shifter, 4 outputs for LEDs strips, 1 fused out for LED strip, resettable fuse for the development board, exposed I2C interface for display or sensors, relay for energy-saving and 1-wire temperature sensor. Exposed pins for Analog and Digital microphones. Works with Wemos D1 mini and D1-style ESP32 boards. Firmware is here."},{"location":"basics/compatible-controllers/#other-products-wled-can-be-installed-to","title":"Other products WLED can be installed to","text":"Name Chip Description Athom 15W bulb ESP8266 (2M flash) 15W bulb with RGB, warm white, and cold white LEDs. Compatible with all voltages, available form factors E27, B22 and GU10 Merkury MI-BW210-999W ESP8285 Tuya Style WiFi Led light bulb, Warm White + RGB. There are two versions of this same bulb sold in the same packaging only way to check is to look at the bulb, EBEQPW92 uses PWM led control and is compatible with WLED however EBEQPW06 uses an SM16716 chip and is not currently compatible with WLED. Managed to flash using tuya-convert and a custom WLED build with the following analog pinout: B:4, G:5, R:13, W:14. Extras disabled to allow OTA, OTA only way to flash this, programming headers are not internally available. Shelly RGBW2 ESP8266 For \"analog\" LED use only! Runs on 12-24VDC. One button and one input. Pins: R=12, G=15, B=14, W=4. Finished, commercial product that can be flashed. More info and flashing docs"},{"location":"basics/compatible-controllers/#raw-esp8266esp32-boards","title":"Raw ESP8266/ESP32 boards","text":"Tip
While these can work like the controllers above without extra hardware, you might get flickering without adding an external levelshifter. Using them without a controller board/shield is only recommended if you like tinkering with electronic projects.
Name Chip Description Adafruit Feather Huzzah ESP8266 General-purpose ESP8266 Board with USB, battery connector, etc. D1 mini-style ESP32 ESP32 A nice compact ESP32 development board. D1 mini compatible layout. ESP-01 ESP8266 One of the first and cheapest ESP8266 boards available. Not recommended for general WLED installs (needs external USB/serial chip, voltage converter, only has 1mb of flash, so soon no wireless updates possible) ESP32 DevKitC v4 ESP32 The original ESP32 Development Board made by Espressif Systems. ESP32 Mini Dev Board 16mb by SerKo (aka Serg) ESP32 ESP32 Dev Board with latest WROOM-32E module, USB Type-C, PTC fused, over-voltage protection. D1 Mini32 form factor and compatible pin out H803 WiFi ESP8266 ESP8266EX based controller with level shifter inside. Data pin GPIO1 Clock pin GPIO14. Tested with WS2813 strip and Firmware fork is here. Heltec WiFi Kit 8 ESP8266 Another alternative of ESP8266 board. OLED display 128X32 pixel, battery charger on board. Almost the same functionality and price as the Wemos board. Plus it can be used in projects with external batteries. Lolin32 Lite ESP32 Low cost ESP32 board optimized for battery usage. Does not have a 5v pin but can be powered with 5v on battery connector. NodeMCU ESP8266 Another popular ESP8266 development board. A bit bigger than the D1 and has pins pre-soldered. There are multiple versions with slight differences, not all are tested. NodeMCU-32s ESP32 The most common ESP32 development board. Works well, depending on the board you might have to press the \"Boot\" button while USB flashing Olimex ESP32 POE ESP32 Ethernet (PoE) and WiFi, though usage of the ethernet port requires a custom compile. The PoE should not be used to power LEDs due to a maximum throughput of 4W. For most installations, standard ethernet should be used, supplying power through the 5V pin. QuinLED-ESP32 Custom design D1 Mini32 formfactor ESP32 module Fed up with the bad quality of generic ESP32 modules on the market, designed my own \"beefed up\" version. Available in multiple versions: QuinLED-ESP32-AB (Antenna Board), QuinLED-ESP32-AE (Antenna External), QuinLED-ESP32-ABE (Antenna Board + Ethernet). Aircoookie's recommendation for running WLED. RE5V1C ESP8285 5v DC input - onboard 10A relay TwilightLord-ESP32 ESP32 ESP32 Dev Board with latest WROOM-32E module, USB Type-C, 800mA LDO, 8MB flash and PTC fused. D1 Mini32 form factor and compatible pin out.16MB Flash version also available Wemos D1 mini ESP8266 An affordable ESP8266 development board. Aircoookie's recommendation for running WLED if you want an ESP8266 board. Current version: 3.1.0 Wemos D1 mini Pro ESP8266 A newer development board with an external antenna connector. Works very well with WLED. Recommended if your signal strength is too low with another board. Current version: 2.0.0. Version 1.0.0 has the same form factor as the D1 mini. WT32-ETH01 ESP32 Under development! Ethernet (non-PoE) and WiFi enabled alternative to the Olimex boards, for 1/4 the cost. Features no PoE, and requires initial flashing of a custom compiled image using a FTDI or similar USB to serial converter."},{"location":"basics/compatible-hardware/","title":"Other Hardware","text":"Still under construction, feel free to add to the list!
This page lists some third-party hardware and/or tools that are working with WLED!
Please use a decent and neutral description when adding things to this list.
Tip
Lists are in alphabetical order. The position of an item in the list does not indicate how good it is or if it will fit your use case. Please carefully compare all items in the category you are interested in, and you should find the one that suits your needs best in just a few minutes!
"},{"location":"basics/compatible-hardware/#addressable-led-strips","title":"Addressable LED Strips","text":"Sorting: 5v data only, 5v Data + Clock, 12v data only
Type Voltage Comments SK6812 5v/12v RGBW WS2811 5v usually found in IP68 sealed 12mm pixel strings WS2812B 5v WS2813 5v has a backup data line APA102 5v using 2 data pins, Clock and Data LPD8806 5v using 2 data pins, Clock and Data WS2801 5v using 2 data pins, Clock and Data SK9822 5v using 2 data pins, Clock and Data GS8208 12v TM1814 12v RGBW WS2811 12v usually 3-LED segments, has data-line resistor WS2815 12v has a backup data line"},{"location":"basics/compatible-hardware/#non-addressable-led-strips","title":"Non-Addressable LED Strips","text":"WLED supports non-addressable LED strips as well. Unlike addressable strips, non-addressable strips require a pin for each \"color\" channel. To drive these strips, additional circuits (MOSFETs) are required. As of v0.13.1, WLED supports single color, CCT, RGB, RGBW and RGBCCT strips. These strips are commonly found at 12 or 24 volts. The default PWM frequency for dimming is 880 Hz on ESP8266 and 19531 Hz for ESP32.
"},{"location":"basics/compatible-hardware/#controllers-with-wled-pre-installed","title":"Controllers with WLED pre-installed","text":"Info
Unless otherwise noted, controllers feature everything you need for most WLED setups, except a power supply, wiring and fuses, and of course the LEDs themselves!
Name Description 8 Port LED Distro This is an 8 port ESP32 based LED distro board running WLED. Distributing both power and data in 1 board. The WT32-ETH01 provides support for Wi-Fi or ethernet connections. It can be used with either 5v or 12v or 24v LED pixels. Also includes a USB-C port for programming, level shifter, 5 amp fuse on every port, multiple voltage inputs with no jumpers to set and phoenix connectors for easy wiring. A1-SLWF-02 WLED controller WLED dedicatedly designed Controller that supports 5V-12V addressable strips from Ukrainian developers. Based on ESP8266. Slim design, sensor button, powered either by type-C or screw-terminal. Screwdriver included. Worldwide delivery. ABC! WLED Controller / ESP8266 Commercial controller for 5V LED strips. Based on ESP8266 uC. Two outputs. Ready to use. Additional Relay&Fuse board available. (German shop & shipping only within Germany). A similar one is available at WLED.SHOP ABC! WLED Controller / ESP32 Commercial controller for 5V LED strips. Based on ESP32 uC. Two outputs. Option for digital microphone / sound reactive. Ready to use. Additional Relay&Fuse board available. (German shop & shipping only within Germany). A similar one is available at WLED.SHOP. ABC! WLED Shield, all-purpose, for ESP8266/ESP32 Commercial WLED Shield for 5V/12V LED strips. To be used with ESP8266 or ESP32 in D1 mini format. Two outputs. Option for digital microphone / sound reactive (with ESP32). Automatic 5V/12V recognition (no jumper/switch etc. required). Enclosure is available too. German shop & shipping currently only within Germany. Athom Light Strip Controller Simple controller with enclosure for reliably driving 3 pin 5V LEDs. Uses 2M ESP8266. Athom High Power Addressable LED Strip Controller Higher power options than the above system. Supports optional clock output. Athom LS8P ESP32 Music Controller ESP32 based controller with dual output, microphone and IR. Comes with WLED preinstalled Athom RGBW Light Strip Controller Has outputs for individual color channels. Cadsbi Motion Smart Ready to use solution with 3 output ports, an external antenna, in a high quality metal enclosure cod.m Wi-Fi Pixel Controller Fully completed control PCB with level shifter, terminals and case - pre-flashed with WLED! ESP8266 Pixel Controller DIY board for 5V/12V LED strips with TTL or RS485 output using a Wemos D1 mini, integrated fuse, pluggable terminal block, 3D printed module case ESPthings.io ET-AL01 DIY board for 5 Analog channels and/or up to 5 Digital LED channels (or a combination of the latter as required), Integrated level shifter, 5v/12/24v compatibility, 4x pull-up/down GPIO, serial interface and power distribution terminals. Can be used with Wemos D1-style ESP8266 or ESP32 boards. ESP32 WLED pico board ESP32 WLED pico board,super small form factor, ready to buy on Tindie and Tindie EU. Integrated level shifter, exposed pins for extending functionality , on board I2S microphone, Firmware is here. Project page is here IOT4WLED Ready to use hardware for WLED! Laterna Based on an ESP32 for digital LED and RBG/RGBW LED strips with support for 5V, 12V and 24V LED strips. (Up to 4 channels) Laterna Mini V3 Small ESP32 based controller with optional digital microphone integrated for digital 5V LED strips. Laterna Stick USB Stick like ESP32 based controller for digital 5V LED strips. LedBox V2 LedBox V2 by StanleyProjects is a fully contained, sound reactive, ESP32 based module for controlling 5-12V addressable LED strips (WS2812, SK6812, etc.), supporting both 3-(VDD,DAT,GND) and 4-(VDD,DAT,CLK,GND) pin configuration. It includes a digital MEMS microphone, button and IR control, and a safety resettable fuse, all in a compact 3D printable case. The board comes all setup, flashed with sound reactive WLED fork, and can be purchased here. Luminxa v2.2.2 ESP32 My Baby's Got LED Certified open hardware. Easy plug-and-play WLED board for those that don't want to figure out the hardware - you won't even need a screwdriver to get started. PC power supply (ATX) powers three 5V injection points on 8A fuses. For sale now on Tindie! Full details on the github repo and maker's website. QuinLED Dig2go Designed to be the quickest and easiest 5v addressable LEDs controller available! Powered simply by using a USB-C input (just like your phone!) for a true plug and play experience. Recommended for small projects up to 15W and very complete with built-in \"power cut\" circuit when the LEDs are off to minimize idle power consumption, LED data level-shifter, built in protection circuits (including fuses), IR receiver, high quality digital microphone with audio reactive effects and even has some easy to use expansion ports for extra buttons or for instance an I2C screen! All of this is housed in a high-quality custom plastic case (not 3D printed) and small enough to fit in the palm of your hand! Comes ready to go, pre-flashed with WLED and even combined with power supply and/or LED strip in different bundles! Buy here! QuinLED Dig-Uno 2021 updated version! DIY/Pre-Assembled board for digital LED driving. Integrated level shifters, temperature sensor option, Auto 5v-24v compatibility, pull-up/down GPIO and safety features such as a onboard fuse. Recommended to use (and comes with) with custom QuinLED-ESP32. Pre-assembled and pre-flashed with WLED available to buy!. Aircoookie's personal recommendation for medium-size WLED projects. QuinLED Dig-Quad 2021 updated version! DIY/Pre-Assembled board for 4 (5) channel digital LED driving. Integrated level shifters, temperature sensor option, Auto 5v-24v compatibility, pull-up/down GPIO and power distribution terminals with 5x onboard fuses for easy LED power injection. Recommended to use (and comes with) with custom QuinLED-ESP32. Pre-assembled and pre-flashed with WLED available to buy!. Aircoookie's personal recommendation for large-size WLED projects with advanced power and output requirements. QuinLED Dig-Octa The Dig-Octa system is for your medium to very large projects! It comes fully pre-assembled and is the ideal board to drive 5v-24v digitally addressable LEDs. The system is composed of brain- and power-boards and is designed to be fully stackable in various configurations of both types of boards, to perfectly adapt to your needs. Some features are: 8 LED data-channels, built-in level-shifters and resistor switchers, Ethernet and external antenna WiFi, auto 5v-24v compatibility, high current handling (up to 50A to 100A!), fully fused inputs and outputs, dedicated relay circuit, I2C temperature sensor, and much more! Comes pre-flashed with WLED and is highly recommended for medium to very large projects. Buy here! Simple WLED Board Very simple DIY board, minimum of required components, option for 5V/12V LEDs. Easy to solder (no SMT components). Simple to understand connection schematics and pictures. Can be used with ESP8266 or ESP32 in D1 mini Format. sjm autoprod rgbw, rgbw2+, rgbw4 Complete, fully-sealed, analog and digital controllers for vehicular use. rgbw has one RGBW channel, rgbw2+ has two analog, RGBW channels plus two/four addressable outputs (requires external 5V source for 5V LEDs). rgbw4 has four analog RGBW channels. 2+ and 4 support 12V or PWM/analog inputs and have internal PTC \"fuses\". WiFi Controlled Desk Lamp Open source PCB for WLED Yet Another WLED Controller Small and simple device for 5V addressable LED strips with minimum components and fully assembled by PCB manufacturing service in standard case. Firmware is here"},{"location":"basics/compatible-hardware/#controllers-on-tindie","title":"Controllers on Tindie","text":"\ud83c\udf1c
Name Description WLED ESP32 universal controller ready to buy on Tindie, 100% compatible with WLED project. Integrated level shifter, 2 outputs for LEDs strips, 1 fused out for LED strip, relay for energy-saving, temperature sensor, PWM fan header, USB port for re-programing. Headers for shields to extend functionality. Available shields for controller is here, Firmware is here. ESP-01 WLED shield shield board for ESP-01 board, ready to buy on Tindie. Integrated level shifter, 3 outputs for various configurations, mosfet for 1 analog channel, Firmware is here. WLED Wemos mini shield shield board, ready to buy on Tindie also Tindie EU. Integrated level shifter, 2 outputs for LEDs strips, 1 fused out for LED strip, resettable fuse for the development board, exposed I2C interface for display or sensors. Exposed pins Digital microphones. Works with Wemos D1 mini and D1-style ESP32 boards. Firmware is here. WLED Wemos shield shield board, ready to buy on Tindie also Tindie EU or DIY 100% compatible with WLED project and WLED sound reactive fork. Integrated level shifter, 4 outputs for LEDs strips, 1 fused out for LED strip, resettable fuse for the development board, exposed I2C interface for display or sensors, relay for energy-saving and 1-wire temperature sensor. Exposed pins for Analog and Digital microphones. Works with Wemos D1 mini and D1-style ESP32 boards. Firmware is here. WLED waterproof controller with external antenna DIY board, designed for use outside permanently and for longer range Wi-Fi connection. No SMD components means it is easier to solder for DIYers. 100% compatible with WLED project. Level shifter, fuse for LED strip, resettable fuse for Wi-Fi module, exposed I2C interface for display or sensors, relay for energy-saving and 1-wire temperature sensor. Build around ESP-07S module. Firmware is here"},{"location":"basics/compatible-hardware/#controllers-wled-can-be-installed-to","title":"Controllers WLED can be installed to","text":"Warning
If the controller does not have a USB port and no firmware supporting wireless updates pre-installed, installing WLED to it requires an FTDI flasher and in some cases, soldering.
Name Chip Description ESPixelStick v3 ESP8266 The ESPixelStick V3 is a WiFi Pixel and DMX single output controller built around the ESP8266 platform. It utilizes industry standard E1.31 sACN and DDP protocols for control of up to 680 WS2811 pixels (4 Universes) or 63 GECE Pixels. The output passes through a built-in RS485 transceiver, allowing for driving DMX and differential Renard inputs (or using a differential receiver for long-distance between board and first pixel). The on board switching regulator allows you to power the ESPixelStick with 5V-24V -- Just match the voltage of the pixels you are using, no voltage configuration is required. Note: Does not come preconfigured with WLED, you must flash the ESP8266 yourself. SP108e v2 ESP8285 Hardware-Modification required and different versions exists! 8285-based 2M Controller that supports addressable RGBWW LED strips, also with CLK line (like ATA102). 5-24v DC input, 85mm x 45mm x 23mm. Vendors list spledapps 'Led Shop' as the supporting mobile application. Board is silk screened with 'SP108e'. No pads are exposed and a second processor is used to control the LEDs. Pin7 of that processor needs to be grounded to hold it in reset state. Then you can connect GPIO0 to GND and TX, RX, VCC, GND for flashing. Connect GPIO2 to R4 for DATA out and GPIO13 to R3 for CLK out. Flashed via PlatformIO, esptool. OTA updates work. Pics of pinout here: https://github.com/psxde/sp108e-led-controller/raw/main/sp108ev2_inside.png SP501e ESP8285 8285-based 1M Controller that supports both Addressable and PWM-based RGBWW LED strips. Note that recent versions have 2M. 5-24v DC input, 55mm x 26mm, sold under BTF lighting, RGBZone, etc. Vendors all list 'Fairynest' as the supporting mobile application. Board is silk screened with 'SP5XXe' but no other markings. Serial pads are exposed on the back-side of the board with GND and GPIO0 right next to each other and thus Flash access fairly straight forward. GPIO 0 must be pulled to GND at boot and throughout the flashing process. I/O configuration: LEDPIN is 'GPIO3' for addressable (note this pin is limited to approx. 250 LEDs), BTNPIN is GPIO 1. PWM pin out for RGBWW: CW: 14, WW: 12, B: 13, R: 15 and G: 4. Flashed via PlatformIO, ESPHome and Tasmotizer. Pics of board here: https://github.com/Operation760/SP501e-RGB-LED-Controller-/blob/master/SP501e_top_bottom_traced.jpg Flashing Connections: https://github.com/tonyn0/sp501e-flashing/blob/main/sp501e%20flash.png SP511e ESP8285 An ESP8285 2MB controller with 3 case buttons, built in mic, IR receiver, 38 key remote, and dual outputs. The dual outputs are connected to the same data pin. There is a step-by-step guide for Installing WLED on SP511E Controller. ESP LED Strip WIFI Control Board [ESP Version] ESP8266 Controller for addressable or analog LEDs (RGBW), 6-27VDC input, no level shifter, reset and boot buttons, enclosure. NOTE: Although this uses high-current transistors, they used jumpers on two of the connections so you are limited to their current rating (3A?)."},{"location":"basics/compatible-hardware/#other-products-wled-can-be-installed-to","title":"Other products WLED can be installed to","text":"Name Chip Description Merkury MI-BW210-999W ESP8285 Tuya Style WiFi Led light bulb, Warm White + RGB. There are two versions of this same bulb sold in the same packaging only way to check is to look at the bulb, EBEQPW92 uses PWM led control and is compatible with WLED however EBEQPW06 uses an SM16716 chip and is not currently compatible with WLED. Managed to flash using tuya-convert and a custom WLED build with the following analog pinout: B:4, G:5, R:13, W:14. Extras disabled to allow OTA, OTA only way to flash this, programming headers are not internally available. Shelly RGBW2 ESP8266 For \"analog\" LED use only! Runs on 12-24VDC. One button and one input. Pins: R=12, G=15, B=14, W=4. Finished, commercial product that can be flashed. More info and flashing docs Athom 15W bulb ESP8266 (2M flash) 15W bulb with RGB, warm white, and cold white LEDs. Compatible with all voltages, available form factors E27, B22 and GU10"},{"location":"basics/compatible-hardware/#raw-esp8266esp32-boards","title":"Raw ESP8266/ESP32 boards","text":"Tip
While these can work like the controllers above without extra hardware, you might get flickering without adding an external levelshifter. Using them without a controller board/shield is only recommended if you like tinkering with electronic projects.
Name Chip Description Adafruit Feather Huzzah ESP8266 General-purpose ESP8266 Board with USB, battery connector, etc. D1 mini-style ESP32 ESP32 A nice compact ESP32 development board. D1 mini compatible layout. ESP32 DevKitC v4 ESP32 The original ESP32 Development Board made by Espressif Systems. H803 WiFi ESP8266 ESP8266EX based controller with level shifter inside. Data pin GPIO1 Clock pin GPIO14. Tested with WS2813 strip and Firmware fork is here. NodeMCU-32s ESP32 The most common ESP32 development board. Works well, depending on the board you might have to press the \"Boot\" button while USB flashing Heltec WiFi Kit 8 ESP8266 Another alternative of ESP8266 board. OLED display 128X32 pixel, battery charger on board. Almost the same functionality and price as the Wemos board. Plus it can be used in projects with external batteries. NodeMCU ESP8266 Another popular ESP8266 development board. A bit bigger than the D1 and has pins pre-soldered. There are multiple versions with slight differences, not all are tested. ESP-01 ESP8266 One of the first and cheapest ESP8266 boards available. Not recommended for general WLED installs (needs external USB/serial chip, voltage converter, only has 1mb of flash, so soon no wireless updates possible) Olimex ESP32 POE ESP32 Ethernet (PoE) and WiFi, though usage of the ethernet port requires a custom compile. The PoE should not be used to power LEDs due to a maximum throughput of 4W. For most installations, standard ethernet should be used, supplying power through the 5V pin. QuinLED-ESP32 Custom design D1 Mini32 formfactor ESP32 module Fed up with the bad quality of generic ESP32 modules on the market, designed my own \"beefed up\" version. Available in multiple versions: QuinLED-ESP32-AB (Antenna Board), QuinLED-ESP32-AE (Antenna External), QuinLED-ESP32-ABE (Antenna Board + Ethernet). Aircoookie's recommendation for running WLED. RE5V1C ESP8285 5v DC input - onboard 10A relay TwilightLord-ESP32 ESP32 ESP32 Dev Board with latest WROOM-32E module, USB Type-C, 800mA LDO, 8MB flash and PTC fused. D1 Mini32 form factor and compatible pin out.16MB Flash version also available Wemos D1 mini ESP8266 An affordable ESP8266 development board. Aircoookie's recommendation for running WLED if you want an ESP8266 board. Current version: 3.1.0 Wemos D1 mini Pro ESP8266 A newer development board with an external antenna connector. Works very well with WLED. Recommended if your signal strength is too low with another board. Current version: 2.0.0. Version 1.0.0 has the same form factor as the D1 mini. WT32-ETH01 ESP32 Under development! Ethernet (non-PoE) and WiFi enabled alternative to the Olimex boards, for 1/4 the cost. Features no PoE, and requires initial flashing of a custom compiled image using a FTDI or similar USB to serial converter."},{"location":"basics/compatible-hardware/#esp32-boards-on-tindie","title":"ESP32 boards on Tindie","text":"\ud83c\udf1c
Name Description ESP32 mini dev board 16mb by SerKo (aka Serg). Buy on Tindie US or Tindie EU. ESP32 Dev Board with latest WROOM-32E module, USB Type-C, PTC fused, over-voltage protection. D1 Mini32 form factor and compatible pin out ESP32 pico board with digital microphone by SerKo (aka Serg). Buy on Tindie US or Tindie EU. ESP32-pico-D4 development board with integrated ics-43434 microphone"},{"location":"basics/compatible-hardware/#microphones-on-tindie","title":"Microphones on Tindie","text":"\ud83c\udf1c
Name Description Digital I2S microphone ICS-43434 by SerKo (aka Serg). Buy on Tindie US or Tindie EU. Digital I2S PDM microphone SPM1423 by SerKo (aka Serg). Buy on Tindie EU."},{"location":"basics/compatible-hardware/#useful-boards-and-addons","title":"Useful boards and addons","text":"Name Description ESP32 Ethernet Network Shield Ethernet Shield (10/100Mbps) for ESP32 boards. Stackable with D1 Mini32 form factor boards. Wemos D1 mini Level Shifter Shield A level shifter shield (74HCT125) - by Evil Genius Labs LLC. WIZmote remote control Remote control using radio network. Compatible with WLED (vesions 0.14.0-beta3 and above). No additional receiver required."},{"location":"basics/compatible-hardware/#compatible-pc-rgb-fans-and-argb-accessories","title":"Compatible PC RGB Fans and ARGB accessories","text":"Brand Model Comments Corsair HD120 Fan Uses WS2812B, data-in only PCCOOLER Moonlight 5-pack Fans Uses WS2812B, includes Data-out connector to keep each fan uniquely addressable if wired in series like traditional LED strips Any 5v 3-pin ARGB for PC Any PC RGB device that supports the 5v 3-pin ARGB motherboard header should work fine with WLED. All the major motherboard vendors support the Corsair HD120 and PCCOOLER fans listed, so we can safely assume any device that supports motherboard ARGB 5V 3-Pin standard will work with WLED."},{"location":"basics/compatible-hardware/#levelshifters","title":"Levelshifters","text":"Name Description SN74AHCT125 Aircoookie's recommended levelshifter. Often used in DIY and commercial controllers. SN74AHCT32 Same pinout as above can be used. This is just an OR gate, but any AHCT gate can be used if inputs are connected appropriately. ;) SN74HCT125N Slower, cheaper version. Works just as well for WS2812, but not recommended for APA102. SN74LVC2T45 Modern bus transceiver with voltage translation Yet Another WLED Controller TXS0102, TXS0108 Bidirectional levelshifters that may work fine with WLED (if possible, 74AHCT gates should be preferred as they support both longer data lines and faster protocols) F-Amp Level shifter/data boosterWarning
I2C shifters are generally too slow for addressable LEDs, so don't use them.
Further reading: Logic Level Shifters for Driving LED Strips
How to connect Levelshifters:
"},{"location":"basics/compatible-hardware/#usbttl-adapters","title":"USB/TTL adapters","text":"Name Description CH340 CH340 module instead of CP2102, PL2303 or FTDI/FTDT. The CH340 can deliver more current which is needed while the flash process depending on the board type. The timing is also much more stable. For boards with an USB/TTL adapter onboard this is NOT needed ESP uploader CP2102N module. Same USB to UART converter as many recent Dev boards using. Featuring latest USB-C connector. For use with many ESP32, ESP8266, ESP8255 and Tuya based modules. 3.3V logic and 5V power pass through for custom boards."},{"location":"basics/compatible-hardware/#miscellaneous","title":"Miscellaneous","text":"Sorting: Sensors, Displays, Actuators
Name Description HC-SR501 \u00a0PIR sensor with adjustable sensitivity and on time delay (suitable as a button). HC-SR602 \u00a0PIR sensor (not suitable as a button but can be used with PIR sensor usermod). TSOP38238 IR receiver compatible with most IR remotes. SSD1305 I2C display, can be used with 4 Line Display usermod. SSD1306 I2C & SPI display, can be used with 4 Line Display usermod. DS18B20 Recommended temperature sensor for use with WLED. Compatible with the Temperature usermod Display shield Various configurations. Compatible with the ESP32 WLED dev board also can be used with ESP32 mini dev boards. 12V Relay & Fuse board Integrates two relays and two 10 A fuses. Suitable for WLED setups with 12 V LED Strips. 5V relay Relay module. Some will require 5V to trigger so you will need level-shifted output (similar as for LEDs) for proper functionality or a circuit with transistor or MOSFET. 5V Relay & Fuse board Integrates two relays and two 10 A fuses. Suitable for WLED setups with 5V LED Strips."},{"location":"basics/compatible-led-strips/","title":"Compatible LED strips","text":"WLED supports two types of LED strips: the so-called digital addressable LED strips and the so-called analog non-addressable LED strips.
"},{"location":"basics/compatible-led-strips/#addressable-led-strips","title":"Addressable LED Strips","text":"Addressable LED Strips allows to control individual LEDs separately. This enables you to use many effects. The supported types are listed below. There are sometimes new types coming onto the market that have a compatible control protocol.
Sorting: 5v data only, 5v Data + Clock, 12v data only
Type Voltage Comments SK6812 5v/12v RGBW WS2811 5v usually found in IP68 sealed 12mm pixel strings WS2812B 5v WS2813 5v has a backup data line APA102 5v using 2 data pins, Clock and Data LPD8806 5v using 2 data pins, Clock and Data WS2801 5v using 2 data pins, Clock and Data SK9822 5v using 2 data pins, Clock and Data UCS8903 5v GS8208 12v TM1814 12v RGBW WS2811 12v usually 3-LED segments, has data-line resistor WS2814 12v/24v RGBW, 3-LED groups (12V) / 6-LED groups (24V) as one logical LED. Must be controlled as SK6812 type, color order: BRG, swap W and G (this option is available since WLED 0.14.0-b1) WS2815 12v has a backup data line LPD6803 12v P9813 5-24 v TM1829 5-24 v UCS8904 5-24 v RGBW"},{"location":"basics/compatible-led-strips/#non-addressable-led-strips","title":"Non-Addressable LED Strips","text":"WLED supports non-addressable LED strips as well. Unlike addressable strips, non-addressable strips require a pin for each \"color\" channel and all LEDs are controlled the same way. To drive these strips, additional circuits (MOSFETs) are required. A basic circuit diagram is shown here. You need one MOSFET and one GPIO per color. It should be noted that the MOSFETs are destroyed very quickly in the event of an overload. To reduce the risk of fire and prevent personal injury, additional circuit elements should be implemented to protect MOSFETs from overtemperature and overload. Depending on the type, fuses are too slow for this! You might consider using self-protected MOSFETs too or the entire MOSFET circuit can be packed into a fire-retardant (e.g. metallic) housing.
As of v0.13.1, WLED supports single color, CCT, RGB, RGBW and RGBCCT strips. These strips are commonly found at 12 or 24 volts. The default PWM frequency for dimming is 880 Hz on ESP8266 and 19531 Hz for ESP32. The commercially available so-called RGB(W) LED amplifiers can also be used (also called repeaters/boosters). These typically include optocouplers and MOSFET circuitry (1 to 5 channels) and can be used, for example, as follows:
Note that there is no GND connection between the controller and the amplifier. And this despite the fact that with all other WLED circuits it is always said that all GNDs must be connected to each other. This special feature is due to the fact that the inputs of the amplifier are galvanically decoupled from the outputs by optocouplers and the amplifier in this circuit is used slightly differently than its usual application.
You can connect the GPIOs directly (3.3V signal level) to the input of the amplifier or, if you use a ready-made WLED controller, you can also use the data outputs (of the level shifter, i.e. 5 V signal level). You can also use both at the same time:
The amplifier shown in the picture is a cheap product. Its advantage is a metal case. However, its circuit is very simple:
The simple structure means that the duty cycle of the PWM signal (the ratio between pulse and period duration) at the output is slightly distorted compared to the input. In many cases this is not critical, but it does result in the color composition of an RGB strip being slightly distorted. A significantly better (and slightly more expensive) version is described in this article (in German, includes schematics). Here the MOSFETs are controlled with push-pull drivers. This and some other measures in the circuit mean that the PWM signal is reproduced very accurately at the output. There are some other types of LED amplifiers on the market (e.g. MiBoxer RGBW amplifiers and similar ones) that DO NOT work as described above because they require higher input voltage.
"},{"location":"basics/compatible-software/","title":"Compatible Software","text":"Still under construction, feel free to add to the list!
This page lists some third-party software that can interface with WLED!
"},{"location":"basics/compatible-software/#controllers","title":"Controllers","text":"Controllers use the WLED API to change the current light settings.
Name Description Home Assistant Versatile and feature rich home automation system. Out-of-the-box WLED integration with automatic discovery. Homey pro with the D.A.L.O.R App Home automation system, WLED integration via the D.A.L.O.R. app with automatic discovery. ioBroker adapter Versatile and feature rich home automation system. Out-of-the-box WLED integration with automatic discovery. Lumia Stream Allows for control of your lights from streaming software node-red-contrib-wled Node-RED nodes for WLED OctoPrint-WLED Connect your OctoPrint install to your WLED install using this plugin to show things like printer status, progress and more! openHAB Another more professional feature rich home automation system. WLED integration made easy. Link 2 WLED-GUI This is a cross-platform desktop app for WLED. You can use it on Windows, Linux and Mac. WLED Native for Android WLED Native for iOS An alternative version of the WLED app with a similar user interface to the official one that looks close to the native OS style guidelines and has a few more features added on top of it. wledQuickControl macOS 11.0+ Menu Bar app for controlling power and brightness. WinLED Windows App for controlling WLED Instance (Brighness, Power, Presets, Effects...). Also usable from Traybar for quick actions. ## SourcesSource programs generate light data and stream them to WLED in real time.
Name Description LedFx A music visualization tool written in Python. Connects to WLED via E1.31 or UDP. Dr.Zzs tutorial video Prismatik WLED-WiFi (native) Ambilight via WiFi or serial - natively supports UDP (WARLS, DRGB, DNRGB protocols). Prismatik WLED-WiFi (plugin) Ambilight via WiFi - a Plugin alternative for Prismatik WLED support. xLights xLights is a Light Sequencer and Show scheduler which works with WLED. Dr.Zzs has made some videos to set it up. Intro Video Hyperion.ng Hyperion is an open-source Bias or Ambient Lighting implementation which you might know from TV manufacturers. It supports many LED devices and video grabbers. Support for WLED through UDPraw at port 19446 or E1.31. Tutorial video, Dr.Zzs video Hyperion (Classic) Hyperion is an open-source Bias or Ambient Lighting implementation which you might know from TV manufacturers. It supports many LED devices and video grabbers. Support for WLED through UDPraw at port 19446 or E1.31. Enigmalight Ambilight clone for broadcom based linux receivers. It supports many LED devices. Support for WLED through USB Adalight/Momo. Download to various forums use the WEB search function of your browser. Q Light Controller+ QLC+ is a free and cross-platform software to control DMX or analog lighting systems like moving heads, dimmers, scanners etc. QLC+ runs on Linux, Windows (XP+), macOS (10.7+) and the Raspberry Pi. WLED can be used with E1.31 (sACN). use major version 4, as 5 is in development."},{"location":"basics/compatible-software/#various","title":"Various","text":"Name Description Logitech WLED Sync Windows tray application to sync Logitech gaming peripherals to WLED."},{"location":"basics/compiling-wled/","title":"Compiling WLED","text":"Moved, see How to compile WLED
"},{"location":"basics/faq/","title":"FAQ","text":"This page will continually get updated with questions often asked.
"},{"location":"basics/faq/#contents","title":"Contents","text":""},{"location":"basics/faq/#installation","title":"Installation","text":"Please see this page.
"},{"location":"basics/faq/#ive-flashed-a-bin-but-i-get-no-response-at-all","title":"I've flashed a bin, but i get no response at all","text":"Some users report first erasing the flash (yes, even on a new device) sometimes helps .
"},{"location":"basics/faq/#connection-issues_1","title":"Connection issues","text":""},{"location":"basics/faq/#once-i-attach-leds-i-cant-connect-to-the-esp-anymore","title":"Once I attach LEDs, I can't connect to the ESP anymore!","text":"The gpio2/D4 pin needs to be high (pullup) at powerup time for the controller to boot successfully. If you accidentally connected the strip the wrong way (if it has arrows printed on, make sure they face away from the pin, otherwise pay attention to the DIN printing). Most strips have the 3-pin male JST connector with 3 holes on the input side. Some users have reported troubles booting even with the direction being correct. In that case, please try adding a 3.3 or 4.7kOhms resistor between the data pin and 3v3 pin!
"},{"location":"basics/faq/#i-have-entered-my-wifi-credentials-and-rebooted-but-i-can-not-connect-to-the-module-now","title":"I have entered my WiFi credentials and rebooted, but I can not connect to the module now!","text":"If you did not enter a static IP, the module will automatically obtain a dynamic IP from the router. You can check it in the router configuration or in the settings page, if the Access Point is still enabled. An easier way is to use the WLED Android app which features automatic discovery!
"},{"location":"basics/faq/#the-module-once-was-connected-but-i-can-no-longer-reach-it","title":"The module once was connected, but I can no longer reach it","text":"First, make sure you can reach the connected WiFi yourself (with another device). See if you can connect to the Access Point, then go to 4.3.2.1/reset. Else, power-cycle the module manually.
"},{"location":"basics/faq/#the-wled-xxxlocal-address-mdns-does-not-work","title":"The wled-xxx.local address (mDNS) does not work","text":"This only works with Apple devices out of the box. You can install Bonjour to make it work in Windows. For Android there is no convenient way to achieve it, though you can use apps like \"Bonjour search\" to find the IP. I highly recommend you install the WLED app, which makes automatic discovery easy!
"},{"location":"basics/faq/#is-it-safe-to-do-a-port-forwarding-to-the-public-internet-to-control-the-lights-from-anywhere","title":"Is it safe to do a port forwarding to the public internet to control the lights from anywhere?","text":"See this page.
"},{"location":"basics/faq/#my-device-is-unresponsive-or-animations-lag","title":"My device is unresponsive or animations lag!","text":"You are probably using too many sync interfaces. Please only enable one of Hue sync, MQTT, or Blynk at a time. For optimal performance, use two devices and sync them via the UDP notifier. Maybe you are also using a very high amount of LEDs. 750 is the recommended maximum. If using E1.31 feature on an ESP32, try \"Disabling WiFi Sleep\" in the WiFi setup section to reduce lag/stuttering of visual effects.
"},{"location":"basics/faq/#im-having-a-bootloop-leds-turn-on-every-5seconds","title":"I'm having a bootloop! (LEDs turn on every ~5seconds)","text":"Please open an issue or message me on Discord to resolve your issue. Most of the time, wiping the flash (Arduino IDE compile setting: Erase flash -> All flash contents) resolves the issue. Unfortunately it will also reset all your settings and presets. You can also try if using a different ESP resolves the issue. If you compiled with lwip version 2, try version 1.4 Higher Bandwidth instead!
"},{"location":"basics/faq/#still-having-connection-issuesconnection-dropping-what-more-can-i-check","title":"Still having connection issues/connection dropping: what more can i check?","text":"Try disabling \"Emulate Alexa device\" in Sync settings before entering your home Wifi credentials. Check whether mDNS is on or off and toggle it: does it make a difference? Same for 'NTP'. Same for 'Sync Send'. Check your router: is your 2.4Ghz on band 1: if not, try it please. If you have the possibility to try another 8266, please try it.
"},{"location":"basics/faq/#i-am-running-realtime-eg-e131-and-not-all-of-my-leds-are-driven-fluently","title":"I am running realtime (e.g. E1.31) and not all of my LEDs are driven fluently!","text":"Realtime effect streaming uses a rather large bandwidth as data is transmitted uncompressed. For example, to drive 1000 LEDs at 30 fps, you will need a data rate of 720 kBit/s, which is difficult to achieve with most cheap ESP boards over WiFi. Even if you split the total amount of LEDs across multiple controllers, your WiFi network could become the limiting factor quickly. The best way to ensure a low-latency, reliable, fluid stream when using large quantities of LEDs is to invest in a wired Ethernet ESP32 board like QuinLED-Dig boards with ethernet or the Olimex ESP32-POE.
There is a 9 DMX universe limit by default in WLED. You can raise it in line 240 of const.h (E131_MAX_UNIVERSE_COUNT 9) and compile your own binary, but the performance of 2000 LEDs over WiFi will likely not be good unless you use an Ethernet enabled board.
If Ethernet is not an option, decrease your LED count as far as possible, lower the frame rate in the sending software and make sure the WiFi signal reception of the board is good. Even without Ethernet, a board with an external antenna is significantly better than a PCB antenna board.
Furthermore I suggest using the DDP protocol if available in your sender software (available in xLights). DDP has a smaller packet header and because of the reduced overhead the fluidity of your animations will be a bit better.
"},{"location":"basics/faq/#compilation-issues_1","title":"Compilation issues","text":""},{"location":"basics/faq/#when-compiling-wled-in-vs-code-using-platformio-i-get-an-error","title":"When compiling WLED in VS Code using platformio, I get an error","text":"Try building again. If the error says the wled00.ino.cpp
or .sconsign27.db.dblite
file could not be found, this often helps. You can also try this!
Please make sure you have connected the strip to GPIO2 and it is sufficiently powered.
"},{"location":"basics/faq/#my-leds-dont-get-as-bright-as-they-should","title":"My LEDs don't get as bright as they should!","text":"If the brightness slider in the UI is already at maximum, try checking the auto brightness limiter in the LED settings. Set the milliamp limit to slightly below the rating of your power supply. If the LEDs are still too dim or change color towards the end of the strip, there may be a significant voltage drop. Try injecting 5v power at the end or middle of the strip with some appropriate cabling.
"},{"location":"basics/faq/#my-leds-are-unable-to-be-set-into-an-consistent-solid-color","title":"My LEDs are unable to be set into an consistent solid color","text":"If the LEDs should be individually addressable, like the SK6812, but instead they only behave as either RED,GREEN OR BlUE pixels (in a row). You might not have enabled (settings -> led preferences) \"LEDs are 4-channel type (RGBW)\" for an RGBW/RGBWW/RGBNW strip. This behaviour is accompanied by WLED being unable to address all LEDs, if you specify the exact amount of LEDs in the strip.
"},{"location":"basics/faq/#when-i-select-green-the-leds-turn-red","title":"When I select green, the LEDs turn red!","text":"Depending on the type of LEDs used, Red and Green or other colors might be reversed. You can change the order in LED settings. WS2812B and most related chips use GRB, WS2811 uses RGB in most cases.
"},{"location":"basics/faq/#my-leds-act-funny-and-flicker-randomly","title":"My LEDs act funny and flicker randomly","text":""},{"location":"basics/faq/#reason-1","title":"Reason 1","text":"If you use an external 5V power supply for your LEDs, please connect the GND of power supply, LEDs, and ESP. Otherwise, the LEDs can't read the data signal from the ESP.
"},{"location":"basics/faq/#reason-2","title":"Reason 2","text":"The ESP8266 is a 3.3V microcontroller while the WS2812B LED uses 5V. I have personally got away with this in most cases, but you should technically add a level shifter. A string of WS2811 did not work in one case (pure static white). A possible workaround is chaining a single WS2812B pixel in front and checking \"Skip first LED\" in the settings. My recommended levelshifter is the SN74AHCT125N, also used in the QuinLED Dig-Uno board. If you don't have a level shifter, you can use this creative workaround.
"},{"location":"basics/faq/#reason-3","title":"Reason 3","text":"Your data line can only be so long. Try out with less or thicker wire between your data pin on your controller and the LED strip, or add (see video) some voltage booster (which can make even 40m data wire length work ;-)).
"},{"location":"basics/faq/#reason-4","title":"Reason 4","text":"If they don't flicker, but display funny colors, try switching between RGB/RGBW modes in LED settings.
"},{"location":"basics/faq/#not-all-my-leds-turn-on","title":"Not all my LEDs turn on","text":""},{"location":"basics/faq/#reason-1_1","title":"Reason 1","text":"By default the LED count is set to 30. If you have more and can power them, go to LED settings and increase the LED count! Please also enter the milliamp rating of your 5v power supply for optimal brightness in the field below it. Do not increase the mA number if you power LEDs directly from the 5V pin of the ESP!
See here for maximum recommended LED counts.
"},{"location":"basics/faq/#reason-2_1","title":"Reason 2","text":"An LED in your chain may be broken. Try another strip or removing the first LED that doesn't light up. Make sure you are in solid effect mode and the LED count is set high enough first!
"},{"location":"basics/faq/#how-to-turn-off-the-bright-blue-onboard-led","title":"How to turn off the bright blue onboard LED?","text":"This LED can be very distracting. Unfortunately it can't easily be disabled as it shares the gpio2/D4 pin with the LED output. It is turned off together with your LEDs (unless they require Off Refresh
to be active) Currently there are 3 workarounds:
LEDPIN
, although the default is recommended for stable operationAlthough pins D1 and D2 are usually regarded the best GPIO pins to use in an ESP8266 project, D4 is the default in WLED, despite having two major and one minor drawback. The major drawbacks are the permanently lit blue onboard LEDs and the fact that the pin level needs to be high (pullup) at powerup or the controller will not boot. A minor drawback is that the Serial1
bus can not be used, but this is irrelevant in most cases, as the USB/serial converter is connected to the other Serial
interface. The reason for using this pin is that it uses UART hardware driving, which increases stability and decreases CPU overhead especially with larger amounts of pixels.
The problem is the DMA hardware driving method used on (just) that pin. It works well, but uses 4x (!) as much RAM memory as the UART hardware driving on pin 2 and the bitbang driver on all other pins.
"},{"location":"basics/faq/#what-led-strip-hardware-is-supported-by-wled","title":"What LED strip hardware is supported by WLED?","text":"The compatible chipsets for the color-coding are
1 pin:
WS2812B (5V)
SK6805 (3 colors)
2 pins (clock CI and data DI) chips:
APA102
Beside the digital addressable LED strips the good old analog LED strips are supported, too:
WiFi Lighting Effects Driver. Also it has LED in the name and is similar to the official term for WiFi, WLAN!
"},{"location":"basics/faq/#what-do-the-wled-version-names-mean","title":"What do the WLED version names mean?","text":"WLED version names are Japanese! Here is a nice list of their meanings:
Version Name Kanji Meaning 0.10 Namigai \u6d6a\u8c9d Geoduck (don't google it!) 0.11.0 Mirai \u672a\u6765 Future 0.11.1 Fumikiri \u8e0f\u5207 Railroad crossing 0.12 Hikari \u5149 Light 0.13 Toki \u6642 Time 0.14 Hoshi \u661f Star 0.15 K\u014dsen \u5149\u7dda Ray of light N/A Kuuhaku \u7a7a\u767d Blank"},{"location":"basics/faq/#what-is-the-difference-between-the-brightness-sliders-in-the-web-ui","title":"What is the difference between the brightness sliders in the web UI?","text":"There are three brightness slider types in the web UI. The white one in the top bar is the master brightness - it scales down every single color and all effects, palettes and segments by the same factor.
In contrast, the slider underneath the color wheel only applies to the currently selected color and will not affect the brightness of other colors or Palettes. It is recommended to use this slider only if you like a darker version of a color alongside other, brighter colors. It should not be used to control the overall brightness, so it is preferable to leave it on maximum and instead use the master brightness control.
There is a third brightness slider in each Segment panel. This serves the same purpose as master brightness, but limited to that segment. Please note that this does not override the master brightness, but instead is an additional downscaling. (If you set both Master and Segment brightness sliders to 50%, the resulting brightness is 25%)
"},{"location":"basics/faq/#my-segments-are-gone-after-a-reboot","title":"My Segments are gone after a reboot!","text":"Segments are non-persistant by default. If you want to load your preset at every startup, just do the following:
16
Boot Preset
to 16
This will be improved in a future release, so that you will be able to save multiple segment configurations!
"},{"location":"basics/faq/#what-is-the-difference-between-the-wled-app-and-the-wled-native-app","title":"What is the difference between the WLED app and the WLED Native app?","text":"The WLED app is the official app developped by the same people that brought you WLED. WLED Native is an initiative by community member Moustachauve to bring an interface that is closer to the native operating system look of your device and some new features.
WLED Native has a few more features available, like a tablet interface for Android and can keep track of changes to the device IP address better.
While WLED Native is not the official app, it is officially endorsed and trusted by the WLED maintainers.
"},{"location":"basics/faq/#may-i-sell-a-product-running-wled","title":"May I sell a product running WLED?","text":"WLED is licensed under the MIT license, thus you are free to use it in any way you wish as long as you retain the copyright notice and accept that I am not to be held liable for anything regarding your use of the software. For product pages, a link to the WLED GitHub repository would be hugely appreciated !
"},{"location":"basics/faq/#my-question-or-solution-is-not-on-this-page_1","title":"My question or solution is not on this page","text":""},{"location":"basics/faq/#check-out-the-wled-forum","title":"Check out the WLED forum!","text":"You can check out and use the WLED Discourse forum.
"},{"location":"basics/faq/#look-through-the-issues","title":"Look through the Issues","text":"Maybe someone already reported your issue, so everybody supplying support would be grateful if you take some time to search through the existing issues.
"},{"location":"basics/faq/#if-i-report-a-new-issue-what-do-i-need-to-share","title":"If I report a new Issue, what do i need to share?","text":"When you create a ticket, please share:
Version Info
Unless noted otherwise, all information applies to the latest release (v0.13.3).
"},{"location":"basics/getting-started/#quick-start-guide","title":"Quick start guide","text":"1. Connect a WS2812B-compatible RGB(W) led strip to GPIO2
. On most ESP8266 based development boards, this pin is labeled D4
; on ESP32 based boards, use IO16
or G16
or 16
. If the connecting wire cannot be kept short, use a level shifter/translator. Optionally, connect a normally open pushbutton to GPIO0
(NodeMCU/Wemos pin D3
, on ESP32 use IO17
) and ground for configurable actions. Note: Board pin naming varies depending on the manufacturer. Please use the board pinout from the specific board you purchased and use the GPIO pins to reference this guide. Make sure to connect ESP and LED-strip grounds together!
While using an ESP8266 and LEDs that have clock and data, you can either use hardware SPI (mostly faster) or software SPI.
GPIO14
(SCLK) for clock and GPIO13
(MOSI) for data.GPIO1
(TxD) for clock and GPIO2
(D4) for data. For safe operation, it is recommended to size your power wires correctly and to integrate fuses. For reference, you may use this LED power, wiring and fuse calculator.
For analog LEDs, the MOSFETs IRLZ44N or STP55NF06L are good candidates. Partial, example circuit:
2. Flash the software to your ESP module! There are two options for this step:
I just want to use WLED! (install release binary)
I want to modify WLED (compile from source code)
If everything worked the first thirty LEDs will light up in bright orange to stimulate courage, friendliness and success!
3. Use a WiFi device to connect to the access point WLED-AP
using the default password wled1234
. You can also just scan this QR code:
WLED-AP is not showing up!
If you do not see the WLED-AP
SSID, the default SSID may have been changed at compile time.
Go to the IP 4.3.2.1
in your browser to control your lights! You should also be able to connect to wled.me
if in access point mode (embedded DNS server).
To connect your WLED module to your home Wifi:
1. Click on the Config (gear) icon to edit your WLED module settings and choose \"Wifi Setup\".
2. For most home networks, simply enter your Wifi network's name and network password. You can also change the mDNS address for your WLED module here.
3. Click Save & Connect at the bottom of the page.
4. Reconnect your device to your home's Wifi network.
5. Check the device list in your router's user interface for the IP of the WLED device within your local network. For easy automatic discovery, use the WLED app! Have fun with the WLED software!
"},{"location":"basics/getting-started/#default-gpio-usage","title":"Default GPIO Usage","text":"These are only defaults
All pins can be changed in the Hardware section of LED settings. Please note that these are GPIO numbers, please consult a pinout for your board to find the labeled pin (e.g D4
= GPIO2
on most ESP8266 boards). When using an ESP8266 board, it's recommended to use pins GPIO1
, GPIO2
, or GPIO3
for LED Data; using other pins will require bit-banging and may cause slow performance and/or issues elsewhere (such as with IR decoding).
Method 1: Reflashing the new update like a new install (see above).
Method 2: The software has an integrated OTA software update capability. First you have to enable it by typing in the correct OTA passphrase (default: \"wledota\") in the settings menu. Remove the tick in the checkbox \"OTA locked\". Then save settings and reboot the ESP. Then you can select \"Manual OTA update\" in Security settings and upload a release binary. After you are done, it is recommended to lock the OTA function again. To do so, tick the checkbox again (you can change the passphrase by typing in a new one now). Reboot. If you try to access the update page now, you should see the message \"OTA lock active\".
Method 3: ArduinoOTA is also supported.
If you own multiple devices and want to update them
Since v0.13 of WLED source code includes shell/command prompt scripts which is allow you to update multiple devices with a single command. Please check tools
subfolder for multi-update
scripts (.cmd or .sh). You will need to modify them to include IP addresses of your WLED devices and assign firmware binary file for each device. If you are using Windows, make sure you install curl
utility somewhere in your PATH
(curl is included with Windows 10 since build 17063). This will only work if \"OTA Lock\" is disabled.
Tip
This is by far the easiest and fastest way to get WLED up and running!
Make sure you are running a recent desktop Chrome or Edge browser and head over to the WLED installer site! If you are updating an existing version of WLED, make sure to uncheck \"Clean install\" so that your settings are kept. This installer is not yet available for ESPs with flash chips smaller than 4MB (e.g. ESP01)
Tip
After using the standard WLED installer, microphone hardware sometimes cannot be initialized properly by WLED. For flashing the MoonModules version of WLED, we recommend using this installer site: https://wled-install.github.io/
"},{"location":"basics/install-binary/#flashing-method-2-esptool","title":"Flashing method 2: esptool","text":"-port COM3
attribute after write_flash
esptool.py write_flash 0x0 ./WLED_XXX.bin\n
"},{"location":"basics/install-binary/#esp32","title":"ESP32","text":"Firstly, flash the version 4 bootloader file, which you can find here. This step only has to be done once, to update afterwards the bootloader does not have to be re-installed.
esptool.py write_flash 0x0 ./esp32_bootloader_v4.bin\n
Caution
This boolader file is only for \"classic ESP32\" boards. You need a different bootloader for esp32-S3/-S2/-C3.
Now you can flash the actual firmware binary. Keep in mind the bootloader needs to have a flash offset of 0, but the firmware 0x10000.
esptool.py write_flash 0x10000 ./WLED_XXX.bin \n
When esptool.py says Connecting...
, some ESP32 boards require you to hold the boot button (to the right of the USB port) for a few seconds
write_flash
again (Note: this will erase all settings stored on the ESP!)esptool.py erase_flash\n
If you have a MagicHome controller, here is a good video tutorial on how to flash it.
"},{"location":"basics/install-binary/#esp8266-flashing-method-3-esp-home-flasher-tool","title":"ESP8266 Flashing method 3: ESP Home Flasher tool","text":"Warning
Don't use ESP Home Flasher for ESP32 boards. On ESP32, ESP Home Flasher will make the filesystem very small (61kB), which leads to issues making presets. Please consider using WLED ESP Flasher, or the web installer or esptool.
This is a GUI-based tool recommended by some users as easier to use than esptool. For some boards, you might have to press some buttons after uploading:
Hold both buttons down, plug it in, start flashing, then when it tries to detect, let go of the button to the left of the USB as you look at it, then when it detects the board type, let go of the other button.
If running Windows, you need a driver from here: https://www.wemos.cc/en/latest/ch340_driver.html before your computer will show the COM port in ESPhome Flasher. With a Wemos D1 mini you do not need to hold down the reset button while flashing.
Tip
For ESP32 boards, you can use this WLED ESP Flasher instead of ESP Home Flasher. Please wait at least 90 seconds after installing, to be sure you don't interrupt WLED when formatting its flash filesystem.
"},{"location":"basics/install-binary/#flashing-method-4-ota-update","title":"Flashing method 4: OTA update","text":"You can alternatively use my basic HTTP OTA updater sketch and upload the binary! This requires the Arduino IDE and ESP8266 core installed. If your device is already running a firmware with built-in OTA capability, you can probably use that as well.
"},{"location":"basics/install-binary/#what-binary-should-i-use","title":"What binary should I use?","text":"I always recommend to use the latest release. Starting from WLED 0.12.0, pins can be configured in LED settings and specific binaries for different LED pins or types are no longer needed. Please use the following binary for these boards respectively:
Binary Name For devices WLED_0.x.x_ESP8266.bin NodeMCU, Wemos D1 mini, ESP-12, all ESP8266 with 4MB flash. Recommended. WLED_0.x.x_ESP32.bin All ESP32 devices (try this if the WLED-AP doesn't appear after flashing) WLED_0.x.x_ESP32_Ethernet.bin ESP32 devices with an Ethernet interface. Also works with WiFi only. WLED_0.x.x_ESP01.bin ESP-01 (black PCB), most Sonoff devices, ESP8265, all ESP8266 with 1MB flash. This binary has the full feature set, but wireless updates will not work. WLED_0.x.x_ESP02.bin All ESP8266 with 2MB flash, Athom bulbs. This binary has the full feature set, but wireless updates will not work (for more detail see this. For wireless updates use WLED_0.x.x_ESP02.bin.gz firmware instead. WLED_0.x.x_ESP02.bin.gz All ESP8266 with 2MB flash, Athom bulbs, wireless update are possible with this firmware. esp32_bootloader.bin Not a WLED release. To be flashed to a brand new ESP32 before flashing the WLED binary itself.Legacy binary format (up to 0.11.1)
Binary Name For devices WLED_0.x.x_ESP8266_1M_ota.bin ESP-01 (black PCB), most Sonoff devices, ESP8265, all ESP8266 with 1MB flash. This binary has some interfaces disabled (Alexa, Blynk, Hue sync, Infrared) in order for wireless updates to continue working. WLED_0.x.x_ESP8266_1M_full.bin ESP-01 (black PCB), most Sonoff devices, ESP8265, all ESP8266 with 1MB flash. This binary has the full feature set, but wireless updates will not work. WLED_0.x.x_ESP8266_512k.bin ESP-01 (blue PCB), older Sonoff devices, all ESP8266 with 512kB flash. Interfaces (Alexa, Blynk, Hue sync, Infrared) disabled, no OTA. Support will not be possible in future versions. WLED_0.x.x_ESP8266_ledpinY.bin Custom build for 4MB flash ESP8266 and WS2812B. LED pin is changed (default is GPIO2). (This is GPIOY and not DY for the D to GPIO mapping, check your boards spec!) WLED_0.x.x_ESP8266_apa102.bin Custom build for 4MB flash ESP8266 and APA102 LEDs (clock pin GPIO0, data GPIO2). WLED_0.x.x_ESP8266_ws2801.bin Custom build for 4MB flash ESP8266 and WS2801 LEDs (clock pin GPIO0, data GPIO2). WLED_0.x.x_ESP32_ledpinY.bin Custom build for ESP32 and WS2812b. LED pin is changed (default is GPIO2). LED pin 16 is useful for the QuinLed-Dig-Uno board with ESP32."},{"location":"basics/install-gui/","title":"Installation using ESP GUI","text":""},{"location":"basics/install-gui/#1-downloading-the-firmware-bin-file","title":"1. Downloading the firmware bin file","text":"You can find precompiled .bin files on the release page. Be sure to download the latest version. This file looks something like this:
WLED_[...]_ESP[...].bin
If you are not sure what binary you should use look at this page: What binary should I use?
"},{"location":"basics/install-gui/#2-downloading-the-flash-download-tools","title":"2. Downloading the Flash Download Tools","text":"Espressif has an official GUI tool for Windows. It has a lot of options and can be used for the ESP8266 and ESP32. You can find it on Espressif's download page here! (if the link changed, just search for esp flash download tool
on Google)
After downloading the file, unzip it and start flash_download_tools_v3.6.8.exe
.
After starting flash_download_tools_v[...].exe
there should pop up two small windows. Now just click on the Developer Mode
andESP8266 DownloadTool
button. Now a new window opens.
WLED_[...]_ESP[...].bin
file by clicking on the first ...
button0x0
Default
button80Mhz
32Mbit
COM1
)921600
Verify that everything looks like the two picture below \u00b0ESPTool settings
(optionally) click on ERASE to erase the entire flash chip
START
Now the firmware will be flashed to the ESP. When the firmware flashing was successful you see this: . Finally restart your board.
Next steps: Quick start guide
"},{"location":"basics/install-wled-flasher/","title":"Installation using ESP GUI - WLED Flasher","text":""},{"location":"basics/install-wled-flasher/#1-downloading-wled-firmware-bin-file","title":"1. Downloading WLED firmware bin file","text":"You can find precompiled .bin files on the official release page. Also available alternative with precompiled usermods
If you are not sure what binary you should use look at this page: What binary should I use?
"},{"location":"basics/install-wled-flasher/#2-downloading-the-esp-wled-flasher","title":"2. Downloading the ESP WLED Flasher","text":"You can find and download flasher here!
After downloading a file, unzip it and start
"},{"location":"basics/install-wled-flasher/#3-flashing-firmware-bin-files","title":"3. Flashing firmware bin files","text":"When flasher start, choose Serial port
(it must be a port your board is connected to).
Next , choose downloaded BIN file
.
Click on Flash ESP
.
Now WLED firmware will be flashed to the ESP. Wait until process is finished and you will see Ada
message.
Next steps: Quick start guide
"},{"location":"basics/top5_mistakes/","title":"TOP 5 mistakes","text":""},{"location":"basics/top5_mistakes/#asking-for-help","title":"Asking for help","text":"Before asking for help on Discord or on other platforms, check the following top 5 most common mistakes while setting up WLED. If you then still have troubles and are going to ask for help, provide as much informtion as possile: describe your setup, make photos, provide screenshots of your settings.
"},{"location":"basics/top5_mistakes/#top-5-mistakes","title":"TOP 5 mistakes:","text":"Don't know yet how to solder? Unsure how to connect your LEDs safely? How to find the perfect power supply? No worries, we have collected a few helpful links for you to learn more about these and more topics:
"},{"location":"basics/tutorials/#wled-specific-tutorials","title":"WLED specific tutorials","text":"Resource Maker Type Date Info Beginner's guide to freak'n cool Holiday LEDs DrZzs Video (23:22) 12 Oct 2019 Excellent guide for getting started with WLED! How to Set Colors and Effects, Save Presets, Make Sync Groups, add a Button, & Macros for Scheduling DrZzs Video (23:39) 29 Oct 2019 Learn about some cool additional WLED features! Make your LEDs dance to music! DrZzs Video (11:30) 17 Nov 2019 How to install LedFx and connect it to WLED for quick sound reactive effects! Getting started with WLED tynick Article 11 Mar 2019 Complete and excellent guide on how to flash and get WLED up and running! How to Compile WLED (from scratch) Quindor Video (02:15:00) 22 Dec 2020 How to compile WLED yourself from scratch (most info in first 30 minutes) WLED with QuinLED-Dig-Uno Install Tutorial Quindor Video (11:13) 21 Sept 2019 Initial flash and setup of WLED on QuinLED-Dig-Uno board Integrating WLED into Home Assistant Quindor Video (8:22) 25 Nov 2019 How to use a WLED node in Home Assistant Holiday LEDs Step-by-step with WLED & Home Assistant KPeyanski Video (20:38) 28 Oct 2020 Complete and great wiring, installation and HA setup tutorial HOW-TO: Holiday LED Strip Lights, Home Assistant and WLED KPeyanski Article 23 Jul 2022 Same as the above video, but in text form! Smart Ping Pong LED Lamp - Quick&Simple DIY bitluni Video (18:19) 13 Sept 2020 Construction, wiring and flashing of a cool looking and easy to make lamp WLED tutorial series (in Russian/\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c) Gelmer Article Series 11 Jun 2023 \u0421\u0435\u0440\u0438\u044f \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432 \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c: \u041a\u0430\u043a \u043f\u0440\u043e\u0448\u0438\u0442\u044c WLED \u0438 LED FX \u0432 ESP01 \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f WLED: \u0411\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0443\u043d\u043d\u0435\u043b\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u043e\u043b\u0438\u043a\u0430 IKEA Lack Alchemist Video (9:16) / Video (13:09) 19 Aug 2022 \u041f\u0440\u043e\u0448\u0438\u0432\u043a\u0430, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b. \u041f\u0440\u0438\u043c\u0435\u0440 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b. ESP8266 based LED controller for WS2812b strip. WLED Firmware + OpenHAB (in Russian) Room31 Video (17:04) 11 Mar 2020 How to use WLED on an ESP32 (German) Bitbastelei/Adlerweb Video (11:00) 1 Nov 2020 DIY Ambilight using WLED and a Relay jangrewe Article ? Wiki page with schematics and instructions for Hyperion, etc. Adding Smarts and Color to an IKEA Lamp apop880 Article 21 May 2021 Tutorial on upgrading a basic IKEA lamp with WLED"},{"location":"basics/tutorials/#digital-led-knowledge","title":"Digital LED knowledge","text":"Resource Maker Type Info Adafruit NeoPixel \u00dcberguide Adafruit Article Everything that's important at a glance. Highly recommended for newcomers to digital LEDs Digital LED Power Usage Quindor Article/Spreadsheet/Video Helps you plan the power usage of your installation Power calculation and injection live stream Quindor Video (2:24:52) Tons of great questions and answers. Live calculations, drawings, 5v vs 12v, strip comparisons, etc. Difference between LED strip types The Hook Up Video (14:41) What is the best LED strip for your project? 7 Common LED Strip FAILS and How To Avoid Them The Hook Up Video (12:14) Make your project look much better! Power Injection demystified Spiker Lights Article What is power injection and how much do I need? Common(sharing) Ground / Multiple power supplies Article When using more than one power supply."},{"location":"basics/tutorials/#tools-skills","title":"Tools & Skills","text":"Resource Maker Type Info How to Solder Beauty and the Bolt Video (9:50) Soldering new leads to LED strip Quindor Video (8:24) Soldering Tutorial Part 2 EEVblog Video (34:05) Detailed tutorial on soldering, see parts 1 and 3 for even more info) Voltage Drop Calculator Tool Another Voltage Drop Calculator Tool Pixel/Bullet Voltage Drop Calc Tool 5 and 12V Combined Wire Gauge Calculator Tool Wire Size/Ampacity Tool Use chassis wiringAdd more categories as needed :)
"},{"location":"features/cct/","title":"White handling","text":""},{"location":"features/cct/#white-channels-handling","title":"White channel(s) handling","text":"Besides addressable RGB and RGBW bus types, WLED 0.13.0 also supports PWM CCT (correlated color temperature) lights.
"},{"location":"features/cct/#auto-white-handling","title":"Auto white handling","text":"Many effects and realtime sources are based on an RGB color model, which necessitates a method to calculate a white channel value from the RGB value for lights that support more than RGB.
WLED offers four auto white modes, one of which can be selected in LED settings using the option Auto-calculate white channel from RGB
. This option is only shown if at least one bus with White channel support is present.
White channel
slider in the user interface, RGB-only effects and most realtime sources will leave the white channel off. Dual The White channel
slider is present in the UI and works the same as in None
mode, however if the slider value is 0 (far left), the Brighter
mode is used for auto white calculation. This is the default auto white mode. Accurate
and Brighter
methods are applied on a per-pixel basis, so they also work in color palettes and realtime effects!
If enabled in LED settings, WB correction allows either making all pixels colder or warmer on a per-segment basis using a slider in the main user interface. This is applied to the RGB color only, after the auto white channel calculation.
"},{"location":"features/cct/#cct-handling","title":"CCT handling","text":"WLED starting with version 0.13.0 also supports bus types with two white channels, one with a warm color temperature (e.g. 2700 Kelvin, reddish white) and one with a cold white color temperature (e.g. 8000 Kelvin, bluish white).
Since as of the release of version 0.13.0 no adjustable CCT addressable LEDs are supported*, this only applies to PWM analog LED outputs.
*SK6812 WWA (with 3 channels, warm white, cold white and amber) are supported, but treated as if RGB using the WS281x
bus type. White spectrum support for this LED type will be added at a later point.
The overall brightness of the white channels is determined from the auto-white calculation outlined above, and as such is identical in behavior to that of single white channel busses.
The color temperature is set either on a per-segment basis via a dedicated slider in the UI, or if Calculate CCT from RGB
is enabled in LED settings, is estimated on a per-pixel basis from the set RGB color (e.g. setting Red results in the warmest, setting Blue results in the coldest possible white). The former has the advantage of granular white spectrum control independent of the set RGB color, while the latter enables control of the color temperature from all effects and realtime sources.
Setting this to 0% results in a more even brightness output across the supported temperature range, as the fading between the warm and cold white channels is linear.
Setting this to 100% results in the highest peak brightness output at the neutral white point (CCT value 127
), as both white channels are active at 100%.
Warning
Make sure your setup can handle driving both white channels at maximum output simultaneously. This results in a higher heat output and might reduce the lifetime of your LEDs. For example, bulbs by Athom are designed for linear blending (0%) and may be damaged by attempting to use additive blending.\n
You can limit the maximum allowed additive blending at build time using the WLED_MAX_CCT_BLEND
macro. For example, add -D WLED_MAX_CCT_BLEND=0
to your build flags to force linear blending only.
By default, PWM CCT bus types set the value of the warm and cold white channels. If your hardware uses an IC that controls the color temperature based on one PWM signal and the overall brightness on the other, please use the build flag -D WLED_USE_IC_CCT
in a custom compilation. (the 15W bulb by Athom uses this method)
Please see here for more info on how to handle WLED CCT from integrations.
"},{"location":"features/effects/","title":"Effects","text":"Version Info
Effects above 117 are only available 0.14+ or Sound Reactive forks. Retired Effects - Can't find an old favorite? Look here.
"},{"location":"features/effects/#effect-overlay","title":"Effect Overlay","text":"Some effects can be overlaid on the background of another effect. To use overlay, set up segments with overlapping pixels. The overlay effect must be playing on the segment with the higher id. If the Overlay option is checked, the background will not be painted and the effect from the lower segment will be displayed.
To aid in showing where colors vs palettes are used, all effects are rendered with the Party palette and the colors: Primary (Fx) (or black) Secondary (Bg) Tertiary (Cs). For 2D effects the background (secondary) color is set to black.
ID Effect Description Flags Colors Parms 186 Akemi The WLED mascot rocking to your tunes. \u25a6 \u266b Head palette, Arms & Legs, Eyes & Mouth Color speed, Dance 27 Android Section of varying length running \u22ee \ud83c\udfa8 Fx, Bg Speed, Width 38 Aurora Simulation of the Aurora Borealis \u22ee \ud83c\udfa8 1, 2, 3 Speed, Intensity 183 Black Hole Colorful dots orbiting a white black hole. \u25a6 Fade rate, Outer Y freq., Outer X freq., Inner X freq., Inner Y freq. 115 Blends Blends random colors across palette \u22ee \ud83c\udfa8 Shift speed, Blend speed 1 Blink Blinks between primary and secondary color \u22ee \ud83c\udfa8 Fx, Bg Speed, Duty cycle 26 Blink Rainbow Same as blink, cycles through the rainbow \u22ee \ud83c\udfa8 Fx, Bg Frequency, Blink duration 121 Blobs No really, they are blobs. \u25a6 \ud83c\udfa8 Fx Speed, # blobs, Blur 163 Blurz \u263e \u22ee \u266b \ud83c\udfa8 Fx, Color mix Fade rate, Blur 91 Bouncing Balls Bouncing ball effect \u22ee \ud83c\udfa8 Fx, Bg, Cs Gravity, # of balls, Overlay 68 Bpm Pulses moving back and forth on palette \u22ee \ud83c\udfa8 Fx Speed 2 Breathe Fades between primary and secondary color \u22ee \ud83c\udfa8 Fx, Bg Speed 88 Candle Flicker resembling a candle flame \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 102 Candle Multi Like candle effect, but each LED has it's own flicker pattern \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 28 Chase 2 LEDs in primary color running on secondary \u22ee \ud83c\udfa8 Fx, Bg, Cs Speed, Width 37 Chase 2 Pattern of n LEDs primary and n LEDs secondary moves along the strip \u22ee \ud83c\udfa8 Fx, Bg Speed, Width 54 Chase 3 Like Chase, but with 3 colors \u22ee \ud83c\udfa8 1, 2, 3 Speed, Size 31 Chase Flash 2 LEDs flash in secondary color while the rest is lit in primary. The flashing LEDs wander from start to end \u22ee \ud83c\udfa8 Bg, Fx Speed 32 Chase Flash Rnd Like Chase Flash, but the 2 LEDs flash in random colors and leaves a random color behind \u22ee \ud83c\udfa8 Fx, Bg Speed 30 Chase Rainbow Like 28 but leaves trail of rainbow \u22ee \ud83c\udfa8 Fx, Bg Speed, Width 29 Chase Random Like Chase but leaves trail of random color \u22ee \ud83c\udfa8 Fx, Cs Speed, Width 111 Chunchun Birds flying in a circle formation \u22ee \ud83c\udfa8 Fx, Bg Speed, Gap size 167 Colored Bursts Rotating rays of color. \u25a6 \ud83c\udfa8 Speed, # of lines, Blur, Gradient, Dots 34 Colorful Shifting Red-Amber-Green-Blue pattern \u22ee \ud83c\udfa8 1, 2, 3 Speed, Saturation 8 Colorloop Cycle all LEDs through the rainbow colors \u22ee \ud83c\udfa8 Speed, Saturation 74 Colortwinkles LEDs light up randomly in random colors and fade off again \u22ee \ud83c\udfa8 Fade speed, Spawn speed 67 Colorwaves Like Pride 2015, but uses palettes \u22ee \ud83c\udfa8 Fx Speed, Hue 119 Crazy Bees Bees darting from flower to flower. \u25a6 Speed, Blur 159 DJ Light An effect emanating from the center to the edges. \u22ee \u266b Speed, Candy Factory 152 DNA A very cool DNA like pattern. \u25a6 \ud83c\udfa8 Scroll speed, Blur 182 DNA Spiral Spiraling DNA pattern \u25a6 \ud83c\udfa8 Scroll speed, Y frequency 112 Dancing Shadows Moving spotlights \u22ee \ud83c\udfa8 Fx Speed, # of shadows 18 Dissolve Fills LEDs with primary in random order, then off again \u22ee \ud83c\udfa8 Fx, Bg Repeat speed, Dissolve speed, Random 19 Dissolve Rnd Fills LEDs with random colors in random order, then off again \u22ee \ud83c\udfa8 Bg Repeat speed, Dissolve speed 124 Distortion Waves Distorted sine waves with a psychedelic flair. \u25a6 Speed, Scale 164 Drift A rotating kaleidoscope. \u25a6 \ud83c\udfa8 Rotation speed, Blur amount 123 Drift Rose Spinning arms that adds and removes nodes as it winds and unwinds. \u25a6 Fade, Blur 96 Drip Water dripping effect \u22ee \ud83c\udfa8 Fx, Bg Gravity, # of drips, Overlay 7 Dynamic Sets each LED to a random color \u22ee \ud83c\udfa8 Speed, Intensity, Smooth 117 Dynamic Smooth Like Dynamic, but with smooth palette blends \u22ee \ud83c\udfa8 Speed, Intensity 12 Fade Fades smoothly between primary and secondary color \u22ee \ud83c\udfa8 Fx, Bg Speed 49 Fairy Inspired by twinkle style Christmas lights. \u22ee \ud83c\udfa8 Fx, Bg Speed, # of flashers 51 Fairytwinkle Like Colortwinkle, but starting from all lit \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 69 Fill Noise Noise pattern \u22ee \ud83c\udfa8 Fx Speed 66 Fire 2012 Simulates flickering fire in red and yellow \u22ee \ud83c\udfa8 Cooling, Spark rate, Boost 45 Fire Flicker LEDs randomly flickering \u22ee \ud83c\udfa8 Fx Speed, Intensity 149 Firenoise Using Perlin Noise for fire. \u25a6 \ud83c\udfa8 X scale, Y scale 42 Fireworks Random color blobs light up, then fade again \u22ee \u25a6 \ud83c\udfa8 Fx, Bg Frequency 90 Fireworks 1D one dimension fireworks with flare \u22ee \u25a6 \ud83c\udfa8 Fx, Bg Gravity, Firing side 89 Fireworks Starburst Exploding multicolor fireworks \u22ee \ud83c\udfa8 Bg Chance, Fragments, Overlay 110 Flow Blend of palette and spot effects \u22ee \ud83c\udfa8 Speed, Zones 179 Flow Stripe Strip with rotating colours. \u22ee Hue speed, Effect speed 155 Freqmap Map the loudest frequency throughout the length of the LED's. \u22ee \u266b \ud83c\udfa8 Fx, Bg Fade rate, Starting color, Smooth mover \u263e 138 Freqmatrix The temporal tail for this animation starts at the beginning of the Segment rather than in the center of the segment. \u22ee \u266b Speed, Sound effect, Low bin, High bin, Sensivity 141 Freqpixels Random pixels coloured by frequency. \u22ee \u266b Fade rate, Starting color and # of pixels 137 Freqwave Maps the major frequencies from the incoming signal to colors in the HSV color space. \u22ee \u266b Speed, Sound effect, Low bin, High bin, Pre-amp, Musical Scale \u263e 177 Frizzles Moving patterns. \u25a6 \ud83c\udfa8 X frequency, Y frequency, Blur 160 Funky Plank A 2D wall of reactivity running from bottom to top \u25a6 \u266b Scroll speed, # of bands 139 GEQ \u263e \u25a6 \u266b \ud83c\udfa8 Fx, Peaks Fade speed, Ripple decay, # of bands, Color bars, Smooth bars \u263e 172 Game Of Life Scrolling game of life. \u25a6 \ud83c\udfa8 Fx, Bg Speed, All colors \u263e 120 Ghost Rider Color changing ghost riding a kite... in a tornado. \u25a6 \ud83c\udfa8 Fade rate, Blur 87 Glitter Rainbow with white sparkles \u22ee \ud83c\udfa8 1, 2, Glitter color Speed, Intensity, Overlay 46 Gradient Moves a saturation gradient of the primary color along the strip \u22ee \ud83c\udfa8 Fx, Bg Speed, Spread 156 Gravcenter Volume reactive vu-meter from center with gravity and perlin noise. \u22ee \u266a \ud83c\udfa8 Fx, Bg Rate of fall, Sensitivity 157 Gravcentric Volume reactive vu-meter from center with gravity. Volume provides index to (time rotating) palette colour. \u22ee \u266a \ud83c\udfa8 Fx, Bg Rate of fall, Sensitivity 158 Gravfreq \u263e \u22ee \u266b \ud83c\udfa8 Fx, Bg Rate of fall, Sensivity 132 Gravimeter \u263e \u22ee \u266a \ud83c\udfa8 Fx, Bg Rate of fall, Sensitivity, Invert Palette, Sound Pressure, AGC debug 82 Halloween Eyes One Pair of blinking eyes at random intervals along strip \u22ee \u25a6 \ud83c\udfa8 Fx, Bg Duration, Eye fade time, Overlay 100 Heartbeat led strip pulsing rhythm similar to a heart beat \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 180 Hiphotic A moving plasma. \u25a6 \ud83c\udfa8 Fx X scale, Y scale, Speed 58 ICU Two \"eyes\" running on opposite sides of the strip \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity, Overlay 64 Juggle Eight colored dots running, leaving trails \u22ee \ud83c\udfa8 Speed, Trail 130 Juggles Juggling balls. \u22ee \u266a \ud83c\udfa8 Fx, Bg Speed, # of balls 168 Julia Animated Julia set fractal named after mathematician Gaston Julia. \u25a6 \ud83c\udfa8 Fx Max iterations per pixel, X center, Y center, Area size 75 Lake Calm palette waving \u22ee \ud83c\udfa8 Fx Speed 41 Lighthouse Dot moves from start to end, leaving behind a fading trail \u22ee \ud83c\udfa8 Fx, Bg Speed, Fade rate 57 Lightning Short random white strobe similar to a lightning bolt \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity, Overlay 176 Lissajous \u263e \u25a6 \ud83c\udfa8 Fx X frequency, Fade rate, Speed, \u263e Smooth Style 47 Loading Moves a sawtooth pattern along the strip \u22ee \ud83c\udfa8 Fx, Bg Speed, Fade 131 Matripix \u263e \u22ee \u266a \ud83c\udfa8 Fx, Bg Speed, Brightness, Frequency Colors, Sound Pressure 153 Matrix The Matrix, on a 2D matrix. \u25a6 Spawn, Trail Speed, Spawning rate, Trail, Custom color 154 Metaballs A cool plasma type effect. \u25a6 \ud83c\udfa8 Speed 76 Meteor The primary color creates a trail of randomly decaying color \u22ee \ud83c\udfa8 Fx Speed, Trail length 77 Meteor Smooth Smoothly animated meteor \u22ee \ud83c\udfa8 Fx Speed, Trail length 135 Midnoise Perlin noise emanating from center. \u22ee \u266a \ud83c\udfa8 Fx, Bg Fade rate, Max. length 59 Multi Comet Like Scanner, but creates multiple trails \u22ee 70 Noise 1 Fast Noise shift pattern \u22ee \ud83c\udfa8 Fx Speed 71 Noise 2 Fast Noise shift pattern \u22ee \ud83c\udfa8 Fx Speed 72 Noise 3 Noise shift pattern \u22ee \ud83c\udfa8 Fx Speed 73 Noise 4 Noise sparkle pattern \u22ee \ud83c\udfa8 Fx Speed 107 Noise Pal Peaceful noise that's slow and with gradually changing palettes \u22ee \ud83c\udfa8 Speed, Scale 146 Noise2D \u25a6 \ud83c\udfa8 Speed, Scale 143 Noisefire A perlin noise based volume reactive fire routine. \u22ee \u266a Speed, Intensity 136 Noisemeter Volume reactive vu-meter. \u22ee \u266a \ud83c\udfa8 Fx, Bg Fade rate, Width 145 Noisemove Using perlin noise as movement for different frequency bins. \u22ee \u266b \ud83c\udfa8 Fx, Bg Speed of perlin movement, Fade rate 126 Octopus A cephalopod stuck in a whirlpool. \u25a6 \ud83c\udfa8 Speed, Offset X, Offset Y, Legs 62 Oscillate Areas of primary and secondary colors move between opposite ends, combining colors where they touch \u22ee 101 Pacifica Gentle ocean waves \u22ee \ud83c\udfa8 Speed, Angle 65 Palette Running color palette \u22ee \ud83c\udfa8 Cycle speed 98 Percent Lights up a percentage of segment \u22ee \ud83c\udfa8 Fx, Bg % of fill, One color 147 Perlin Move Using Perlin Noise for movement. \u22ee \ud83c\udfa8 Fx, Bg Speed, # of pixels, Fade rate 105 Phased Sine waves (in sourcecode) \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 109 Phased Noise Noisy sine waves \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 128 Pixels Random pixels \u22ee \u266a \ud83c\udfa8 Fx, Bg Fade rate, # of pixels 129 Pixelwave Pixels emanating from center \u22ee \u266a \ud83c\udfa8 Fx, Bg Speed, Sensitivity 97 Plasma Plasma lamp \u22ee \ud83c\udfa8 Fx Phase, Intensity 178 Plasma Ball A ball of plasma. \u25a6 \ud83c\udfa8 Speed, Fade, Blur 133 Plasmoid Sine wave based plasma. \u22ee \u266a \ud83c\udfa8 Fx, Bg Phase, # of pixels 174 Polar Lights The northern lights. \u25a6 Speed, Scale 95 Popcorn popping kernels \u22ee \ud83c\udfa8 Fx, Bg, Cs Speed, Intensity, Overlay 63 Pride 2015 Rainbow cycling with brightness variation \u22ee Speed 144 Puddlepeak Blast coloured puddles randomly up and down the strand with the 'beat'. \u22ee \u266a \ud83c\udfa8 Fx, Bg Fade rate, Puddle size, Select bin, Volume (min) 134 Puddles Blast coloured puddles based on volume. \u22ee \u266a \ud83c\udfa8 Fx, Bg Fade rate, Puddle size 162 Pulser Travelling waves. \u25a6 \ud83c\udfa8 Speed, Blur 78 Railway Shows primary and secondary color on alternating LEDs. All LEDs fade to their opposite color and back again \u22ee \ud83c\udfa8 1, 2 Speed, Smoothness 43 Rain Like Fireworks, but the blobs move \u22ee \u25a6 \ud83c\udfa8 Fx, Bg Speed, Spawning rate 9 Rainbow Displays rainbow colors along the whole strip \u22ee \ud83c\udfa8 Speed, Size 33 Rainbow Runner Like Chase, but the 2 LEDs light up in rainbow colors and leave a primary color trail \u22ee \ud83c\udfa8 Bg Speed, Size 5 Random Colors Applies a new random color to all LEDs \u22ee \ud83c\udfa8 Speed, Fade time 79 Ripple Effect resembling random water ripples \u22ee \u25a6 \ud83c\udfa8 Bg Speed, Wave #, Overlay 148 Ripple Peak Peak detection triggers ripples. \u22ee \u266a \ud83c\udfa8 Fx, Bg Fade rate, Max # of ripples, Select bin, Volume (min) 99 Ripple Rainbow Like ripple, but with a dimly lit changing background \u22ee \u25a6 \ud83c\udfa8 Speed, Wave # 185 Rocktaves Colours the same for each note between octaves, with sine wave going back and forth. \u22ee \u266b \ud83c\udfa8 Fx, Bg 15 Running Sine Waves scrolling \u22ee \ud83c\udfa8 Fx, Bg Speed, Wave width 52 Running Dual Sine waves in both directions \u22ee \ud83c\udfa8 L, Bg, R Speed, Wave width 16 Saw Sawtooth Waves scrolling \u22ee \ud83c\udfa8 Fx, Bg Speed, Width 10 Scan A single primary colored light wanders between start and end \u22ee \ud83c\udfa8 Fx, Bg, Cs Speed, # of dots, Overlay 11 Scan Dual Same as Scan but uses two lights starting at both ends \u22ee \ud83c\udfa8 Fx, Bg, Cs Speed, # of dots, Overlay 40 Scanner Dot moves between ends, leaving behind a fading trail \u22ee \ud83c\udfa8 Fx, Bg Speed, Fade rate 60 Scanner Dual Like Scanner, but with two dots running on opposite sides \u22ee \ud83c\udfa8 Fx, Bg, Cs Speed, Fade rate 122 Scrolling Text Edit segment name to set text (variables #DATE, #TIME, #DDMM, #MMDD, #HHMM, #HH, #MM; suffix with 0 to have leading 0s, i.e. #DATE0. MM specific: #FPS = current frames per second; #POW=estimated power (Ampere). Use segment grouping to increase text size on a large matrix. \u25a6 \ud83c\udfa8 Fx, Bg, Gradient Speed, Y Offset, Trail, Font size, Gradient, Overlay 181 Sindots Dots revolving in a circle while the 'camera' \u25a6 \ud83c\udfa8 Speed, Dot distance, Fade rate, Blur 108 Sine Controllable sine waves \u22ee 92 Sinelon Fastled sinusoidal moving eye \u22ee \ud83c\udfa8 Fx, Bg, Cs Speed, Trail 93 Sinelon Dual Sinelon from both directions \u22ee \ud83c\udfa8 Fx, Bg, Cs Speed, Trail 94 Sinelon Rainbow Sinelon in rainbow colours \u22ee \ud83c\udfa8 Cs Speed, Trail 125 Soap Like soap bubbles, but lasts longer. \u25a6 \ud83c\udfa8 Speed, Smoothness 0 Solid Solid primary color on all LEDs \u22ee 103 Solid Glitter Like Glitter, but with solid color background \u22ee Bg, Glitter color Intensity 83 Solid Pattern Speed sets number of LEDs on, intensity sets off \u22ee \ud83c\udfa8 Fg, Bg Fg size, Bg size 84 Solid Pattern Tri Solid Pattern with three colors \u22ee 1, 2, 3 Size 118 Spaceships Circling ships with fading trails. Homage to 80s spaceship shooter games. \u25a6 \ud83c\udfa8 Speed, Blur 20 Sparkle Single random LEDs light up in the primary color for a short time, secondary is background \u22ee \ud83c\udfa8 Fx, Bg Speed, Overlay 21 Sparkle Dark All LEDs are lit in the primary color, single random LEDs turn off for a short time \u22ee \ud83c\udfa8 Bg, Fx Speed, Intensity, Overlay 22 Sparkle+ All LEDs are lit in the primary color, multiple random LEDs turn off for a short time \u22ee \ud83c\udfa8 Bg, Fx Speed, Intensity, Overlay 85 Spots Solid lights with even distance \u22ee \ud83c\udfa8 Fx, Bg Spread, Width, Overlay 86 Spots Fade Spots, getting bigger and smaller \u22ee \ud83c\udfa8 Fx, Bg Spread, Width, Overlay 150 Squared Swirl Boxes moving around \u25a6 \ud83c\udfa8 Blur 61 Stream 2 \u263e \u22ee Speed 39 Stream \u263e \u22ee \ud83c\udfa8 Speed, Zone size 23 Strobe All LEDs are lit in the secondary color, all LEDs flash in a single short burst in primary color \u22ee \ud83c\udfa8 Fx, Bg Speed 25 Strobe Mega All LEDs are lit in the secondary color, all LEDs flash in several short bursts in primary color \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 24 Strobe Rainbow Same as strobe, cycles through the rainbow \u22ee \ud83c\udfa8 Bg Speed 166 Sun Radiation The sun! Doesn't support segments. \u25a6 Variance, Brightness 104 Sunrise Simulates a gradual sunrise or sunset. Speed sets: 0 - static sun, 1 - 60: sunrise time in minutes,60 - 120: sunset time in minutes - 60, above: \"breathing\" rise and set \u22ee \ud83c\udfa8 Time [min], Width 6 Sweep Switches between primary and secondary, switching LEDs one by one, start to end to start \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 36 Sweep Random Like Sweep, but uses random colors \u22ee \ud83c\udfa8 Speed 175 Swirl Several blurred circles. Looks good with pink plasma palette. Supports AGC. \u25a6 \u266a \ud83c\udfa8 Bg Swirl Speed, Sensitivity, Blur 116 TV Simulator TV light spill simulation \u22ee Speed, Intensity 173 Tartan Plaid pattern of horizontal and vertical bands. Makes a great kilt. \u25a6 \ud83c\udfa8 X scale, Y scale, Sharpness 44 Tetrix Falling blocks stack \u22ee \ud83c\udfa8 Fx, Bg Speed, Width, One color 13 Theater Pattern of one lit and two unlit LEDs running \u22ee \ud83c\udfa8 Fx, Bg Speed, Gap size 14 Theater Rainbow Same as Theater but uses colors of the rainbow \u22ee \ud83c\udfa8 Bg Speed, Gap size 35 Traffic Light Emulates a traffic light \u22ee \ud83c\udfa8 Bg Speed, US style 56 Tri Fade Fades the whole strip from primary color to secondary color to off \u22ee \ud83c\udfa8 1, 2, 3 Speed 55 Tri Wipe Like Wipe but turns LEDs off as \"third color\" \u22ee \ud83c\udfa8 1, 2, 3 Speed 17 Twinkle Random LEDs light up in the primary color with secondary as background \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 81 Twinklecat Twinkling with fast in / slow out \u22ee \ud83c\udfa8 Speed, Twinkle rate 80 Twinklefox FastLED gentle twinkling with slow fade in/out \u22ee \ud83c\udfa8 Speed, Twinkle rate 106 Twinkleup Twinkle effect with fade-in \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 50 Two Dots Two areas sweeping \u22ee \ud83c\udfa8 1, 2, Bg Speed, Dot size, Overlay 113 Washing Machine Spins, slows, reverses directions \u22ee \ud83c\udfa8 Speed, Intensity 140 Waterfall A volume AND FFT version of a Waterfall that has 'beat' support. \u22ee \u266b \ud83c\udfa8 Fx, Bg Speed, Adjust color, Select bin, Volume (min) 165 Waverly \u263e \u25a6 \u266a \ud83c\udfa8 Amplification, Sensitivity, No Clouds, Sound Pressure, AGC debug 184 Wavesins Beat waves and phase shifting. Looks OK in 2D'ish as well. \u22ee \ud83c\udfa8 Fx Speed, Brightness variation, Starting color, Range of colors, Color variation 127 Waving Cell If a bunch of eucaryotes went to a sports stadium and did the wave, it would look exactly like this. \u25a6 \ud83c\udfa8 Speed, Amplitude 1, Amplitude 2, Amplitude 3 3 Wipe Switches between primary and secondary, switching LEDs one by one, start to end \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 4 Wipe Random Same as Wipe, but uses random colors \u22ee \ud83c\udfa8 Speed 207 Y\ud83d\udca1Big_Caleido \u263e \u25a6 Speed 224 Y\ud83d\udca1Caleido1 \u263e \u25a6 Speed 223 Y\ud83d\udca1Caleido2 \u263e \u25a6 Speed 222 Y\ud83d\udca1Caleido3 \u263e \u25a6 Speed 226 Y\ud83d\udca1Center_Field \u263e \u25a6 Speed 228 Y\ud83d\udca1Chasing_Spirals \u263e \u25a6 Speed 197 Y\ud83d\udca1Complex_Kaleido \u263e \u25a6 Speed 196 Y\ud83d\udca1Complex_Kaleido_2 \u263e \u25a6 Speed 195 Y\ud83d\udca1Complex_Kaleido_3 \u263e \u25a6 Speed 194 Y\ud83d\udca1Complex_Kaleido_4 \u263e \u25a6 Speed 193 Y\ud83d\udca1Complex_Kaleido_5 \u263e \u25a6 Speed 192 Y\ud83d\udca1Complex_Kaleido_6 \u263e \u25a6 Speed 225 Y\ud83d\udca1Distance_Experiment \u263e \u25a6 Speed 216 Y\ud83d\udca1Hot_Blob \u263e \u25a6 Speed 221 Y\ud83d\udca1Lava1 \u263e \u25a6 Speed 189 Y\ud83d\udca1Module_Experiment1 \u263e \u25a6 Speed 48 Y\ud83d\udca1Module_Experiment10 \u263e \u25a6 Speed 188 Y\ud83d\udca1Module_Experiment2 \u263e \u25a6 Speed 171 Y\ud83d\udca1Module_Experiment3 \u263e \u25a6 Speed 169 Y\ud83d\udca1Module_Experiment4 \u263e \u25a6 Speed 161 Y\ud83d\udca1Module_Experiment5 \u263e \u25a6 Speed 151 Y\ud83d\udca1Module_Experiment6 \u263e \u25a6 Speed 142 Y\ud83d\udca1Module_Experiment7 \u263e \u25a6 Speed 114 Y\ud83d\udca1Module_Experiment8 \u263e \u25a6 Speed 53 Y\ud83d\udca1Module_Experiment9 \u263e \u25a6 Speed 190 Y\ud83d\udca1Parametric_Water \u263e \u25a6 Speed 213 Y\ud83d\udca1Polar_Waves \u263e \u25a6 Speed 212 Y\ud83d\udca1RGB_Blobs \u263e \u25a6 Speed 211 Y\ud83d\udca1RGB_Blobs2 \u263e \u25a6 Speed 210 Y\ud83d\udca1RGB_Blobs3 \u263e \u25a6 Speed 209 Y\ud83d\udca1RGB_Blobs4 \u263e \u25a6 Speed 208 Y\ud83d\udca1RGB_Blobs5 \u263e \u25a6 Speed 229 Y\ud83d\udca1Rotating_Blob \u263e \u25a6 Speed 206 Y\ud83d\udca1SM1 \u263e \u25a6 Speed 198 Y\ud83d\udca1SM10 \u263e \u25a6 Speed 205 Y\ud83d\udca1SM2 \u263e \u25a6 Speed 204 Y\ud83d\udca1SM3 \u263e \u25a6 Speed 203 Y\ud83d\udca1SM4 \u263e \u25a6 Speed 202 Y\ud83d\udca1SM5 \u263e \u25a6 Speed 201 Y\ud83d\udca1SM6 \u263e \u25a6 Speed 200 Y\ud83d\udca1SM8 \u263e \u25a6 Speed 199 Y\ud83d\udca1SM9 \u263e \u25a6 Speed 220 Y\ud83d\udca1Scaledemo1 \u263e \u25a6 Speed 214 Y\ud83d\udca1Slow_Fade \u263e \u25a6 Speed 218 Y\ud83d\udca1Spiralus \u263e \u25a6 Speed 217 Y\ud83d\udca1Spiralus2 \u263e \u25a6 Speed 191 Y\ud83d\udca1Water \u263e \u25a6 Speed 227 Y\ud83d\udca1Waves \u263e \u25a6 Speed 219 Y\ud83d\udca1Yves \u263e \u25a6 Speed 215 Y\ud83d\udca1Zoom \u263e \u25a6 Speed 170 Y\ud83d\udca1Zoom2 \u263e \u25a6 Speed 187 \u2699\ufe0f ARTI-FX \u263e \u22ee \ud83c\udfa8 Fx Speed, Intensity, Custom 1, Custom 2, Custom 3 \u22ee \ud83c\udfa8 Fx Speed, Intensity, Custom 1, Custom 2, Custom 3"},{"location":"features/effects/#retired-effects","title":"Retired Effects","text":"Some effects get retired when they can be recreated with newer, more general effects.
Removed Effect Replacement Retired After Candy Cane Chase 2 - red/white 0.14.0 Dissolve Rnd Dissolve 0.14.0 Dynamic Smooth Dynamic 0.14.0 Halloween Chase 2 0.14.0 Merry Christmas Chase 2 - red/green 0.12.0 Police Two Dot 0.14.0 Police All Two Dots - red/blue w/ full intensity 0.13.0 Two Areas Two Dots - full intensity 0.13.0"},{"location":"features/ethernet-lan/","title":"Ethernet (LAN) compatibility","text":""},{"location":"features/ethernet-lan/#introduction","title":"Introduction","text":"WLED controllers are usually integrated into local network wirelessly (via WiFi). But there is also possibility to integrate WLED Controller into your network via Ethernet (LAN). Currently only ESP32 based controllers support Ethernet (classic, NOT new types like -S2, -C3, -S3 etc.).
"},{"location":"features/ethernet-lan/#preconditions-and-important-notes","title":"Preconditions and important notes","text":"Go to \"Config\" and then to \"WiFi Setup\". At the bottom of this page select the Ethernet type you use. Then click on \"Save & Connect\". Ready!
"},{"location":"features/ethernet-lan/#ethernet-controllers-and-adapters-supported-by-wled-as-of-november-2023","title":"Ethernet controllers and adapters supported by WLED (as of November 2023)","text":"Note: all controllers use GPIOs 19, 21, 22, 25, 26, 27 as they are required for ethernet and can not be changed. GPIOs additionally used are given in the table.
Name Features additional GPIOs used ABC! WLED V43 & compatible Isolated shield in accordance with IEEE 802.3 standard; LAN8720 based with proper reset line; adapter developed as Plug& Play solution for ABC! WLED Controller V43 but also might be used with other ESP32 boards 5, 17, 23, 33 ESP32-POE General purpose controller with integrated Ethernet 12, 17, 18, 23 ESP32Deux 17, 18, 23 KIT-VE Board from Espressif (ESP microcontroller manufacture company) 0, 5, 18, 23 QuinLED-Dig-Octa & T-ETH-POE 17, 18, 23 QuinLED-ESP32 5, 17, 18, 23 Serg74-ETH32 5, 17, 18, 23 TwilightLord-ESP32 5, 17, 18, 23 WESP32 0, 16, 17 WT32-ETH01 0, 16, 18, 23"},{"location":"features/macros/","title":"Macros","text":"Info
Also see Presets for 0.11.0+.
You are able to set custom actions (\"Macros\") in Time & Macro settings for the following events:
&M=
Boot preset
in 0.11)Each macro has the format of a standard HTTP API call without the IP. Optionally, the \"win&\" may be omitted. For example, the macro \"A=255\" sets the brightness to maximum. \"R=255&G=160&B=0\" sets the color to orange. You can specify up to 16 macros. (up to 250 in WLED 0.11 since the Macro functionality has been merged into the Presets feature)
Examples of how to use API-calls and define macros can be found in this issue and in this one.
The simplest macro example is getting a button to do your bidding. The default pin to which a button can be connected is GPIO 0 (D3 on NodeMCU, D1 Mini and others). Even though WLED uses the internal pull up resistors on input pins, this pin is ideally externally pulled high to 3.3V with a 10k resistor. The configured macro executes when the pin is pulled low (grounded). The desired macro is entered on the Time/Macros configuration page and then assigned to a short, long or double press. Like this:
The \"T=2\" macro toggles power to the LEDs (in this case long press). The \"FX=~\" macro steps through the effects (in this case short press).
You can set a preset to P1=1&P2=3&PL=~
, enter the preset number for your button, and this will step through presets 1 and 3. Change the \"3\" to whatever your highest preset is that you want to include.
The default (built-in) actions for button 0 are short-press: toggle on/off and long-press: select random color. Long-pressing for more than 6 seconds will open the WLED-AP with the default password (wled1234
). For further buttons, the default action for short press is cycling effects, long press ramp brightness, and double press cycle palettes.
Multiple buttons are implemented since 0.13 and allow a few different types of buttons to be connected to the ESP:
Button GPIO pin and type can be selected in the LED Settings page.
Each momentary button can have 3 different Presets assigned, for short press, long press or double press. Momentary push-buttons by default trigger shortly after the release of a button, to be able to detect if it has been pressed short, long or twice. When configuring the same preset number for short, long and double press, it will trigger directly when being pressed as of WLED 0.14.0-b2-2306020.
For switch type buttons you can assign only 2 presets, one for transition of switch from LOW to HIGH and second for the opposite transition from HIGH to LOW.
Selecting 0 for preset will use the default action. If you find that the default action is inverted for switch, please create presets for On and Off actions and assign them appropriately.
For assigning Presets to buttons use Time & Macros settings page.
Note: Button 0 has two, built-in functions. 1. Hold it down for >6 seconds and the Wi-Fi settings will be reset to default. 2. Hold it down for >12 seconds and flash memory is erased.
"},{"location":"features/macros/#analog-button","title":"Analog button","text":"Starting in WLED 0.13, analog \"buttons\" (e.g. a potentiometer) are supported. With the Short and Long columns set to 0, set the Double column in Button Actions to one of these values to configure:
Property Value Global brightness 250 Effect speed 249 Effect intensity 248 Palette 247 Primary color hue 200 Segment N opacity 0-32This potentiometer should be supplied 3.3V and GND, with it's output supplied to A0 (or any other ADC pin you specify), recommended 10K\u03a9 or greater.
Do not use ESP32 ADC2 GPIO pins for analog buttons
On ESP8266, you can only have a single analog button on pin A0, the pin set in the settings UI is ignored. On ESP32, only ADC1 pins will work for analog input while WiFi is active (pins 32-39). ADC2 pins will not work.
"},{"location":"features/macros/#global-brightness","title":"Global brightness","text":"Users planning to use a potentiometer for global brightness should be aware that wled is configured to turn off when the potentiometer is adjusted to either extreme - both maximum and minimum adjustments. Users who desire to disable this functionality may do so on the hardware side by adding resistors between the potentiometer and the rails.
Adding a resistor between the potentiometer and 3.3V prevents A0 from fully reaching 3.3V and allows the potentiometer to be adjusted to the maximum adjustment without powering off wled. A value of 7.5%-10% of the potentiometer value should be sufficient for this (~750\u03a9 for a 10K\u03a9 potentiometer). Similarly, added resistance between the potentiometer and GND prevents A0 from reaching 0V, and allows the potentiometer to be adjusted to the minimum adjustment without powering off wled. A value of 3-5% of the potentiometer value should be sufficient (~500\u03a9 for a 10K\u03a9 potentiomenter).
In both instances, the added resistances will slightly reduce the overall adjustment range, with a larger reduction for larger resistor choices. As such, A user who desires the maximum possible adjustment range should determine their needed resistance values experimentally by installing the potentiometer, adjusting for stable behavior at the desired extrema, measuring the voltage on A0, using the voltage divider equation to determine the optimal resistance, then retesting for confirmation.
"},{"location":"features/multi-strip/","title":"Multi-strip Support","text":""},{"location":"features/multi-strip/#multi-strip-support","title":"Multi strip support","text":"Starting in WLED 0.12.0, you are able to use multiple LED outputs from one ESP board! Pins and LED numbers can be easily configured in LED settings, you don't need to re-compile code for your specific setup. Custom binaries for multiple pins are now also a thing of the past!
There are a few tips and recomendations to keep in mind when designing your setup:
"},{"location":"features/multi-strip/#general","title":"General","text":"See Virtual Leds
"},{"location":"features/palettes/","title":"Palettes","text":"Version Info
Beginning in 0.14 up to 10 Custom Palletes can be uploaded.
PaletteID Name Description 0 Default The palette is automatically selected depending on the effect. For most effects, this is the primary color 1 Random Cycle The palette changes to a random one every few seconds. Subject to change 2 Color 1 A palette consisting only of the primary color 3 Colors 1 & 2 Consists of the primary and secondary color 4 Color Gradient A palette which is a mixture of all segment colors 5 Colors Only Contains primary, secondary and tertiary colors 6 Party Rainbow without green hues 7 Cloud Gray-blueish colors 8 Lava Dark red, yellow and bright white 9 Ocean Blue, teal and white colors 10 Forest Yellow and green hues 11 Rainbow Every hue 12 Rainbow bands Rainbow colors with black spots in-between 13 Sunset Dark blue with purple, red and yellow hues 14 Rivendell Desaturated greens 15 Breeze Teal colors with varying brightness 16 Red & Blue Red running on blue 17 Yellowout Yellow, fading out 18 Analoguous Red running on blue 19 Splash Vibrant pink and magenta 20 Pastel Different hues with very little saturation 21 Sunset 2 Yellow and white running on dim blue 22 Beech Different shades of light blue 23 Vintage Warm white running on very dim red 24 Departure Greens and white fading out 25 Landscape Blue, white and green gradient 26 Beach Teal and yellow gradient fading out 27 Sherbet Bright white, pink and mint colors 28 Hult White, magenta and teal 29 Hult 64 Teal and yellow hues 30 Drywet Blue and yellow gradient 31 Jul Pastel green and red 32 Grintage Yellow fading out 33 Rewhi Bright orange on desaturated purple 34 Tertiary Red, green and blue gradient 35 Fire White, yellow and fading red gradient 36 Icefire Same as Fire, but with blue colors 37 Cyane Desaturated pastel colors 38 Light Pink Desaturated purple hues 39 Autumn Three white fields surrounded by yellow and dim red 40 Magenta White with magenta and blue 41 Magred Magenta and red hues 42 Yelmag Magenta and red hues with a yellow 43 Yelblu Blue with a little yellow 44 Orange & Teal An Orange - Gray - Teal gradient 45 Tiamat A bright meteor with blue, teal and magenta hues 46 April Night Dark blue background with colorful snowflakes 47 Orangery Orange and yellow tones 48 C9 Christmas lights palette. Red - amber - green - blue 49 Sakura Pink and rose tones 50 Aurora Greens on dark blue 51 Atlantica Greens & Blues of the ocean 52 C9 2 C9 plus yellow 53 C9 New C9, but brighter and with a less purple blue 54 Temperature Temperature mapping 55 Aurora 2 Aurora with some pinks & blue 56 Retro Clown Yellow to purple gradient 57 Candy Vivid yellows, magenta, salmon and blues 58 Toxy Reaf Vivid aqua to purple gradient 59 Fairy Reaf Bright aqua to purple gradient 60 Semi Blue Dark blues with a bright blue burst 61 Pink Candy White, pinks and purple 62 Red Reaf Blue, aqua and red gradient 63 Aqua Flash Aqua gradient with a flash of yellow and white 64 Yelblu Hot Yellow, red, blue spectrum 65 Lite Light Faint white and purple 66 Red Flash Red gradient with burst of white in the center 67 Blink Red Dark blue to dark red gradient with burst of purple 68 Red Shift Vibrant yellow to blue gradient with magenta, purple and red 69 Red Tide Waves of yellow, orange and red 70 Candy2 Faded gradient of yellow, salmon and blue 71 Audio Responsive Ratio \ud83c\udf1c\ud83c\udfb8 Dynamic palette based on FFT audio analysis - sets the RGB value based on the relative amplitude of different frequencies 72 Audio Responsive Hue \ud83c\udf1c\ud83c\udfb8 Dynamic palette based on FFT audio analysis - sets the hue based on that frequency 73 Audio Responsive Ramp \ud83c\udf1c\ud83c\udfb8 Dynamic palette based on FFT audio analysis - palette that starts with black, but color based on audio data ### Custom PalettesAs of 0.14, up to 10 custom palettes can be uploaded by the user in JSON files named palette0.json
through palette9.json
The format closely resembles that of the palettes defined in palettes.h
with a position (0-255), red, green, blue for each color. An example of the content would be:
{\"palette\":[ \n 0, 255, 33, 4, \n 43, 255, 68, 25,\n 86, 255, 7, 25,\n 127, 255, 82, 103,\n 170, 255, 255, 242,\n 209, 42, 255, 22,\n 255, 87, 255, 65]}\n
Once a palette[0-9].json file has been created, it can be uploaded to the controller using the /edit
page (http://[controller-ip]/edit). The controller must be rebooted (/win&RB
) before the newly uploaded palettes will be available. After reboot, the custom palette(s) will be named ~ Custom [0-9] ~
in the Palettes section of the user interface.
The Pixel Art Converter tool aims to make it easier to show pixel art on a LED matrix panel, by converting any image to 2D pixel art and sending it to the WLED device. The file types PNG, JPG, WEBP and GIF have been tested to work with the tool.
"},{"location":"features/pixel-art-converter/#installation-approaches","title":"Installation Approaches","text":"There are three ways to install the pixel art converter:
pixartmin.htm
from the WLED-PixelArtConverter repositorypixartmin.htm
in a browserCompilation required
Compiling WLED from the source code is required. Follow the instructions on compiling WLED to do this.
-D WLED_ENABLE_PIXART
under the line that starts with build_flags =
in platformio_override.ini
Network connection
A network connection is required to connect to the CDN, hosting the JS library Ace, an embedded code editor.
pixartmin.html
file from the WLED-PixelArtConverter repositoryhttp://[device_ip_address]/edit
pixartmin.html
file using the UIhttp://[device_ip_address]/pixartmin.html
2D LED panels are natively supported by WLED but need some configuration for the software to show the 2D grid correctly.
2D Configuration
settings menu in WLED2D Matrix
Serpentine option
Setting the serpentine LED panel option incorrectly can lead to very confusing results that look almost correct but not quite. Enabling or Disabling the option depends on the characteristics of the 2D matrix
"},{"location":"features/pixel-art-converter/#usage","title":"Usage","text":"The Pixel Art Generator does not yet have a link in the WLED front-end, therefore head over to the web page: http://[device_ip_address]/pixart.htm
(default DHCP IP-address link).
On the web page:
Select an image that should be shown on the matrix display
This example uses a 16x16 pixel, happy version of the WLED mascot Akemi by Aircoookie.
A preview is displayed further down the web page.
Scaling option
It can help to use the Scale image
option, depending on the image size used.
Click on \"Send to device\" to push the generated image to the WLED device.
Presets can be used to save your favorite light configurations to apply later! You can compare them to the \"scenes\" feature present in some other smart devices.
"},{"location":"features/presets/#new-version-011","title":"New version (0.11+)","text":""},{"location":"features/presets/#overview","title":"Overview","text":"WLED 0.11.0 contains a major overhaul of presets, storing them in a /presets.json
file in an internal filesystem. This enables many new features, you can now have up to 250 presets and each of them can save all segments which are set up! Speaking of segments, the maximum number has been increased to 12 on ESP8266 and 16 on ESP32! Presets can now also contain both HTTP and JSON API commands, replacing the previous Macro functionality. Each preset can be named, so you'll be able to access it more easily!
The new preset system is quite a bit more advanced than the previous one, thus it is likely not as self-explanatory to use. Here you can find what each setting does and how to make best use of it!
\"Create Preset\" button Use this to save the current state as a permanent preset, or to add a new API macro.
Preset name Enter a nice name for your preset here. I would recommend putting something short, but to the point here, like Epic fireworks
or Slow fade
. All special characters and emoji are permitted (however, there must not be more than 6 consecutive whitespaces) If you leave this empty, you'll get a name based on the preset ID number, like Preset 16
.
Quick load label You can optionally add a short label up to 2 characters or 1 emoji long. It will show up in a small circle on top of the preset list for extra quick access without scrolling! I recommend using this for the presets you truly love.
Use current state/Overwrite with state This is enabled by default when adding a new preset and disabled when editing an existing preset. When enabled, it will write the current segment config, including all colors and effect, to the preset. When disabled, it will instead give you a textfield to enter a custom API command or show you the command currently saved.
Include brightness If disabled, the brightness value is not included in the preset. This can be useful e.g. when you want to control the brightness manually and want the preset to only set the effect.
Save segment bounds This is an important one. Make sure it is enabled for your boot preset, so that your segment config is properly restored on boot! When disabled, the segment start and stop LEDs are not included in the preset. This can be useful if you plan to make changes to your segment setup and don't want your presets to always reset it to the point it was when the preset was saved.
API command This accepts any HTTP or JSON API command! (only visible if the current state checkbox is unchecked) It replaces the previous macro functionality. If you know your JSON, you can even create playlists of other presets!
Some basic examples of API commands:
HTTP API JSON API Description T=2 {\"on\":\"t\"} Switch between on and off state (toggle). So when LEDs are off, they turn on and vice versa. T=1 {\"on\":true} The LEDs turn on (or no change if they were already on) T=0 {\"on\":false} The LEDs are switched off (or no change if they were already off) n.a. {\"on\":true, \"tt\":0} The LEDs are switched on, the LEDs light up immediately without slowly dimming, regardless of the global setting \u201eTransition\u201c. A=128 {\"bri\": 128} The brightness is set to 50%. Minimum value is 0, maximum value (100%) is 255. Therefore 128 means the brightness of 50% A=~10 {\"bri\":\"~10\"} The brightness is increased by 10. So if this was 100 before, it will be 110. A=~-20 {\"bri\":\"~-10\"} The brightness is decreased by 20. So if this was 100 before, it will be 80. R=255&G=0&B=0 {\"seg\":[{\"col\":[[255,0,0]]}]} The color of LEDs is set to red R=0&G=255&B=0&A=128&FX=0 {\"seg\":[{\"fx\":0, \"col\":[[0,255,0]]}], \"bri\":128} The color of LEDs is set to green, brightness to 50% (value 128) and effect to solid (FX=0) P1=1&P2=3&PL=~ {\"ps\":\"1~ 3~\"} Iterate between presets with IDs 1 to 3: When called up, the next preset is called up and so on in cycle: 1->2->3->1->2->3->1->\u2026Save to ID This is the ID the preset will be saved to. When creating a new preset, you likely won't have to change it as the lowest unused ID will be chosen automatically. If you change the ID on an existing preset and save, you can copy it to the new ID - change the name though.
Save and Delete buttons Now these are self-explanatory, but I said I'd cover each point :)
ID This is the number you'll want to use to apply this preset from a timed macro or automation!
"},{"location":"features/presets/#a-note-on-performance","title":"A note on performance","text":"This new preset system is quite fast where it matters, reading the presets. Applying a preset will typically take less than a tenth of a second.
However, due to a design choice of the LittleFS filesystem used by WLED, random writes to the preset file are very resource intensive. This means that while updating your presets, you might notice your light freezing and becoming unresponsive for up to a few seconds. Adding new presets is usually very fast, those performance issues will occur once you delete/edit/overwrite older presets and your preset file becomes very large, or when adding presets after deleting older ones.
I'm looking into ways to mitigate this situation as soon as possible! Meanwhile, to keep things snappy, I would recommend not having more than 50-ish single segment or a dozen of multi-segment presets.
"},{"location":"features/presets/#what-about-my-cool-presets-from-earlier-versions","title":"What about my cool presets from earlier versions?","text":"Don't worry, they (as well as your settings) will be automatically imported to the new system! And if you ever need to downgrade to v0.10 for some reason, they will still be there (although any changes made in v0.11 won't be applied)
"},{"location":"features/presets/#obtaining-preset-list","title":"Obtaining preset list","text":"Obtaining the preset list is possible with the /presets.json file Seeing the name of the current preset with the API only is not possible, you can only obtain its ID. Then you'd need some code to match it with the entries from presets.json (this is also what the UI does). See section \"Backing up/restoring presets\".
"},{"location":"features/presets/#saving-named-presets","title":"Saving named presets","text":"Save a named preset with {\"psave\":<preset number here>;\"n\":\"Preset name\",\"ib\":true,\"sb\":true}
To backup all presets, go to [WLED-IP]/edit
(OTA lock must be off), right click the presets.json
file and download! To restore, use the Choose file
and Upload
buttons.
Tip
If you want to create a preset that turns on the light to the last effect displayed, uncheck Use current state
and enter T=1
into the API Command field.
WLED supports schedules - that is, applying presets at a certain time automatically. Here is a simple guide to get it set up quickly!
Time & Macros
section in the WLED settings. Time-controlled presets
. There are 8 different timer slots available. Preset
column, enter the preset ID you noted earlier. -Hours are measured with the 24-hour clock, where midnight is 0:00. Entering \"24\" will instead activate the preset hourly.Note
This only applies the preset at the start of the specified minute. If you set up two presets, one to turn on the light at 7 and another to turn it off at 8, if WLED is booted at 7:30, the light will not turn on. This should not be an issue in most applications.
"},{"location":"features/presets/#applying-presets-at-sunrise-and-sunset","title":"Applying presets at sunrise and sunset","text":"Applying a preset at sunrise and/or sunset is also supported, the last two timed preset slots are used for this. To calculate the times, WLED needs your location. This is possible with the \"Get Location\" button in Time & Macro settings if accessed via a browser. If you are using the WLED app, you will need to open locate.wled.me in your browser and copy the coordinates over to the settings page manually. With the Minutes input field, you may specify an offset of up to 59 minutes before or 59 minutes after the actual sunrise/set time.
Location
Sunrise and sunset calculation do not work if you live in the polar circles (latitude >66.6N or >66.6S).
"},{"location":"features/presets/#earlier-versions-up-to-010","title":"Earlier versions (up to 0.10)","text":"There are 16 preset slots in total. In 0.9.0, the last preset (16) is capable of saving the entire segment configuration. All other presets only save a single segment (main segment, the first one by default) and restore that preset to all selected segments.
In the Favorites tab, the number buttons from 1-16 are the different save slots. Find a config you like, then toggle Saving mode on and click on a number to save the preset to that slot. If Saving mode is toggled off, you can restore presets with a single click.
"},{"location":"features/presets/#preset-cycle-up-to-0121","title":"Preset cycle (up to 0.12.1)","text":"With this feature, you can create an animation by automatically swapping between presets within a specified range. Keep in mind that any changes you make to effects/colors will be overridden once the system applies the next preset.
If you want to start the preset cycle on boot, go to LED settings and tick \"Save current preset cycle configuration as boot default
To modify the duration of the preset cycle, ensure the preset cycle box is unchecked before entering a new time value. Once updated, the preset cycle can be enabled again\"
Playlists supersede Preset cycle in 0.13.
"},{"location":"features/relay-control/","title":"Control a Relay","text":"Digital LED strips still use power when seemingly switched off, about 1W per 200 LEDs. In case you want to prevent that, you can completely cut power to the LEDs by adding a relay to your circuit. It is toggled by WLED when WLED is turned on/off (in the UI, or through other interfaces). No pin is allocated for a relay by default, but can be easily set in the LED preferences page. Previously, GPIO12 (Pin D6 on many devices) was set as the default and is confirmed to work well on most boards except the ESP32-C3.
When you decide that you want WLED to control a relay, make sure you buy a suitable relay board. Check what voltage you can supply from your controller to relay (available 3.3V or 5V pin or different voltage from external power source), and make sure the relay can be controlled by voltage level your board is providing (3.3V CMOS, 5V TTL). Note, some relays come with a jumper that lets you configure whether the relay switches at high or low level of signal, giving you maximum flexibility.
This page gives a clear description using a light bulb instead of a LED strip. And instead of the D1 mentioned there, with WLED, you use the pin you set.
The default WLED behavior is to turn the relay pin on (high) when the LEDs are on and off (low) when the LEDs are off. This can be changed in the LED Preferences page. Many relays are powered when the signal is LOW. See this thread.
Sometimes people ask whether they can control more than one relay through WLED, including controlling this all via Alexa. Controlling an extra relay separately from the RGB lights is not something WLED is designed to do, however you can modify the code to add that functionality. For that, make sure you can compile WLED from source unmodified first. Then, change #define ESPALEXA_MAXDEVICES 1 in line 71 of the wled.h file to 2. After that, just follow the API documentation on https://github.com/Aircoookie/Espalexa to add a new EspalexaDevice to the alexa.cpp file
Second option for controlling multiple relays is using a Multi Relay usermod. As with Alexa you will need to compile WLED from source an include Multi Relay usermod either by including -D USERMOD_MULTI_RELAY
in PlatformIO.ini or adding #define USERMOD_MULTI_RELAY
in wled.h
or my_config.h
. You can also override default number of relays by defining MULTI_RELAY_MAX_RELAYS
. Configuring usermod is done using Usermod settings page where you can define GPIO pins used, wether relay activates on HIGH or LOW logic, if the activation has any delay and if the relay can be controlled from the outside using MQTT message (external). MQTT topic for controlling relays is wled/[device]/relay/[relay_id]/command
and accepts on
, off
and toggle
messages. When the relay changes state a message with on
or off
is sent with the topic wled/[device]/relay/[relay_id]
.
How To: Use WLED to switch external relay with PIR sensor without affecting WLED state
If you do not want PIR (motion) sensor attached to WLED controller to trigger change of WLED state, but still want to control a legacy light, fan, etc. use the Multi Relay usermod and another relay attached to WLED controller. Create two presets for relay control (shown for switching relay off) and set up PIR and multi relay usermods as shown.
If you do not want button relay control just leave relay button at -1, the same goes for PIR sensor parameters (leave nighttime-only and/or off-only unchecked). Adjust preset numbers and GPIO pins to your liking. Multi relay usermod can also switch relay using MQTT messages or HTTP requests (check source code for available commands). Of course if you configured MQTT on your WLED device PIR sensor usermod will publish /motion topic to MQTT broker for your HA integration.
"},{"location":"features/segments/","title":"Segments","text":"Info
Starting in WLED 0.9.0, Segments are supported.
This feature allows you to set different zones on the LED strip, each running a different effect or color.
A segment is selected if the checkmark next to the segment number is checked. Changes you make to color or effects will apply to all selected segments. The color/effect that is shown in the web UI is that of the first selected segment.
There is one main segment, Segment 0 by default. This segment has a few important differences to the rest of the segments:
Tip: If you divide your strip into two segments, reverse the second one and select both, you can achieve very nice symmetrical effects!
Segment 0 has a Start LED of 0 and a Stop LED equal to the LED Count you defined in Configuration, LED Preferences. The Stop LED is not included in the Segment. Currently you can create a maximum of 10 segments. Presets 1-15 use only Segment 0 by default. Preset 16 is the only Preset that saves settings for Segments 1-10.
To display segment information select the down arrow in the Segment box. To add a Segment select \u201c+ Add Segment\u201d. Enter the Start and Stop LED as appropriate. Grouping and Spacing control the organization of the LEDs within the selected effect. To reverse the direction of an effect select Reverse Direction. To delete a Segment select the trash can. To save your Segment settings select the checkmark to the right of the Start and Stop LED numbers.
"},{"location":"features/segments/#grouping-and-spacing","title":"Grouping and Spacing","text":"When an effect changes the color of one LED, it is really changing the color of one LED group. Since the default group size is one, the effect normally only changes a single LED. When Grouping is set to two, the effect will light two LEDs using the same color. The two LEDs are treated as a single virtual LED.
To illustrate this, we can create a segment with 12 LEDS (physically referred to as LED 0 to LED 11) and select an effect that repeats three colors. When Grouping is set to one we see a repeating pattern of one red LED, one blue LED, and one green LED. When Grouping is set to two the segment of 12 physical LEDs becomes a segment of 6 virtual LEDs (virtualLED 0 to virtualLED 5). The same effect will now set the color of each virtual LED (which consists of two physical LEDs). The pattern becomes two red LEDs followed by two blue LEDs then two green LEDs.
Setting LED Output Grouping 1 Spacing 0 Grouping 2 Spacing 0As the pattern cycles, the group of LEDs will move together.
Setting LED Output Grouping 1 Spacing 0 Grouping 2 Spacing 0Spacing controls the space or gap between LEDs. The default spacing is zero, so normally there is no space between LEDs. When Spacing is set to one, every other LED will be lit. The number of virtual LEDs in the strip will be half the number of physical LEDs.
Again, we can create a segment with 12 LEDS (physically referred to as LED 0 to LED 11) and select an effect that repeats three colors. When Spacing is set to zero we see a repeating pattern of one red LED, one blue LED, and one green LED. When Spacing is set to one the segment of 12 physical LEDs becomes a segment of 6 virtual LEDs (virtualLED 0 to virtualLED 5). The same effect will now set the color of each virtual LED (which consists of the even numbered physical LEDs). The pattern becomes one red LED followed by a blank LED, one blue LED followed by a blank LED, then one green LED followed by a blank LED.
Setting LED Output Grouping 1 Spacing 0 Grouping 1 Spacing 1As the pattern cycles, only the virtual LEDs will be lit - the blank LEDs in between the virtual LEDs will always be off.
Setting LED Output Grouping 1 Spacing 0 Grouping 1 Spacing 1Grouping and Spacing can be combined to create many different custom LED layouts. In the example below, the strip of 12 physical LEDs has been configured to function as four virtual LEDs with a small gap between them.
Setting LED Output Grouping 2 Spacing 1 Grouping 2 Spacing 1"},{"location":"features/segments/#interleaving","title":"Interleaving","text":"This is an easy way to get a repeating pattern of colors using one segment per color.
"},{"location":"features/segments/#offset-in-a-segment","title":"Offset in a segment","text":"By default effects start in the first LED in the segment and finish in the last one. If the offset parameter in a segment is used, the effect start will be moved by the number of positions entered. It will continue to the last LED and then finish with the initial positions that were skipped.
For instance, let's assume assume a strip of 12 LEDs with the positions numbered as follows (like the examples above):
An offset value of 5 will make the effect start in the physical position 5, continue to position 11 and then finish with positions 0 through 4, like this:
A negative offset value is allowed and represents an offset starting from the last position in the segment. In our previous example, an offset of -2 will start the effect in position 10, like this:
The offset values is prioritized over grouping and/or spacing. For example, if the offset is 2, grouping 4 and spacing 1, the first group of 4 LEDs will start at the physical position number 2.
"},{"location":"features/segments/#effect-overlay","title":"Effect Overlay","text":"Some effects can be overlaid on the background of another effect. To use overlay, set up segments with overlapping pixels. The overlay effect must be playing on the segment with the higher id. If the Overlay option is checked, the background will not be painted and the effect from the lower segment will be displayed.
"},{"location":"features/settings/","title":"Settings","text":"Web-configurable settings are split in multiple sub-pages. This page is meant to clarify the purpose of each setting.
"},{"location":"features/settings/#wifi-settings","title":"WiFi Settings","text":"This sub-page offers options to connect the ESP to different WiFi/WLAN devices. (This section applies to WLED 0.8.5.)
Setting name Value Range Description Network Name String 0..32 The name (SSID) of your home WiFi. Spaces and some other characters are not supported. Network password String 0..64 The password of your home WiFi Static IP 4x 0..256 An optional static IPv4 address Static gateway 4x 0..255 In a static config, your gateway's IPv4 address Static subnet 4x 0..255 In a static config, this normally is 255.255.255.0 mDNS address String 0..32 Name of your device for the Bonjour/Zeroconf protocol Client IP - The current IP of the ESP in the home network AP SSID String 0..32 The name of the ESPs internal WiFi hotspot (Access Point) Hide AP name Y/N The ESPs Access Point won't appear in WiFi lists of other devices AP password String 0..64 The password of the ESPs WiFi Access Point AP WiFi channel 1..13 The 2.4G WiFi band of the AP. For advanced users AP opens select Condition on when to open the AP AP IP - The Access Point IPv4 address of the ESP (is 192.168.4.1 in most cases) WiFi sleep Y/N Disabling WiFi sleep can increase reliability, but increases power consumption"},{"location":"features/settings/#led-preferences","title":"LED Preferences","text":"This sub-page configures your LED & Hardware setup. (This section applies to WLED 0.14.1.)
Setting name Value Range Default Description Enable automatic brightness limiter on/off on Have WLED automatically reduce overall brightness so that maximum current draw from the power supply stays below a specified level Maximum current 300\u201365000 mA 850 mA Maximum allowable current draw that WLED will target [only appears if \"Enable automatic brightness limiter\" is on] LED voltage multiple options \"5V default (55mA)\" Voltage/type of LEDs [only appears if \"Enable automatic brightness limiter\" is on] Custom max. current 1\u2013255 50 Current draw of a single LED pixel set to full white [only appears if \"LED voltage\" is set to \"Custom\"]"},{"location":"features/settings/#hardware-setup","title":"Hardware Setup","text":""},{"location":"features/settings/#led-outputs","title":"LED outputs","text":"WLED supports multiple outputs. To add an output, click the plus button at the bottom of the \"LED outputs\": section; to remove the last output, click the minus button. Bellow the plus/minus buttons is an indication of how much of the memory allocated to LEDs is being used by the configuration.
All outputs share the same address space within WLED. By default, the first pixel of an output will be given an address that is one higher than the last pixel of the previous output, but this can be altered.
Each output has the following settings:
Setting name Value Range Default Description Type (represented by the output's number) multiple options WS281x Select the type of LEDs this output will be controlling Color order muliple options \"GRB\" Select which order your LEDs process color information (e.g. if your LEDs display red and green swapped, try changing it) [only appears if \"Type\" is set to a type that supports color order] Start/Index integer cummulative length of all previous outputs Define which address this output (or its first pixel) should use within WLED's address space [only editable if \"Custom bus start indices\" is on] Length integer 1 Define how many pixels are connected to this output [only appears if \"Type\" is set to a type that supports multiple pixels] (Data/Clk) GPIO(s) integer (blank) Tell WLED which GPIO pin(s) this output is connected to [number and description of GPIO settings will depend on the output's selected type] Reversed (rotated 180\u00b0) on/off off Mirrors the LEDs (last LED is first) [only appears if \"Type\" is set to a type that supports multiple pixels] Skip first LEDs 0\u2013length 0 Will turn off the first one or more LEDs and shift those remaining by that number (e.g. if the first LEDs are only used as a signal repeater) [only appears if \"Type\" is set to a type that supports multiple pixels] Off Refresh on/off off (typically) WLED doesn't send out data if all of its outputs are off, but some pixels (notably TM1814) will go into a demo mode after a period of inactivity, and setting forces WLED to periodically send out additional \"off\" commands [only appears if \"Type\" is set to a type that supports multiple pixels; default is \"on\" if \"Type\" is set to \"TM1814\"] Inverted output on/off off Invert the output's state (i.e. if the output is bright when it's supposed to be dark, set this to \"on\") [only appears if \"Type\" is set to a type that supports output inversion] IP address IPv4 (blank) Set the IP address where the output data should be sent to [only appears if \"Type\" is set to a type that supports network output] Auto-calculate white chanel from RGB multiple options \"None\" Selects whether WLED should attempted to generate white-channel information for colors that are only defined as red, green, and blue values [only appears if \"Type\" is set to a type that has more than three color channels]The following settings apply to all LED outputs:
Setting name Value Range Default Description Make a segment for each output on/off off Will automatically create a segment for each output, including the correct Start LED and Stop LED settings Custom bus start indices on/off off When on, custom \"Start\" or \"Index\" values can be set for each output (e.g. output 2 can be set so that it shows up as LED address 200 regardless of output 1's length) Use global LED buffer on/off on (WLED-AC) Improves the performance of WLED-wide brightness controls (including Automatic Brightness Limiting) at the expense of additional memory usage (\ud83c\udf1c) Use global LED buffer on/off off (WLED-MM) Similar to WLED-AC, however does not improve color accuracy or brightness controls. it can be useful for \"stacking\" several effects onto each other.Additionally, one or more Color Order Overrides can be defined by clicking the plus button. This is useful when you have LEDs with two different color orders sharing the same output. The following settings are available for each override:
Setting name Value Range Default Description Start integer 0 Define which address this color override should start it Length integer 1 Define how many pixels in a row should have their color setting overridden Color order muliple options \"GRB\" Same as \"Color order\" above"},{"location":"features/settings/#other-settings","title":"Other settings","text":"(This section applies to WLED 0.8.5; some of these settings no longer appear in 0.14.1.)
Setting name Value Range Description Turn on after power up Y/N Whether the lights should turn on after a reset Apply preset 0..16 Preset to load at boot (0 = none) Use Gamma for brightness Y/N Will correct brightness changes to make it appear more linear. Advised to leave off Use Gamma for color Y/N Will correct colors to match those on a monitor. Strongly advised to keep on Brightness factor 1..255 Factor to change master brightness if it is to dim/bright for a certain configuration Crossfade Y/N Whether to have a smooth fading transitional effect when changing colors/brightness Transition time 0..65535 How many milliseconds the transition lasts Enable transition for secondary color Y/N Enable Palette transitions Y/N Enable transitions for palettes (not affected by transition time) Timed light duration 1..255 How long the nightlight should stay on Target brightness 0..255 What brightness the light should have after time is over. 0=off. Fade down Y/N Gradually fades down the light over the duration instead of turning it off at the end Palette blending select Choose how the palette wraps at the end (seam)"},{"location":"features/settings/#user-interface-settings","title":"User Interface settings","text":"This sub-page changes the look of the web interface. (This section applies to WLED 0.8.5.)
Setting name Value Range Description Server description String 1..32 The name of the device as shown on the top of the UI. Differs from Alexa device name Sync button toggles... Y/N If enabled, both send and receive are toggled by the button in UI. If disabled, only sending is toggled and receiving is kept as configured in Sync settings."},{"location":"features/settings/#sync-settings","title":"Sync settings","text":"This sub-page configures external software synchronization interfaces. (This section applies to WLED 0.8.5.)
Setting name Value Range Description On/Off button enabled Y/N Check if there is a physical pushbutton connected to GPIO0 Infrared receiver type select Type of infrared receiver Broadcast UDP port 1..65535 All WLED lights you want to group together must have the same port Receive Brightness Y/N If there is a sync notification, whether its brightness should be applied Color Y/N Whether the color of the synced device should be applied Effects Y/N Whether the effect settings should be applied Send on direct change Y/N Whether to send a sync notification when state changed via web UI or API Send on button press Y/N Whether to send sync when toggled by button or IR Send Alexa notifications Y/N Whether to send sync after changed by Alexa (you may use Alexa groups instead) Send Hue notifications Y/N Whether to send sync after a connected Philips light changed Send Macro notifications Y/N Whether to send sync after a macro was triggered Send notifications twice Y/N Sends notifications twice (if you have issues with UDP packet loss) Receive UDP realtime Y/N Receive live UDP stream data (DRGB, WARLS, ...) Use E1.31 multicast Y/N Listen on multicast IP instead of unicast E1.31 start universe 1..63000 Only applies for multicast. If you want to set different content, set ESPs at least 8 universes apart Timeout 100..65000 Time after which to resume normal mode once stream has stopped. 65000 will keep the data indefinitely Force max brightness Y/N Realtime stream with max. brightness (unless limited by power brightness limiter) Disable realtime gamma correction Y/N Check if your host software does gamma correction already Realtime LED offset -255..255 Shift the realtime input by how many LEDs Emulate Alexa device Y/N Allows you to control the light via the Amazon Echo voice assistant. Requires reboot Alexa Invocation name String 1..32 The name you want the device to have for control via Alexa. Choose something easy she can understand Device Auth token String 40 You will get this in an e-mail during Blynk setup MQTT Broker IP or String 0..32 Connect to this host MQTT broker Device topic String 0..32 MQTT topic unique to this light Group topic String 0..32 MQTT topic for all lights in a group (room, floor, ...) Hue Bridge IP 4x 0..255 Your Hue bridge IPv4 address. Should be static to avoid reassigning Poll Hue light 0..99 The ID of the hue lamp you want to sync WLED to every x ms 100..65000 How often to poll. Smaller numbers decrease lag but might hurt bridge responsiveness ... Y/N Turn polling on/off Receive On/Off Y/N Turn on/off like the hue light Brightness Y/N Set brightness to that of the hue light Color Y/N Set color to that of the hue light Hue status - Shows the current connection status to a hue bridge Baud rate Various Set the default Serial connection Baud Rate"},{"location":"features/settings/#time-settings","title":"Time settings","text":"This sub-page configures automation tasks. (This section applies to WLED 0.8.5.)
Setting name Value Range Description Get time from NTP Y/N Whether to get the current time from the internet Use 24h format Y/N Use 24h clock format instead of AM/PM Time zone - Your time zone. Open an issue if yours is unsupported. DST is applied automatically UTC offset -65000..65000 Seconds to offset. If you want e.g. 1h offset, use 3600 Current local time - The local time the ESP has acquired. If set up correctly, should equal actual time Clock overlay - The special overlay to use. Allows to display a clock on the strip Countdown mode Y/N Allows to have a visual countdown towards a specific date API macro fields 16x String 0..64 Allows you to define custom API calls which can be triggered by events Boot Macro 0..16 Which macro to trigger after WiFi connected (0 is default action) Alexa On/Off Macros 2x 0..16 Which macros to trigger when turning on/off via Alexa Button Macro 0..16 Macro to trigger if button is short pressed. Default action is on/off toggle. Long Press 0..16 Macro to trigger if button is long pressed (>0.7s). Default action is random color. Double press 0..16 Macro for double click on button. Countdown-Over Macro 0..16 Macro to trigger when the countdown is over Timed-Light-Over Macro 0..16 Macro to trigger when timed light is done"},{"location":"features/settings/#security-settings","title":"Security settings","text":"This sub-page manages permissions and updates. (This section applies to WLED 0.8.5.)
Setting name Value Range Description Enable OTA lock Y/N If enabled, no firmware updates may be done via WiFi and some settings can't be changed. Passphrase String 0..32 To disable OTA lock, you need a password. The default is \"wledota\". Change it! Deny access to WiFi settings Y/N Disables changes to WiFi settings while locked Disable recovery AP Y/N If enabled, the module will not open an Access Point if connection to home WiFi failed. Factory reset Y/N Deletes all custom settings data (passwords, configuration, macros, presets) Manual OTA - If OTA is enabled, you can upload new binary firmware Enable ArduinoOTA Y/N Useful for developers. Be careful, can even be left on when OTA locked!"},{"location":"features/subpages/","title":"Web GUI Sitemap","text":"This is the sitemap of the module server. Access with \\<ESP-IP>/path (Example: 192.168.8.4/settings)
Path Description OTA rights required Since version / Default UI, index page No 0.2 /update Upload new firmware Yes 0.3 /win HTTP Request API (since 0.3) No 0.3 /json JSON API No 0.8.4 /json/state JSON state object No 0.8.4 /json/info JSON information No 0.8.4 /json/eff Effect name list No 0.8.4 /json/pal Palette name list No 0.8.4 /json/live Current colors of LEDs No 0.9.0 /liveview Live preview of current LEDs No 0.9.0 /settings Settings index page No 0.2 /settings/wifi WiFi Settings page Cnfg 0.5.0 /settings/led LED Settings page No 0.5.0 /settings/ui UI Settings page No 0.5.0 /settings/sync Sync Settings page No 0.5.0 /settings/time Time Settings page No 0.5.0 /settings/sec Security Settings page Yes 0.5.0 /welcome New User Welcome page No 0.5.0 /sliders UI, index page No 0.5.0 /reset Reboot module No 0.3 /version Returns build version No 0.3 /uptime Returns runtime in ms No 0.4 /freeheap Returns free memory No 0.4 /favicon.ico Page icon No 0.2 /teapot :) No 0.5.0 /edit Filesystem editor Yes 0.2 /u Custom usermod page 0.8.4 (?) /cpal.htm Custom palette editor 0.14.0-b3 /pixart.htm 2D Pixel Art converter (not compiled by default) 0.14.0-b3 /pxmagic.htm 2D Image converter 0.14.0-b4"},{"location":"features/subpages/#removed-sites","title":"Removed sites","text":"Path Description OTA rights required Versions /list Lists SPIFFS contents (if USEFS) Yes 0.2-0.8.3 /easter Joke page No 0.6.2 only /power Returns an estimate of used LED current No 0.5.0-0.8.3 /build Returns details about the build No 0.5.0-0.8.3 /cleareeprom Resets to factory defaults Yes 0.3-0.6.4 /down Kills software. Hard reset required. Yes 0.3-0.6.4 /url Returns current light setup API url No 0.9.1-0.14.0-b3"},{"location":"interfaces/blynk/","title":"Blynk","text":"Warning
The official Blynk v1 server is shut down as of January 2023. WLED v0.14.0-b1 binaries no longer have Blynk support enabled by default. This only works with the legacy Blynk app, for which new signups have been closed by the Blynk developer. WLED will either move to Blynk 2.0 or a different solution soon.
You can use the free (if you only use it for 1 WLED light) IoT cloud Blynk to control your WLED Lights with the beautiful Blynk app for Android and iOS!
With Blynk, you can also even control your lights when you are not connected to your home network!
"},{"location":"interfaces/blynk/#installation","title":"Installation","text":"You can use the sync button in Blynk to sync other WLED ESPs, just like with the web UIs!
If you have doubts about the security of using a 3rd party IoT cloud, don't worry. WLED will only attempt to connect to Blynk if you put the device token string into Sync settings! Keep in mind that your ESP needs to connect to an external server, which may cause lag.
"},{"location":"interfaces/ddp/","title":"Distributed Display Protocol","text":"NOT TO BE CONFUSED WITH UDP.
DDP is a protocol designed by 3waylabs outlined here on their website.
WLED listens for DDP packets on port 4048, as outlined by the protocol. Check the DDP documentation for more info about packet structure.
*Notice WLED does not read the optional timecodes in DDP packet headers. If you are implementing the protocol to send packets to WLED, do not bother implementing it
"},{"location":"interfaces/ddp/#example-implementations","title":"Example implementations","text":"dgram
with wled-client
in clean NodeJS environment.Version Info
As of version v0.14.0-b25 MM-WLED supports DMX input via MAX485. This is great when ArtNet or e1.31/sACN over WIFI is not suitable
"},{"location":"interfaces/dmx-input/#features-and-limitations","title":"features and limitations","text":"For the DMX feature to work, you'll need to use the V4 build varients. Define all the pins you are using in the DMX input section of the Sync Interfaces menu
"},{"location":"interfaces/dmx-input/#hardware-setup","title":"hardware setup","text":"The DMX interface require the use of an RS484 adapter such as the MAX485 transceiver connected to the pins defined in setup of the ESP in order to handle DMX input and RDM input and output.
You will need to use three GPIO pins that support output.
Do NOT use the pins on your ESP32 labelled RX and TX as your DMX pins!
Connect the RS485 power pins as follows
For information about the use of DMX with ESP8266, you might like to read this tutorial by Robert Oostenveld. Note this is just background information about the hardware and you do not need any of the code listed here when using WLED output.
"},{"location":"interfaces/dmx-input/#questions","title":"questions","text":"If you have further questions about this feature, you can ask on DMX Input Discord or reach me via github (@netmindz) or via WLED Discord (netmindz).
"},{"location":"interfaces/dmx-output/","title":"DMX","text":""},{"location":"interfaces/dmx-output/#dmx-output","title":"DMX output","text":"Version Info
As of version 0.9.2 WLED supports DMX output via MAX485. This is great for controlling DMX LED PAR lamps with WLED patterns.
"},{"location":"interfaces/dmx-output/#features-and-limitations","title":"features and limitations","text":"For the DMX feature to work, you'll need to compile WLED from source. It's not a big deal, you can do it! Here is the Quick Start guide. There you'll find the section \"i want to modify WLED\".
make sure, you can compile the latest version of WLED without any issues. Then continue.
Once that works, in wled00/wled.h you need to change the line //#define WLED_ENABLE_DMX
to #define WLED_ENABLE_DMX
Yes, you just remove the //, which enables the line and therefore DMX support.
Once you successfully uploaded the sketch to your board, you'll find a new entry \"DMX Output\" in your settings menu.
Grab the manual for your lamp and maybe some snacks, look up the dmx channels and set everything up accordingly.
The DMX output required the use of a MAX485 transceiver connected to the TX-pin of the ESP in order to produce DMX output.
I am currently working on an open source PCB design to go along with this feature.
For information about the use of DMX with ESP8266, you might like to read this tutorial by Robert Oostenveld. Note this is just background information about the hardware and you do not need any of the code listed here when using WLED output.
If you need to use another pin for output than the TX-pin, you'll need to change this in the ESP-Dmx library itself. This setting is located in src/dependencies/dmx/ESPDMX.cpp on line 31.
"},{"location":"interfaces/dmx-output/#questions","title":"questions","text":"If you have further questions about this feature, you can reach me via github (@jwingefeld), ICQ (30914656) or via WLED Discord (JvPeek).
"},{"location":"interfaces/dmx-output/#other-references","title":"other references","text":"WLED supports the E1.31 (sACN) realtime light protocol.
Version Info
As of WLED v0.10.0, Art-Net is alternatively supported. All information on this page applies for Art-Net as well. You will need to switch to Art-Net mode in Sync settings and reboot once.
Version Info
As of WLED v0.11.0, DDP is alternatively supported. Using DDP, the Multi RGB DMX mode is always used regardless of the DMX mode setting (as it is no DMX) You will need to switch to DDP mode in Sync settings and reboot once.
Version Info
As > WLED 0.14.0-b1, DMX Effect mode channel mapping changed. This is a breaking change in E131 sync behavior. Existing DMX setups using WLED Effect mode are likely to break. Solution: Adopt external DMX channel mappings according to the new Effect mode channel layout.
"},{"location":"interfaces/e1.31-dmx/#features","title":"Features","text":"Note: WLED > 0.14.0-b1 implements a basic priority handling. To enable it set E1.31 port priority UI config > 0. Packages < config priority will always be skipped. Higher priority senders will overrule lower priority package senders (timeout 3 seconds). Non-zero start code and E1.31 preview data is ignored.
Note: If you see issued with lag, you may see better performance if you disable Wi-Fi Multimedia (WMM) Mode QoS on your router
"},{"location":"interfaces/e1.31-dmx/#general-recommendations","title":"General Recommendations","text":"We highly recommend the LedFx project in combination with WLED! Configure WLED first, ensure devices are powered on and connected to your WiFi. To add WLED devices, in the 'Device Management', click on the Find WLED devices button. If you want to manually add devices, use more than 170 LEDs with LedFx, you need to go to additional settings and set \"Universe Size\" to 510 when adding the WLED device!
"},{"location":"interfaces/e1.31-dmx/#settings","title":"Settings","text":""},{"location":"interfaces/e1.31-dmx/#dmx-types","title":"DMX types","text":"Select the mode you want to use in Sync settings.
"},{"location":"interfaces/e1.31-dmx/#disabled","title":"Disabled","text":"Incoming E1.31 packets will be ignored.
"},{"location":"interfaces/e1.31-dmx/#single-rgb","title":"Single RGB","text":"All LEDs are set to the same color. 3 Channels: Red, Green, Blue
"},{"location":"interfaces/e1.31-dmx/#single-drgb","title":"Single DRGB","text":"All LEDs are set to the same color. 4 Channels: Master Dimmer, Red, Green, Blue
"},{"location":"interfaces/e1.31-dmx/#effect","title":"Effect","text":"Not a realtime mode & only support 1 universe. Allows setting WLED effect properties over E1.31 with 15 channels.
Channel Property 1 Master Dimmer 2 Effect mode ID 3 Effect speed 4 Effect intensity 5 Effect palette ID 6 Effect option 7 Red Primary 8 Green Primary 9 Blue Primary 10 Red Secondary 11 Green Secondary 12 Blue Secondary 13 Red Tertiary 14 Green Tertiary 15 Blue TertiaryThe effect option
channel is divided into 128 macro parts to control the various states that a segment can be in.
Using 2D effect options on a 1D strip has no effect.
Value Reverse Mirror 1D to 2D Map (2D only) Transpose (2D only) Mirror Y (2D only) Reverse Y (2D only) 0..1 Pixels 2..3 Pixels x 4..5 Pixels x 6..7 Pixels x x 8..9 Pixels x 10..11 Pixels x x 12..13 Pixels x x 14..15 Pixels x x x 16..17 Bar 18..19 Bar x 20..21 Bar x 22..23 Bar x x 24..25 Bar x 26..27 Bar x x 28..29 Bar x x 30..31 Bar x x x 32..33 Arc 34..35 Arc x 36..37 Arc x 38..39 Arc x x 40..41 Arc x 42..43 Arc x x 44..45 Arc x x 46..47 Arc x x x 48..49 Corner 50..51 Corner x 52..53 Corner x 54..55 Corner x x 56..57 Corner x 58..59 Corner x x 60..61 Corner x x 62..63 Corner x x x 64..65 x Pixels 66..67 x Pixels x 68..69 x Pixels x 70..71 x Pixels x x 72..73 x Pixels x 74..75 x Pixels x x 76..77 x Pixels x x 78..79 x Pixels x x x 80..81 x Bar 82..83 x Bar x 84..85 x Bar x 86..87 x Bar x x 88..89 x Bar x 90..91 x Bar x x 92..93 x Bar x x 94..95 x Bar x x x 96..97 x Arc 98..99 x Arc x 100..101 x Arc x 102..103 x Arc x x 104..105 x Arc x 106..107 x Arc x x 108..109 x Arc x x 110..111 x Arc x x x 112..113 x Corner 114..115 x Corner x 116..117 x Corner x 118..119 x Corner x x 120..121 x Corner x 122..123 x Corner x x 124..125 x Corner x x 126..127 x Corner x x x 128..129 x Pixels 130..131 x Pixels x 132..133 x Pixels x 134..135 x Pixels x x 136..137 x Pixels x 138..139 x Pixels x x 140..141 x Pixels x x 142..143 x Pixels x x x 144..145 x Bar 146..147 x Bar x 148..149 x Bar x 150..151 x Bar x x 152..153 x Bar x 154..155 x Bar x x 156..157 x Bar x x 158..159 x Bar x x x 160..161 x Arc 162..163 x Arc x 164..165 x Arc x 166..167 x Arc x x 168..169 x Arc x 170..171 x Arc x x 172..173 x Arc x x 174..175 x Arc x x x 176..177 x Corner 178..179 x Corner x 180..181 x Corner x 182..183 x Corner x x 184..185 x Corner x 186..187 x Corner x x 188..189 x Corner x x 190..191 x Corner x x x 192..193 x x Pixels 194..195 x x Pixels x 196..197 x x Pixels x 198..199 x x Pixels x x 200..201 x x Pixels x 202..203 x x Pixels x x 204..205 x x Pixels x x 206..207 x x Pixels x x x 208..209 x x Bar 210..211 x x Bar x 212..213 x x Bar x 214..215 x x Bar x x 216..217 x x Bar x 218..219 x x Bar x x 220..221 x x Bar x x 222..223 x x Bar x x x 224..225 x x Arc 226..227 x x Arc x 228..229 x x Arc x 230..231 x x Arc x x 232..233 x x Arc x 234..235 x x Arc x x 236..237 x x Arc x x 238..239 x x Arc x x x 240..241 x x Corner 242..243 x x Corner x 244..245 x x Corner x 246..247 x x Corner x x 248..249 x x Corner x 250..251 x x Corner x x 252..253 x x Corner x x 254..255 x x Corner x x x"},{"location":"interfaces/e1.31-dmx/#effect-white","title":"Effect + White","text":"Same as Effect
with additional whites = 18 channels.
Same as Effect
with 15 channels per segment; expect channel 1 = \"Segment Dimmer\"
.
All effect segment modes introduce an additional DMX segment spacing
. If spacing s = 0
subsequent DMX addresses for all segments are created. When s > 0
a gap of s
DMX addresses between segments is used. To calculate segment DMX fixture addresses:
Segment DMX Address (i) = DMXAddress + i * (dmxEffectChannels + s)\n
Where DMXAddress
= start address as configured in UI, dmxEffectChannels
= 15|18 depending on selected effect segment mode, s
= address gap as configured in UI and i
is the index id of each segment as existing.
Note: 1 DMX universe = max 512 DMX addresses. So max number of segments depends on start address, selected segment mode and configured DMX segment spacing. To calculate how many segments can be controlled:
Max segments = floor[ (512 - DMXAddress) / (dmxEffectChannels + s) ]\n
"},{"location":"interfaces/e1.31-dmx/#effect-segment-white","title":"Effect Segment + White","text":"Same as Effect Segment
including whites, so it uses 18 DMX channels per segment.
3 Channels per LED in sequence. LED 0 Red, LED 0 Green, LED 0 Blue, LED 1 Red, ... Default mode, equivalent to pre-0.9.1 E1.31. This is the mode you want to use for xLights and LedFx.
"},{"location":"interfaces/e1.31-dmx/#multiple-rgbw","title":"Multiple RGBW","text":"Like Multiple RGB
+ additional white channels.
Like Multiple RGB
, but the first channel is a brightness control. Master Dimmer, LED 0 Red, LED 0 Green, ...
Trigger presets and control brightness. 2 Channels: Brightness, Preset ID
"},{"location":"interfaces/http-api/","title":"HTTP Request API","text":"Hint
While this API is not deprecated, it is highly recommended to use the JSON API instead of the HTTP API for new integrations, as it is structured in a better way and allows efficient use of newer features like segments, presets, and playlists.
WLED's HTTP API allows you to set many properties of your lights, even more than the index page UI supports, via a simple GET web request.
Help
Unsure how all this API stuff works? Check out this amazing guide by tynick!
The basic URL scheme is: [ipaddress]/win
. This will return an XML file with some current values (see bottom of page). Parameters can be added to control some of the variables.
192.168.4.1/win&A=255
sets the brightness to maximumled.local/win&A=128&FX=0
sets the brightness to half and the effect to SolidIn conjunction with a router port forwarding this can be used to automate WLED, for example via IFTTT.
Add one or multiple of the following parameters after the base URL/IP to change values: (if the parameter is unknown or the value illegal nothing will happen)
"},{"location":"interfaces/http-api/#led-control","title":"LED control","text":"Parameter Value Range Description Since Version &A= 0 to 255 Master brightness 0.2 &T= 0, 1, or 2 Master Off/On/Toggle 0.3 &R= 0 to 255 Primary Red value 0.2 &G= 0 to 255 Primary Green value 0.2 &B= 0 to 255 Primary Blue value 0.2 &W= 0 to 255 Primary White value 0.4 &FX= 0 to 101 LED Effect Index 0.3 &SX= 0 to 255 Effect Speed 0.3 &IX= 0 to 255 Effect Intensity 0.5.0 &FP= 0 to 46 FastLED Palette 0.8.0 &NL= 0 to 255 Nightlight active and duration in minutes 0.3 &ND none Toggles nightlight on but uses default duration 0.6.3 &NT= 0 to 255 Nightlight target brightness 0.5.0 &NF= 0 to 2 Fade Nightlight, 1 = fade brightness only, 2 = additionaly fade color from primary to secondary color 0.5.0"},{"location":"interfaces/http-api/#advanced","title":"Advanced","text":"Parameter Value Range Description Since Version &CL= HEX/DEC Primary color 0.8.0 &C2= HEX/DEC Secondary color 0.8.0 &C3= HEX/DEC Third color 0.8.0 &R2= 0 to 255 Secondary Red value 0.4 &G2= 0 to 255 Secondary Green value 0.4 &B2= 0 to 255 Secondary Blue value 0.4 &W2= 0 to 255 Secondary White value 0.4 &HU= 0 to 65535 Hue 0.5.1 &SA= 0 to 255 Saturation (only in conjunction with Hue) 0.5.1 &H2 none Hue + Saturation will set secondary color 0.5.1 &SR= 0 or 1 Set Primary/Secondary color to random hue 0.4 &SC none Swap primary and secondary color 0.4"},{"location":"interfaces/http-api/#use-of-hex-values","title":"Use of hex values","text":"Hex values need to be prefaced with the character h or H. The normal format is RRGGBB
. If the led strip is RGBW, the hex format is WWRRGGBB
. Note: In the UI the format is RRGGBBWW
, so the values cannot be copied without a transformation.
Loxone offers two commands. One for RGB values and one for brightness and color temperature.
Parameter Syntax Range Description Since Version &LX= BBBGGGRRR 0 - 100100100 Loxone RGB value for primary color. Each color (RRR
,GGG
,BBB
) is specified in the range from 0 to 100%. 0.11 &LX= 20bbbtttt 200002700 - 201006500 Loxone brightness and color temperature values for primary color. Brightness bbb
is specified in the range 0 to 100%. tttt
defines the color temperature in the range from 2700 to 6500 Kelvin. 0.11 &LY= BBBGGGRRR 0 - 100100100 Loxone RGB value for secondary color. Each color (RRR
,GGG
,BBB
) is specified in the range from 0 to 100%. 0.11 &LY= 20bbbtttt 200002700 - 201006500 Loxone brightness and color temperature values for secondary color. Brightness bbb
is specified in the range 0 to 100%. tttt
defines the color temperature in the range from 2700 to 6500 Kelvin. 0.11"},{"location":"interfaces/http-api/#notifications","title":"Notifications","text":"Parameter Value Range Description Since Version &RN= 0 or 1 Receive UDP Notifications 0.3 &SN= 0 or 1 Send UDP Notifications 0.3 &NN none No notification for this request 0.3 &HP= 0 to 99 Sets Hue polling light ID (0 is off) 0.5.1"},{"location":"interfaces/http-api/#presets","title":"Presets","text":"Parameter Value Range Description Since Version &PS= 1 to 16 Saves current setup to preset. Preset 255 can be used and is temporary/not persistent. 0.4 &PL= 1 to 250 Applies entire preset 0.4 &P1= 1 to 249 First cycle preset 0.6.3 &P2= 2 to 250 Last cycle preset 0.6.3 &TT= 0 to 65000 Set transition time (ms) 0.6.3"},{"location":"interfaces/http-api/#macros","title":"Macros","text":"Parameter Value Range Description Since Version &M= 1 to 16 Apply macro (deprecated, added for compatibility with pre-0.11 automations) 0.5.0"},{"location":"interfaces/http-api/#segments","title":"Segments","text":"It is highly recommended to use the JSON API when dealing with Segments.
Parameter Value Range Description Since Version &SM= 0 to 9 Set the main segment (values are reported to XML) 0.9.0 &SS= 0 to 9 Select segment to apply THIS api call to 0.9.0 &SV= 0, 1, or 2 Set segment selected (2 unselects others) 0.9.0 &S= 0 to ledcount-1 Set segment start 0.9.0 &S2= 0 to ledcount Set segment stop 0.9.0 &GP= 1 to 255 Set segment grouping 0.9.1 &SP= 0 to 255 Set segment spacing 0.9.1 &RV= 0 or 1 Reverse/Flip Segment direction 0.9.1 &SB= 0 to 255 Segment brightness 0.10.0"},{"location":"interfaces/http-api/#general-and-experimental","title":"General and Experimental","text":"Parameter Value Range Description Since Version &RB none Reboot WLED 0.10.0 (?) &ST= 32bit Current UTC time in Unix epoch 0.4 &CT= 32bit UTC time for countdown end 0.4 &MD= 0 or 1 Set slider mode to RGB/HSB 0.3 &AX= 0 to 255 Debug feature, can be configured for general IO 0.3 &IN none Server will not respond to this request (internal) 0.3 &OL= 0 to 255 Experimental overlays 0.3 &L= 0 to 255 Lock pixel 0.4 &L2= 0 to 255 Lock pixel range L to L2 0.4 &UL none Unlock instead (used in conjunction with L and L2) 0.4 &NX= String 1..6 Cronixie clockface 0.4 &NM= 0 or 1 Cronixie Time or Countdown mode 0.4 &NB= 0 or 1 Cronixie Backlight 0.4 &IT none Include UI color theme in API response 0.8.2 &RD= 0 or 1 Toggle realtime UDP 0.8.4 &LO= 0-2 Live data override. 0 is off, 1 is override until live data ends, 2 is override until ESP reboot 0.10.2 &NP none Advance to the next preset in a playlist 0.15"},{"location":"interfaces/http-api/#xml-response","title":"XML response","text":"This is the XML file sent as response to every API call.
Parameter Value Range Description ac 0 to 255 Master Brightness cl 3x 0..255 Primary Color RGB cs 3x 0..255 Secondary RGB ns 0 or 1 Notification Sending on nr 0 or 1 Notification Receive on nl 0 or 1 Nightlight active nf 0 or 2 Nightlight Fade type nd 0 to 255 Nightlight delay nt 0 to 255 Nightlight target brightness fx 0 to 73 Effect index sx 0 to 255 Effect speed ix 0 to 255 Effect intensity fp 0 to 43 FastLED palette wv -1 to 255 Primary White value ws 0 to 255 Secondary White ps 0 to 255 Current Preset cy 0 or 1 Preset Cycling enabled md 0 or 1 RGB or HSB UI mode ds String 0..32 Server description ss 0 to 12 Segment ID"},{"location":"interfaces/http-api/#in-decrementing-values","title":"In-/decrementing values","text":"You can use the ~
character to easily set values relative to their current value. This is currently supported for the following parameters: A, R, G, B, W, R2, G2, B2, W2, FX, SX, IX, FP, PL
For example, use PL=~
to go to the next preset. Using just ~
without a number will increase the value by 1, ~-
will decrease it by 1. The value will then wrap around, so using A=~-
when A is 0 will set A to 255.
You can also specify by how much to change the value. For example, using A=~10
will increase the brightness by 10. In case of using a number behind ~
, the value will clip (so it will not wrap around, if the maximum brightness is set, A=~10
will not have any effect)
To setup a Macro for a Button to advance to the next Preset, use win&P1=1&P2=30&PL=~ P1 will equal the first Preset of the rotation while P2 will be the last Preset.
"},{"location":"interfaces/infrared/","title":"Infrared","text":"Version Info
Since v0.8.2, infrared control from various IR remotes is supported for ESP8266 and since v0.9.0 for ESP32, too.
A dedicated infrared receiver module is required and must be connected to the WLED Controller. For example, KY-022 or TSOP38238 are confirmed to work and inexpensive. These receivers each have three pins: 3.3V, GND and IR data. IR data pin must be connected to a free GPIO pin. This GPIO must then be set as IR GPIO under \"Config->LED Preferences\" (The default sensor pin is GPIO4).
Warning
IR receiving will not work on ESP8266 if you use any LED pin other than GPIO 1, 2, or 3 for digital LED strips.
"},{"location":"interfaces/infrared/#supported-ir-remotes","title":"Supported IR remotes","text":"To use IR remote go to Settings
, Sync Interfaces
and change the value for Infrared receiver type
according to the IR remote type of the following list:
Since version WLED 14.0-beta3: An ESP-NOW compatible remote control is supported. An example of this is the \u201eWIZmote\u201c remote control. This is based on an ESP microcontroller. ESP-NOW can be activated in WLED settings. You have to enter the Hardware MAC address of the remote control. This is determined by clicking on any button on the remote control and copying the last received MAC address from the \"Last Seen\" field to the \"Hardware MAC\" field in WLED ESP-NOW settings (\u201cConfig->WiFi Setup\u201d) and saving it with \"Save\". Advantages: no special receiver needs to be attached to the WLED controller and the signals are transmitted via radio network. Therefore there is no line of sight between the remote control and the WLED controller required, as is the case with an IR remote control. The 4 buttons \"1\"-\"4\" of the WIZmote remote control are linked to presets 1 to 4. The meaning of other keys is self-explanatory. Attention: WIZmote needs two good quality AAA batteries to work properly. If the batteries are too weak, the correct signal will not be sent, even if the blue LED on the remote control lights up briefly, actually indicating signal transmission.
"},{"location":"interfaces/json-api/","title":"JSON API","text":"WLED versions since 0.8.4 implement a powerful JSON API over HTTP. It is accessible using the /json
subpage.
Sending a GET request will return an object similar to the sample below The response consists of four objects:
state
contains the current state of the light. All values may be modified by the client (see below)info
contains general information about the device. No value can be modified using this APIeffects
contains an array of the effect mode namespalettes
contains an array of the palette namesYou may also obtain those objects individually using the URLs /json/state
/json/info
/json/eff
, and /json/pal
.
Reserved effect IDs
In WLED versions 0.14+, some effects are unsupported in certain builds (e.g. some audio reactive effects may only work on ESP32). In order for each effect to have an unique ID on all devices, having unsupported ones in between supported ones is possible. If called, these will fallback to the Solid effect, in the effects list they have the name RSVD
or -
. To improve user experience, it is recommended to remove effects with the names RSVD
or -
form the UI effect selection.
WLED JSON API Library in rust. Even if you are not using rust, or don't know how to read rust, the up-to-date JSON structure is included and documented in this project.
"},{"location":"interfaces/json-api/#setting-new-values","title":"Setting new values","text":"Sending a POST request to /json
or /json/state
with (parts of) the state object will update the respective values. Example: {\"on\":true,\"bri\":255}
sets the brightness to maximum. {\"seg\":[{\"col\":[[0,255,200]]}]}
sets the color of the first segment to teal. {\"seg\":[{\"id\":X,\"on\":\"t\"}]}
and replacing X with the desired segment ID will toggle on or off that segment.
CURL example
This will toggle on and off and return the new state (v0.13+): curl -X POST \"http://[WLED-IP]/json/state\" -d '{\"on\":\"t\",\"v\":true}' -H \"Content-Type: application/json\"
Sample JSON API response (v0.8.4):
{\n \"state\": {\n \"on\": true,\n \"bri\": 127,\n \"transition\": 7,\n \"ps\": -1,\n \"pl\": -1,\n \"nl\": {\n \"on\": false,\n \"dur\": 60,\n \"fade\": true,\n \"tbri\": 0\n },\n \"udpn\": {\n \"send\": false,\n \"recv\": true\n },\n \"seg\": [{\n \"start\": 0,\n \"stop\": 20,\n \"len\": 20,\n \"col\": [\n [255, 160, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0]\n ],\n \"fx\": 0,\n \"sx\": 127,\n \"ix\": 127,\n \"pal\": 0,\n \"sel\": true,\n \"rev\": false,\n \"cln\": -1\n }]\n },\n \"info\": {\n \"ver\": \"0.8.4\",\n \"vid\": 1903252,\n \"leds\": {\n \"count\": 20,\n \"rgbw\": true,\n \"pin\": [2],\n \"pwr\": 0,\n \"maxpwr\": 65000,\n \"maxseg\": 1\n },\n \"name\": \"WLED Light\",\n \"udpport\": 21324,\n \"live\": false,\n \"fxcount\": 80,\n \"palcount\": 47,\n \"arch\": \"esp8266\",\n \"core\": \"2_4_2\",\n \"freeheap\": 13264,\n \"uptime\": 17985,\n \"opt\": 127,\n \"brand\": \"WLED\",\n \"product\": \"DIY light\",\n \"btype\": \"src\",\n \"mac\": \"60019423b441\"\n },\n \"effects\": [\n \"Solid\", \"Blink\", \"Breathe\", \"Wipe\", \"Wipe Random\", \"Random Colors\", \"Sweep\", \"Dynamic\", \"Colorloop\", \"Rainbow\",\n \"Scan\", \"Dual Scan\", \"Fade\", \"Chase\", \"Chase Rainbow\", \"Running\", \"Saw\", \"Twinkle\", \"Dissolve\", \"Dissolve Rnd\",\n \"Sparkle\", \"Dark Sparkle\", \"Sparkle+\", \"Strobe\", \"Strobe Rainbow\", \"Mega Strobe\", \"Blink Rainbow\", \"Android\", \"Chase\", \"Chase Random\",\n \"Chase Rainbow\", \"Chase Flash\", \"Chase Flash Rnd\", \"Rainbow Runner\", \"Colorful\", \"Traffic Light\", \"Sweep Random\", \"Running 2\", \"Red & Blue\",\"Stream\",\n \"Scanner\", \"Lighthouse\", \"Fireworks\", \"Rain\", \"Merry Christmas\", \"Fire Flicker\", \"Gradient\", \"Loading\", \"In Out\", \"In In\",\n \"Out Out\", \"Out In\", \"Circus\", \"Halloween\", \"Tri Chase\", \"Tri Wipe\", \"Tri Fade\", \"Lightning\", \"ICU\", \"Multi Comet\",\n \"Dual Scanner\", \"Stream 2\", \"Oscillate\", \"Pride 2015\", \"Juggle\", \"Palette\", \"Fire 2012\", \"Colorwaves\", \"BPM\", \"Fill Noise\", \"Noise 1\",\n \"Noise 2\", \"Noise 3\", \"Noise 4\", \"Colortwinkle\", \"Lake\", \"Meteor\", \"Smooth Meteor\", \"Railway\", \"Ripple\"\n ],\n \"palettes\": [\n \"Default\", \"Random Cycle\", \"Primary Color\", \"Based on Primary\", \"Set Colors\", \"Based on Set\", \"Party\", \"Cloud\", \"Lava\", \"Ocean\",\n \"Forest\", \"Rainbow\", \"Rainbow Bands\", \"Sunset\", \"Rivendell\", \"Breeze\", \"Red & Blue\", \"Yellowout\", \"Analogous\", \"Splash\",\n \"Pastel\", \"Sunset 2\", \"Beech\", \"Vintage\", \"Departure\", \"Landscape\", \"Beach\", \"Sherbet\", \"Hult\", \"Hult 64\",\n \"Drywet\", \"Jul\", \"Grintage\", \"Rewhi\", \"Tertiary\", \"Fire\", \"Icefire\", \"Cyane\", \"Light Pink\", \"Autumn\",\n \"Magenta\", \"Magred\", \"Yelmag\", \"Yelblu\", \"Orange & Teal\", \"Tiamat\", \"April Night\"\n ]\n}\n
"},{"location":"interfaces/json-api/#overview-of-values","title":"Overview of values","text":""},{"location":"interfaces/json-api/#state-object","title":"State object","text":"JSON key Value range Description on bool On/Off state of the light. You can also use \"t\"
instead of true
or false
to toggle. bri 0 to 255 Brightness of the light. If on is false
, contains last brightness when light was on (aka brightness when on is set to true). Setting bri to 0 is supported but it is recommended to use the range 1-255 and use on: false
to turn off. The state response will never have the value 0
for bri. transition 0 to 65535 Duration of the crossfade between different colors/brightness levels. One unit is 100ms, so a value of 4
results in atransition of 400ms. tt 0 to 65535 Similar to transition, but applies to just the current API call. Not included in state response. ps -1 to 250 ID of currently set preset. 1~17~
can be used to iterate through presets 1-17, or 4~10~r
to select random preset between presets 4 and 10 (inclusive). pss 0 to 65535 Bitwise indication of preset slots (0 - vacant, 1 - written). Always 0 in 0.11. Not changable. Removed as of v0.11.1 psave 1 to 250 (16 prior to 0.11) Save current light config (state) to specified preset slot. Not included in state response. pl -1 to 250 ID of currently set playlist. (read-olny) pdel 1 to 250 Preset ID to delete. Not included in state response. nl.on bool Nightlight currently active nl.dur 1 to 255 Duration of nightlight in minutes nl.fade bool If true
, the light will gradually dim over the course of the nightlight duration. If false
, it will instantly turn to the target brightness once the duration has elapsed. Removed in 0.13.0 (use mode instead) nl.mode 0 to 3 Nightlight mode (0: instant, 1: fade, 2: color fade, 3: sunrise) (available since 0.10.2) nl.tbri 0 to 255 Target brightness of nightlight feature nl.rem -1 to 15300 Remaining nightlight duration in seconds, -1 if not active. Only in state response, can not be set. udpn.send bool Send WLED broadcast (UDP sync) packet on state change udpn.recv bool Receive broadcast packets udpn.sgrp 0 to 255 Bitfield for broadcast send groups 1-8 udpn.rgrp 0 to 255 Bitfield for broadcast receive groups 1-8 udpn.nn bool Don't send a broadcast packet (applies to just the current API call). Not included in state response. v bool If set to true in a JSON POST command, the response will contain the full JSON state object. Not included in state response rb bool If set to true, device will reboot immediately. Not included in state response. live bool If set to true, enters realtime mode and blanks the LEDs. The realtime timeout option does not have an effect when this command is used, WLED will stay in realtime mode until the state (color/effect/segments, excluding brightness) is changed. It is expected that {\"live\":false}
is sent once live data sending is terminated. Not included in state response. lor 0, 1, or 2 Live data override. 0 is off, 1 is override until live data ends, 2 is override until ESP reboot (available since 0.10.0) time uint32 Set module time to unix timestamp. Not included in state response. mainseg 0 to info.leds.maxseg-1 Main Segment seg Object or Array of objects (see below) Segments are individual parts of the LED strip. Since 0.9.0 this enables running different effects on differentparts of the strip. playlist object Custom preset playlists. Not included in state response. (available since 0.11.0) tb uint32 Sets timebase for effects. Not reported. ledmap 0 to 9 Load specified ledmap (0 for ledmap.json
, 1-9 for ledmap1.json
to ledmap9.json
). See mapping. Not included in state response. (available since 0.14.0) rmcpal bool Remove last custom palette if set to true
. Not included in state response. (available since 0.14.0) np bool Advance to the next preset in a playlist if set to true
. Not included in state response. (available since 0.15)"},{"location":"interfaces/json-api/#contents-of-the-segment-object","title":"Contents of the segment object","text":"Notice: start, stop, and len are not changeable in 0.8.4. Any segment with id > 0 is ignored. Unless stated otherwise, every value may be changed via an HTTP POST request. The tertiary color is not gamma-corrected in 0.8.4, but is in subsequent releases.
JSON key Value range Description id 0 to info.maxseg -1 Zero-indexed ID of the segment. May be omitted, in that case the ID will be inferred from the order of the segment objects in the seg array. start 0 to info.leds.count -1 LED the segment starts at. For 2D set-up it determines column where segment starts, from top-left corner of the matrix. stop 0 to info.leds.count LED the segment stops at, not included in range. If stop is set to a lower or equal value than start (setting to0
is recommended), the segment is invalidated and deleted. For 2D set-up it determines column where segment stops, from top-left corner of the matrix. startY 0 to matrix width Start row from top-left corner of a matrix. (available since 0.14.0) stopY 1 to matrix height\u00a0 Stop row from top-left corner of matrix. (available since 0.14.0) len 0 to info.leds.count Length of the segment (stop - start). stop has preference, so if it is included, len is ignored. grp 0 to 255 Grouping (how many consecutive LEDs of the same segment will be grouped to the same color) spc 0 to 255 Spacing (how many LEDs are turned off and skipped between each group) of -len+1 to len Offset (how many LEDs to rotate the virtual start of the segments, available since 0.13.0) col array of colors Array that has up to 3 color arrays as elements, the primary, secondary (background) and tertiary colors of the segment. Each color is an array of 3 or 4 bytes, which represents a RGB(W) color, i.e. [[255,170,0],[0,0,0],[64,64,64]]
. It can also be represented as aan array of strings of hex values, i.e. [\"FFAA00\",\"000000\",\"404040\"]
for orange, black and grey. fx 0 to info.fxcount -1 ID of the effect or ~
to increment, ~-
to decrement, or \"r\"
for random. sx 0 to 255 Relative effect speed. ~
to increment, ~-
to decrement. ~10
to increment by 10, ~-10
to decrement by 10. ix 0 to 255 Effect intensity. ~
to increment, ~-
to decrement. ~10
to increment by 10, ~-10
to decrement by 10. c1 0 to 255 Effect custom slider 1. Custom sliders are hidden or displayed and labeled based on effect metadata. c2 0 to 255 Effect custom slider 2. c3 0 to 31 Effect custom slider 3. o1 bool Effect option 1. Custom options are hidden or displayed and labeled based on effect metadata. o2 bool Effect option 2. o3 bool Effect option 3. pal 0 to info.palcount -1 ID of the color palette or ~ to increment, ~- to decrement, or r for random. sel bool true
if the segment is selected. Selected segments will have their state (color/FX) updated by APIs that don't support segments (e.g. UDP sync, HTTP API). If no segment is selected, the first segment (id:0
) will behave as if selected. WLED will report the state of the first (lowest id) segment that is selected to APIs (HTTP, MQTT, Blynk...), or mainseg
in case no segment is selected and for the UDP API. Live data is always applied to all LEDs regardless of segment configuration. rev bool Flips the segment (in horizontal dimension for 2D set-up), causing animations to change direction. rY bool Flips the 2D segment in vertical dimension. (available since 0.14.0) on bool Turns on and off the individual segment. (available since 0.10.0) bri 0 to 255 Sets the individual segment brightness (available since 0.10.0) mi bool Mirrors the segment (in horizontal dimension for 2D set-up) (available since 0.10.2) mY bool Mirrors the 2D segment in vertical dimension. (available since 0.14.0) tp bool Transposes a segment (swaps X and Y dimensions). (available since 0.14.0) cct 0 to 255 or 1900 to 10091 White spectrum color temperature (available since 0.13.0) lx BBBGGGRRR
: 0 - 100100100 Loxone RGB value for primary color. Each color (RRR
,GGG
,BBB
) is specified in the range from 0 to 100%. Only available if Loxone is compiled in. lx 20bbbtttt
: 200002700 - 201006500 Loxone brightness and color temperature values for primary color. Brightness bbb
is specified in the range 0 to 100%. tttt
defines the color temperature in the range from 2700 to 6500 Kelvin. (available since 0.11.0, not included in state response) Only available if Loxone is compiled in. ly BBBGGGRRR
: 0 - 100100100 Loxone RGB value for secondary color. Each color (RRR
,GGG
,BBB
) is specified in the range from 0 to 100%. Only available if Loxone is compiled in. ly 20bbbtttt
: 200002700 - 201006500 Loxone brightness and color temperature values for secondary color. Brightness bbb
is specified in the range 0 to 100%. tttt
defines the color temperature in the range from 2700 to 6500 Kelvin. (available since 0.11.0, not included in state response) Only available if Loxone is compiled in. i array Individual LED control. Not included in state response (available since 0.10.2) frz bool freezes/unfreezes the current effect m12 0 to 4 [map1D2D.count] Setting of segment field 'Expand 1D FX'. (0: Pixels, 1: Bar, 2: Arc, 3: Corner) si 0 to 3 Setting of the sound simulation type for audio enhanced effects. (0: 'BeatSin', 1: 'WeWillRockYou', 2: '10_3', 3: '14_3') (as of 0.14.0-b1, there are these 4 types defined) fxdef bool Forces loading of effect defaults (speed, intensity, etc) from effect metadata. (available since 0.14.0) set 0 to 3 Assigns group or set ID to segment (not to be confused with grouping). Visual aid only (helps in UI). (available since 0.14.0) rpt bool Flag to repeat current segment settings by creating segments until all available LEDs are included in automatically created segments or maximum segments reached. Will also toggle reverse on every even segment. (available since 0.13.0)"},{"location":"interfaces/json-api/#info-object","title":"Info object","text":"No value may be changed by means of this API.
JSON key Value range Description ver string Version name. vid uint32 Build ID (YYMMDDB, B = daily build index). leds object Contains info about the LED setup. leds.cct booltrue
if the light supports color temperature control (available since 0.13.0, deprecated, use info.leds.lc) leds.count 1 to 1200 Total LED count. leds.fps 0 to 255 Current frames per second. (available since 0.12.0) leds.rgbw bool true
if LEDs are 4-channel (RGB + White). (deprecated, use info.leds.lc) leds.wv bool true
if a white channel slider should be displayed. (available since 0.10.0, deprecated, use info.leds.lc) leds.pin byte array LED strip pin(s). Always one element. Removed as of v0.13 leds.pwr 0 to 65000 Current LED power usage in milliamps as determined by the ABL. 0
if ABL is disabled. leds.maxpwr 0 to 65000 Maximum power budget in milliamps for the ABL. 0
if ABL is disabled. leds.maxseg byte Maximum number of segments supported by this version. leds.lc byte Logical AND of all active segment's virtual light capabilities leds.seglc byte array Per-segment virtual light capabilities str bool If true
, an UI with only a single button for toggling sync should toggle receive+send, otherwise send only name string Friendly name of the light. Intended for display in lists and titles. udpport uint16 The UDP port for realtime packets and WLED broadcast. live bool If true
, the software is currently receiving realtime data via UDP or E1.31. lm string Info about the realtime data source lip string Realtime data source IP address ws -1 to 8 Number of currently connected WebSockets clients. -1 indicates that WS is unsupported in this build. fxcount byte Number of effects included. palcount uint16 Number of palettes configured. wifi object Info about current signal strength wifi.bssid string The BSSID of the currently connected network. wifi.signal 0 to 100 Relative signal quality of the current connection. wifi.channel 1 to 14 The current WiFi channel. fs object Info about the embedded LittleFS filesystem (since 0.11.0) fs.u uint32 Estimate of used filesystem space in kilobytes fs.t uint32 Total filesystem size in kilobytes fs.pmt uint32 Unix timestamp for the last modification to the presets.json
file. Not accurate after boot or after using /edit
ndc -1 to 255 Number of other WLED devices discovered on the network. -1 if Node discovery disabled. (since 0.12.0) arch string Name of the platform. core string Version of the underlying (Arduino core) SDK. lwip 0, 1, or 2 Version of LwIP. 1 or 2 on ESP8266, 0 (does not apply) on ESP32. Deprecated, removal in 0.14.0 freeheap uint32 Bytes of heap memory (RAM) currently available. Problematic if <10k
. uptime uint32 Time since the last boot/reset in seconds. opt uint16 Used for debugging purposes only. brand string The producer/vendor of the light. Always WLED
for standard installations. product string The product name. Always FOSS
for standard installations. btype string The origin of the build. src
if a release version is compiled from source, bin
for an official release image, dev
for a development build (regardless of src/bin origin) and exp
for experimental versions. ogn
if the image is flashed to hardware by the vendor. Removed as of v0.10 mac string The hexadecimal hardware MAC address of the light, lowercase and without colons. ip string The IP address of this instance. Empty string if not connected. (since 0.13.0) Examples of frequently requested custom API:
Function/Effect API (Add to preset or call from other sources) Cycle presets between 1 and 6{\"ps\":\"1~6~\"}
Select random effect on all selected segments {\"seg\":{\"fx\":\"r\"}}
Select random palette between 5 and 10 on segment 2 {\"seg\":[{\"id\":2,\"pal\":\"5~10~r\"}]}
Change segment 0 name {\"seg\":[{\"id\":0,\"n\":\"Your custom ASCII text\"}]}
Freeze or unfreeze an effect {\"seg\":[{\"id\":0,\"frz\":true}]}
or {\"seg\":[{\"id\":0,\"frz\":false}]}
Night light {\"nl\":{\"on\":true,\"dur\":10,\"mode\":0}}
Increase brightness by 40 wrapping when maximum reached {\"bri\":\"w~40\"}
"},{"location":"interfaces/json-api/#per-segment-individual-led-control","title":"Per-segment individual LED control","text":"Using the i
property of the segment object, you can set the LED colors in the segment using the JSON API. Keep in mind that this is non-persistent, if the light is turned off the segment will return to effect mode. The segment is frozen when using individual control, the set effect will not run. To unfreeze the segment, click the \"eye\" icon, change any property of the segment or turn off the light.
To set individual LEDs starting from the beginning, use an array of Color arrays [255,0,0]
or hex values \"FF0000\"
. Hex values are more efficient than Color arrays and should be preferred when setting a large number of colors. {\"seg\":{\"i\":[\"FF0000\",\"00FF00\",\"0000FF\"]}}
or {\"seg\":{\"i\":[[255,0,0],[0,255,0],[0,0,255]]}}
will set the first LED red, the second green and the third blue.
To set individual LEDs, use the LED index followed by its color value. {\"seg\":{\"i\":[0,\"FF0000\",2,\"00FF00\",4,\"0000FF\"]}}
is the same as above, but leaves blank spaces between the lit LEDs.
To set ranges of LEDs, use the LED start and stop index followed by its color value. {\"seg\":{\"i\":[0,8,\"FF0000\",10,18,\"0000FF\"]}}
sets the first eight LEDs to red, leaves out two, and sets another 8 to blue.
To set a large number of colors, send multiple api calls of 256 colors at a time. {\"seg\": {\"i\":[0,\"CC0000\",\"00CC00\",\"0000CC\",\"CC0000\"...]}}
{\"seg\": {\"i\":[256,\"CC0000\",\"00CC00\",\"0000CC\",\"CC0000\"...]}}
{\"seg\": {\"i\":[512,\"CC0000\",\"00CC00\",\"0000CC\",\"CC0000\"...]}}
Do not make several calls in parallel, that is not optimal for the device. Instead make your call in sequence, where each call waits for the previous to complete before making a new one. How this is done depends on your choice of tool, but with CURL you que your commands by separating then with &&
i.e. CURL [command 1] && CURL [command 2] && CURL [command 3]
.
Command buffer size
If you are trying to set many LEDs and it fails to work, you can check your request here for length. Select ESP32 and Deserialize. If the required buffer size is above 10K for ESP8266 and 24K for ESP32, please split it into multiple sequential requests and consider using the Hex string syntax.
Keep in mind that the LED indices are segment-based, so LED 0 is the first LED of the segment, not of the entire strip. Segment features, including Grouping, Spacing, Mirroring and Reverse are functional.
Matrices are handled as a non-serpentine layout.
Brightness interaction
For your colors to apply correctly, make sure the desired brightness is set beforehand. Turning on the LEDs from an off state and setting individual LEDs in the same JSON request will not work!
"},{"location":"interfaces/json-api/#playlists","title":"Playlists","text":"(Available since 0.11.0)
Sample playlist API call:
{\n \"playlist\": {\n \"ps\": [26, 20, 18, 20],\n \"dur\": [30, 20, 10, 50],\n \"transition\": 0,\n \"repeat\": 10,\n \"end\": 21\n }\n}\n
This example applies preset ID 26 for 3 seconds, then preset 20 for 2 seconds, then preset 18 for 1 second, lastly preset 20 again for 5 seconds.This repeats 10 times, then preset 21 is applied.
Playlist object:
JSON key Description ps Array of preset ID integers to be applied in this order. dur Array of time each preset should be kept, in tenths of seconds. If only one integer is supplied, all presets will be kept for that time.Defaults to 10 seconds if not provided. transition Array of time each preset should transition to the next one, in tenths of seconds. If only one integer is supplied, all presets will transition for that time. Defaults to the current transition time if not provided. repeat How many times the entire playlist should cycle before finishing. Set to0
for an indefinite cycle. Default to indefinite if not provided. end Single preset ID to apply after the playlist finished. Has no effect when an indefinite cycle is set. If not provided, the light will stay on the last preset of the playlist."},{"location":"interfaces/json-api/#light-capabilities","title":"Light capabilities","text":"In order to e.g. only show color controls relevant to a given setup, it is necessary to obtain the color capabilities of the light. The info.leds.seglc
array can be used to do so on a per-segment level. It contains n+1
8-bit integers, where n
is the id
of the last active segment, each index corresponds to the segment with that ID. This integer indicates whether a given segment supports (24 bit) RGB colors, an extra (8 bit) white channel and/or adjustable color temperature (CCT):
Therefore:
lc
value Capabilities 0 None. Indicates a segment that does not have a bus within its range, e.g. because it is not active. 1 Supports RGB 2 Supports white channel only 3 Supports RGBW 4 Supports CCT only, no white channel (unused) 5 Supports CCT + RGB, no white channel (unused) 6 Supports CCT (including white channel) 7 Supports CCT (including white channel) + RGB Note that CCT is controllable per-segment, while RGB color and white channel have 3 color slots each per segment.
info.leds.lc
contains this info on a global level, and is a bitwise AND of the per-segment light capability values.
Please also see the general info about CCT.
"},{"location":"interfaces/json-api/#supported-value-ranges","title":"Supported value ranges","text":"Given that the white spectrum handling is agnostic to the true color temperature of the LEDs used, a relative range is preferred for the time being, where a value of 0
indicates the warmest possible color temperature, while a value of 255
indicates the coldest temperature.
It is also possible to pass a value in the range of 1900
to 10091
, in which case it is treated as a Kelvin color temperature, where 1900
is mapped to a relative value of 0
and 10091
to a relative value of 255
.
As such, it is unlikely to match the actual color temperature output by the light, therefore the relative values 0-255 are preferred for the time being.
In the future, an option to specify the Kelvin temperatures of the utilized hardware may be added, once this is done, a color temperature can be set to more accurately match other lights.
Therefore, for forward compatibility, your integration should expect both either a 0-255 value for seg.cct
, in which case it is a relative value, or an absolute Kelvin value in the range 1000-16000 K. In case a Kelvin value is provided, you can consider the color temperature as accurate, which is not possible with relative 0-255 values as the Kelvin points of the white channels are unknown. It is preferred that you set a new CCT value in the same range as received from WLED, that is, use 0-255 if the original value was within this range, and 1000-20000 K otherwise.
If your code relies on absolute Kelvin values, a reasonable estimate for the warm white point (relative 0
) could be 2700K, while cold white (relative 255
) could commonly be 6500K.
seg.cct
can always be set, but only has an effect on the physical state of the light if one or both of the following conditions is met:
Calculate CCT from RGB
is not enabledCCT support is indicated by info.leds.cct
being true
, in which case you can regard the instance as a CCT light and e.g. display a color temperature control.
Why effect metadata?
Prior to 0.14, user interfaces showed Speed and Intensity slider, palette controls, and all three color slots regardless of the effect selected. This may cause confusion to the user because controls are displayed that have no immediate effect in the current configuration. Effect metadata allows you to dynamically hide certain controls, so that the user only sees controls actually utilized by the selected effect mode.
Starting with WLED 0.14, effect metadata is available under the /json/fxdata
URL. This returns an array of strings with info.fxcount
entries. The string at a given index corresponds to the metadata of the effect with the same ID as that index. Metadata is stored in a memory-optimized string format, for example the Aurora effect has the metadata !,!;;!;1;sx=24,pal=50
.
The metadata string consists of up to five sections, separated by semicolons: <Effect parameters>;<Colors>;<Palette>;<Flags>;<Defaults>
The first section specifies the number and labels of effect parameters (e.g. speed, intensity). Up to 5 sliders and 3 checkboxes are supported (sx
,ix
,c1
,c2
,c3
,o1
,o2
,o3
parameters in the seg
object). For more details about the ranges of the sliders see contents-of-the-segment-object. Slider/checkbox labels are comma separated. An empty or missing label disables this control. !
specifies the default label is used:
The fallback value if this section is missing is two sliders, Effect speed and Effect intensity.
Examples:
Parameter string Displayed controls<empty>
No effect parameters ! 1 slider: Effect speed !,! 2 sliders: Effect speed + Effect intensity !,Phase 2 sliders: Effect speed + Phase ,Saturation,,,,Invert 1 slider (sets ix
parameter) and 1 checkbox: Saturation + Invert ,,,,,Random colors 1 checkbox: Random colors"},{"location":"interfaces/json-api/#colors","title":"Colors","text":"Up to 3 colors can be used. Please note that only the first two characters of the label are visible in the WLED UI. !
specifies the default label is used. The default labels for the color slots are Fx
, Bg
, and Cs
.
The fallback value if this section is missing is 3 colors: Fx
+ Bg
+ Cs
.
Examples:
Colors string Displayed controls<empty>
No color controls ! 1 color: Fx ,! 1 color: Bg !,! 2 colors: Fx + Bg 1,2,3 3 colors: 1 + 2 + 3"},{"location":"interfaces/json-api/#palette","title":"Palette","text":"If empty, the effect does not use palettes. If !
, palette selection is enabled.
The fallback value if this section is missing is palette selection enabled.
"},{"location":"interfaces/json-api/#flags","title":"Flags","text":"Flags allow filtering for effects with certain characteristics. They are a single character each and not comma-separated. Currently, the following flags are specified:
Flag Effect characteristic 0 Effect works well on a single LED. If flag 0 is present, flags 1/2/3 are omitted. (unused) 1 Effect is optimized for use on 1D LED strips. 2 Effect requires a 2D matrix setup (unless flag 1 is also present) 3 Effect requires a 3D cube (unless flags 1 and/or 2 are also present) (unused) v Effect is audio reactive, reacts to amplitude/volume. f Effect is audio reactive, reacts to audio frequency distribution.For example, a Flag string of 2v
denotes a volume reactive effect that is to be used on 2D matrices.
The fallback value if this section is missing is 1
, i.e. a 1D optimized effect.
Defaults are values for effect parameters that work particularly well on that effect. They are set automatically when the effect is selected in UI unless configured otherwis in UI settings. To specify defaults, use the standard segment parameter name (e.g. ix
) followed by an =
and the default value. For example, sx=24,pal=50
sets the effect speed to 24 (slow) and the palette to ID 50 (Aurora).
If no default is specified for a given parameter, it retains the current value.
"},{"location":"interfaces/json-api/#sensors","title":"Sensors","text":"Warning
This section about the Sensor API is a DRAFT specification. It is not yet implemented and subject to change.
Various types of sensors (e.g. for Temperature, light intensity, PIR) may be added to WLED via usermods. To allow read access to sensor data via the JSON API in a standardized way, the info.sensor
array is used.
If the info.sensor
array is missing or empty, no sensor values are exposed.
Each sensor/measurement is represented by an object within the info.sensor
array.
For example,
{\"type\":\"T\",\"n\":\"Outside\",\"val\":12}\n
refers to a 12 \u00b0C temperature measurement in Celsius with the sensor name \"Outside\".
The object may contain the following properties, of which all are optional, except type
.
\"b\"
and \"CL\"
types and custom type sensors. null
if the reading is invalid, either due to an error or because the first reading has not yet completed. unit string An explicit human-readable unit string for the measurement. If omitted, the default for the sensor type is used. error int or string If present and not null
,false
,0
or an empty string, a sensor error is indicated. May either be an integer error code or an error string. tc number Seconds of WLED uptime
when the value last changed substantially. The threshold for a \"substantial\" change is up to the implementation. This can for example be used to find when a PIR sensor was last activated. tm number Seconds of WLED uptime
when the last reading given by val
was obtained. ts number Seconds of WLED uptime
at the first measurement / start of measurement period. (required for Energy sensor type) min number Lower bound of possible value range max number Upper bound of possible value range u number Absolute uncertainty of the measurement model string Identification of the sensor hardware used"},{"location":"interfaces/json-api/#sensor-types","title":"Sensor types","text":"These are the standardized sensor types that may be implemented by usermods:
Type ID string Measurement type Default unit \"\" (empty string) Invalid sensor (reserved) - b Button/Boolean true/false c Custom user-defined sensor - q Electric charge As t Time s BL Battery Level % CL 24-bit RGB color hex string E Energy (ts
property required) J I Electric current A J Illuminance lx L Distance m Lp Sound pressure level dB M Mass kg N Number/count - P Power W Pe General purpose percentage % PL Power Level (signal strength) dBm Pr Pressure Pa R Electric Resistance Ohms RH Relative Humidity % T Temperature \u00b0C U Voltage V (other strings) Reserved, let us know if you need a new type added - If a client is only interested in certain sensor types (e.g. Temperature), it may disregard all other sensor objects.
"},{"location":"interfaces/json-api/#api","title":"API","text":"there is all routes for JSON API:
Important
Notice: The MQTT implementation is currently being restructured to provide a better experience for users of Home Assistant and other automation software. This will be a breaking change. For details regarding the rework, please see #207!
WLED versions from 0.8.0 up are able to connect to an MQTT broker for smart home control. Connection to both domains and IP servers is supported on port 1883.
Warning
Secure connections are not currently supported. I recommend only connecting to local MQTT brokers. In v0.8.4-0.8.6 only, WLED supports MQTT autodiscovery by the HomeAssistant software. This has been removed because of bootloop issues and in favor of the native HomeAssistant integration.
WLED will subscribe to up to six topics to change the state of the lights.
[mqttDeviceTopic]/api -> Send an API call (using the HTTP API or, since 0.11, JSON API syntax). You may omit the \"win\" and just send e.g. \"FX=73\"
[mqttGroupTopic]
The topic paths [mqttDeviceTopic] and [mqttGroupTopic] are customizable in Sync settings. If [mqttGroupTopic] is left empty, it will not subscribe to anything. An empty [mqttDeviceTopic] will instead be replaced with the default \"wled/macaddr\". [mqttDeviceTopic] is intended to be unique to one WLED device and just control that device. [mqttGroupTopic] is intended to control a group of or all WLED devices.
UDP notifications will be sent just as if the change was done via the UI or HTTP API.
Additionally, on light change, WLED will publish to 3 topics for MQTT clients to query the state of the light.
[mqttDeviceTopic]/g -> Contains current brightness as ASCII number 0-255
[mqttDeviceTopic]/c -> Contains current color as HEX (#RRGGBB if white is 0, else #WWRRGGBB)
[mqttDeviceTopic]/v -> Contains XML API response (same as HTTP API)
There is support for client ID and authentication, but this is presently transmitted over an unencrypted connection, so please do not use the same password for other services.
Attention
The maximum length of an MQTT message for WLED is only limited by free RAM.
"},{"location":"interfaces/philips-hue/","title":"Philips Hue","text":"WLED can sync to your Philips hue lights.
Info
This feature allows your WLED light to set it color to that of one of your Hue lights. It does NOT enable individual control of your WLED light from the hue app.
To activate it, please go to Sync settings, fill in the IP of your hue bridge. Also you need to fill in the numeric ID of the hue light you want to sync to. Newer versions of the Hue app do not display light IDs in the \"About\" section of the app anymore, to find it, the app Hue Config Viewer
is highly recommended. It is available on the Play Store as well as the App Store. After pairing the app to your Hue bridge, you can see the numeric IDs of all your Hue lights in the Lights
menu.
The poll interval specifies how often WLED asks the hue bridge for a light change. Lower values will mean a quicker response of WLED to hue light changes, but also decrease responsiveness and stability of WLED and potentially the hue bridge. It is recommended to set it to 1000-2000ms.
Due to the nature of the hue protocol, WLED can only sync itself to a native hue bulb. At this time, there is no way to add WLED to the hue bridge and control it individually as if it was a native light.
Please don't expect the same level of stability with this feature active, the ESP may reset itself because of the increased traffic it needs to handle.
With DiyHue you can emulate a hue bridge that will show all WLED strips as Hue Strip Plus which will work with Hue Sync in realtime.
"},{"location":"interfaces/serial/","title":"Serial","text":"WLED 0.13.0 supports multiple protocols over Serial. Serial is available via USB, and on most boards, GPIO1 for TX and GPIO3 for RX.
Pin usage limitation
If GPIO3 is allocated (e.g. for LED output), all Serial functionality except debug output is unavailable. If GPIO1 is allocated, all Serial output is disabled, including the JSON API response, Improv, and tpm2 output.
"},{"location":"interfaces/serial/#adalight-and-tpm2","title":"Adalight and tpm2","text":"Both these protocols are supported and can be used to stream realtime LED data to WLED for direct display, e.g. from an bias lighting program. For tpm2, only data packets are supported and data in 24-bit RGB format is expected. If you want to drive a large amount of LEDs, you may need to increase the Baud rate in WLED Sync settings, as the default baud rate of 115200
is only sufficient for about 50-100 LEDs depending on the refresh rate. Adalight is supported since WLED 0.6.3, tpm2 since version 0.10.2.
You can send commands to the WLED instance via Serial using the JSON API. To request a JSON response containing the state
and info
objects, send {\"v\":true}
.
Improv Serial is supported and can be used to check the installed software version as well as connect your device to WiFi without needing to connect to the WLED access point. Improv is used by the WLED web installer for an easy installation and setup process. Note that the baud rate must remain at the default 115200
setting for the device to be detected as Improv-capable.
Send a lowercase 'v'
character (byte 0x76
) to obtain the ID of the installed WLED version.
To get the colors currently displayed by LEDs:
Send an uppercase 'L'
(byte 0x4C
) to request the current LED data as a tpm2 data packet in 24-bit RGB format.
Send a lowercase 'l'
(byte 0x6C
) to request the current LED data in JSON format. This returns the LED colors as 32-bit integers, of which the lowest byte is the Blue value, then Green, then Red, and the highest byte is the White channel value.
For both of these methods, you may need to increase the baud rate if you have a large amount of LEDs. However, tpm2 requires on average 2-4x less bandwidth than JSON, and should therefore be preferred if your application can parse binary data.
"},{"location":"interfaces/serial/#changing-baud-rate","title":"Changing Baud Rate","text":"There are 2 main method for changing Baud Rate for the serial connection - Persistant: Configure in App under Sync Interfaces. This setting will persist, and WLED will use specified Baud Rate from this point forward. - Temporary: Utilizing the serial connection at the existing Baud Rate, send the specific command byte to have WLED temporarily change to new Baud Rate. This Baud Rate is temporary and will be reset to default or peristant setting on reboot.
Byte Baud Rate0xB0
115200 0xB1
230400 0xB2
460800 0xB3
500000 0xB4
576000 0xB5
921600 0xB6
1000000 0xB7
1500000 - Note: Keep at 115200 to use Improv. Some boards may not support high rates."},{"location":"interfaces/serial/#debugging","title":"Debugging","text":"Compile with the -D WLED_DEBUG
build flag to enable serial debugging using DEBUG_PRINTLN(x)
macros. This will reserve pin GPIO1, therefore it cannot be used for other purposes when debugging.
The UDP notifier function of WLED makes it easy to sync multiple lights to the same color/effect, enabled by default. You can set the specific behavior of it in Sync settings, also you can choose if all aspects or only brightness/color/effects are applied.
Additionally, there is a \"Sync\" quick toggle for it in the main control UI! In UI settings, you can set whether this button only turns on/off sending (default) or also receiving, with the option Sync button toggles both send and receive
.
If your sync settings are not the way you like on boot, check the WLED Broadcast
section in Sync settings, where you can specify what is sent and received by default:
If all checkboxes are disabled, nothing is received by default after each boot. If the sync is toggled on in the main UI and the corresponding checkbox in UI settings is checked, everything is received.
A sync receiver will not assume the state of the last sender directly after booting, a new packet must be send for it to react.
"},{"location":"interfaces/udp-notifier/#sending-settings","title":"Sending settings","text":"Setting Description Send on direct change Whether to send a sync notification when state changed via the web UI or API Send on button press Whether to send sync when toggled by the physical hardware button Send Alexa notifications Whether to send sync after changed by Alexa (you may use Alexa groups instead) Send Hue notifications Whether to send sync after a connected Philips light changed Send Macro notifications Whether to send sync after a macro was triggered Send notifications twice Sends notifications twice (if you have issues with UDP packet loss)The quick toggle in the main UI will only apply to direct changes (UI + API), all other sync type sending behavior remains unaffected.
You can easily group WLED devices (for example all in one room) by changing the UDP port of all devices you want in that group.
"},{"location":"interfaces/udp-notifier/#sync-groups","title":"Sync groups","text":"From v0.13.0, 8 Sync groups are available. This allows syncing select instances only without changing the UDP port. For example, you might use one sync group per room you use WLED devices in. Make sure the sender and receiver you want to sync both have the same sync group ticked (a sender can send to multiple groups and a receiver can listen to multiple groups).
Sync packets received from pre-0.13.0 instances are treated as if sent in sync group 1 only.
"},{"location":"interfaces/udp-notifier/#protocol-description","title":"Protocol description","text":"Warning
Note: this info is partly out of date, see updated functionality in the code (udp.cpp)
When enabled, the module where a value was changed will send an UDP broadcast to a port (default 21324). Other modules that listen on this port will set themselves to the same color.
For interoperability, the protocol was designed so that even modules with different WLED versions can sync. Therefore, if a WLED 0.4 system receives a WLED 0.3 UDP notification it will apply the primary color but keep its current secondary color.
The UDP packet is currently 24 bytes long. It is laid out in the following:
Byte Index Var Name Description Notifier Version 0 - Packet Purpose Byte* 0 1 callMode Packet Reason** 0 2 bri Master Brightness 0 3 col[0] Primary Red Value 0 4 col[1] Primary Green Value 0 5 col[2] Primary Blue Value 0 6 nightlightActive Nightlight running? 0 7 nightlightDelayMins Nightlight Time 0 8 effectCurrent Effect Index 0 9 effectSpeed Effect Speed 0 10 white Primary White Value 1 11 - Version Byte*** 1 12 colSec[0] Secondary Red Value 2 13 colSec[1] Secondary Green Value 2 14 colSec[2] Secondary Blue Value 2 15 whiteSec Secondary White Value 2 16 effectIntensity Effect Intensity 3 17 transitionDelay Transition Duration Upper 4 18 transitionDelay Transition Duration Lower 4 19 effectPalette FastLED palette 5 20-23 - Zeros -*The notifier protocol is only used if this byte is 0. Otherwise, one of the UDP Realtime protocols will be used.
**The callMode variable specifies the reason for the notification. Every color update has the potential to trigger a notification.
callMode Description Behavior 0 Initial Boot Do not notify 1 Direct Change via UI or API notifyDirect? 2 Button was pressed notifyButton? 3 Update by other notification Do not notify 4 Nightlight activated notifyDirect? 5 Other (Req. with &NN) Do not notify 6 Effect changed notifyDirect? 7 Hue light changed notifyHue? 8 Preset Cycle active notifyDirect? 9 Updated via Blynk notifyDirect?***This is the version of the UDP protocol.
UDP Version Description WLED Version 0 Basic Support 0.3 1 White Value supported 0.4p 2 Secondary Color supported 0.4 3 Effect Intensity supported 0.5.0 4 Transition Time supported 0.6.0 5 Palettes supported 0.8.0"},{"location":"interfaces/udp-realtime/","title":"UDP Realtime / tpm2.net","text":""},{"location":"interfaces/udp-realtime/#hyperion","title":"Hyperion","text":"You can now use WLED with the popular Ambilight software Hyperion. Just configure Hyperion to use an UDP device with protocol 0 on port 19446! The maximum number of LEDs supported in this mode is 490. (WLED 0.8.0 and lower: 341)
"},{"location":"interfaces/udp-realtime/#prismatik","title":"Prismatik","text":"Prismatik is another Ambilight option. Select one of the UDP options in the device configuration wizard.
"},{"location":"interfaces/udp-realtime/#tpm2net","title":"TPM2.NET","text":"Supported in latest master and will be available in WLED 0.10.1. Please set the WLED broadcast UDP port to 65506 in Sync settings to enable receiving TPM2.NET data.
"},{"location":"interfaces/udp-realtime/#udp-realtime","title":"UDP Realtime","text":"Additionally, WLED offers a way to directly drive the connected LEDs via UDP. The protocol is referred to as WLED Audio-Reactive-Led-Strip (WARLS), since the support of that project was its primary goal. However, it can also be used for other realtime applications like an ambilight.
WARLS uses the same UDP port the notifier uses (default 21324, can be changed in settings). At the moment, the web UI will be disabled while active, the HTTP API, Alexa and button control remains functional. It uses the current brightness and gamma correction settings.
Byte 0 of the UDP packet tells the server which realtime protocol to use.
Value Description Max. LEDs 1 WARLS 255 2 DRGB 490 3 DRGBW 367 4 DNRGB 489/packet 0 WLED Notifier -In every protocol, Byte 1 tells the server how many seconds to wait after the last received packet before returning to normal mode, in practice you should use 1-2 (seconds) here in most cases so that the module returns to normal mode quickly after the end of transmission. Use 255 to stay on the UDP data without a timeout until a request is requested via another method.
After this the LED color information is transmitted like this:
WARLS
Byte Description 2 + n*4 LED Index 3 + n*4 Red Value 4 + n*4 Green Value 5 + n*4 Blue ValueDRGB: This mode has the difference that the LED indices are not part of the packet, instead every LED is updated. This leads to a higher speed when all LEDs are changed, but a drastically lower speed if only one LED is updated per packet.
Byte Description 2 + n*3 Red Value 3 + n*3 Green Value 4 + n*3 Blue ValueDRGBW: Like DRGB, but supports the White value for RGBW strips.
Byte Description 2 + n*4 Red Value 3 + n*4 Green Value 4 + n*4 Blue Value 5 + n*4 White ValueDNRGB: DRGB, but with 2 additional bytes that signify the starting LED index. This allows for more than 490 LEDs in realtime mode by sending multiple packets.
Byte Description 2 Start index high byte 3 Start index low byte 4 + n*3 Red Value 5 + n*3 Green Value 6 + n*3 Blue ValueWhen realtime mode starts, all LEDs will be black. However, you don't have to change all LEDs using one packet. Changing a single LED therefore only requires a packet of 2+4 bytes. All LEDs maintain their color until it is changed or the module exits WARLS mode because of a timeout.
"},{"location":"interfaces/udp-realtime/#setup-with-arls","title":"Setup with ARLS","text":"The software now supports audio-reactive-led-strip!
Version Info
Since WLED 0.10.2, a WebSocket server is enabled by default and can be used to access a subset of the JSON API.
The server is available at the /ws
endpoint, you can access it like ws://[WLED-IP]/ws
.
You may send any JSON state update to the socket. On change of the lighting state, the server will send a JSON object containing the state and info objects (this is equivalent to HTTP GET /json/si
) to all connected clients. This object will also be sent to a client upon connecting.
You can manually request the full JSON state object by sending {\"v\":true}
to the websocket.
You can also request a live stream of the LED values (e.g. the \"Peek\" feature of WLED-UI) by sending {\"lv\":true}
to the websocket. The returned format is the same as for /json/live
. Only one client can receive this at a time, if a new client requests it the stream will stop for the previous client (but the websocket will stay connected).
There can be a maximum of 4 clients connected at a time. If a fifth client connects, a different client will be disconnected. On ESP8266, it is recommended to have no more than 2 clients connected simultaneously.
"},{"location":"interfaces/json-ir/json_infrared/","title":"Infrared","text":"Version Info
Since v0.13.0, infrared control for any IR remote compatible with your IR receiver with JSON remote.
A dedicated infrared receiver module is required. (KY-022 or TSOP38238 are confirmed to work and inexpensive)
The default sensor pin is GPIO4. It can be changed in the WLED settings.
"},{"location":"interfaces/json-ir/json_infrared/#json-ir-remote","title":"JSON IR Remote","text":"The JSON IR remote allows users to customize IR remote behavior without writing custom C code or compiling. Using the JSON IR remote, you can map buttons from any compatible remote to any HTTP request API or JSON API command.
The map of IR codes to API commands is stored on your ESP's file system in ir.json
. From the \"LED Preferences\" page, set the IR pin and remote type to \"JSON remote\". Once \"JSON remote\" is selected, a file upload control will appear. You can also upload and edit ir.json from the /edit page, which can be reached by going to http://[controller-ip]/edit. If you use the edit page to upload your config file, be sure to name it ir.json
.
LED remotes typically are not sold separately. But you can purchase with an RGB controller for $2-4 on AliExpress and $5-10 on Amazon. When purchasing a remote, be sure that it is an infrared (IR) remote and not a radio (RF) remote as they are not supported at this time.
44-key white ir.json
40-key blue ir.json
40-key black ir.json
38-key ir.json (Sold with WLED compatible SP511E controllers)
32-key ir.json (commonly sold with fairy string lights)
24-key (very common, but buttons need repurposed to be very useful with WLED) ir.json v1 gray buttons load presets 1-4 ir.json v2 gray buttons cycle effects, palettes and change speed
24-key grey ir.json
24-key music ir.json v3
21-key ir.json
18-Key Silver ir.json
6-key ir.json
"},{"location":"interfaces/json-ir/json_infrared/#editing-irjson","title":"Editing ir.json","text":"First see if a JSON file already exists for your remote. If not, see if there is a JSON file for a remote with the same number of buttons. Often remotes with the same number of buttons have different labels but emit the same codes. The JSON keys are the hex encoded IR codes emitted by each button. The keys are strings and case is important, be sure to use the same format as the sample below. It is also the same format used when codes are echoed on the serial console.
In the JSON document, each button object should have a cmd
attribute containing the HTTP request or JSON API command. In addition to HTTP and JSON API commands, several C functions are supported (!incBrightness, !decBrightness, !presetFallback). The !incBrightness and !decBrightness functions, take smaller steps at the dim end of the range with progressively larger steps at the bright end. The !presetFallback function applies a preset (attribute PL) and falls back to the specified effect and palette (attributes FX and FP) if preset does not exist. (see sample below)
If an IR remote button is pressed rapidly or held down, subsequent presses have a different code (0xFFFFFFFF). If your command is repeatable but does not contain the \"~\" character and is not calling incBrightness or decBrightness, then add a \"rpt\" attribute with a value of true. Label and position attributes are ignored by WLED but useful when making edits.
If an ir.json file does not already exist for your remote, you will need to determine what code each button emits. To do this, connect your ESP8266 or ESP32 to a computer and open Arduino or VSCode serial monitor. Then press each button and record the code printed on the serial monitor. You should see something like this:
IR recv\n0xFFDE10\n
You should get a 24-bit hex encoded integer. If you get 0xFFFFFFFF, that means the button has been pressed repeatedly or held down. Try tapping quickly.
"},{"location":"interfaces/json-ir/json_infrared/#tips","title":"Tips","text":"play
or auto
buttons to a playlist. They currently just turn on preset cycling CY=1
or load a playlist of presets 1-5. You can define the playlist in ir.json as in the sample below, or save a playlist as a preset and load that.P1=31&P2=40&PL=~
P1=21&P2=30&PL=~-
{\n \"0xF740BF\": {\n \"label\": \"On/Off\",\n \"cmd\": \"T=2\",\n \"rpt\": true\n },\n \"0xF700FF\": {\n \"label\": \"Speed +\",\n \"cmd\": \"SX=~16\"\n },\n \"0xF720DF\": {\n \"label\": \"Red\",\n \"cmnt\": \"Lava palette + primary, secondary and tertiary colors\",\n \"cmd\": \"FP=8&CL=hFF7F00&C2=hFF0000&C3=hCC3D60\"\n }, \n \"0xF710EF\": {\n \"label\": \"Timer1\",\n \"cmnt\": \"Timer 60 min\",\n \"cmd\": \"NL=60&NT=0\"\n },\n \"0xF730CF\": {\n \"label\": \"Play\",\n \"cmnt\": \"prime example of a playlist that cycles every 180 seconds and continues to repeat\",\n \"cmd\": {\"playlist\":{\"ps\":[1,3,5,7,11,13,17],\"dur\": 1800,\"transition\":7,\"repeat\":0,\"end\":0}}\n }, \n \"0xFF9867\": {\n \"label\": \"Bright+\",\n \"cmnt\": \"smaller steps at beginning, larger steps at the end\",\n \"cmd\": \"!incBrightness\"\n },\n \"0xF78877\": {\n \"label\": \"DIY1\",\n \"cmnt\": \"Preset 1, fallback to Saw(16) - Party(6) if it doesn't exist\",\n \"cmd\": \"!presetFallback\",\n \"PL\": 1,\n \"FX\": 16,\n \"FP\": 6\n },\n}\n
"},{"location":"moonmodules/Installing-and-Compiling/","title":"Installing and Compiling","text":""},{"location":"moonmodules/Installing-and-Compiling/#introduction","title":"Introduction","text":"MoonModules introduces a new naming convention for bin(ary) files which contains configs and presets for used hardware. It also shows the used hardware in the bin name including shield esp flash memory size, audio input.
"},{"location":"moonmodules/Installing-and-Compiling/#naming-convention","title":"Naming convention","text":"Binaries can be downloaded or compiled yourself. See below.
When uploading binaries in Manual OTA update , MoonModules support bin awareness: the UI shows which binary is installed and this is a recommendation for the binary to upload (should support the same hardware).
"},{"location":"moonmodules/Installing-and-Compiling/#installing-or-compiling","title":"Installing or Compiling","text":""},{"location":"moonmodules/Installing-and-Compiling/#installing-a-bin","title":"Installing a bin","text":"There are currently 4 locations where bins can be downloaded.
They can be installed using Manual OTA update from within the WLED UI or use Sergs ESP_Flasher to directly upload a bin using USB to a board.
"},{"location":"moonmodules/Installing-and-Compiling/#serg74","title":"Serg74","text":"https://github.com/srg74/WLED-wemos-shield/tree/master/resources/Firmware/%40MoonModules
Updated frequently with dev versions. Go here for latest features
"},{"location":"moonmodules/Installing-and-Compiling/#wladi","title":"Wladi","text":"https://wled-install.github.io/
Updated periodically with release and dev versions
"},{"location":"moonmodules/Installing-and-Compiling/#wledme","title":"wled.me","text":"https://install.wled.me
Releases only
"},{"location":"moonmodules/Installing-and-Compiling/#moonmodules-release-page","title":"MoonModules release page","text":"https://github.com/MoonModules/WLED/releases
Releases only
"},{"location":"moonmodules/Installing-and-Compiling/#compiling-from-ms-code-platform-io","title":"Compiling from MS Code / Platform IO","text":""},{"location":"moonmodules/Installing-and-Compiling/#platformio-environments","title":"PlatformIO Environments","text":"Serg74: https://github.com/srg74/WLED-wemos-shield/tree/master/resources/Firmware/%40Atuline. Choose latest version. Or https://wled-install.github.io/. For Wemos Shield choose WLEDSR_0.13.3.4_wemos_shield_esp32_16MB_max.bin or WLEDSR_0.13.3.4_wemos_shield_esp32_4MB_M.bin (Pins pre-configured)
Serg74 https://github.com/srg74/WLED-wemos-shield/tree/master/resources/Firmware/%40Aircoookie or. Select folder for WLED AC 0.13.3 or 0.14 beta (preferred) or https://wled-install.github.io/
pka Custom Effects
ARTI-FX are effects which are not compiled in the WLED repository but specified by a file (program file) which is interpreted in real time.
The big advantage of this is that effects are not limited by what is made by WLED programmers but anybody can create effects without releasing a new version of WLED. Furthermore any change in the effect code is instantly shown on leds allowing fast developing of effects.
A disadvantage is that the file needs to be loaded, examined and then run in real-time which is 'per definition' slower then pre-compiled code, although performance is promising already and will get better over time.
"},{"location":"moonmodules/arti-fx/#quick-start","title":"Quick start","text":"To get your first ARTI-FX running, perform the following steps
ARTI-FX examples are stored in Github repository
If you develop effects which you want to share, ask for access on Github.
These effects can be loaded easily within WLED: Give a ARTI-FX segment name the same name as an effect in this repository (case sensitive, without .wled), click on ARTI-FX Editor and click Download 'effect'.wled and press Save.
Alternatively, if you want all the effects in this folder at once, go to the ARTI-FX Editor and click Download presets.json (This will overwrite any existing presets you have). Refresh the WLED page or reboot to see the new presets.
"},{"location":"moonmodules/arti-fx/#create-your-own-arti-fx","title":"Create your own ARTI-FX","text":"A ARTI-FX program typically looks like this:
A program contains structures like if statements, for loops, assignments, calls (e.g. renderFrame) etc., commands like setPixelcolor and variables like ledCount.
"},{"location":"moonmodules/arti-fx/#components","title":"Components","text":"program: Once every effect. Can contain global variables and internal functions. There are 2 special internal functions: renderFrame and renderLed
Global variables: Once every effect, reused between functions. Variables (global and local) are defined by using an assignment e.g. t=0
renderFrame: Once every frame
renderLed: Once every led within a frame
Functions and variables give access to the WLED functionality. The list of functions and variables will grow as we go. A function has parameters (even empty parameters) e.g. setPixelColor(x,y), variables haven't e.g. ledCount.
"},{"location":"moonmodules/arti-fx/#wled-general","title":"WLED general","text":"\"ledCount\": {},\n\"setPixelColor\": {\"pixelNr\":\"int\", \"color\":\"int\"},\n\"leds\": {},\n\"setPixels\": {\"leds\": \"array\"},\n\"hsv\": {\"h\":\"uint8\", \"s\":\"uint8\", \"v\":\"uint8\"},\n\n\"setRange\": {\"from\":\"uint16\", \"to\":\"uint16\", \"color\":\"uint32\"},\n\"fill\": {\"color\":\"uint32\"},\n\"colorBlend\": {\"color1\":\"uint32\", \"color2\":\"uint32\", \"blend\":\"uint16\"},\n\"colorWheel\": {\"pos\":\"uint8\"},\n\"colorFromPalette\": {\"index\":\"uint8\", \"brightness\":\"uint8\"},\n\n\"segcolor\": {\"index\":\"uint8\"},\n\"speedSlider\": {\"return\":\"uint8\"},\n\"intensitySlider\": {\"return\":\"uint8\"},\n
"},{"location":"moonmodules/arti-fx/#wled-sr","title":"WLED SR","text":"\"beatSin\": { \"bpm\":\"uint16\", \"lowest\":\"uint8\", \"highest\":\"uint8\", \"timebase\":\"uint32\", \"phase_offset\":\"uint8\"},\n\"fadeToBlackBy\": {\"fadeBy\":\"uint8\"},\n\"iNoise\": {\"x\":\"uint32\", \"y\":\"uint32\"},\n\"fadeOut\": {\"rate\":\"uint8\"},\n\n\"custom1Slider\": {\"return\":\"uint8\"},\n\"custom2Slider\": {\"return\":\"uint8\"},\n\"custom3Slider\": {\"return\":\"uint8\"},\n\"sampleAvg\": {\"return\": \"double\"},\n
"},{"location":"moonmodules/arti-fx/#arti-fx_1","title":"ARTI-FX","text":"\"counter\": {\"return\": \"uint32\"},\n\n\"shift\": {\"delta\": \"int\"},\n\"circle2D\": {\"degrees\": \"int\"},\n
"},{"location":"moonmodules/arti-fx/#math","title":"Math","text":"\"constrain\": {\"amt\":\"any\", \"low\":\"any\", \"high\":\"any\"},\n\"map\": {\"x\":\"int\", \"in_min\":\"int\", \"in_max\":\"int\", \"out_min\":\"int\", \"out_max\":\"int\"},\n\"seed\": {\"seed\": \"uint16\"},\n\"random\": {\"return\": \"uint16\"},\n\"sin\": {\"degrees\": \"double\", \"return\": \"double\"},\n\"cos\": {\"degrees\": \"double\", \"return\": \"double\"},\n\"abs\": {\"value\": \"double\", \"return\": \"double\"},\n\"min\": {\"value1\": \"double\", \"value2\": \"double\", \"return\": \"double\"},\n\"max\": {\"value1\": \"double\", \"value2\": \"double\", \"return\": \"double\"},\n
"},{"location":"moonmodules/arti-fx/#time","title":"Time","text":"\"hour\": {\"return\":\"uint8\"},\n\"minute\": {\"return\":\"uint8\"},\n\"second\": {\"return\":\"uint8\"},\n\"millis\": {\"return\": \"uint32\"},\n
"},{"location":"moonmodules/arti-fx/#pixelblase-support","title":"Pixelblase support","text":"\"time\": {\"inVal\":\"double\", \"return\": \"double\"},\n\"triangle\": {\"t\":\"double\", \"return\": \"double\"},\n\"wave\": {\"v\":\"double\", \"return\": \"double\"},\n\"square\": {\"v\":\"double\", \"t\":\"double\", \"return\": \"double\"},\n
"},{"location":"moonmodules/arti-fx/#serial-output","title":"Serial output","text":"\"printf\": {\"args\": \"__VA_ARGS__\"}\n
"},{"location":"moonmodules/arti-fx/#details","title":"Details","text":"All variables and values are internally stored as doubles and where needed converted to (unsigned) integers, e.g. to WLED functions or operators like %.
Technical details about external variables and functions can be found in arti_wled.h. Look for arti_external_function, arti_set_external_variable and arti_get_external_variable. Some examples:
"},{"location":"moonmodules/arti-fx/#current-limitations","title":"Current limitations","text":"This page Work In Progress
"},{"location":"moonmodules/contribute-dev/#setup","title":"Setup","text":""},{"location":"moonmodules/contribute-dev/#core-branches","title":"Core branches","text":"You can contribute to the contents on this site as follows:
Go to https://yourfork.github.io/WLED-Docs or https://mm.kno.wled.ge/moonmodules/contribute-docs/ if you have contributor rights
Images can be added by dragging them to the page (see earlier added images and videos for the syntax to be used, use width=\"xxx\" to adjust the size)
Commit (see workflow after commit)
If a commit is done a workflow will be started to create the pages.
Progress can be seen in https://github.com/yourfork/WLED-Docs/actions
This will take some time (about 30s)
After the workflow is completed new version of your kno.wled.ge can be found here:
https://yourfork.github.io/WLED-Docs
"},{"location":"moonmodules/contribute-docs/#create-pull-request","title":"Create pull request","text":"kno.wled.ge not supported help is in maintenance mode and can be found here: https://github.com/Atuline/WLED/wiki
"},{"location":"moonmodules/contribute-docs/#wled-ac","title":"WLED AC","text":"Above can also be done on https://github.com/Aircoookie/WLED-Docs
"},{"location":"moonmodules/fork-comparison/","title":"Fork Comparison","text":"What are the differences between WLED SR, upstream AC WLED, and MoonModules fork?
Feature WLED SR 0.13 MoonModules WLED 0.14 Upstream WLED 0.14 0.14 architecture No Yes (upstream frequently merged) Yes Usermods have own pages in main config menu Audio Reactive only Yes No Segments 2D aware No (XY calculated, mirror not working) Yes Yes Audio reactive Core Usermod Usermod Microphone Profiles No Yes No Audio dynamics limiter No Yes Yes High Definition audio analysis, 32 channel GEQ No Yes (WIP) for ESP32 and ESP32-S3 No ARTI-FX Yes Yes No Expand 1D effects No Yes (+ JMap, Circle and Block) Yes Extended hw info basic Yes No JSON Mapping on 1D effects No Yes No Games usermod (3D to 2D, gyro) No Yes (WIP) No Weather usermod (syncing internet data) No Yes (WIP) No HB effects Fully supported 80% supported (WIP) Not supported classic ESP32 Yes Yes Yes ESP32-S3 No Yes Experimental ESP32-S2 and ESP32-C3 No Experimental Experimental ESP8266 No Yes but no Audio Reactive Yes but no Audio Reactive Bin Awareness Yes Yes No Audioreactive palettes Yes Yes No Extended mic settings in platformIO No Yes No DMX Input No Yes No"},{"location":"moonmodules/mappings/","title":"Mappings","text":""},{"location":"moonmodules/mappings/#introduction","title":"Introduction","text":"There are a few steps between an effect and it's physical presentation on a number of leds.
This are the basic steps:
Optionally there can also be:
Remarks
Below is in processing order
"},{"location":"moonmodules/mappings/#json-mapping","title":"JSON mapping","text":"AKA jmap 1D expansion: maps a 1D effect to a 2D pattern
From excel/vba via /edit and to matrix
Files are here: JSONMappings
json files need to be uploaded to /edit. E.g. if filename is candle33.json, the name of the segment must be candle33 and expand1D must be jmap in order to run the mapping.
"},{"location":"moonmodules/mappings/#segment-to-logical","title":"Segment to Logical","text":"Maps segments to a matrix where (0,0) is always topleft and (width, height) always bottom right. Non serpentine
"},{"location":"moonmodules/mappings/#panel-layout","title":"Panel layout","text":"Takes into account Panel setup and Led panel layout as defined in 2D Configuration (e.g. 1st panel, 1st led, serpentine)
Code: uses customMappingTable
"},{"location":"moonmodules/mappings/#ledmaps","title":"Ledmaps","text":"Code: uses customMappingTable
See also Advanced/Mappings
"},{"location":"moonmodules/mappings/#fork-specific-info","title":"Fork specific info","text":"Feature WLED SR 0.13 MoonModules WLED 0.14 Upstream WLED 0.14 JSON Mapping No Yes No JSON mapping yet although it's based on an idea from AirCoookie Segment to Logical Yes Yes Yes Ledmaps Yes Yes Yes Panel layout Yes Yes Yes"},{"location":"moonmodules/platformio-entries/","title":"Platformio entries","text":"To re-use settings in a consistent way, MoonModules platformio entries conform to the following standard:
"},{"location":"moonmodules/platformio-entries/#overview","title":"Overview","text":"Remarks:
-D WLED_USE_MY_CONFIG -D WLED_WATCHDOG_TIMEOUT=0 #-D WLED_DISABLE_BROWNOUT_DET -D ARDUINO_USB_CDC_ON_BOOT=0 ; needed for arduino-esp32 >=2.0.4; avoids errors on startup ; -D WLED_DISABLE_LOXONE ; -D WLED_DISABLE_ALEXA ; -D WLED_DISABLE_HUESYNC ; -D WLED_DISABLE_MQTT ; -D WLED_DISABLE_INFRARED ; -D WLED_ENABLE_DMX ; -D WLED_DEBUG ; -D SR_DEBUG ; -D MIC_LOGGER
This is also ported to WLEDSR.
"},{"location":"moonmodules/platformio-entries/#wled-ac","title":"WLED AC","text":"No plans yet
"},{"location":"moonmodules/preset-api-commands/","title":"Preset API Commands","text":""},{"location":"moonmodules/preset-api-commands/#new-in-014","title":"New in 0.14","text":"key what value remarks m12 Exand1D 0=Pixels, 1=Bar, 2=Arc, 3=Corner, 4=jMap \ud83c\udf1c, 5=Circles \ud83c\udf1c, 6=Block \ud83c\udf1c ssim sound sim 0=BeatSin, 1=WeWillRockYou, 2=U10_3, 3=U14_3See also Features/Presets
"},{"location":"moonmodules/preset-api-commands/#fork-specific-info","title":"Fork specific info","text":""},{"location":"moonmodules/preset-api-commands/#wled-sr","title":"WLED SR","text":"Not in WLEDSR
"},{"location":"moonmodules/release-notes-v0.14.0-b0/","title":"Release notes v0.14.0-b0","text":""},{"location":"moonmodules/release-notes-v0.14.0-b0/#adding-pong","title":"Adding pong","text":"September 16, 2022
"},{"location":"moonmodules/release-notes-v0.14.0-b0/#adding-pong_1","title":"Adding pong","text":"In games usermod
"},{"location":"moonmodules/release-notes-v0.14.0-b0/#updates-from-audio-reactive","title":"updates from audio-reactive","text":"September 8, 2022
"},{"location":"moonmodules/release-notes-v0.14.0-b0/#updates-from-audio-reactive_1","title":"updates from audio-reactive","text":""},{"location":"moonmodules/release-notes-v0.14.0-b0/#merged-to-upstream","title":"merged to upstream","text":"volume & frequency \"dynamics limiter\" - slower decay of sound volume in effects. Also has an effect on GEQ, as it turns on smoothing for frequency bands.
GEQ frequency scaling: None (as in SR WLED), Linear, Square Root (new default), Logarithmic.
New option \"MIC profile\" - default (same table as in SR WLED), line-in (strictly \"pink noise\"), IMNP441 (optimized), ICS-43434 (optimized). This option causes the use of different \"pink noise tables\" when adjusting the frequency spectrum to human \"hearing sensitivity\". Pink noise calibration is very common when using hardware Equalizers. A good testcase is this Pink Noise Video.
(minor) Showing the \"GEQ input gain\" in percent, next to the slider value.
user-settable \"Trebble Amplification\" for GEQ effects. Will be placed into the Info Page, directly under \"GEQ input gain\".
September 6
Lessons Learnt: When upgrading WLED devices to software using the IDF 4.4.x framework, it seems that a flash erase is needed. Without this, we observed crashes whenever files were written.
Suspected cause: Lorol LittleFS (from standards framework) is not compatible with the built-in littleFS from IDF v4.4 / arduino-esp32 v2.0.4. Could be that the partition table is the problem, so a chip erase is needed to clean the table.
A new merge to mdev has been done: new environment esp32mdev_V4
so that normal compiles are not getting the new framework automatically.
From excel/vba via /edit and to matrix
Files are here: JSONMappings
"},{"location":"moonmodules/release-notes-v0.14.0-b0/#september-2","title":"September 2","text":""},{"location":"moonmodules/release-notes-v0.14.0-b0/#updates-from-audioreactive-prototype_1","title":"updates from audioreactive-prototype","text":"Merged into upstream
"},{"location":"moonmodules/release-notes-v0.14.0-b0/#expand1d-effects","title":"Expand1D effects","text":"Strip bar has been merged to upstream, strip Arc and strip Corner (as opposed to pixel Arc and Corner, see upstream) is \"waiting\" in upstream branch. To be added to MoonModules.
"},{"location":"moonmodules/release-notes-v0.14.0-b0/#usermod-level-up","title":"Usermod level up","text":"each usermod got its own settings page
"},{"location":"moonmodules/release-notes-v0.14.0-b0/#september-1","title":"September 1","text":""},{"location":"moonmodules/release-notes-v0.14.0-b0/#august-31","title":"August 31","text":""},{"location":"moonmodules/release-notes-v0.14.0-b0/#arti-fx","title":"ARTI-FX","text":"+ =
+ =
"},{"location":"moonmodules/release-notes-v0.14.0-b0/#august-29","title":"August 29","text":""},{"location":"moonmodules/release-notes-v0.14.0-b0/#updates-from-audioreactive-prototype_2","title":"updates from audioreactive-prototype","text":""},{"location":"moonmodules/release-notes-v0.14.0-b0/#merged-into-upstream","title":"Merged into upstream","text":"December 23, 2022
Currently implemented for AudioReactive and 4LineDisplay (tested) and all usermods which uses pin variables (testing in progress)
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#mmknowledge","title":"mm.kno.wled.ge","text":"December 21, 2022
MoonModules pages (wich is a fork of upstream pages) is now linked to mm.kno.wled.ge and is integrated in MoonModules WLED.
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#usermod-specific-help","title":"Usermod specific help","text":"December 19, 2022
This goes to https://mm.kno.wled.ge/soundreactive/Sound-Settings/
Also added in Weather usermod and four line display usermod (pages wip)
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#ledmap2d","title":"Ledmap2D","text":"December 5, 2022 In 0.14 ledmaps are only supported for 1D. This fix makes it work for 2D in WLED MM.
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#arti-fx-improvements","title":"ARTI-FX improvements","text":"November 29, 2022
ARTI-FX improvements: - Simplified presets.json (can be downloaded directly into WLED MM in ARTI-FX editor screen) - some bug fixes to let ARTI-FX run better on 2D
And combining ARTI-FX with 1D expansions gives great results and makes ARTI-FX very well performing on large 2D matrices!!!
This is color_fade_pulse (by @atuline) with Circles expansion:
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#improved-lay-out-usermod-settings","title":"Improved lay-out usermod settings","text":"November 20, 2022
Grouping and pre-post texts in usermod settings (to make it more readable)
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#audioreactive-palettes","title":"Audioreactive palettes","text":"November 19, 2022
by NetMindz
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#extended-mic-settings-in-platformio","title":"Extended mic settings in platformIO","text":"November 18, 2022
allowing to create mic specific environments:
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#bin-aware-builds","title":"Bin Aware Builds","text":"October 28, 2022
Upload hardware specific configs based on generated filenames (=> WLED install is aware of underlying hardware).
Ultimate goal of bin awareness is that WLED itself says: hey! I found a new update for you, do you want to install?
plus
(esp32mdev -> esp32_4MB_min. esp32mdevmax -> esp32_4MB_max / esp32_16MB_max)
plus
(0.14.0. sequence of upstream commit . sequence of mm commit (need to be updated together with build date)
=>
=>
(WLED install is aware of the filename of it's bin, WLEDMM_0.14.0.2.1_esp32_16MB.bin in this example)
plus
(Serg and Wladi repo's should use the same names)
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#ota-latest-release","title":"OTA latest release","text":"October 25, 2022
Manual OTA Update is showing the latest MoonModules/WLED release and clicking on the version icon jumps to the release pages on Github, links to Serg74 and Wladi builds are also shown on the release page, so Manual OTA Update will guide you to the version you need!
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#add-circles-and-block-as-1d-expansion","title":"Add Circles and Block as 1D expansion","text":"October 21, 2022
Add Circles and Block as 1D expansion and show virtualStrip effects with \u22ee\u22ee
Tetris effect with block expansion:
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#compatibility-for-sr013-presets","title":"compatibility for SR/0.13 presets","text":"October 20, 2022
Thanks to 'renumbered effect ID's back to WLED SR 0.13 numbering': Add compatibility for SR/0.13 presets. This allows HB effects to be run on 0.14, however this shows that there are some shortcomings in 0.14: e.g. lissajoux not working as at should and overlapping segments not working (e.g. Akemi from Hell): November update: Lissajoux, Akemi from Hell (and others) fixed, overlapping segments working now. Check this in Led Preferences:
(To see them fully working: load them into WLEDSR 0.13!)
To upload HR effects put effects / presets.json in /edit
To start creating your own multiple segment effects put base / presets.json in /edit
Presets.json files are here
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#renumbered-effect-ids-back-to-wled-sr-013-numbering","title":"renumbered effect ID's back to WLED SR 0.13 numbering","text":"October 16, 2022
Important update: renumbered effect ID's back to WLED SR 0.13 numbering so WLED (SR) 0.13 is compatible with MoonModules 0.14 for presets and sync between devices
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#extra-hardware-info-on-info-tab","title":"Extra hardware info on Info tab","text":"October 13, 2022
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#refactored-json-mapping","title":"Refactored JSON Mapping","text":"October 1, 2022
smaller memory footprint so larger mappings can be used, e.g. Snake32:
Files are here: JSONMappings
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#games-usermod-additions","title":"Games usermod additions","text":"September 27, 2022
Added to games usermod:
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#3d-to-2d-mapping","title":"3D to 2D mapping","text":"Adding Frame3D class which takes a 3D coordinate and maps this to 2D matrix (using addEffect(), setPixelColor(floats) and drawLine() added in 0.14 version)
=
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#3d-gyro","title":"3D + Gyro","text":"Refactoring USERMOD_MPU6050_IMU (so that it works!) using latest ElectronicCats/mpu6050 library Embedding this usermod in games usermod and use yaw pitch and roll in Frame3D class
+ =
"},{"location":"moonmodules/release-notes-v0.14.0-b15/","title":"Release notes v0.14.0-b15","text":""},{"location":"moonmodules/release-notes-v0.14.0-b15/#example-mapping-library-for-rings-cubes-and-clouds","title":"Example mapping library for Rings, Cubes and Clouds","text":"2 April 2023
Get them here, upload the presets.json to have them all as presets: MoonModules/WLED-Effects/Ledmaps
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#mm-usermods-have-their-own-icon","title":"MM Usermods have their own icon","text":"2 April 2023
And (therefore) shown on top
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#tablet-pc-mode-support-and-ui-graphics-refactor","title":"Tablet PC Mode support and UI graphics refactor","text":"24 March 2023
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#better-sort-of-presets","title":"Better sort of presets","text":"23 March 2023
simplify sort to better align with quick load labels (sort first) and ir remotes using id (sort after presets)
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#athom-wled-music-controller-support","title":"Athom WLED Music Controller support","text":"21 March 2023
17 March 2023
FreqDist: set to rightshift to move the frequency bands a bit to the right in case most activity is on the left side.
FreqRMS: set to \"on\" to activate a different method for averaging higher frequencies, called \"RMS\" - it preserves peaks better. Downside: could lead to \"overshooting\" in GEQ, as our mic profiles are not adjusted to it yet.
17 March 2023
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#geq-smooth-bars","title":"GEQ Smooth Bars","text":"7 March 2023
New option to the GEQ effect: smooth bars. It's intended for matrices with >24 columns, where you would see a \"staircase\" effect because we only have 16 frequency channels. With the new option enabled, it looks like more channels are availeable and stairs are smoothed out.
and also smooth colors:
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#ledmap-properties","title":"Ledmap properties","text":"1 March 2023
See Advanced/Mapping/0.14 MM
Example: Ring Map
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#aditional-info-in-info-tab","title":"Aditional info in info tab","text":"27 Februari 2023
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#manage-netdebug-netprint-in-settings","title":"Manage NetDebug / NetPrint in settings","text":"24 Februari 2023
NetDebug is called NetPrint in WLEDMM as it is not only used for debut as we have USER_PRINT. It just prints to the network, hence the name.
No need to specify ip address and port in platformio.ini and therefor hardcode in bin/esp32 (but can be set to default). Go to Sync Interfaces / Net Print and specify there. Set output to network pressing Net Print in the info tab (default off after reboot value is saved in cfg.json - bug: not always set correctly after reboot - wip).
Bins WLEDMM_0.14.0-b2.19_esp32_4MB_M_debug and WLEDMM_0.14.0-b2.19_esp32_16MB_M_debug have NetPrint enabled by default. To do: check if NetPrint can be enabled in all bins (without performance/network consequences), also when WLED_DEBUG is off to catch Serial output.
March 8: All _M and _XL bins have NetPrint enabled by default (but not WLED_DEBUG): User info (using USER_PRINT) can be send to network
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#2d-ledmaps","title":"2D Ledmaps","text":"The first one will change colors smoothly, the second one will change colors every 5 seconds.
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#pins","title":"Pins","text":"January 14, 2023
For more information see https://mm.kno.wled.ge/usermods/globalpins/ This page is shown if you press here:
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#generate-presets-and-playlists","title":"Generate presets and playlists","text":"January 12, 2023
Generate presets of all effects and group them together in playlists for 1D or 2D, Volume or FFT, combinations or all
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#i2c-and-spi-pins-make-over","title":"I2C and SPI pins make over","text":"Januari 9, 2023
We were not happy how currently pins are managed. It raises questions in discord we could not answer so we decided to refactor it. It's not easy as a lot is interconnected but we made the first steps:
This will be work in progress the coming weeks to implement in usermods (AudioReactive and 4LD working, others likely working but must be tested)
Overview of usermods available in _all bins:
"},{"location":"moonmodules/release-notes-v0.14.0-b25/","title":"Release notes v0.14.0-b25","text":"MoonModules v0.14.0-b25, release July 15th 2023
This WLED MM release is based on latest stable dev of WLED AC (June 2, 2023). We have also added a few stability patches that arrived in WLED AC after June 2nd. As WLED AC is undergoing a lot of changes, MoonModules built in a longer delay then normal to keep up with upstream until latest upstream is well tested.
Below an overview of major MoonModules specific changes and new features.
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#full-bright-preview","title":"Full Bright Preview","text":"7 July 2023
By @Softhack007
Instead of dimming down, the preview always shows at max brightness - even when the global brightness slider for your LEDs is set to a low value.
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#animartrix-usermod-2d-effects","title":"AnimARTrix Usermod - 2D effects","text":"
29 Jun 2023
By @Netmindz
Usermod to allow access to the AnimARTrix 2D effects by @StefanPetrick, all the effect names are prefixed with Y to group them at the bottom of the list. Animation speed can be controled by slider.
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#wled-instances","title":"WLED Instances","text":"May 2023
Refactor of the Nodes popup
1 July 2023 (audio fastpath, part 1)
Some effects will run up to 60% faster now. A lot of minor speedups to effect core routines were added. Additionally, FastLED color handling code was updated to release 3.6.0.
pixelwave
, freqmatrix
or DJ Light
."},{"location":"moonmodules/release-notes-v0.14.0-b25/#auto-brightness-limiter-works-again","title":"Auto Brightness Limiter works again","text":"
30 June 2023
By @Softhack007
Auto Brightness Limiter bugfixes (from WLED AC) are included in this release.
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#improved-stability","title":"Improved Stability","text":"1 June 2023
By @Troy and @Softhack007 and @ewowi
WLEDMM internal memory handling was optimized and improved for reliability. Loading of ledmaps was optimized to prevent repeated reading of the same file. As a consequence, large setups (>2500 LEDs) and big ledmaps.json files will work much better. We recommend using an ESP32 board with PSRAM for large setups, as JSON files will be processed in external PSRAM if available (PSRAM enabled firmware build needed).
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#peak-unlimited","title":"Peak unlimited","text":"May 16
by @ewowi
Instead of scaling down on pixels when having lots of leds we lower the peak frame rate so we have WYPIWYG (what you peak is what you get)
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#audio-palette-updates","title":"Audio Palette Updates","text":"14 April 2023
By @Netmindz
Fix issues with Audio Responsive Hue being single color and add new Audio Responsive Ramp palette. AR Ramp is designed for use with effects like Fire that expect the palette to start with black, then ramp up
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#soundpressure","title":"SoundPressure","text":"7 April 2023
By @Softhack007
In contrast to \"volume\", sound pressure level changes with the real loudness, as measured by your microphone. It will climb when you turn music louder, and fall when you turn volume down. You need an I2S digital microphone for soundpressure.
ARTI-FX, and the Waverly and Gravimeter effects already support sound pressure. More effects to come. Currently SoundPressure is not transmitted to networked devices with \"UDP sound sync\".
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#dmx-input","title":"DMX Input","text":"6 April 2023
By @Netmindz
Do you have existing tranditional wired DMX setup and just want to attach you WLED device like any other fixture? Well now you can. Same behaviour as existing DMX over ip (ArtNet / e1.31), but now with the stability and realiability without the need to use Ethernet.
Note: only currently on the _v4 builds due the esp_dmx library needing the 2.x ESP32-Arduino platform
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#support-for-pixelart-in-arti-fx","title":"Support for pixelArt in ARTI-FX","text":"5 April 2023
Idea by @Stiw47
ARTI-FX can show multiple frames, each stored as a separate json file in /edit
Program can be found here: https://github.com/MoonModules/WLED-Effects/blob/master/ARTIFX/wled/mario.wled
As ARTIFX does not support strings, jsonToPixels only contains a sequence number, the name of the json files is combination of segment name (that should be called mario), sequence number and \".json\") See https://github.com/MoonModules/WLED-Effects/blob/master/ARTIFX/wled/presets.json for how to add mario in presets
And don't forget to upload latest wledv033.json to /edit (https://github.com/MoonModules/WLED-Effects/blob/master/ARTIFX/wled/wledv033.json)"},{"location":"moonmodules/release-notes-v0.14.0-b25/#add-es8388-as-sound-reactive-input-type","title":"Add ES8388 as Sound Reactive Input type","text":"
5 April 2023
By @Troy and @Netmindz
Can be found in these boards: LyraT v4.3
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#git-log","title":"Git Log","text":"git log mdev --pretty=format:\"%h - %ad - %an : %s &b\" --date=format-local:\"%Y-%m-%d\" --since=\"2023-04-02\"
c0a0f66a - 2023-04-30 - Frank : trying to revive github ci build for new MCUs (#38) as suggested here:\n* https://github.com/platformio/platform-espressif32/issues/1081#issuecomment-1518601054\n\n62910038 - 2023-04-28 - netmindz : Merge pull request #37 from netmindz/mdev Update FX.cpp\n\nd4bdb303 - 2023-04-24 - netmindz : Update FX.cpp Assign proper attribution of DJLight to Stefan Petrick\n\n fb3477e5 - 2023-04-21 - Frank : soundreactive effect updated \n* blurz: some visual improvements\n* Matripix: improved color smoothness, Color by frequency (instead of volume), option to use sound pressure\n* pixelwave: improved color selection, use sound energy instead of volume\n* freqwave: some speedups, option to show frequency with \"musical scale\"\n* gravfreq: fixed some math accidents that lead to horrible flickering\n* default setting improved for some effects\n\nd5a7f5dd - 2023-04-21 - Frank : scrolling text bugfix effect was crashing with too long or undefined segment names.\n\n8e9db0ad - 2023-04-21 - Frank : more accurate FPS forESP32 the standard millis() code is very inaccurate in the \"high FPS\" ranges. This replaces it with the esp32 high resolution timer.\n\n9130e4be - 2023-04-21 - Frank : minor optimization of core LED functions \n* use _fast_ integer types in loops - in contrast to \"uint16_t\" etc, the compiler can leave out range/overflow corrections, so it might run faster.\n* fcn_declare.h: revive \"WLED_USE_REAL_MATH\" option, which can be a bit faster on ESP32.\n\n36356743 - 2023-04-21 - Frank : audio effects: allow to run at full speed \n* set the \"speed\" slider to 255, for running at full speed\n* #FPS (framerate) and #POW (ampere) added to scrolling text\n\n00661de7 - 2023-04-21 - Frank : accept up to 250 fps target in LED preferences warning included.\n\n63a597b9 - 2023-04-20 - Frank : pio: same for -S3 ..... \nTool Manager: toolchain-xtensa-esp32s3@8.4.0+2021r2-patch3 has been installed!\nTool Manager: Installing espressif/toolchain-riscv32-esp @ 8.4.0+2021r2-patch3\nError: Could not find the package with 'espressif/toolchain-riscv32-esp @ 8.4.0+2021r2-patch3' requirements for your system 'linux_x86_64'\nError: Process completed with exit code 1.\n\nb35cd214 - 2023-04-20 - Frank : pio: disable -C3 and -S2 builds until github fixes their build toolds \nTool Manager: toolchain-xtensa-esp32s2@8.4.0+2021r2-patch3 has been installed!\nTool Manager: Installing espressif/toolchain-riscv32-esp @ 8.4.0+2021r2-patch3\nError: Could not find the package with 'espressif/toolchain-riscv32-esp @ 8.4.0+2021r2-patch3' requirements for your system 'linux_x86_64'\n\n33a78bef - 2023-04-20 - Frank : a little less buffer for -S2 the last change caused a build error for ESP32-S2: region `dram0_0_seg' overflowed by 5064 bytes\n\n1b3d9a1a - 2023-04-20 - Frank : more JSON buffer for boards with PSRAM allows to load ledmaps with > 15000 positions!\n\nbcbc0fbd - 2023-04-19 - Frank : Update platformio.ini \n* temporarily remove esp32c3dev_4MB_M from nightly builds, as the github action build currently has strange problems with it\n* -D WLED_USE_PSRAM_JSON for ESP32 boards, as using PSRAM for LED Buffers and Segment Buffers causes slow-down\nd90ee766 - 2023-04-19 - Frank : PSRAM: you can have it, and eat it or not eat it *This patch allows to compile with BOARD_HAS_PSRAM, but not set WLED_USE_PSRAM - reserved pins will be protected, and PSRAM usage will be shown in info.\n* if you add `-D WLED_USE_PSRAM_JSON` then PSRAM will be used for some JSON buffers, but not for LEDs and Segments.\n\ne2d3800f - 2023-04-19 - Frank : woraround for spurious crash in serializePalettes the root cause of the crash is not really clear, as the problem seems to occur randomly, mosr frequent with fresh installations.\nThis workaround prevents the array bounds violation, by re-using the last valid gGradientPalettes entry.\n\na2f15c77 - 2023-04-19 - Frank : WIFI_POWERON_HACK for AP mode reduce TX power - required for C3 mini v1.0.0 (wemos), see https://www.wemos.cc/en/latest/c3/c3_mini_1_0_0.html#about-wifi\n\n0558865c - 2023-04-18 - Troy : Merge pull request #36 from Fonta/patch-1 Fix invalid environment error in PlatformIO\n\n2e118938 - 2023-04-18 - Troy : Merge pull request #35 from troyhacks/DDP-RGBW-Transmit-Fix DDP Transmit RGBW Fix\n\n8d85a524 - 2023-04-17 - Frank : correct some stupid peak detection defaults parameters C1 and C2 control peak detection. Previous defaults (c2=0 !!!) did not make any sense.\n\n3f429439 - 2023-04-17 - Frank : Blurz effect: back to original SR code \nModifications from upstream have made the effect kind of boring non-reactive. So we go back to the original effect.\nHINT: Effect looks best with _segment_ brightness set to max (use _global_ brightness to reduce brightness as you like).\n\n45da3121 - 2023-04-16 - Fonta : Update platformio.ini \n\n6b6c961a - 2023-04-16 - Fonta : Fix invalid environment error in PlatformIO PlatformIO gives error on codm environments\n``Error: Invalid environment name 'codm-controller-0.6'. The name can contain alphanumeric, underscore, and hyphen characters (a-z, 0-9, -, _)``\n\n28c737df - 2023-04-15 - Frank : small fix Serial0 does not exist without ARDUINO_USB_CDC_ON_BOOT\n\n0fd26cc7 - 2023-04-15 - Frank : replace AC WebServer with lost-hope variant temporarily replace the webserver with a modified one that can also show .wled and .log files under /edit.\n\n2585b785 - 2023-04-15 - Frank : remove duplictate dependancies (AsyncTCP 1.1.1) \n* moving \"pbolduc/AsyncTCP.git @ 1.2.0\" on top of lib_deps, to prevent that AsyncTCP 1.1.1 is pulled in (due due dependacies from Aircoookie/ESPAsyncWebServer\n* remove duplicate env.lib_deps from -S2 environments\n\nc295c877 - 2023-04-15 - Frank : moving esp_dmx lib into esp32_4MB_V4_S_base the idea is to keep enable flag and library in the same build env.\n\n244a6137 - 2023-04-15 - Frank : esp32_4MB_V4_M: stay below 100% flash usage \n\n322ab9c5 - 2023-04-15 - Frank : arti-fx error handling improvements \n- if log file cannot be created, switch to serial logging\n- fixing a broken format string\n- usermod_arti: avoid to copy more than what fits into the buffer\n\nb7f1373e - 2023-04-14 - TroyHacks : DDP Transmit RGBW Fix \n\n4294f601 - 2023-04-14 - Frank : npm run build \ncc9a19bc - 2023-04-14 - Frank : partial merge of upstream/main \n* leaving out DotStarHspi5MhzMethod, as we are still on NPB 2.6.9 for eth boards\n* leaving out the index.css/index.css changes, as I'm not sure how to merge this.\n@ewoudwijma we need to merge the JS and CSS parts when you are back; I'll stay with our MM version for now.\n\nee23827f - 2023-04-14 - netmindz : Merge pull request #16 from netmindz/audio-palette-updates Audio palette updates\n\ncc25a21b - 2023-04-14 - Will Tatam : Merge branch 'mdev' into audio-palette-updates \n\n05c3e569 - 2023-04-14 - Frank : optional: warn about functions with high stack usage \n\n3e2a6848 - 2023-04-14 - Frank : arti setup(): attempt to fix memory leak \n- check that programName is not too long (fileNameLength-7 is the limit)\n- try to fix a memory leak, as programText must be free'd in case of error.\n@ewoudwijma please review my changes, I'm not 100% sure I did it right.\n\n10ca7c83 - 2023-04-14 - Frank : enumerateLedmaps: prevent buffer overflow make sure that bounds of char fileName[33] are not exceeded by sprintf.\n\n5f4dd53b - 2023-04-14 - Frank : V4 target: enable warning for variable shadoing \n* pio.ini: add \"-Wshadow=compatible-local\" for V4 targets\n* pio.ini: fix alignment for 8266 build_flags\n* fix one (harmless) case of shadowed vars in MM specific code\n\ndb62153e - 2023-04-13 - Frank : fix for a potential array overrun unguarded sprintf / strcpy are always a risk.\n\n122f54a2 - 2023-04-13 - Frank : prevent heat-up on tiny -C3 boards \n* reduce LED default brightness\n* unset \"disable wifi sleep\" when WLEDMM_WIFI_POWERON_HACK\n\n94a7f562 - 2023-04-13 - Frank : handling of Serial on CDC USB board ... like the typical -C3\n* Replaced a few direct Serial.printf with macros\n* Always check if Serial is connected before printing (CDC sometimes hangs when trying to send/receive without connection)\n\n0081122f - 2023-04-13 - Frank : buildenv improvement for -C3 \n* IRremoteESP8266 @ ~2.8.2\n* -D WLED_DISABLE_ADALIGHT (as most devices don't have a serial-to-USB chip)\n\na193aabd - 2023-04-13 - Frank : Merge pull request #34 from troyhacks/2023-04-12-Art-Net_Transmit_Repair_Bad_Optimization \n\"Unfixing\" an optimization to the Art-Net header.\nThe local \"buffer\" was shadowing the LED buffer (function parameter), so art-net would only send out headers but no LEDs.\n2e0d1046 - 2023-04-13 - Frank : some cleanups and updates for -C3 * remove duplicate env.lib_deps\n* use NeoPixelBus @ 2.7.3\n* added board_build.flash_mode\n\n0afad594 - 2023-04-13 - Frank : MM style buildenv for seeedxiao -C3 \n\n40e614cb - 2023-04-13 - Frank : ups double platform_packages line removed\n\ne9719900 - 2023-04-13 - Frank : pio: added esp32.platformV4_new = espressif32 @ ~5.2.0 \n\n0ae004ff - 2023-04-13 - Frank : buildenv fix: avoid NeoPixelBus 2.7.4 it seems that NPB 2.7.4 introduces new incompatibilities with WLED, that break gh action builds.\n\ndeb09c28 - 2023-04-13 - TroyHacks : Unmessing an optimization to the header - which caused the header to be sent over and over. \n\n04fa3995 - 2023-04-11 - Frank : soundsim bugfix FFT_MajorPeak simulated value was too small.\n\na1bdb47c - 2023-04-10 - Frank : trying to make sound pressure less boring for line-in \"sound pressure\" for line-in was always close to max - which is expected, because the ADC chip utilize the full 24/16bit sample range.\nThe new calculation leads to some more \"movement\".\n\n25122f98 - 2023-04-10 - Frank : temporary disable DMX input on -C3 and -S2 \n\n8ba43b63 - 2023-04-10 - Frank : Sound pressure: modified correction factors for PDM and analog \n\n61949cfd - 2023-04-10 - Frank : Sound Pressure \n- some optimizations \n- slightly extend input range\n- add correction factors for some sound sources\n- gravimeter: tweaking\n\n822fcf27 - 2023-04-08 - Ewoud : ARTI-FX change .wled.log to .log \n\n79c67122 - 2023-04-08 - Will Tatam : Enable WLED_ENABLE_DMX_INPUT again, now we reference a preditacble tag not branch \n\neb3ad99b - 2023-04-08 - Will Tatam : Use taged version of esp_dmx \n\n343252f6 - 2023-04-08 - Will Tatam : Use taged version of esp_dmx \n\n876b08e3 - 2023-04-08 - Ewoud : Temporary disable WLED_ENABLE_DMX_INPUT in esp32_4MB_V4_S_base \n\nca9bd227 - 2023-04-08 - Ewoud : Merge remote-tracking branch 'upstream/main' into mdev Everything merged except platformio.ini\n4ld has not been merged previously\nUpdate version to 0.14.0-b15.22\n\n212126b0 - 2023-04-07 - Ewoud : esp8266_4MB_M: usermods maches max usermods, add net print,set flashsize \n\na6e2cf0b - 2023-04-07 - Ewoud : ARTI-FX: Fix printing to USER_PRINT (if !logToFile) \n\n4aea3970 - 2023-04-07 - Ewoud : ARTI-FX support 8266 (experimental!!) add soundpressure Add ARTI-FX to esp8266_4MB_M (experimental!)\n\n20a91454 - 2023-04-06 - Ewoud : Post marge: regenerate html_settings \n\n6ef2857d - 2023-04-06 - MoonModules : Merge pull request #28 from netmindz/DMX-Input-esp_dmx Dmx input esp dmx\n\n7ffe25d5 - 2023-04-06 - MoonModules : Merge branch 'mdev' into DMX-Input-esp_dmx \n\n6cce70b2 - 2023-04-06 - Frank : gravimeter and waverly: option to show sound pressure level \n* adjusted gravimeter and waverly effects so that \"Sound Pressure\" can be used instead of volume\n* some improvements to gravimeter effect\n* fixing some over/underflows in gravimeter\n* waverly: option \"No Clouds\" to only show lower part\n\n197e120e - 2023-04-06 - Frank : estimated audio sound pressure \n\nb0907762 - 2023-04-06 - Frank : low-cut audio input filtering \n* 40Hz low-cut and DC blocker filter - will remove any signal offsets and also removes rumbling noise up to 12db\n* DC blocker set as default for all sources (prerequisite for later measuring sound pressure)\nadditional filtering options are in the making :-)\n\n00e9c592 - 2023-04-06 - MoonModules : Update readme.md \n\na77900b0 - 2023-04-06 - MoonModules : Update readme.md \n\n669b81de - 2023-04-06 - MoonModules : Update readme.md \n\n753f5621 - 2023-04-06 - Ewoud : ws sendLiveLedsWs: no skiplines to show large matrices uncompressed \n\n7372d304 - 2023-04-05 - MoonModules : Update FUNDING.yml \n\n64041836 - 2023-04-05 - Ewoud : Merge pull request #30 from troyhacks/ES8388-init-fixes ES8388 init optimizations and fixes\n\n95d6d186 - 2023-04-05 - TroyHacks : ES8388 init optimizations and fixes \n\nd64cefb2 - 2023-04-05 - Will Tatam : Fix invert of tx and rx pins \n\ncae1c004 - 2023-04-05 - Ewoud : ARTIFX add support for pixelart + small changes arti_wled.h:\n\ne4243c4d - 2023-04-05 - Ewoud : Merge pull request #5 from netmindz/ES8388 WiP - ES8388\n\n84f316cd - 2023-04-04 - netmindz : Merge pull request #1 from troyhacks/ES8388-troyhacks Working proof of concept for ES8388\n\n111c8c92 - 2023-04-04 - TroyHacks : Merge branch 'ES8388-troyhacks' of https://github.com/troyhacks/WLED into ES8388-troyhacks \n\nf44f307f - 2023-04-04 - TroyHacks : Comments and typos, init optimization and shortening. \n\n7d32bc5f - 2023-04-04 - Troy : Merge branch 'ES8388' into ES8388-troyhacks \n\na6a1bbab - 2023-04-04 - TroyHacks : Remove platform.ini entry for ES8388 \n\nc38baf90 - 2023-04-04 - TroyHacks : Removing local lib copy \n\nd775f7fb - 2023-04-04 - TroyHacks : Removed reliance on the ES8388 library and made things more in line with similar boards with I2C init. \n\n4997145d - 2023-04-04 - Ewoud : Fastled usermod, add Stefan Petrick effects PolarBasics & CircularBlobs CC BY-NC 3.0 licensed effects only include this usermod only if you accept the terms!\nTherefore not enabled in platformio.ini builds.\n\nbd477624 - 2023-04-04 - TroyHacks : Working proof of concept for ES8388 \n\n03570848 - 2023-04-03 - Will Tatam : Merge branch 'mdev' into ES8388 \n\n760ff836 - 2023-04-03 - Will Tatam : Merge branch 'mdev' into ES8388 \n\nd17a41f7 - 2023-04-02 - Bla\u017e Kristan : Merge pull request #3155 from werkstrom/patch-1 Adjustments to Pixel Art Converter\n\n503f71f0 - 2023-04-02 - Blaz Kristan : Npm run build \n\n329899f4 - 2023-04-02 - Ewoud : ooops \n\n3dd78731 - 2023-04-02 - Ewoud : First b15 daily build: add fastled usermod \n\n9307105b - 2023-04-02 - Henrik : Redone in Patch-1 \n\n27e89151 - 2023-04-02 - Ewoud : Versioning: 0.14.0-b15 (use the .21 extension on future commits) \n\n567daf99 - 2023-04-02 - Henrik : Merge branch 'Aircoookie:main' into patch-1 \n\neead626d - 2023-04-02 - Ewoud : 0.14.0-b15.21 release! \n
"},{"location":"moonmodules/release-notes-v0.14.0-b26/","title":"Release notes v0.14.0-b26","text":"Below are the ongoing updates in WLEDMM which are included in release v0.14.0-b26.30
"},{"location":"moonmodules/release-notes-v0.14.0-b26/#some-_s-builds-are-optimized-for-speed","title":"Some_S
builds are optimized for speed","text":"July 21st, 2023
By @Softhack007
Some MoonModules builds are now utilizing compiler option -O2 \"optimize for speed\", instead of -Os \"optimize for size\".
As the firmware size grows with this option, only a few _S
firmware binaries for esp32 are currently build with this higher optimization level:
esp32_4MB_S
(flash usage 87.4% --> 98.8%)esp32_16MB_V4_S
(flash usage 73.3% --> 82.9%)esp32_16MB_S
(includes animartix)esp32S3_8MB_S
for -S3 (up to 45% faster than normal build!)First tests show 20%-35% higher FPS (framerates) in effects!
Known issue: USERMOD_ANIMARTRIX aborts with internal compiler error when building with -O2
:
wled00/../usermods/usermod_v2_animartrix/usermod_v2_animartrix.h: In function 'uint16_t mode_Waves()':\nwled00/../usermods/usermod_v2_animartrix/usermod_v2_animartrix.h:340:1: error: insn does not satisfy its constraints:\n }\n ^\n (insn 811 738 824 24 (set (reg/v:SF 19 f0 [orig:69 result ] [69])\n (mem/u/c:SF (symbol_ref/u:SI (\"*.LC1575\") [flags 0x2]) [0 S4 A32])) \".pio/libdeps/my_esp32_16MB_V4_S_debug/animartrix/ANIMartRIX.h\":345 47 {movsf_internal}\n (nil))\n during RTL pass: postreload\n wled00/../usermods/usermod_v2_animartrix/usermod_v2_animartrix.h:340:1: internal compiler error: in extract_constrain_insn, at recog.c:2210\n libbacktrace could not find executable to open\n Please submit a full bug report, with preprocessed source if appropriate. See <https://gcc.gnu.org/bugs/> for instructions.\n
"},{"location":"moonmodules/release-notes-v0.14.0-b27/","title":"Release notes v0.14.0-b27","text":"Below are the ongoing updates in WLEDMM which are included in release v0.14.0-b27.31
"},{"location":"moonmodules/release-notes-v0.14.0-b27/#topic","title":"Topic","text":"Aug 26st, 2023
what it is.
By @Softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b27/#topic_1","title":"Topic","text":"Date
By @Netmindz
"},{"location":"moonmodules/release-notes-v0.14.0-b28/","title":"Release notes v0.14.0-b28","text":"MoonModules v0.14.0-b28, release December 20th 2023
Below are the WLEDMM specific new features which are included in release v0.14.0-b28.34
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#build-runs-anywhere-usermods","title":"build runs-anywhere usermods","text":"Dec 15th, 2023
WLEDMM now allows you to encapsulate your MoonModules specific code like this:
class ShtUsermod : public Usermod\n{\n private:\n#ifndef _MoonModules_WLED_\n bool enabled = false; // Is usermod enabled or not //WLEDMM not needed - using public attribute of class UserMod\n#endif\n\n public:\n#ifdef _MoonModules_WLED_\n ShtUsermod(const char *name, bool enabled):Usermod(name, enabled) {} //WLEDMM usermod initializer with parameters\n#endif\n\nvoid ShtUsermod::setup()\n{\n if (enabled) {\n\n#ifdef _MoonModules_WLED_\n if ((i2c_sda >= 0) && (i2c_scl >= 0) && pinManager.joinWire(i2c_sda, i2c_scl)) { // WLEDMM pin management done by pinManager.joinWire()\n pinAllocDone = true;\n } else {\n USER_PRINTF(\"[%s] SHT pin allocation failed!\\n\", _name); // WLEDMM using USER_PRINTF for important messages\n cleanup();\n return;\n }\n#else\n PinManagerPinType pins[2] = { { i2c_sda, true }, { i2c_scl, true } };\n if (i2c_sda < 0 || i2c_scl < 0 || !pinManager.allocateMultiplePins(pins, 2, PinOwner::HW_I2C)) { \n DEBUG_PRINTF(\"[%s] SHT pin allocation failed!\\n\", _name);\n cleanup();\n return;\n } else pinAllocDone = true;\n#endif\n }\n initDone = true;\n}\n
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#udp-sound-sync-improvements","title":"UDP Sound Sync improvements","text":"December 2023
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#latency-reduced-drasticially","title":"Latency reduced drasticially","text":"Latency from microphone to receiving sound on the remode unit has been optimized drasticially. Previously the average delay was 30-60ms. With our optimized code, UDP packets are sent out directly when new samples arrive from the driver, resulting in average delay of 10-25ms.
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#new-udp-sync-mode-receive-or-local","title":"New UDP sync mode \"Receive or Local\"","text":"Acts like \"Receive\", however automaticially falls back to local whenever the UDP stream is missing.
Local input when sender is missing.
Automatic switch-over to network sound.
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#udp-sound-sequence-checking-framecounter","title":"UDP sound sequence checking (framecounter)","text":"UDP transport itself does neither guarantee delivery nor sequence.
Leveraging on a previously unused byte in the UDP sound sync format, WLED-MM now checks that a newly received sound sample is \"in sequence\". Too-late packets will be dropped, leading to smoother animations.
By @netmindz
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#presets-name-and-default-checkboxes","title":"Presets name and default checkboxes","text":"Nov 23st, 2023
Default name of new preset now includes the icons (cause it's nice to know if a preset is sound reactive or not) Preset checkboxes have now default of last set values (cause it's handy of you don't want to save brightness it is not saved in next preset save as well)
By @ewowi
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#super-sync","title":"Super Sync","text":"October 15, 2023 By @ewowi
Super Sync runs one effect on multiple instances allowing for higher framerates as each instance runs only part of the effect.
The nodes tab shows more info per instance, info which is needed for SuperSync.
SuperSync takes all the panels in the 2D config setup and each panel will be setup on a different node.
Red: client node is not setup right
SuperSync button: for all nodes with a red yes in the SSync column the desired configuration will be send and configured on that node. After pressing SuperSync all nodes should be in the right config
SuperSync is work in progress. Some effects run perfect, others not yet. This has mostly to do with the random function giving different values on different instances. Some effects have been adapted to give the same values for random using the same random seeds
Example of setup of supersync on 3x3 = 9 nodes:
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#wm8978-support-for-ohmic-pico-dsp","title":"WM8978 support for Ohmic Pico DSP","text":"Oct 20st, 2023
Essentially a similar type of chip to the ES8388 - I2S codec configured over I2C. Configured for line-in with pass-thru on the Ohmic ESP32 Pico D4 DSP board: https://github.com/ohmic-net/puca_dsp
May not work out of the box with all WM8978 boards because of the vast configuration options in the codec, but could easily be adjusted for various configurations. Not that there's many out there. :)
By @troyhacks
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#lots-of-bugfix-back-porting-from-upstream","title":"Lots of bugfix back-porting from upstream","text":"Dec 16th, 2023
Due to technical incompatibilities to latest upstream source code, WLEDMM is still building on the WLED core from summer 2023 (long story...). We have however made an effort to analyze bugfixes from upstream until version 0.14.1-beta, and brought them into WLED-MM if possible.
As a user, you get our latest features, combined with various stability improvements and bugfixing made in upstream WLED. Plus all bugfixing and improvements of MM specific features that were created in the last 3 months.
The detailed list is here: https://github.com/MoonModules/WLED/blob/mdev/CHANGELOG.md
by @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/","title":"Release notes v0.14.3-b3x-daily","text":"Below are the ongoing updates in WLEDMM which has not made it to a release yet (Next major release will be v0.14.3-b32)
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#moonmodules-v0143-b32-work-in-progress","title":"MoonModules v0.14.3-b32 (work in progress)","text":""},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#info-page-improvements","title":"Info Page improvements","text":"May 4th, 2024
System information in the \"Info\" panel re-organized, and PSRAM statistics added.
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#lots-of-bugfix-back-porting-from-upstream","title":"Lots of bugfix back-porting from upstream","text":"ongoing, 2024
Due to technical incompatibilities to latest upstream source code, WLEDMM is still building on the WLED core from summer 2023 (long story...). We have however made an effort to analyze bugfixes from upstream until version 0.14.3, and brought them into WLED-MM if possible. We also pack-ported a few features from upstream 0.15.0-beta.
by @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#updated-dmx-input-now-with-rdm-support","title":"Updated DMX Input - now with RDM support","text":"Feb 10th, 2024
The (wired) DMX Input has been given significant rewrite by @arneboe and now supports RDM - NOTE: you will need to re-enter all 3 pins used when you upgrade to this version
by @arneboe
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#moonmodules-v0141-b30","title":"MoonModules v0.14.1-b30","text":""},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#gamma-correct-palettes-preview","title":"gamma-correct palettes preview","text":"Jan 25th, 2024
old \u00a0 new
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#option-to-disable-sequence-checking-in-sound-sync","title":"option to disable sequence checking in sound sync","text":"Jan 5th, 2024
UDP sound sync - sequence checking can be disabled in settings (useful if several units send sound)
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#new-audio-reactive-effects-enhancing-standard-effects","title":"new audio reactive effects (enhancing standard effects)","text":"Dec 31st, 2023
Audio Reactive standard effects - clap your hands - Popcorn ;-)
back-ported from WLED-SR. These \"audio enhanced\" effects are triggered by sound. Like clapping of hands, music starts, beats, fireworks explosions.
The popcorn audio effect looks particularly great in 2D mode - select 1D-2D mapping \"bars\").
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#build-runs-anywhere-usermods","title":"build runs-anywhere usermods","text":"Dec 15th, 2023
WLEDMM now allows you to encapsulate your MoonModules specific code like this:
class ShtUsermod : public Usermod\n{\n private:\n#ifndef _MoonModules_WLED_\n bool enabled = false; // Is usermod enabled or not //WLEDMM not needed - using public attribute of class UserMod\n#endif\n\n public:\n#ifdef _MoonModules_WLED_\n ShtUsermod(const char *name, bool enabled):Usermod(name, enabled) {} //WLEDMM usermod initializer with parameters\n#endif\n\nvoid ShtUsermod::setup()\n{\n if (enabled) {\n\n#ifdef _MoonModules_WLED_\n if ((i2c_sda >= 0) && (i2c_scl >= 0) && pinManager.joinWire(i2c_sda, i2c_scl)) { // WLEDMM pin management done by pinManager.joinWire()\n pinAllocDone = true;\n } else {\n USER_PRINTF(\"[%s] SHT pin allocation failed!\\n\", _name); // WLEDMM using USER_PRINTF for important messages\n cleanup();\n return;\n }\n#else\n PinManagerPinType pins[2] = { { i2c_sda, true }, { i2c_scl, true } };\n if (i2c_sda < 0 || i2c_scl < 0 || !pinManager.allocateMultiplePins(pins, 2, PinOwner::HW_I2C)) { \n DEBUG_PRINTF(\"[%s] SHT pin allocation failed!\\n\", _name);\n cleanup();\n return;\n } else pinAllocDone = true;\n#endif\n }\n initDone = true;\n}\n
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#udp-sound-sync-improvements","title":"UDP Sound Sync improvements","text":"December 2023
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#latency-reduced-drasticially","title":"Latency reduced drasticially","text":"Latency from microphone to receiving sound on the remode unit has been optimized drasticially. Previously the average delay was 30-60ms. With our optimized code, UDP packets are sent out directly when new samples arrive from the driver, resulting in average delay of 10-25ms.
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#new-udp-sync-mode-receive-or-local","title":"New UDP sync mode \"Receive or Local\"","text":"Acts like \"Receive\", however automaticially falls back to local whenever the UDP stream is missing.
Local input when sender is missing.
Automatic switch-over to network sound.
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#udp-sound-sequence-checking-framecounter","title":"UDP sound sequence checking (framecounter)","text":"UDP transport itself does neither guarantee delivery nor sequence.
Leveraging on a previously unused byte in the UDP sound sync format, WLED-MM now checks that a newly received sound sample is \"in sequence\". Too-late packets will be dropped, leading to smoother animations.
By @netmindz
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#presets-name-and-default-checkboxes","title":"Presets name and default checkboxes","text":"Nov 23st, 2023
Default name of new preset now includes the icons (cause it's nice to know if a preset is sound reactive or not) Preset checkboxes have now default of last set values (cause it's handy of you don't want to save brightness it is not saved in next preset save as well)
By @ewowi
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#super-sync","title":"Super Sync","text":"October 15, 2023 By @ewowi
Super Sync runs one effect on multiple instances allowing for higher framerates as each instance runs only part of the effect.
The nodes tab shows more info per instance, info which is needed for SuperSync.
SuperSync takes all the panels in the 2D config setup and each panel will be setup on a different node.
Red: client node is not setup right
SuperSync button: for all nodes with a red yes in the SSync column the desired configuration will be send and configured on that node. After pressing SuperSync all nodes should be in the right config
SuperSync is work in progress. Some effects run perfect, others not yet. This has mostly to do with the random function giving different values on different instances. Some effects have been adapted to give the same values for random using the same random seeds
Example of setup of supersync on 3x3 = 9 nodes:
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#wm8978-support-for-ohmic-pico-dsp","title":"WM8978 support for Ohmic Pico DSP","text":"Oct 20st, 2023
Essentially a similar type of chip to the ES8388 - I2S codec configured over I2C. Configured for line-in with pass-thru on the Ohmic ESP32 Pico D4 DSP board: https://github.com/ohmic-net/puca_dsp
May not work out of the box with all WM8978 boards because of the vast configuration options in the codec, but could easily be adjusted for various configurations. Not that there's many out there. :)
By @troyhacks
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#lots-of-bugfix-back-porting-from-upstream_1","title":"Lots of bugfix back-porting from upstream","text":"Dec 16th, 2023
Due to technical incompatibilities to latest upstream source code, WLEDMM is still building on the WLED core from summer 2023 (long story...). We have however made an effort to analyze bugfixes from upstream until version 0.14.1-beta, and brought them into WLED-MM if possible.
As a user, you get our latest features, combined with various stability improvements and bugfixing made in upstream WLED. Plus all bugfixing and improvements of MM specific features that were created in the last 3 months.
by @softhack007
"},{"location":"moonmodules/showcases-hcs/","title":"Human Sized Cube","text":""},{"location":"moonmodules/showcases-hcs/#hardware","title":"Hardware","text":"Idea, design and first build by @troy
Red numbers: Panels: 1..4 are the side panels, 5 is the top panel
result: insta
tuned for HSC by @softhack007 and @ewowi
Setup as 5 horizontal panels (advanced setup) so of no ledmap is used, effects run smooth on the sides (top is the 5th panel)
First two panels start top right, rest top left, see above image
Note: Panel numbering starts at 0
Can be found here
cfg.json can be used to create above setup
presets.json contains a set of well tested presets
ledmap1.json and ledmap2.json are used in effects
import using /edit"},{"location":"moonmodules/showcases-hcs/#fork-specific-info","title":"Fork specific info","text":"Feature WLED SR 0.13 MoonModules WLED 0.14 Upstream WLED 0.14 Ledmaps Yes Yes Yes"},{"location":"moonmodules/super-sync/","title":"Super Sync","text":""},{"location":"moonmodules/super-sync/#introduction","title":"Introduction","text":"
See here for a quick overview https://mm.kno.wled.ge/moonmodules/release-notes-v0.14.0-b3-daily/#super-sync
Further documentation to be done.
Below is in processing order
"},{"location":"moonmodules/super-sync/#json-mapping","title":"JSON mapping","text":""},{"location":"moonmodules/super-sync/#fork-specific-info","title":"Fork specific info","text":"Feature WLED SR 0.13 MoonModules WLED 0.14 Upstream WLED 0.14 Ledmaps Yes Yes Yes"},{"location":"moonmodules/what-is-moonmodules/","title":"What is MoonModules","text":""},{"location":"moonmodules/what-is-moonmodules/#what-are-all-these-acronyms","title":"What are all these acronyms?","text":"WLED MM 0.14 (\ud83c\udf1c) = WLED AC 0.14 + Extra features
WLED AC 0.14 = (WLED AC 0.13 + WLED SR)(2.0).
WLED SR (\ud83c\udfb8) is for the last 2 years maintained mainly by @softhack007 and @ewowi and has been created by the legendary Andrew Tuline (\ud83c\udfb8).
WLED AC 0.14 has been made mainly by @Aircoookie , @blazoncek , @softhack007 and @ewowi.
WLED MM is mainly maintained by @softhack007 @ewowi, @netmindz, @s\u00f6ren and @troy and can be considered similar to what AMG is doing to Mercedes (see amg.wled.me).
"},{"location":"moonmodules/what-is-moonmodules/#compatibility","title":"compatibility","text":"WLED MM is compatible with WLED AC (it's running on average 1 day to 1 week behind WLED AC latest build) for all features that can also be found in WLED AC.
Consider WLED MM as a possible next version of WLED AC (we submit PR's on a regular basis).
"},{"location":"moonmodules/what-is-moonmodules/#why","title":"why?","text":"The reason WLED MM is created is that we have many ideas how to improve WLED AC but we need a \"playground\" to develop and mature those ideas.
WLED MM releases and daily builds are made to deploy - and are deployed - on live situations, not test bench only. Many features added to MM came from live situation feedback. Although new builds may have errors, in practice they tend to be better then earlier versions.
"},{"location":"moonmodules/what-is-moonmodules/#whats-new","title":"What's new?","text":"Our latest work can be found here: mdev.
You can compile it yourself using PlatformIO.ini entry esp32_4MB_max or get a build from Serg74 (daily) or Wladi (periodically).
Get latest release here: https://github.com/MoonModules/WLED/releases
"},{"location":"moonmodules/what-is-moonmodules/#more-info","title":"More info:","text":"Release notes v0.14.0-b3-daily
Release notes v0.14.0-b27
Release notes v0.14.0-b26
Release notes v0.14.0-b25
Release notes v0.14.0-b15
Release notes v0.14.0-b1
Release notes v0.14.0-b0
Installing and compiling
Fork comparison
WLED AC:
WLED MM:
WLED SR:
The Future ???
"},{"location":"moonmodules/wip/","title":"Work in Progress","text":"This page is work in progress
Check WLED MoonModules Wiki for original content
Template text:
"},{"location":"moonmodules/wip/#fork-specific-info","title":"Fork specific info","text":""},{"location":"moonmodules/wip/#wled-sr","title":"WLED SR","text":""},{"location":"soundreactive/Line-Input/","title":"I2S ADC for Line-In","text":"If you want the best experience, then Line-In using I2S will give the best quality. As you are getting a clean audio feed the squelch value should be set to 1 to start with, and a gain of 1 is also likely a good starting point. Automatic Gain Control (AGC) set to \"Normal\" is still recommended, but not strictly required.
Looking to add line-in with I2S support? You might want to try I2S ADC boards that use one of these chips:
Many I2S ADC line-in boards expect an additional MCLK signal (\"Main Clock\" aka \"System Clock\" aka \"Master Clock\" aka \"Memory Clock\"). MCLK is sometimes labelled SCLK for \"system clock\". For these boards with 4 data pins, use the AudioReactive Generic I2S with MCLK
input option, and connect MCLK pin to GPIO pin 0 on the original ESP32.
*NOTE: Technically GPIO 1 and 3 will work on the original ESP32 for MCLK, but these are most often in use for the serial console. If you're using an MCLK-required line-in board on an ESP32-S3 (and possibly other ESP32-XX boards) then the MCLK can be any free GPIO pin. WLED will generally show you which pins are allowed for MCLK on your board.
"},{"location":"soundreactive/Line-Input/#pmod-i2s2","title":"Pmod I2S2","text":"Data Sheet and Information
"},{"location":"soundreactive/Line-Input/#wm8782","title":"WM8782","text":"Buy: AliExpress
Data Sheet
"},{"location":"soundreactive/Line-Input/#ti-pcm1808","title":"TI PCM1808","text":"Buy: Amazon or AliExpress
Top side: Right audio input, Audio Ground, Left audio input.
Right side: The I2S connections -
Left side: Feature settings and 5v input:
In WLED AudioReactive settings you will need to use Generic I2S with MCLK
. You have 3 choices of what MCLK pin you can use - 0, 1, and 3. Pin 0 highly recommended as 1 as 3 will likely be in use on the original ESP32 for the serial console.
5v seems to NEED to be connected. You can connect it to 3.3v but it will glitch randomly. Put that pin on 5v for best function.
3.3v and ground are connected to the same pins on the right side - just need to connect one of each, on either side.
MD1 and MD0 set master/slave modes. It defaults to slave (both pins are internally set to low), which is what you want for WLED. Don't connect these to anything.
FMY (format, FMT in the spec sheet - I assume the \"Y\" is a typo on the silkscreen) is a bit more interesting. By default it's pulled low internally, which the docs claim to be \"I2S, 24-bit\" - which will work fine as a default.
...however, pulling FMY \"high\" (connected to 3.3v) seems to make everything better in WLED. According to the spec sheet, this moves the entire 24 bit sequence one pulse earlier (\"left justified\") and the responsiveness seems to be better overall in WLED. The GEQ visual output is more \"balanced\" with the highs being better represented. The format of the 24 bits is unchanged - both are MSB first - but it seems to be better in WLED when the pin is pulled high. This may also depend on if you're using an IDF v3 build (the default) or IDF v4 (the requirement for ESP32-S3 and other more modern boards, optionally for the original ESP32).
"},{"location":"soundreactive/Line-Input/#es8388-and-ac101","title":"ES8388 and AC101","text":"Because of some confusion with these chips being used on various boards interchangably:
These audio chips reqires I2C commands to initialize properly. \"Line-in mode\" has been hard-coded into the initialization and will be used when \"ES8388\" or \"AC101\" is selected. (While the chips were sometimes used interchangably for the same basic function, the initialization is not the same!)
The on-board microphones are not currently supported by default - line-in is much better regardless.
Note: the underside of ESP32 overhang shows ESP32-A1S 2974. This version uses the ES8388 chip.
Line-in is internally routed to line-out, allowing these boards to be used in the middle of a line-level signal path.
"},{"location":"soundreactive/Line-Input/#pin-config","title":"Pin Config","text":"The LyraT v4.3 and some AiThinker v2.2 boards use the following pin config:
If the above doesn't work for AiThinker v2.2 boards use a chip with the following pins, use if you see errors about I2C:
Note: the underside of ESP32 overhang shows ESP32-A1S B221 and B238 on two boards with this config - the \"B\" or \"B2\" may be hints as to revision.
Older Ai-Thinker AudioKit A1S boards use the AC101 chip. The board sample we have is marked \"v2.2 2957\". There is no stamp on the bottom of the ESP32 antenna overhang. Assume anything lower than that version is an AC101.
Config for the AC101 is:
...although who knows what other revisions may be floating around?!
"},{"location":"soundreactive/Line-Input/#wm8978","title":"WM8978","text":"This audio chip reqires I2C commands to initialize properly. \"Line-in mode\" has been hard-coded into the initialization and will be used when \"WM8978\" is selected.
The on-board microphones are not currently supported - line-in is much better regardless.
Support for the WM8978 chipset is derived from the Puca DSP board:
Curently the Puca DSP on-board microphones may leak some sound in extremely loud environments, but the line-in will overpower this signal when presented. This has been minimized with settings. It technically shouldn't be using any mic signal, but there may be a small voltage leak in the analog signal path.
Line-in should be internally routed to line-out, allowing this board to be used in the middle of a line-level signal path.
"},{"location":"soundreactive/Line-Input/#pin-config_1","title":"Pin Config","text":"The Puca DSP board pins are as follows:
WLED has effects that use the audio data to actually control how the effect behaves, but the new Audio Responsive palettes allow you to make any of the effects respond to audio by selecting one of these palettes
2 SR palettes:
V: selection of FTT values
HSV: Some effects like fire expect the luminosity to rise using HSV
Implemented - Dev branch only
"},{"location":"soundreactive/Sound-Reactive-Palettes/#wled-mm","title":"WLED MM","text":"Released in v0.14.0-b1.13
"},{"location":"soundreactive/Sound-Reactive-Palettes/#wled-ac","title":"WLED AC","text":"Not yet implemented
"},{"location":"soundreactive/Sound-Settings/","title":"Work in Progress","text":""},{"location":"soundreactive/Sound-Settings/#introduction","title":"Introduction","text":"In order to accommodate a wide range of audio inputs, ambient environments and string lengths, we have added user configurable squelch (noise reduction/suppression) and gain controls on the sound settings page that apply to all sound reactive animations.
"},{"location":"soundreactive/Sound-Settings/#press-reset-key-after-changing-sound-source","title":"Press reset key after changing sound source","text":"After changing the sound source (either GPIO pins or Microphone type), it is important to press the \"reset\" (RST) button on your ESP32 - don't forget to \"save\" first. WLED cannot change the sound input configuration \"on the fly\", due to a known hardware problem of ESP32. See https://github.com/espressif/esp-idf/issues/7442 \"only a hard CPU reset can disconnect the I2S signal from built-in ADC\".
"},{"location":"soundreactive/Sound-Settings/#analog-input-pins","title":"Analog Input Pins","text":"We typically recommend using GPIO 36, aka VP or ADC1_CH0 for analog input, however the following pins should also work:
GPIO 32 => ADC1_CH4
GPIO 33 => ADC1_CH5
GPI\u00a0 34 => ADC1_CH6
GPI\u00a0 35 => ADC1_CH7
GPI\u00a0 36 => ADC1_CH0, VP
GPI\u00a0 37 => ADC1_CH1
GPI\u00a0 38 => ADC1_CH2
GPI\u00a0 39 => ADC1_CH3, VN
Do NOT use any of the pins from ADC2, as they will conflict with the WiFi and with I2S sampling.
Remember to press Reset after saving your new analog input configuration.
We have observed problems when using \"analog buttons\" (potentiometer) together with ADC analog sound input. It seems that different drivers (I2S-ADC for sound, analogRead() for potentiometer) are getting into conflict - more details in the related bug report for espressif software. If you plan to attach a potentiometer to your WLED device, we recommend to use an I2S digital microphone to avoid these problems.
More information about analog inputs on our analog microphones page.
"},{"location":"soundreactive/Sound-Settings/#squelch","title":"Squelch","text":"Adjust this value on the Sound Settings page so that the leds are only activated above a certain 'background noise' level.
In order to accommodate a wide range of audio inputs, ambient environments and string lengths, we have added user configurable squelch (noise reduction/suppression) and gain controls on the LED settings page for the volume reactive animations.
See also
\u21d2 Squelch and Gain
\u21d2 Sound setting examples for common microphones
"},{"location":"soundreactive/Sound-Settings/#gain","title":"Gain","text":"Line-in signals are typically much lower than that of some of the microphones. Rather than use an auto gain function, you can manually adjust the gain from 1 to 255, which translates to 0.1 up to almost 6.5 gain. That's equivalent to a range of -20dB up to +16dB.
In addition, the 'Intensity' and \"input level\" sliders can sometimes adjust an animation to simulate increased gain.
"},{"location":"soundreactive/Sound-Settings/#how-to","title":"How To","text":"Here's a method to setup squelch and gain for your SR WLED Device.
From faulty microphones to flaky wiring, to WiFi related issues, particularly in AP mode, getting reliable and spike free sound sampling with WLED and in particular analog sampling has been a challenge. Digital microphones such as the INMP441, the ICS-43434 provide the best results.
"},{"location":"soundreactive/Sound-Settings/#i2s-digital-input","title":"I2S Digital Input","text":"Currently the following I2S options are available:
Some more information can be found on our I2S digital microphones page.
to be extended soon
"},{"location":"soundreactive/Sound-Settings/#i2s-line-in","title":"I2S Line-in","text":"There are solutions available for line-in via I2S. For example, boards/shields with \"es7243\" chip should work already (we have a special driver for these), and the \"es8388\" used in some of the AudioDevKit boards. Please check our Line-Input page for more information.
"},{"location":"soundreactive/Sound-Settings/#agc-improved-autonomous-gain-control","title":"AGC - improved Autonomous Gain Control","text":"We have recently improved the AGC (automatic gain control) algorithm in WLED-SR. It's not enabled by default, however we encourage you to give it a try - all sound reactive effects now support AGC, including 2D and frequency-reactive effects. The only prerequisite for using AGC is that you first adjust \"Squelch\" to define 'silence' (ambient noise level) in your environment - see previous section.
AGC will automatically perform sound input amplification, based on current sound loudness. For example, if you play music and then increase the speaker volume, WLED-SR will adjust internal gain factors to follow your music. Forget about manually changing \"gain\" settings. Just relax and let WLED-SR do it autonomously.
Currently WLED-SR offers four different AGC presets that can be selected in sound settings: * Off - AGC off. WLED will strictly use the Gain value from sound input settings, without any adjustments. * Normal - AGC tries to smoothly follow changes in sound input volume. Recommended as a balanced option for general use. * Vivid - AGC will quickly adjust to changes in sound input volume. Recommended in case you want \"more blinken from your LEDs\". * Lazy - AGC will take some more time before internal gain is adjusted. Recommended for GEQ effects, or when listening to music that features strong \"dynamics\".
"},{"location":"soundreactive/Sound-Settings/#sync","title":"Sync","text":"It is possible to fit a mic or line-in connection to a single WLED device and then send the results of the audio processing to other WLED devices on the same network. Just set the device with the input to Send and the other devices to Receive
NOTE: if you see issues with delay or no data at all, you may se better performance if you disable Wi-Fi Multimedia (WMM) Mode QoS on your wifi router
to be extended soon
"},{"location":"soundreactive/introduction/","title":"Sound Reactive Introduction","text":"In this section you will find everything related to sound for versions >= 0.14.
Aim is to migrate content in Sound Reactive (<=0.13) step by step to here.
"},{"location":"soundreactive/introduction/#fork-specific-info","title":"Fork specific info","text":""},{"location":"soundreactive/introduction/#wled-sr","title":"WLED SR","text":""},{"location":"soundreactive/sync/","title":"Sound Sync","text":"If you have more than one device or wish to use Line Input but your audio source is not right next where your LEDs are, then Audio Sync is the feature you need, no need for multiple mics or long cables. Sound Sync is different from direct LEDs control using protocols like E1.31, DMX, DDP or AdaLight.
For the WLED instance that you wish to be the source, simply set the Sync mode in the Audio Reactive module to Send and then use Recieve on all the WLED instances you wish to use the data
You might have a setup something like this or just a simple wired line-in rather than Bluetooth or Chromecast
UDP Sound Sync is a feature to synchronize (share) the sound input of a 'master' device with one or more 'slave' devices.
UDP Sound Sync does not sync the actual animations, but rather transmits summary audio sampling information to several devices that still run their own animations locally. In a nutshell, it means that several devices can share a single audio source.
"},{"location":"soundreactive/sync/#setup","title":"Setup","text":"Before configuring UDP Sound Sync, make sure you have gone into the WiFi Preferences and clicked on 'Disable WiFi sleep' at the bottom of the page. It has caused us innumerable problems in the past.
In order to configure UDP sound sync, the \u2018master\u2019 needs to be an ESP32 configured as normal, but with Sync Mode set to Send
For devices without an audio input, Audio Reactive must be enabled but with the Sync Mode set to Receive. Make sure the UDP port is the same on all devices.
In order to change the UDP Sync Mode (Disabled/Transmit/Receive), you need to power-cycle the ESP32.
"},{"location":"soundreactive/sync/#technical","title":"Technical","text":"When an ESP32 is configured for audio transmission, it will connect to a UDP Multicast address, and begin sending a single UDP Multicast packet containing the data used to generate sound-reactive animations out to any other devices that are configured to receive on the same network. The following information is transmitted:
"},{"location":"soundreactive/sync/#v1-format-used-in-sr-wled-up-to-013x","title":"V1 format, used in SR WLED up to 0.13.x","text":"#define UDP_SYNC_HEADER \"00001\"\nstruct audioSyncPacket {\n char header[6] = UDP_SYNC_HEADER;\n uint8_t myVals[32]; // 32 Bytes\n int sampleAgc; // 04 Bytes\n int sampleRaw; // 04 Bytes\n float sampleAvg; // 04 Bytes\n bool samplePeak; // 01 Bytes\n uint8_t fftResult[16]; // 16 Bytes - FFT results, one byte per GEQ channel\n double FFT_Magnitude; // 08 Bytes\n double FFT_MajorPeak; // 08 Bytes\n};\n
UDP_SYNC_HEADER is a versioning number that's defined in audio_reactive.h
"},{"location":"soundreactive/sync/#v2-format-wled-version-0140-including-moonmodules-fork","title":"V2 Format - WLED version >= 0.14.0 (including MoonModules fork)","text":"#define UDP_SYNC_HEADER_V2 \"00002\"\n\n// new \"V2\" audiosync struct - 44 Bytes\n struct __attribute__ ((packed)) audioSyncPacket { // WLEDMM \"packed\" ensures that there are no additional gaps\n char header[6]; // 06 Bytes offset 0\n uint8_t pressure[2]; // 02 Bytes, offset 6 - sound pressure as fixed point (8bit integer, 8bit fraction) \n float sampleRaw; // 04 Bytes offset 8 - either \"sampleRaw\" or \"rawSampleAgc\" depending on soundAgc setting\n float sampleSmth; // 04 Bytes offset 12 - either \"sampleAvg\" or \"sampleAgc\" depending on soundAgc setting\n uint8_t samplePeak; // 01 Bytes offset 16 - 0 no peak; >=1 peak detected. In future, this will also provide peak Magnitude\n uint8_t frameCounter; // 01 Bytes offset 17 - track duplicate/out of order packets\n uint8_t fftResult[16]; // 16 Bytes offset 18\n uint16_t zeroCrossingCount; // 02 Bytes, offset 34\n float FFT_Magnitude; // 04 Bytes offset 36\n float FFT_MajorPeak; // 04 Bytes offset 40\n };\n
The V2 format expects that AGC is performed by the sender, so there is no need to transmit \"AGC\" and \"non-AGC\" samples separately. To save bandwidth, the myvals[]
array was removed, and all numbers are either float
or uint8_t
.
SR-WLED 0.13.3 still sends out V1 format, however it is able to receive and decode V2 format, too.
"},{"location":"soundreactive/sync/#values","title":"values","text":"float
, additional accuracy can be provided by using the fraction part of the number - for example sampleSmth= 127.125
. Samples transmitted are the max value from approx 20 milliseconds of sampling, with AGC gain already applied.You might want to take a look at this library, which allows to send and receive WLED Audio Sync data independent from WLED.
When configured to receive audio data from another device, the receiver will disable any onboard microphone sampling and FFT processing, in favor of audio data received from the network. Any time a UDP Multicast packet is received from a transmitter, it will be treated as a discrete microphone sample and stored in memory the same way it would be if it were a local microphone.
239.0.0.1
, and the default UDP port is 11988
.For windows, there is WledSRServer (https://github.com/Victoare/SR-WLED-audio-server-win) which is a small application that is doing the audio capturing, FFT computation and packet sending on the system. It sends out V2 packets.
UDP Sound sync brought to you by @spedione on Discord.
"},{"location":"usermods/4LineDisplay/","title":"Usermod Four line display","text":""},{"location":"usermods/4LineDisplay/#i2c-4-line-display-usermod","title":"I2C 4 Line Display Usermod","text":"First, thanks to the authors of the ssd11306_i2c_oled_u8g2 mod.
Provides a four line display using either 128x32 or 128x64 OLED displays. It can operate independently, but starts to provide a relatively complete on-device UI when paired with the Rotary Encoder UI usermod. I strongly encourage you to use them together.
See the pair of usermods in action
"},{"location":"usermods/4LineDisplay/#installation","title":"Installation","text":"Copy and update the example platformio_override.ini.sample
from the Rotary Encoder UI usermode folder to the root directory of your particular build. This file should be placed in the same directory as platformio.ini
.
USERMOD_FOUR_LINE_DISPLAY
- define this to have this mod included wled00\\usermods_list.cpp - also tells Rotary Encoder usermod, if installed, the display is availableFLD_PIN_SCL
- The display SCL pin, defaults to 5FLD_PIN_SDA
- The display SDA pin, defaults to 4All of the parameters can be configured via the Usermods settings page, inluding GPIO pins.
"},{"location":"usermods/4LineDisplay/#platformio-requirements","title":"PlatformIO requirements","text":"This usermod requires the U8g2
and Wire
libraries. See the platformio_override.ini.sample
found in the Rotary Encoder UI usermod folder for how to include these using platformio_override.ini
.
enabled
- enable/disable usermodpin
- GPIO pins used for display; I2C displays use Clk & Data; SPI displays can use SCK, MOSI, CS, DC & RSTtype
- display type in numeric formatcontrast
- set display contrast (higher contrast may reduce display lifetime)refreshRateSec
- display refresh time in secondsscreenTimeOutSec
- screen saver time-out in secondsflip
- flip/rotate display 180\u00b0sleepMode
- enable/disable screen saverclockMode
- enable/disable clock display in screen saver modei2c-freq-kHz
- I2C clock frequency in kHz (may help reduce dropped frames, range: 400-3400)2021-02 * First public release
2021-04 * Adaptation for runtime configuration.
2021-11 * Added configuration option description.
"},{"location":"usermods/4LineDisplay/#i2c-4-line-display-usermod-alt","title":"I2C 4 Line Display Usermod ALT","text":"Thank you to the authors of the original version of these usermods. It would not have been possible without them! \"usermod_v2_four_line_display\" \"usermod_v2_rotary_encoder_ui\"
The core of these usermods are a copy of the originals. The main changes are to the FourLineDisplay usermod. The display usermod UI has been completely changed.
The changes made to the RotaryEncoder usermod were made to support the new UI in the display usermod. Without the display it, functions identical to the original. The original \"usermod_v2_auto_save\" will not work with the display just yet.
Press the encoder to cycle through the options: Brightness Speed Intensity Palette Effect Main Color (only if display is used) *Saturation (only if display is used)
Press and hold the encoder to display Network Info if AP is active, it will display AP, SSID and password
Also shows if the timer is enabled
See the pair of usermods in action
"},{"location":"usermods/4LineDisplay/#installation_1","title":"Installation","text":"Please refer to the original usermod_v2_rotary_encoder_ui
readme for the main instructions Then to activate this alternative usermod add #define USE_ALT_DISPLAY
to the usermods_list.cpp
file, or add -D USE_ALT_DISPLAY
to the original platformio_override.ini.sample
file
Note: the Four Line Display usermod requires the libraries U8g2
and Wire
.
2021-10 * First public release
"},{"location":"usermods/4LineDisplay/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/4LineDisplay/#wled-ac","title":"WLED AC","text":""},{"location":"usermods/4LineDisplay/#wled-sr","title":"WLED SR","text":""},{"location":"usermods/AutoPlaylist/","title":"Usermod Auto Playlist","text":""},{"location":"usermods/AutoPlaylist/#auto-playlist","title":"Auto Playlist","text":"v2 Usermod to automatically change between two playlists:
Optionally, \"AutoChange\" will advance your music playlist automatically when the musicality suggests a good time to change presets.
"},{"location":"usermods/AutoPlaylist/#settings","title":"Settings","text":"AutoChange looks at the properties of the incoming audio to try and determine a good time to change presets in your music playlist.
This is entirely just \"for fun\" and should not to be relied on to be overly accurate, etc. It's a calculation, not a VJ or lighjting artist.
AutoChange works with some new values computed in the AudioReactive usermod:
These values are each calculted as two averages in the AutoPlaylist usermod: * A fast-moving average for each of the 3 values * A slow-moving average for each of the 3 values
Finally, a vector is computed to determine the difference between the two average pools. When this vector is minimal, the preset is changed.
The change threshhold is calculated on the fly and adjusted up or down based on if we are faster or slower than our ideal change window.
\"Change Lockout\" will prevent the usermod from changing the presets more frequently than this number of milliseconds, but \"Ideal Change Min\" and \"Ideal Change Max\" simply influence the calculated change threshold. If the calculated vector is lower than the current change threshold AND change lockout has been exceeded, a preset change will almost always take place (see note).
When a change happens more quickly than \"Ideal Change Min\" or more slowly than \"Ideal Change Max\", the change threshold is adjusted accordingly.
If we haven't seen a change by the time \"Ideal Change Min\" has occured, the change threshold is increased to the minimum distance detected to increase the chances of detecting a change happening within the time window. This also helps AutoChange adjust to different music over time, like when a track changes.
"},{"location":"usermods/AutoPlaylist/#installation","title":"Installation","text":"Add this to build_flags
in your platformio_override.ini file:
-D USERMOD_AUTO_PLAYLIST
Optionally you can add this to enable the usermod's specific debug output:
-D USERMOD_AUTO_PLAYLIST_DEBUG
This debug is also automatically enabled with -D WLED_DEBUG
as well.
No special requirements.
"},{"location":"usermods/AutoPlaylist/#change-log","title":"Change Log","text":"2024-03-25 * Pre-Beta release, docs added.
2024-04-04 * Docs updated with debug flag.
"},{"location":"usermods/Autosave/","title":"Usermod Auto save","text":""},{"location":"usermods/Autosave/#auto-save","title":"Auto Save","text":"v2 Usermod to automatically save settings to preset number AUTOSAVE_PRESET_NUM after a change to any of: * brightness * effect speed * effect intensity * mode (effect) * palette
but it will wait for AUTOSAVE_AFTER_SEC seconds, a \"settle\" period in case there are other changes (any change will extend the \"settle\" period).
It will additionally load preset AUTOSAVE_PRESET_NUM at startup during the first loop()
.
AutoSaveUsermod is standalone, but if FourLineDisplayUsermod is installed, it will notify the user of the saved changes.
Note: WLED doesn't respect the brightness of the preset being auto loaded, so the AutoSaveUsermod will set the AUTOSAVE_PRESET_NUM preset in the first loop, so brightness IS honored. This means WLED will effectively ignore Default brightness and Apply N preset at boot when the AutoSaveUsermod is installed.
"},{"location":"usermods/Autosave/#installation","title":"Installation","text":"Copy and update the example platformio_override.ini.sample
from the Rotary Encoder UI usermode folder to the root directory of your particular build. This file should be placed in the same directory as platformio.ini
.
USERMOD_AUTO_SAVE
- define this to have this usermod included wled00\\usermods_list.cppAUTOSAVE_AFTER_SEC
- define the delay time after the settings auto-saving routine should be executedAUTOSAVE_PRESET_NUM
- define the preset number used by autosave usermodUSERMOD_AUTO_SAVE_ON_BOOT
- define if autosave should be enabled on bootUSERMOD_FOUR_LINE_DISPLAY
- define this to have this the Four Line Display mod included wled00\\usermods_list.cpp also tells this usermod that the display is available (see the Four Line Display usermod readme.md
for more details)Example to add in platformio_override: -D USERMOD_AUTO_SAVE -D AUTOSAVE_AFTER_SEC=10 -D AUTOSAVE_PRESET_NUM=100 -D USERMOD_AUTO_SAVE_ON_BOOT=true
You can also configure auto-save parameters using Usermods settings page.
"},{"location":"usermods/Autosave/#platformio-requirements","title":"PlatformIO requirements","text":"No special requirements.
Note: the Four Line Display usermod requires the libraries U8g2
and Wire
.
2021-02 * First public release 2021-04 * Adaptation for runtime configuration.
"},{"location":"usermods/Autosave/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/Autosave/#wled-sr","title":"WLED SR","text":""},{"location":"usermods/BH1750/","title":"Usermod BH1750","text":""},{"location":"usermods/BH1750/#bh1750-usermod","title":"BH1750 usermod","text":"This usermod will read from an ambient light sensor like the BH1750. The luminance is displayed in both the Info section of the web UI, as well as published to the /luminance
MQTT topic if enabled.
claws/BH1750 @^1.2.0
lib_deps
in your platformio.ini
(or platformio_override.ini
).To enable, compile with USERMOD_BH1750
defined (e.g. in platformio_override.ini
)
[env:usermod_BH1750_d1_mini]\nextends = env:d1_mini\nbuild_flags =\n ${common.build_flags_esp8266}\n -D USERMOD_BH1750\nlib_deps = \n ${esp8266.lib_deps}\n claws/BH1750 @ ^1.2.0\n
"},{"location":"usermods/BH1750/#configuration-options","title":"Configuration Options","text":"The following settings can be set at compile-time but are configurable on the usermod menu (except First Measurement time): * USERMOD_BH1750_MAX_MEASUREMENT_INTERVAL
- the max number of milliseconds between measurements, defaults to 10000ms * USERMOD_BH1750_MIN_MEASUREMENT_INTERVAL
- the min number of milliseconds between measurements, defaults to 500ms * USERMOD_BH1750_OFFSET_VALUE
- the offset value to report on, defaults to 1 * USERMOD_BH1750_FIRST_MEASUREMENT_AT
- the number of milliseconds after boot to take first measurement, defaults to 10000 ms
In addition, the Usermod screen allows you to: - enable/disable the usermod - Enable Home Assistant Discovery of usermod - Configure the SCL/SDA pins
"},{"location":"usermods/BH1750/#api","title":"API","text":"The following method is available to interact with the usermod from other code modules: - getIlluminance
read the brightness from the sensor
Jul 2022 - Added Home Assistant Discovery - Implemented PinManager to register pins - Made pins configurable in usermod menu - Added API call to read luminance from other modules - Enhanced info-screen outputs - Updated readme.md
This Usermod is designed to read a BME280
or BMP280
sensor and output the following: - Temperature - Humidity (BME280
only) - Pressure - Heat Index (BME280
only) - Dew Point (BME280
only)
Configuration is performed via the Usermod menu. There are no parameters to set in code! The following settings can be configured in the Usermod Menu: - Temperature Decimals (number of decimal places to output) - Humidity Decimals - Pressure Decimals - Temperature Interval (how many seconds between temperature and humidity measurements) - Pressure Interval - Publish Always (turn off to only publish changes, on to publish whether or not value changed) - Use Celsius (turn off to use Fahrenheit) - Home Assistant Discovery (turn on to sent MQTT Discovery entries for Home Assistant) - SCL/SDA GPIO Pins
Dependencies - Libraries - BME280@~3.0.0
(by finitespace) - Wire
- These must be added under lib_deps
in your platform.ini
(or platform_override.ini
). - Data is published over MQTT - make sure you've enabled the MQTT sync interface. - This usermod also writes to serial (GPIO1 on ESP8266). Please make sure nothing else is listening to the serial TX pin or your board will get confused by log messages!
In addition to outputting via MQTT, you can read the values from the Info Screen on the dashboard page of the device's web interface.
Methods also exist to read the read/calculated values from other WLED modules through code. - getTemperatureC()
- getTemperatureF()
- getHumidity()
- getPressure()
- getDewPointC()
- getDewPointF()
- getHeatIndexC()
- getHeatIndexF()
To enable, compile with USERMOD_BME280
defined (e.g. in platformio_override.ini
)
[env:usermod_bme280_d1_mini]\nextends = env:d1_mini\nbuild_flags =\n ${common.build_flags_esp8266}\n -D USERMOD_BME280\nlib_deps = \n ${esp8266.lib_deps}\n BME280@~3.0.0\n Wire\n
"},{"location":"usermods/BME280/#mqtt","title":"MQTT","text":"MQTT topics are as follows (<deviceTopic>
is set in MQTT section of Sync Setup menu): Measurement type | MQTT topic --- | --- Temperature | <deviceTopic>/temperature
Humidity | <deviceTopic>/humidity
Pressure | <deviceTopic>/pressure
Heat index | <deviceTopic>/heat_index
Dew point | <deviceTopic>/dew_point
If you are using Home Assistant, and Home Assistant Discovery
is turned on, Home Assistant should automatically detect a new device, provided you have the MQTT integration installed. The device is separate from the main WLED device and will contain sensors for Pressure, Humidity, Temperature, Dew Point and Heat Index.
Jul 2022 - Added Home Assistant Discovery - Added API interface to output data - Removed compile-time variables - Added usermod menu interface - Added value outputs to info screen - Updated readme.md
- Registered usermod - Implemented PinManager for usermod - Implemented reallocation of pins without reboot
Apr 2021 - Added Publish Always
option
Dec 2020 - Ported to V2 Usermod format - Customizable measure intervals
- Customizable number of decimal places
in published sensor values - Pressure measured in units of hPa instead of Pa - Calculation of heat index (apparent temperature) and dew point - 16x oversampling
of sensor during measurement - Values only published if they are different from the previous value
Enables battery level monitoring of your project.
For this to work, the positive side of the (18650) battery must be connected to pin A0
of the d1 mini/esp8266 with a 100k Ohm resistor (see Useful Links).
If you have an ESP32 board, connect the positive side of the battery to ADC1 (GPIO32 - GPIO39)
"},{"location":"usermods/Battery/#features","title":"\u2699\ufe0f Features","text":"define USERMOD_BATTERY
in wled00/my_config.h
USERMOD_BATTERY
define this (in my_config.h
) to have this usermod included wled00\\usermods_list.cpp USERMOD_BATTERY_USE_LIPO
define this (in my_config.h
) if you use LiPo rechargeables (1S) USERMOD_BATTERY_MEASUREMENT_PIN
defaults to A0 on ESP8266 and GPIO35 on ESP32 USERMOD_BATTERY_MEASUREMENT_INTERVAL
ms battery check interval. defaults to 30 seconds USERMOD_BATTERY_MIN_VOLTAGE
v minimum battery voltage. default is 2.6 (18650 battery standard) USERMOD_BATTERY_MAX_VOLTAGE
v maximum battery voltage. default is 4.2 (18650 battery standard) USERMOD_BATTERY_TOTAL_CAPACITY
mAh the capacity of all cells in parralel sumed up USERMOD_BATTERY_CALIBRATION
offset / calibration number, fine tune the measured voltage by the microcontroller Auto-Off --- --- USERMOD_BATTERY_AUTO_OFF_ENABLED
true/false enables auto-off USERMOD_BATTERY_AUTO_OFF_THRESHOLD
% (0-100) when this threshold is reached master power turns off Low-Power-Indicator --- --- USERMOD_BATTERY_LOW_POWER_INDICATOR_ENABLED
true/false enables low power indication USERMOD_BATTERY_LOW_POWER_INDICATOR_PRESET
preset id when low power is detected then use this preset to indicate low power USERMOD_BATTERY_LOW_POWER_INDICATOR_THRESHOLD
% (0-100) when this threshold is reached low power gets indicated USERMOD_BATTERY_LOW_POWER_INDICATOR_DURATION
seconds for this long the configured preset is played All parameters can be configured at runtime via the Usermods settings page.
"},{"location":"usermods/Battery/#important","title":"\u26a0\ufe0f Important","text":"USERMOD_BATTERY_MAX_VOLTAGE
Discharge voltage 2,5V USERMOD_BATTERY_MIN_VOLTAGE
Max. discharge current (constant) 10A (10000mA) max. charging current 1.7A (1700mA) ... ... ... .. .. .. Specification from: Molicel INR18650-M35A, 3500mAh 10A Lithium-ion battery, 3.6V - 3.7V
"},{"location":"usermods/Battery/#useful-links","title":"\ud83c\udf10 Useful Links","text":"2023-01-04
-D USERMOD_BATTERY_USE_LIPO
)2022-12-25
2021-09-02
2021-08-15
USERMOD_BATTERY_MIN_VOLTAGE
to 2.6 volt as default for 18650 batteries2021-08-10
This usermod-v2 modification allows the connection of multiple relays, each with individual delay and on/off mode.
"},{"location":"usermods/MultiRelay/#http-api","title":"HTTP API","text":"All responses are returned in JSON format.
http://[device-ip]/relays
http://[device-ip]/relays?switch=1,0,1,1
The number of values behind the switch parameter must correspond to the number of relays. The value 1 switches the relay on, 0 switches it off.
http://[device-ip]/relays?toggle=1,0,1,1
The number of values behind the parameter switch must correspond to the number of relays. The value 1 causes the relay to toggle, 0 leaves its state unchanged.
Examples: 1. total of 4 relays, relay 2 will be toggled: http://[device-ip]/relays?toggle=0,1,0,0
2. total of 3 relays, relay 1&3 will be switched on: http://[device-ip]/relays?switch=1,0,1
You can toggle the relay state by sending the following JSON object to: http://[device-ip]/json
Switch relay 0 on: {\"MultiRelay\":{\"relay\":0,\"on\":true}}
Switch relay 3 and 4 off: {\"MultiRelay\":[{\"relay\":2,\"on\":false},{\"relay\":3,\"on\":false}]}
wled
/deviceMAC/relay
/0
/command
on
|off
|toggle
wled
/deviceMAC/relay
/1
/command
on
|off
|toggle
When a relay is switched, a message is published:
wled
/deviceMAC/relay
/0
on
|off
#include \"../usermods/multi_relay/usermod_multi_relay.h\"
at the top and usermods.add(new MultiRelay());
at the bottom of usermods_list.cpp
. or#define USERMOD_MULTI_RELAY
in wled.h or -D USERMOD_MULTI_RELAY
in your platformio.iniYou can override the default maximum number of relays (which is 4) by defining MULTI_RELAY_MAX_RELAYS.
Example usermods_list.cpp:
#include \"wled.h\"\n/*\n * Register your v2 usermods here!\n * (for v1 usermods using just usermod.cpp, you can ignore this file)\n */\n\n/*\n * Add/uncomment your usermod filename here (and once more below)\n * || || ||\n * \\/ \\/ \\/\n */\n//#include \"usermod_v2_example.h\"\n//#include \"usermod_temperature.h\"\n#include \"../usermods/usermod_multi_relay.h\"\n\nvoid registerUsermods()\n{\n /*\n * Add your usermod class name here\n * || || ||\n * \\/ \\/ \\/\n */\n //usermods.add(new MyExampleUsermod());\n //usermods.add(new UsermodTemperature());\n usermods.add(new MultiRelay());\n\n}\n
"},{"location":"usermods/MultiRelay/#configuration","title":"Configuration","text":"Usermod can be configured via the Usermods settings page.
enabled
- enable/disable usermodpin
- ESP GPIO pin the relay is connected to (can be configured at compile time -D MULTI_RELAY_PINS=xx,xx,...
)delay-s
- delay in seconds after on/off command is receivedactive-high
- assign high/low activation of relay (can be used to reverse relay states)external
- if enabled, WLED does not control relay, it can only be triggered by an external command (MQTT, HTTP, JSON or button)button
- button (from LED Settings) that controls this relaybroadcast
- time in seconds between MQTT relay-state broadcastsHA-discovery
- enable Home Assistant auto discoveryIf there is no MultiRelay section, just save current configuration and re-open Usermods settings page.
Have fun - @blazoncek
"},{"location":"usermods/MultiRelay/#change-log","title":"Change log","text":"2021-04 * First implementation.
2021-11 * Added information about dynamic configuration options * Added button support.
"},{"location":"usermods/MultiRelay/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/MultiRelay/#wled-sr","title":"WLED SR","text":""},{"location":"usermods/PIRsensorSwitch/","title":"Usermod PIRsensorSwitch","text":""},{"location":"usermods/PIRsensorSwitch/#pir-sensor-switch","title":"PIR sensor switch","text":"This usermod-v2 modification allows the connection of a PIR sensor to switch on the LED strip when motion is detected. The switch-off occurs ten minutes after no more motion is detected.
Story:
I use the PIR Sensor to automatically turn on the WLED analog clock in my home office room when I am there. The LED strip is switched using a relay to keep the power consumption low when it is switched off.
"},{"location":"usermods/PIRsensorSwitch/#web-interface","title":"Web interface","text":"The info page in the web interface shows the remaining time of the off timer. Usermod can also be temporarily disbled/enabled from the info page by clicking PIR button.
"},{"location":"usermods/PIRsensorSwitch/#sensor-connection","title":"Sensor connection","text":"My setup uses an HC-SR501 or HC-SR602 sensor, an HC-SR505 should also work.
The usermod uses GPIO13 (D1 mini pin D7) by default for the sensor signal, but can be changed in the Usermod settings page. This example page describes how to connect the sensor.
Use the potentiometers on the sensor to set the time delay to the minimum and the sensitivity to about half, or slightly above. You can also use usermod's off timer instead of sensor's. In such case rotate the potentiometer to its shortest time possible (or use SR602 which lacks such potentiometer).
"},{"location":"usermods/PIRsensorSwitch/#usermod-installation","title":"Usermod installation","text":"NOTE: Usermod has been included in master branch of WLED so it can be compiled in directly just by defining -D USERMOD_PIRSWITCH
and optionaly -D PIR_SENSOR_PIN=16
to override default pin. You can also change the default off time by adding -D PIR_SENSOR_OFF_SEC=30
.
To query or change the PIR sensor state the methods bool PIRsensorEnabled()
and void EnablePIRsensor(bool enable)
are available.
When the PIR sensor state changes an MQTT message is broadcasted with topic wled/deviceMAC/motion
and message on
or off
. Usermod can also be configured to send just the MQTT message but not change WLED state using settings page as well as responding to motion only at night (assuming NTP and lattitude/longitude are set to determine sunrise/sunset times).
usermod_PIR_sensor_switch.h
before you include other usermods in `usermods_list.cpp'or
#include \"usermod_PIR_sensor_switch.h\"
at the top of the usermod.h
where you need it.Example usermod.h :
#include \"wled.h\"\n\n#include \"usermod_PIR_sensor_switch.h\"\n\nclass MyUsermod : public Usermod {\n //...\n\n void togglePIRSensor() {\n #ifdef USERMOD_PIR_SENSOR_SWITCH\n PIRsensorSwitch *PIRsensor = (PIRsensorSwitch::*) usermods.lookup(USERMOD_ID_PIRSWITCH);\n if (PIRsensor != nullptr) {\n PIRsensor->EnablePIRsensor(!PIRsensor->PIRsensorEnabled());\n }\n #endif\n }\n //...\n};\n
"},{"location":"usermods/PIRsensorSwitch/#configuration-options","title":"Configuration options","text":"Usermod can be configured via the Usermods settings page.
PIRenabled
- enable/disable usermodpin
- dynamically change GPIO pin where PIR sensor is attached to ESPPIRoffSec
- number of seconds after PIR sensor deactivates when usermod triggers Off preset (or turns WLED off)on-preset
- preset triggered when PIR activates (if this is 0 it will just turn WLED on)off-preset
- preset triggered when PIR deactivates (if this is 0 it will just turn WLED off)nighttime-only
- enable triggering only between sunset and sunrise (you will need to set up NTP, Lat & Lon in Time & Macro settings)mqtt-only
- send only MQTT messages, do not interact with WLEDoff-only
- only trigger presets or turn WLED on/off if WLED is not already on (displaying effect)notifications
- enable or disable sending notifications to other WLED instances using Sync buttonHave fun - @gegu & @blazoncek
"},{"location":"usermods/PIRsensorSwitch/#change-log","title":"Change log","text":"2021-04 * Adaptation for runtime configuration.
2021-11 * Added information about dynamic configuration options * Added option to temporary enable/disble usermod from WLED UI (Info dialog)
2022-11 * Added compile time option for off timer. * Added Home Assistant autodiscovery MQTT broadcast. * Updated info on compiling.
"},{"location":"usermods/PIRsensorSwitch/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/PIRsensorSwitch/#wled-sr","title":"WLED SR","text":""},{"location":"usermods/Rotary-Encoder/","title":"Usermod Rotary Encoder","text":""},{"location":"usermods/Rotary-Encoder/#rotary-encoder-ui-usermod","title":"Rotary Encoder UI Usermod","text":"First, thanks to the authors of other Rotary Encoder usermods.
This usermod starts to provide a relatively complete on-device UI when paired with the Four Line Display usermod. I strongly encourage you to try them together.
See the pair of usermods in action
"},{"location":"usermods/Rotary-Encoder/#installation","title":"Installation","text":"Copy and update the example platformio_override.ini.sample
to the root directory of your particular build. This file should be placed in the same directory as platformio.ini
.
USERMOD_ROTARY_ENCODER_UI
- define this to have this user mod included wled00\\usermods_list.cppUSERMOD_ROTARY_ENCODER_GPIO
- define the GPIO function (INPUT, INPUT_PULLUP, etc...)USERMOD_FOUR_LINE_DISPLAY
- define this to have this the Four Line Display mod included wled00\\usermods_list.cpp also tells this usermod that the display is available (see the Four Line Display usermod readme.md
for more details)ENCODER_DT_PIN
\u00a0\u00a0- defaults to 12ENCODER_CLK_PIN
- defaults to 14ENCODER_SW_PIN
\u00a0\u00a0- defaults to 13USERMOD_ROTARY_ENCODER_GPIO
- GPIO functionality: INPUT_PULLUP
to use internal pull-up INPUT
to use pull-up on the PCBNo special requirements.
Note: the Four Line Display usermod requires the libraries U8g2
and Wire
.
2021-02 * First public release
"},{"location":"usermods/Rotary-Encoder/#rotary-encoder-ui-usermod-alt","title":"Rotary Encoder UI Usermod ALT","text":"Thank you to the authors of the original version of these usermods. It would not have been possible without them! \"usermod_v2_four_line_display\" \"usermod_v2_rotary_encoder_ui\"
The core of these usermods are a copy of the originals. The main changes are to the FourLineDisplay usermod. The display usermod UI has been completely changed.
The changes made to the RotaryEncoder usermod were made to support the new UI in the display usermod. Without the display, it functions identical to the original. The original \"usermod_v2_auto_save\" will not work with the display just yet.
Press the encoder to cycle through the options: Brightness Speed Intensity Palette Effect Main Color (only if display is used) *Saturation (only if display is used)
Press and hold the encoder to display Network Info if AP is active, it will display the AP, SSID and Password
Also shows if the timer is enabled.
See the pair of usermods in action
"},{"location":"usermods/Rotary-Encoder/#installation_1","title":"Installation","text":"Please refer to the original usermod_v2_rotary_encoder_ui
readme for the main instructions Then to activate this alternative usermod add #define USE_ALT_DISPLAY
to the usermods_list.cpp
file, or add -D USE_ALT_DISPLAY
to the original platformio_override.ini.sample
file
Note: the Four Line Display usermod requires the libraries U8g2
and Wire
.
2021-10 * First public release
"},{"location":"usermods/Rotary-Encoder/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/Rotary-Encoder/#wled-sr","title":"WLED SR","text":""},{"location":"usermods/Temperature/","title":"Usermod Temperature","text":""},{"location":"usermods/Temperature/#temperature-usermod","title":"Temperature usermod","text":"Based on the excellent QuinLED_Dig_Uno_Temp_MQTT
usermod by srg74 and 400killer! Reads an attached DS18B20 temperature sensor (as available on the QuinLED Dig-Uno) Temperature is displayed in both the Info section of the web UI as well as published to the /temperature
MQTT topic, if enabled. May be expanded with support for different sensor types in the future.
If temperature sensor is not detected during boot, this usermod will be disabled.
"},{"location":"usermods/Temperature/#installation","title":"Installation","text":"Copy the example platformio_override.ini
to the root directory. This file should be placed in the same directory as platformio.ini
.
USERMOD_DALLASTEMPERATURE
- enables this user mod wled00/usermods_list.cppUSERMOD_DALLASTEMPERATURE_FIRST_MEASUREMENT_AT
- number of milliseconds after boot to take first measurement, defaults to 20000 msAll parameters can be configured at runtime via the Usermods settings page, including pin, temperature in degrees Celsius or Farenheit and measurement interval.
"},{"location":"usermods/Temperature/#project-link","title":"Project link","text":"If you are using platformio_override.ini
, you should be able to refresh the task list and see your custom task, for example env:d1_mini_usermod_dallas_temperature_C
.
If you are not using platformio_override.ini
, you might have to uncomment OneWire@~2.3.5 under
[common]
section in platformio.ini
:
# platformio.ini\n...\n[platformio]\n...\n; default_envs = esp07\ndefault_envs = d1_mini\n...\n[common]\n...\nlib_deps =\n ...\n #For Dallas sensor uncomment following line\n OneWire@~2.3.5\n...\n
"},{"location":"usermods/Temperature/#change-log","title":"Change Log","text":"2020-09-12 * Changed to use async non-blocking implementation * Do not report erroneous low temperatures to MQTT * Disable plugin if temperature sensor not detected * Report the number of seconds until the first read in the info screen instead of sensor error 2021-04 * Adaptation for runtime configuration.
"},{"location":"usermods/Temperature/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/Temperature/#wled-sr","title":"WLED SR","text":""},{"location":"usermods/Weather/","title":"Weather usermod","text":"This page is work in progress
\ud83c\udf1c
"},{"location":"usermods/Weather/#introduction","title":"Introduction","text":"The weather usermod shows the temperature of your location from now to the coming days in bars on a 2D matrix display
+ =
"},{"location":"usermods/Weather/#settings","title":"Settings","text":""},{"location":"usermods/Weather/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/Weather/#wled-sr","title":"WLED SR","text":"Not supported
"},{"location":"usermods/Weather/#wled-ac","title":"WLED AC","text":"Not supported
"},{"location":"usermods/mpu6050-IMU/","title":"Usermod PU-6050","text":""},{"location":"usermods/mpu6050-IMU/#mpu-6050-six-axis-gyro-accelerometer-driver","title":"MPU-6050 Six-Axis (Gyro + Accelerometer) Driver","text":"v2 of this usermod enables connection of a MPU-6050 IMU sensor to work with effects controlled by the orientation or motion of the WLED Device.
The MPU6050 has a built in \"Digital Motion Processor\" which does the \"heavy lifting\" integrating the gyro and accelerometer measurements to get potentially more useful gravity vector and orientation output.
It is fairly straightforward to comment out variables being read from the device if they're not needed. Saves CPU/Memory/Bandwidth.
Story:
As a memento to a long trip I was on, I built an icosahedron globe. I put lights inside to indicate cities I travelled to.
I wanted to integrate an IMU to allow either on-board, or off-board effects that would react to the globes orientation. See the blog post on building it https://www.robopenguins.com/icosahedron-travel-globe/ or a video demo https://youtu.be/zYjybxHBsHM .
"},{"location":"usermods/mpu6050-IMU/#adding-dependencies","title":"Adding Dependencies","text":"I2Cdev and MPU6050 must be installed.
To install them, add ElectronicCats/MPU6050 @ 0.6.0 to lib_deps in the platformio.ini file.
For example:
lib_compat_mode = soft\nlib_deps =\n FastLED@3.3.2\n NeoPixelBus@2.5.7\n ESPAsyncTCP@1.2.0\n ESPAsyncUDP@697c75a025\n AsyncTCP@1.0.3\n Esp Async WebServer@1.2.0\n IRremoteESP8266@2.7.3\n ElectronicCats/MPU6050 @ 0.6.0\n
"},{"location":"usermods/mpu6050-IMU/#wiring","title":"Wiring","text":"The connections needed to the MPU6050 are as follows:
VCC VU (5V USB) Not available on all boards so use 3.3V if needed.\n GND G Ground\n SCL D1 (GPIO05) I2C clock\n SDA D2 (GPIO04) I2C data\n XDA not connected\n XCL not connected\n AD0 not connected\n INT D8 (GPIO15) Interrupt pin\n
You could probably modify the code not to need an interrupt, but I used the setup directly from the example.
"},{"location":"usermods/mpu6050-IMU/#json-api","title":"JSON API","text":"This code adds:
\"u\":{\n \"IMU\":{\n \"Quat\": [w, x, y, z],\n \"Euler\": [psi, theta, phi],\n \"Gyro\": [x, y, z],\n \"Accel\": [x, y, z],\n \"RealAccel\": [x, y, z],\n \"WorldAccel\": [x, y, z],\n \"Gravity\": [x, y, z],\n \"Orientation\": [yaw, pitch, roll]\n }\n}\n
to the info object"},{"location":"usermods/mpu6050-IMU/#usermod-installation","title":"Usermod installation","text":"#include \"usermod_mpu6050_imu.h\"
in the top and registerUsermod(new MPU6050Driver());
in the bottom of usermods_list.cpp
.Example usermods_list.cpp:
#include \"wled.h\"\n\n#ifdef USERMOD_MPU6050_IMU\n#include \"../usermods/mpu6050_imu/usermod_mpu6050_imu.h\"\n#endif\n\n#ifdef USERMOD_MPU6050_IMU\n usermods.add(new MPU6050Driver());\n#endif\n
"},{"location":"usermods/mpu6050-IMU/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/mpu6050-IMU/#wled-sr","title":"WLED SR","text":""},{"location":"usermods/mpu6050-IMU/#wled-mm","title":"WLED MM","text":"Repaired / Updated in WLED MM (AC uses old unmaintained library)
"},{"location":"usermods/pinmanager/","title":"Usermod global pins","text":"This page is work in progress
\ud83c\udf1c
"},{"location":"usermods/pinmanager/#i2c-and-spi","title":"I2C and SPI","text":"WLED MM has implemented a more intuitive way of dealing with i2c and spi pins accross usermods. Main changes:
ESP32 \u00a0ESP32-S3 \u00a0ESP32-S2 ESP32-C3 \u00a0ESP8266
Nr of pins and functionality is depending on the board chosen (esp8266, esp32, esp32-c2, esp32-c3, esps32-s3)
four-line-display is an exception, because the driver library has its own \"software I2C\" - slow, but can always be used with any availeable pin.
on both esp32 and 8266, you can decide to not use I2C, and use pins for something else. For example (on 8266), attach some buttons or rotary encoder to gpio 4+5.
After booting WLED MM an overview of allocated pins and possible conflicts is send to Serial output:
"},{"location":"usermods/pinmanager/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/pinmanager/#wled-sr","title":"WLED SR","text":"Pin drop downs not supported
"},{"location":"usermods/pinmanager/#wled-ac","title":"WLED AC","text":"Pin drop downs not supported
"},{"location":"usermods/staircase/","title":"Usermod staircase","text":""},{"location":"usermods/staircase/#usermod-animated-staircase","title":"Usermod Animated Staircase","text":"This usermod makes your staircase look cool by illuminating it with an animation. It uses PIR or ultrasonic sensors at the top and bottom of your stairs to:
The Animated Staircase can be controlled by the WLED API. Change settings such as speed, on/off time and distance by sending an HTTP request, see below.
"},{"location":"usermods/staircase/#wled-integration","title":"WLED integration","text":"To include this usermod in your WLED setup, you have to be able to compile WLED from source.
Before compiling, you have to make the following modifications:
Edit usermods_list.cpp
: 1. Open wled00/usermods_list.cpp
2. add #include \"../usermods/Animated_Staircase/Animated_Staircase.h\"
to the top of the file 3. add usermods.add(new Animated_Staircase());
to the end of the void registerUsermods()
function.
You can configure usermod using the Usermods settings page. Please enter GPIO pins for PIR or ultrasonic sensors (trigger and echo). If you use PIR sensor enter -1 for echo pin. Maximum distance for ultrasonic sensor can be configured as the time needed for an echo (see below).
"},{"location":"usermods/staircase/#hardware-installation","title":"Hardware installation","text":"You may need to use 10k pull-down resistors on the selected PIR pins, depending on the sensor.
"},{"location":"usermods/staircase/#wled-configuration","title":"WLED configuration","text":"The Staircase settings can be changed through the WLED JSON api.
NOTE: We are using curl to send HTTP POSTs to the WLED API. If you're using Windows and want to use the curl commands, replace the \\
with a ^
or remove them and put everything on one line.
To read the current settings, open a browser to http://xxx.xxx.xxx.xxx/json/state
(use your WLED device IP address). The device will respond with a json object containing all WLED settings. The staircase settings and sensor states are inside the WLED \"state\" element:
{\n \"state\": {\n \"staircase\": {\n \"enabled\": true,\n \"bottom-sensor\": false,\n \"top-sensor\": false\n },\n}\n
"},{"location":"usermods/staircase/#enabledisable-the-usermod","title":"Enable/disable the usermod","text":"By disabling the usermod you will be able to keep the LED's on, independent from the sensor activity. This enables you to play with the lights without the usermod switching them on or off.
To disable the usermod:
curl -X POST -H \"Content-Type: application/json\" \\\n -d {\"staircase\":{\"enabled\":false}} \\\n xxx.xxx.xxx.xxx/json/state\n
To enable the usermod again, use \"enabled\":true
.
Alternatively you can use Usermod Settings page where you can change other parameters as well.
"},{"location":"usermods/staircase/#changing-animation-parameters-and-detection-range-of-the-ultrasonic-hc-sr04-sensor","title":"Changing animation parameters and detection range of the ultrasonic HC-SR04 sensor","text":"Using Usermod Settings page you can define different usermod parameters, includng sensor pins, delay between segment activation etc.
When an ultrasonic sensor is enabled you can enter maximum detection distance in centimeters separately for top and bottom sensors.
Please note: using an HC-SR04 sensor, particularly when detecting echos at longer distances creates delays in the WLED software, might introduce timing hiccups in your animation or a less responsive web interface. It is therefore advised to keep the detection distance as short as possible.
"},{"location":"usermods/staircase/#animation-triggering-through-the-api","title":"Animation triggering through the API","text":"In addition to activation by one of the stair sensors, you can also trigger the animation manually via the API. To simulate triggering the bottom sensor, use:
curl -X POST -H \"Content-Type: application/json\" \\\n -d '{\"staircase\":{\"bottom-sensor\":true}}' \\\n xxx.xxx.xxx.xxx/json/state\n
Likewise, to trigger the top sensor:
curl -X POST -H \"Content-Type: application/json\" \\\n -d '{\"staircase\":{\"top-sensor\":true}}' \\\n xxx.xxx.xxx.xxx/json/state\n
MQTT You can publish a message with either up
or down
on topic /swipe
to trigger animation. You can also use on
or off
for enabling or disabling the usermod. Have fun with this usermod. www.rolfje.com
Modifications @blazoncek
"},{"location":"usermods/staircase/#change-log","title":"Change log","text":"2021-04 * Adaptation for runtime configuration.
"},{"location":"usermods/staircase/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/staircase/#wled-sr","title":"WLED SR","text":""},{"location":"usermods/wip/","title":"Work in Progress","text":"This page is work in progress
Check WLED Atuline Wiki for original content
Template text:
"},{"location":"usermods/wip/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/wip/#wled-sr","title":"WLED SR","text":""}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Welcome to WLED MoonModules & Sound Reactive","text":""},{"location":"#welcome-to-wled-moonmodules","title":"Welcome to WLED MoonModules","text":"MoonModules/WLED is a fork from Aircoookie/WLED which contains latest merge of v0.14 of WLED with additional features.
This fork is created by members of the Atuline/WLED team to make development against v0.14 possible while still preserving Atuline/WLED v0.13 as a stable and supported version. The Atuline/WLED fork is also called WLED SR (Sound Reactive).
More info here.
"},{"location":"#good-to-know","title":"Good to know","text":"Disclaimer: using this software is the users responsibility as it is not bug free. Therefore contributors of this repo are not reliable for anything including but not limited to spontaneous combustion of the entire led strip, the house and the inevitable heat death of the universe
Join the Discord server to discuss everything about WLED MM and SR!
WLED Aircoookie welcome \ud83d\udc47
"},{"location":"#welcome-to-my-project-wled","title":"Welcome to my project WLED! \u2728","text":"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!
"},{"location":"#features","title":"\u2699\ufe0f Features","text":"See the getting started page!
On this page you can find excellent tutorials made by the community and helpful tools to help you get your new lamp up and running!
"},{"location":"#user-interface","title":"\ud83d\uddbc\ufe0f User interface","text":""},{"location":"#compatible-hardware","title":"\ud83d\udcbe Compatible hardware","text":"See here!
"},{"location":"#other","title":"\u270c\ufe0f Other","text":"Licensed under the MIT license Credits here!
Join the Discord server to discuss everything about WLED!
Check out the WLED Discourse forum! You can also send me mails to dev.aircoookie@gmail.com, but please only do so if you want to talk to me privately. If WLED really brightens up your every day, you can
Disclaimer
If you are sensitive to photosensitive epilepsy it is not recommended that you use this software. In case you still want to try, don't use strobe, lighting or noise modes or high effect speed settings. As per the MIT license, I assume no liability for any damage to you or any other person or equipment.
"},{"location":"2D/HUB75/","title":"HUB75 support","text":"WLED-MM now features support for LED matrix panels using the HUB75 format
You can use either a regular ESP32 with a suitable adapter board such as ESP32 Trinity or rorosaurus/esp32-hub75-driver or the dedicated Adafruit Matrix Portal S3
This support is supplied by the ESP32-HUB75-MatrixPanel-DMA library, so see here for more details about supported hardware
Support for HUB75 in WLED-MM should be considered experimental at the moment, but we welcome early feedback on this new feature - please share your experience in the 2D channel
"},{"location":"2D/HUB75/#setup","title":"Setup","text":""},{"location":"2D/HUB75/#required-software-build","title":"Required Software Build","text":""},{"location":"2D/HUB75/#adafruit-matrix-portal-s3","title":"Adafruit Matrix Portal S3","text":"Please use the dedicated adafruit_matrixportal_esp32s3 build as this is pre-configured for the pins needed for HUB75 output
"},{"location":"2D/HUB75/#huidu-hd-wf2-esp32-s3","title":"Huidu HD-WF2 ESP32-S3","text":"You must use a build with WLED_ENABLE_HUB75MATRIX defined, for example, esp32_4MB_V4_S. If you do not see Hub75 options in the list of LED types, you are not using the correct build
If you are using a board such as the ESP32 Trinity or other boards wired for the default pinout of the ESP32-HUB75-MatrixPanel-DMA driver, this is selected by default
If you are using the rorosaurus/esp32-hub75-driver or any other board using the SmartMatrix default pinout then you will need to do a custom build with ESP32_FORUM_PINOUT defined
If you are using any other config, you currently need to edit wled00/bus_manager.cpp to add a new elif block and define to your build - it is not possible to set the HUB75 pin config in LED preferences at the moment
"},{"location":"2D/HUB75/#configuration","title":"Configuration","text":""},{"location":"2D/HUB75/#panel-size-and-chain-length","title":"Panel size and chain length","text":"First, you must set the LED output to match the correct Hub75Matrix option for the panel size you are using. The chain length is the number of panels connected. Note: currently only a horizontal chain of panels is supported. You can used 2D setup to configure physical panel positions.
Next, you need to go into the 2D Configuration and create a single matrix with the total size of your hub75 setup. e.g a chain of 2 panels with 32x32 pixels each, would be created as a 64x32 matrix in the 2D configuration page
"},{"location":"2D/HUB75/#hub75-known-problems-and-limitations","title":"HUB75 Known Problems and Limitations","text":"This page is a work in progress
Check WLEDSR - 2D Support for original content
"},{"location":"WLEDSR/%28temporary%29-WLEDSR-improvements-and-bugfixes-from-0.13.2-to-0.13.3/","title":"(temporary) WLEDSR improvements and bugfixes from 0.13.2 to 0.13.3","text":""},{"location":"WLEDSR/%28temporary%29-WLEDSR-improvements-and-bugfixes-from-0.13.2-to-0.13.3/#user-interface-and-generic-features","title":"User Interface and generic features","text":"-D WLED_WATCHDOG_TIMEOUT=30
to activateXY()
function which returns the index number of the X-Y coordinate on the matrix has been added.As documented in FastLED, leds[0] should end up being at the top left of your array:
Don't enable serpentine setting if your pixels are\nlaid out all running the same way, like this:\n\n 0 > 1 > 2 > 3 > 4\n |\n .----<----<----<----'\n |\n 5 > 6 > 7 > 8 > 9\n |\n .----<----<----<----'\n |\n 10 > 11 > 12 > 13 > 14\n |\n .----<----<----<----'\n |\n 15 > 16 > 17 > 18 > 19\n\nEnable serpentine setting if your pixels are\nlaid out back-and-forth, like this:\n\n 0 > 1 > 2 > 3 > 4\n |\n |\n 9 < 8 < 7 < 6 < 5\n |\n |\n 10 > 11 > 12 > 13 > 14\n |\n |\n 19 < 18 < 17 < 16 < 15\n
matrixWidth
and matrixHeight
are new 'LED Settings'.matrixWidth
is the number of pixels per row.matrixHeight
is the number of pixels per column.The dev branch has a new XY() function (thanks Sutaburosu) in FX.cpp, which supports multiple layouts.
There are 5 orientation flags as follows:
By comparison, the author's aliexpress purchased 16x16 array needs to be configured as:
Serpentine | Rowmajor | Flipmajor\n
Note: When an X,Y value goes out of bounds, this routine writes to an LED beyond SEGLEN, and as a result, we need to use the setPixels() routine to write to the display.
Note: Working with this can be confusing, so here's a simulator you can play around with to get familiar with XY() at Wokwi.
"},{"location":"WLEDSR/2D-Functionality/#multiple-panels-202106dev","title":"Multiple panels (202106/dev)","text":"When you want to create larger matrices, the standard available panels are not big enough. They typically are 16x16 or 8x32 pixels. To support large matrices, they should be connected together. This is now supported in WLED SR (currently in dev version). Multiple panels can be specified in the LED-Preferences screen by checking Multiple Panels and then defining the number of horizontal and vertical panels. First panel should be top left, extending to the right, the extending down, until bottom right.
For example if you create a 32x32 matrix by connecting 4 8x32 panels together you have 4 horizontal panels and 1 vertical panel. Alternatively if you have 4 16x16 panels, you have 2 horizontal and 2 vertical panels. In the latter case, panel ordering is:
0 1
2 3
The XY() function supports this by first determining in which panel an (x,y) coordinate should be displayed and then within a panel it's position is determined as described above (using flipmajor, serpentine etc.).
In the 8x32 example above, 0<x<8 is displayed in the first panel, 8<x<16 in the second panel and so on. For each panel, the first led number is calculated. E.g. if each panel has 256 leds then the second panel first led is led[256]. The values of x and y are then corrected by the width and the height of the panel to find the place within the panel (major and minor values)
"},{"location":"WLEDSR/2D-Support/","title":"2D Support","text":""},{"location":"WLEDSR/2D-Support/#introduction","title":"Introduction","text":"In order to accommodate 2D effects we have modified how Segment settings are used and added 2D Matrix and panel variables on the Led Preferences settings. Note: Currently only working in dev. You are invited to test this and give feedback on Beta testing discord channel
"},{"location":"WLEDSR/2D-Support/#2d-architecture","title":"2D architecture","text":"WLED SR distinguishes between the following levels * 2D Segment (dev) * 2D Matrix (dev) * 2D Panel (dev)
An effect is plotted on a segment. A segment is a rectangle on a matrix (logical level). A matrix is implemented by one or more identical led panels, with a specific layout (e.g. first led bottom left, serpentine, physical level).
Note: 2D effects can also be projected on a 1D LED Strip instead of a 2D Panel. e.g. for a led strip of 144 leds you can define width=height=12 and each zone of 12 leds is a row of a matrix. Rows are then side by side instead of above each other. Some 2D effects, e.g. graphic equalizer look still pretty cool on strips (as is the other way around with 1D effects on a 2D matrix like NoiseMove or Sparkle).
"},{"location":"WLEDSR/2D-Support/#2d-segments","title":"2D Segments","text":"As WLED supports multiple segments, all effects and therefore also 2D effects are first projected on a segment. In 1D, a segment is a zone on a LED strip and is specified by Start Led and a Stop Led (note that Stop Led is one led after the last led in the segment).
In 2D, a segment is a rectangle on a 2D matrix and 2D effects plot on this rectangle using x,y coordinates of the SEGMENT. A rectangle can be defined in the Segment UI where the start led specifies the top-left and the stop led specifies the bottom-right of the rectangle. Multiple segments can be specified this way. Segments can overlap. In fact overlapping creates very nice effects.
See Segment start stop charts to easy find matrix start and stop values
"},{"location":"WLEDSR/2D-Support/#rotation-and-reversexy","title":"Rotation and ReverseX/Y","text":"A segment can be rotated 90\u00ba degrees and reversed on the X or Y-axis and can be specified in the Segment-UI. The SegmentRotation branch of dev supports this and is currently in beta-test. This will move to dev and release over time.
The following table shows the effect setting these values:
Value Rotation Reverse X Reverse Y Effect 0 - - - 0\u00ba rotation and no reverse 1 - - + Reverse horizontal 2 - + - Reverse vertical 3 - + + 180\u00ba rotation 4 + - - 90\u00ba rotation 5 + - + 90\u00ba and reverse horizontal 6 + + - 90\u00ba and vertical 7 + + + 270\u00ba rotation"},{"location":"WLEDSR/2D-Support/#2d-matrices-and-panels","title":"2D Matrices and panels","text":"See Led Preferences
"},{"location":"WLEDSR/2D-Support/#technical","title":"Technical","text":"(Created by Harry Baas)
"},{"location":"WLEDSR/2D-Support/#examples","title":"Examples","text":""},{"location":"WLEDSR/2D-Support/#16x16-matrix_1","title":"16x16 matrix","text":"To get the (x,y) coordinates from the start and stop led: * Segment top left = (start%matrixWidth, start/matrixWidth) * Segment bottom right = (stop%matrixWidth, stop/matrixWidth)
Example of 1 segment (default) covering a whole 16x16 matrix: * start = 0, stop = 255 * top left = (0,0) * bottom right = (15,15) * width = height = 16
Example of a segment covering a middle part rectangle of the 16x16 matrix: * start = 20, stop = 235 * top left = (4,1) * bottom right = (10,14) * width = 7 * height = 14
Example of a segment covering the left part of the 16x16 matrix: * start = 0, stop = 241 * top left = (0,0) * bottom right = (0,15) * width = 1 * height = 16
"},{"location":"WLEDSR/2D-Support/#16-x-12-matrix","title":"16 x 12 matrix","text":"matrixWidth = 16, matrixHeight = 12.
Total led count 192 leds
left and right binmap effect. In the middle noisemove.
Add the following Api command into a preset. This will show the Saw effect rotated and reversed in 16 8*8 segments.
After that you, if you select all 16 segments and select another effect, this effect will also be populated to all 16 segments, resulting in surprising new effects
{\"on\":true,\"bri\":89,\"transition\":7,\"mainseg\":0,\"seg\":[{\"id\":0,\"start\":0,\"stop\":232,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":false,\"rev2D\":false,\"mi\":false,\"rot2D\":false},{\"id\":1,\"start\":8,\"stop\":240,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":true,\"rev2D\":false,\"mi\":false,\"rot2D\":false},{\"id\":2,\"start\":16,\"stop\":248,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":false,\"rev2D\":false,\"mi\":false,\"rot2D\":false},{\"id\":3,\"start\":24,\"stop\":256,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":true,\"rev2D\":false,\"mi\":false,\"rot2D\":false},{\"id\":4,\"start\":256,\"stop\":488,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":false,\"rev2D\":true,\"mi\":false,\"rot2D\":false},{\"id\":5,\"start\":264,\"stop\":496,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":true,\"rev2D\":true,\"mi\":false,\"rot2D\":false},{\"id\":6,\"start\":272,\"stop\":504,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":false,\"rev2D\":true,\"mi\":false,\"rot2D\":false},{\"id\":7,\"start\":280,\"stop\":512,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":true,\"rev2D\":true,\"mi\":false,\"rot2D\":false},{\"id\":8,\"start\":512,\"stop\":744,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":false,\"rev2D\":false,\"mi\":false,\"rot2D\":false},{\"id\":9,\"start\":520,\"stop\":752,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":true,\"rev2D\":false,\"mi\":false,\"rot2D\":false},{\"id\":10,\"start\":528,\"stop\":760,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":false,\"rev2D\":false,\"mi\":false,\"rot2D\":false},{\"id\":11,\"start\":536,\"stop\":768,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":true,\"rev2D\":false,\"mi\":false,\"rot2D\":false},{\"id\":12,\"start\":768,\"stop\":1000,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":false,\"rev2D\":true,\"mi\":false,\"rot2D\":false},{\"id\":13,\"start\":776,\"stop\":1008,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":true,\"rev2D\":true,\"mi\":false,\"rot2D\":false},{\"id\":14,\"start\":784,\"stop\":1016,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":false,\"rev2D\":true,\"mi\":false,\"rot2D\":false},{\"id\":15,\"start\":792,\"stop\":1024,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,0,0],[59,42,27],[0,0,255]],\"fx\":16,\"sx\":47,\"ix\":142,\"f1x\":89,\"f2x\":74,\"f3x\":111,\"pal\":12,\"sel\":true,\"rev\":true,\"rev2D\":true,\"mi\":false,\"rot2D\":false},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0}]}
In order to be able to use leds[i] in WLED, we add the following global variable:
uint32_t ledData[MAX_LEDS]; // See const.h for a value of 1500.\n
In many routines, we are adding the following code so that we don't have lossy data when copying led information from one element to the next:
CRGB *leds = (CRGB*) ledData;\n\n // leds[i] code in here\n\n setPixels(leds);\n return FRAMETIME;\n
This works with SEGMENTS in that two different animations don't clash. The questions I have are:
If the latter, would that not be very inefficient, and if inefficient, would it not make more sense to use:
if (!SEGENV.allocateData(sizeof(CRGB)*SEGLEN)) return mode_static(); //Allocates based on the size of a CRGB\n CRGB* leds = reinterpret_cast<CRGB*>(SEGENV.data);\n\n // leds[i] code in here\n\n setPixels(leds);\n return FRAMETIME;\n
That being said, an associate with embedded system support says that dynamic memory allocation is NOT a good thing to perform on embedded systems.
Thoughts?
In the meantime, and I quote: \"When allocating memory the danger is always that that memory isn't deallocated properly, and thus leaks memory. Running out of RAM happens very fast on embedded devices that's why it's discouraged.\"
"},{"location":"WLEDSR/Adding-Sliders/","title":"Sliders in WLED","text":""},{"location":"WLEDSR/Adding-Sliders/#introduction","title":"Introduction","text":"This page provides WLED programmers information on adding another slider to WLED. This information is not yet complete, as it doesn't yet deal with icons, EEPROM or IR. I will also be researching how to programmatically show/hide these sliders.
"},{"location":"WLEDSR/Adding-Sliders/#updating-html_uih","title":"Updating html_ui.h","text":"Please see https://mm.kno.wled.ge/WLEDSR/Modifying-Sound-Reactive-WLED on how to generate html_ui.h since the UI was changed in v0.10.0-alpha-lw.
The information below describes the way html_ui.h was generated before the UI change and is deprecated.
This file is compressed and is taken from data\\index.htm. Please see Aircoookie's page on 'adding your own effect:
https://github.com/Aircoookie/WLED/wiki/Add-own-functionality
To serve your changes by the internal webserver, you will need to follow these or similar steps to gzip compress the index.html file:
Here's a link to my Google document containing the changes required:
https://docs.google.com/document/d/1m6dm3O_aXgJLGDJfM6E-4CHzzvU8bsaHqrs7VmisYko/edit
"},{"location":"WLEDSR/Adding-a-Sound-Settings-page-to-the-UI/","title":"Adding a new Settings Page","text":""},{"location":"WLEDSR/Adding-a-Sound-Settings-page-to-the-UI/#introduction","title":"Introduction","text":"This page outlines the methods we used and the files that must be modified to add a Sound Settings page to the WLED UI.
"},{"location":"WLEDSR/Adding-a-Sound-Settings-page-to-the-UI/#new-settings_soundhtm","title":"NEW settings_sound.htm","text":"I first added a new file in the data folder named settings_sound.htm
. I did a copy/paste from settings_leds.htm
to have a base for the new settings page. Let's break down this file. * At the top, we have our standard HTML beginning lines with the TITLE of the page between the <title>
tags. * Inside of the <script>
tags we have a few functions that are necessary for the page to function. * function H()
is our help button function. When called, the UI will direct you to the relevant wiki page inside the window.open()
function. * function B()
is our back button function. When called, the UI will direct you to the previous main settings page via window.open(\"/settings\",\"_self\")
. * function GetV()
injects the values from the relevant settings stored in EEPROM to the settings page. * Inside the <style>
tag we @import
the relevant style.css
file. This closes our <head>
tag. * When the body of the page is loaded, function GetV()
is called. This can vary depending on the functions that need to be called when the page loads. * Inside the <body>
tag we have our form. This form holds the layout for the settings page. * Our squelch and gain settings have the names \"SQ\" and \"GN\" respectively. These names refer to the name given to the setting in xml.cpp
and are used to retrieve and save these settings from/to EEPROM.
This file holds the settings page button layout. We want to add an entry so we can access our new settings page. This was pretty straight forward. I added the following line, in the position I wanted it to appear on the page, using the previous entries as an example.
<form action=\"/settings/sound\"><button type=\"submit\">Sound Settings</button></form>\n
I also made some changes to the style of the buttons so they all show on the same page. This was not necessary but I feel it gave a more polished look."},{"location":"WLEDSR/Adding-a-Sound-Settings-page-to-the-UI/#modify-xmlcpp","title":"Modify xml.cpp","text":"This is our map, so to speak. Each setting is given a unique 2 character string that will be used to reference it in the UI. In our case, \"SQ\" and \"GN\". This file is also the map for the XML response when querying the API. Our settings aren't used in the API at this time so I won't go into that right now.
There are two important functions in xml.cpp that relates to our task which are void sappend()
and void sappends()
* sappend()
takes a numeric setting and appends it to the string buffer. Valid cases for this function are: * 'c', a check box * 'v', a numeric value * 'i', the selected index * sappends()
takes a string setting and appends it to the string buffer. Valid cases for this function are: * 's', a string setting * 'm', a message to be displayed
Around line 192 in xml.cpp we have the function getSettingsJS()
which retrieves the settings values from EEPROM based on the current sub-page which is defined in wled_server.cpp.
We want to add a sub-page so we need to change the following line from if (subPage <1 || subPage >7)
to if (subPage <1 || subPage >8)
. At the end of this function, after the last sub-page (previously 7) we have the following code block around line 522:
if (subPage == 8)\n{\n sappend('v',\"SQ\",soundSquelch);\n sappend('v',\"GN\",sampleGain);\n }\n
Here we can see our SQ and GN settings are loaded from EEPROM and filled in to their respective form field using the v case from the sappend()
function."},{"location":"WLEDSR/Adding-a-Sound-Settings-page-to-the-UI/#modify-setcpp","title":"Modify set.cpp","text":"This file handles storing the settings entered into EEPROM. Similar to xml.cpp, we want to add a settings page so we need to tell WLED there is an additional page in the handleSettingsSet()
function. I changed the following line from if (subPage <1 || subPage >7) return;
to if (subPage <1 || subPage >8) return;
.
Lastly, I added the following code block after the last defined sub-page around line 361:
//SOUND SETTINGS\nif (subPage == 8)\n{\n int t;\n t = request->arg(\"SQ\").toInt();\n if (t > 0) soundSquelch = t;\n t = request->arg(\"GN\").toInt();\n if (t > 0) sampleGain = t;\n}\n
"},{"location":"WLEDSR/Adding-a-Sound-Settings-page-to-the-UI/#modify-wled_servercpp","title":"Modify wled_server.cpp","text":"This file serves the webpage for the WLED frontend. We want to add a settings page so we will add the following block of code around line 82, using the previous block as an example. Notice the sub-page defined in xml.cpp is referenced as well as the NEW setting page URL defined in settings.htm.
// add sound settings page\nserver.on(\"/settings/sound\", HTTP_POST, [](AsyncWebServerRequest *request){\n handleSettingsSet(request, 8);\n serveMessage(request, 200,F(\"Sound settings saved.\"),\"Redirecting...\",1);\n});\n
In the serveSettings()
function around line 383 we need to add else if (url.indexOf(\"sound\")> 0) subPage = 8; // add sound settings page
, so the webserver knows to load those settings. And finally we need to add a case around line 406 for our new sub-page like this case 8: request->send_P(200, \"text/html\", PAGE_settings_sound, settingsProcessor); break;
.
Finally, we need to add our new settings page to cdata.js
in the tools folder. This file holds the framework for modifying the compressed *.h
files that serve the WLED frontend. This is the file nodejs looks to when running npm run build
to compress the *.htm
files in the data folder into *.h
files which are compiled with the firmware.
I used the previous entries as an example and added the following code block around line 243:
{\n file: \"settings_sound.htm\",\n name: \"PAGE_settings_sound\",\n prepend: \"=====(\",\n append: \")=====\",\n method: \"plaintext\",\n filter: \"html-minify\",\n mangle: (str) =>\n str\n .replace(/\\<link rel=\"stylesheet\".*\\>/gms, \"\")\n .replace(/\\<style\\>.*\\<\\/style\\>/gms, \"%CSS%%SCSS%\")\n .replace(\n /function GetV().*\\<\\/script\\>/gms,\n \"function GetV() {var d=document;\\n\"\n ),\n},\n
Those are the steps I took to modify the WLED settings pages and add a page for the sound reactive related settings in the UI. Once those were completed, I ran npm install
and npm run build
to compress the new UI and include it in the firmware. After compiling the new firmware, I needed to reset the EEPROM via http://WLED/settings/sec?
-> Factory reset.
Generally we recommend using I2S digital sound input - like INMP441, SPH0645, ICS-43434, or PDM I2S microphones. Additionally there are solutions for line-in via I2S. For example, boards/shields with \"es7243\" chip should work already (we have a special driver for these), and we're investigating \"es8388\".
Below are a number of popular Arduino compatible analog microphones that have been tested.
Model Compatibility Notes MAX9814 Good+ Best to set the gain to 40dB. MAX9812 Fair Only 20dB gain, but worked OK. MAX4466 bad Is very sensitive to 3.3V noise and voltage dropout due to Wifi activity. Avoid powering your LED strip from ESP32, as the strip causes a lot of noise on the 3.3V/5V power lines. INMP401 Good Some Chinese ones are not reliable. Clap Sensors (LM393, KY-038, KY-037) unusable these sensors may have an \"analogue output\" but the signal quality is extremely poor. Don't use them as a microphone, they were designed for other purposes.See also
\u21d2 Sound setting examples for common microphones
\u21d2 noise and spikes on analog microphones
If you are using the MAX9814, you need to connect gain to vdd to set the gain to 40dB as the default 60db has far too much background noise.
"},{"location":"WLEDSR/Analog-Audio-Input-Options/#dont-waste-your-money-on-cheapest-hardware","title":"Don't waste your money on cheapest hardware","text":"Important: there are some inexpensive sound sensors you can buy from Aliexpress or elsewhere (such as LM393, KY-038 or KY-037). Typically these have an on/off output only (detecting \"sound\" or \"silence\"), sometimes there is an additional \"analog data out\" with very low quality. They may or may not work adequately. For more information on our microphone test results, see our Arduino Compatible Microphones document.
"},{"location":"WLEDSR/Analog-Audio-Input-Options/#use-squelch","title":"Use Squelch","text":"If the LED's are active when the ambient volume is low while running volume only effects beginning with a single '*', you can increase the background noise filtering (or squelch) by navigating to the 'Config | Sound Settings' and increase the Squelch value. You can also make it more sensitive by lowering that Squelch value. In addition, there is a gain setting, which is required especially for the much lower signal level provided by the line-in configuration. Gain, Squelch and AGC are affecting all soundreactive, volumereactive and frequency (FFT) reactive effects.
"},{"location":"WLEDSR/Analog-Audio-Input-Options/#good-to-know","title":"good to know","text":"Note 1: Do NOT connect input devices to 5V (or Vin). The power should be connected to the 3.3V pin.
Note 2: A piezo vibration sensor (from aliexpress) was successfully hooked up and tested. This piezo hack is not possible any more, as piezo impulses would be filtered out as random noise.
Note 3: On the ESP32, the default ADC pin is GPI36 (also known as VP), while the ESP8266 uses A0. On ESP32, any GPIO related to ADC1 can be used - see next note.
Note 4: If your ESP32 doesn't have pin 36, any of the other ADC1 (and not ADC2) pins should work.
Note 5: On the ESP32, the ADC and I2S pins are defined in audio_reactive.h. You can also select them in the sound settings UI.
"},{"location":"WLEDSR/Analog-Audio-Input-Options/#wiring","title":"Wiring","text":""},{"location":"WLEDSR/Analog-Audio-Input-Options/#the-following-schematics-are-provided-as-an-example-only-there-are-many-ways-to-achieve-the-same-results-these-are-only-a-few-of-those-ways","title":"The following schematics are provided as an example only. There are many ways to achieve the same results. These are only a few of those ways.","text":"Microphone Wiring Example (MAX9814) Line In Wiring ExampleSome folks have mentioned that they don't need this line-in circuit, which is fine. Here's an explanation of that circuit.
The 680 ohm resistors provide termination so that you don't get reflection on the incoming signals. The 100nf capacitors remove any DC offset from the incoming signal. Remember that the ESP goes from 0V to 3.3V. Beyond that lay dragons. Finally, the 1M resistors provide DC centering of the incoming (now) AC only signal halfway between 0 and 3.3V.
Note 1: If you are just using a single L or R channel for the line-in, disconnect the capacitor for the other channel, or the resultant sample will be significantly reduced in amplitude.
Note 2: Providing a 'T' connector so that you can hear the music as it goes into the circuit is highly recommended. In the author's case, there was considerable static when the ESP32 was powered by the computer's USB port, but was fine when the ESP32 was powered by a USB powerbank.
"},{"location":"WLEDSR/Analog-Audio-Input-Options/#dual-input-wiring","title":"Dual Input Wiring","text":"The following diagram shows one way of connecting a 3.5mm jack and an analog microphone to the ESP8266/32 while being able to change your desired input with a simple SPDT switch.
The left and right channels of the TRS Jack are connected together to sample both channels simultaneously as one channel.
Connect the output of the capacitor to the ADC pin for your board.
"},{"location":"WLEDSR/Analog-Audio-Input-Options/#pins-used","title":"Pins Used","text":"On the ESP32, the default ADC pin used is GPI36 (also known as VP), while the ESP8266 uses A0. Power is connected to the 3.3V pin. On ESP32 The ADC pin can be configured on the sound settings page; any GPIO associated with ADC1
(i.e. GPIO32 to GPI39) can be used.
The volume and frequency reactive routines (starting with a single or double *), support a squelch or background noise suppression. This can be configured on the Sound Settings page.
"},{"location":"WLEDSR/Analog-Audio-Input-Options/#gain","title":"Gain","text":"Line-in signals are typically much lower than that of some of the microphones. Rather than use an auto gain function, you can manually adjust the gain from 1 to 255, which translate to a gain factor from 0.1 up to 6.5 gain. That's equivalent to a range of -20dB up to +16dB.
"},{"location":"WLEDSR/Analog-Audio-Input-Options/#problems-encountered","title":"Problems Encountered","text":"Noise - Some recommendations to reduce noise
Spikes - We've often seen spikes when using an analog microphone in conjunction with WLED. There's an article that should shed light on the issue at ESP32 microcontroller generates noise on microphone.
Use this basic code to read and calculate the average from the INMP401/MAX4466/MAX9814 microphone on an ESP32 or ESP8266
micLev
variable is the DC Offset value that you can use for zeroing your samples./* ESPSample\n *\n * By: Andrew Tuline\n *\n * Updated: Feb, 2019\n *\n * Basic code to read and calculate average from the Sparkfun INMP401/MAX4466/MAX9814 microphone\n * on an ESP32 or ESP8266.\n * \n * Use the Arduino Serial plotter to view the output. Compare results to those found at:\n * \n * https://github.com/atuline/WLED/blob/assets/docs/Microphones.pdf\n *\n * Note that the ESP32 employs a 12 bit A/D, while the ESP8266 has a 10 bit A/D. Also note\n * the anomalous spikes on the ESP8266.\n * \n * The micLev variable is the DC Offset value that you can use for zeroeing your samples.\n * \n */\n\n#ifdef ESP8266\n#define MIC_PIN A0 // ESP8266 pin A0\n#else\n#define MIC_PIN 36 // ESP32 pin also known as 'VP'.\n#endif\n\nvoid setup() {\n delay(1000);\n Serial.begin(115200); // Initialize serial port for debugging.\n} // setup()\n\nvoid loop() {\n analog_sample();\n} // loop()\n\nvoid analog_sample() {\n static float micLev; // Needs to be a float, or smoothing calculation below will be very inaccurate.\n int micIn = analogRead(MIC_PIN);\n micLev = ((micLev*31)+micIn)/32; // Smooth out the data to get average value (used for zeroeing).\n Serial.print(micIn); Serial.print(\" \");\n Serial.print(micLev); Serial.println(\" \");\n} // analog_sample()\n
Original code can be found here."},{"location":"WLEDSR/Arduino-IDE-Compile-%28Outdated%29/","title":"Arduino IDE Compile (Outdated)","text":""},{"location":"WLEDSR/Arduino-IDE-Compile-%28Outdated%29/#compiling-from-a-fresh-install-of-the-arduino-ide","title":"Compiling from a fresh install of the Arduino IDE","text":"Note: Around October 2020, mismatching library version issues made it increasingly difficult to compile WLED with the Arduino IDE. Your best bet is to use VS Code with Platform IO. In the meantime, here's the old Arduino IDE instructions:
If you already have ESP8266/32 drivers installed, please ensure your drivers are recent:
Note: Before attempting to compile WLED, make sure you can select your ESP board and compile a basic sketch such as: \"File | Examples | 01.Basics | Blink\"
"},{"location":"WLEDSR/Arduino-IDE-Compile-%28Outdated%29/#wled-library-pre-requisites","title":"WLED library pre-requisites:","text":"WLED makes use of a LOT of 3rd party libraries and is NOT easy to compile, especially for anyone new to Arduino. Although the WLED distribution contains several of these libraries, it doesn't include them all. Additional libraries you need to install are:
See the next section to find/install these libraries.
"},{"location":"WLEDSR/Arduino-IDE-Compile-%28Outdated%29/#install-libraries-that-are-included-in-the-library-manager","title":"Install libraries that are included in the Library Manager","text":"To install libraries that are not in the library manager, you would typically:
Your library should now be included if you go \"Sketch | Include Libraries\" and navigate down to Contributed libraries.
Download and install ESPAsyncTCP
Download and install ESPAsyncWebServer
Download and install ESPAsyncUDP
Note: AirCoookie has since created a fork of ESPAsyncWebServer, and the original ESPAsyncWebServer will no longer work with WLED. If you have the original installed, you can edit wled.h and comment out the line as follows:
// #define WLED_ENABLE_WEBSOCKETS
If you add the library manually or with git you will most likely need to restart, yes restart the Arduino IDE before it will be recognized. For more information on libraries, see: https://www.arduino.cc/en/Guide/Libraries.
When you are done, if you navigate to 'File | Examples' and scroll all the way down, you should see:
"},{"location":"WLEDSR/Arduino-IDE-Compile-%28Outdated%29/#download-wled","title":"Download WLED","text":"If you have 'git' installed, navigate to where you want to store your project and run:
git clone https://github.com/atuline/WLED.git WLED-Reactive
Once you have:
You should now be able to compile and upload WLED to your ESP device.
If this feels like a treasure hunt, it is. Now, imagine what the authors of WLED had to go through just to get this all working together. We just figured out how to compile it and to get some sound reactive code running.
"},{"location":"WLEDSR/Connectivity-Issues/","title":"Connectivity Issues","text":"We've sometimes been unable to connect to one or more of our WLED enabled devices. Here are some things to try:
Note: This page has been brought to you by our Discord friend @tuantrung2905. Thanks for your continued and persistent testing efforts!
"},{"location":"WLEDSR/Contributing-Code-to-SR-WLED/","title":"Contributing Code to SR WLED","text":"We learned a long time ago that adding new code can make for a LOT of testing. If you offer to help out with this fork, please keep in mind that we support:
If you'd like to contribute, you would need to be able to perform a significant amount of testing and future maintenance (see above) so your new code doesn't unintentionally break other functionality.
"},{"location":"WLEDSR/Contributing-Code-to-SR-WLED/#what-functionality-to-add","title":"What functionality to add:","text":"dev
branch! Do not create a PR for master
unless there is a very good reason.We still have the occasional issue with our dev/master branches where we lose connectivity with the web server. This was most prevalent with the ESP8266 branch in AP mode, and precipitated a re-write for that platform. As a result of this ongoing issue, we are sensitive to new functionality being added without adequate testing.
In conclusion, the most important factors are commitment, teamwork, communication, documentation, testing, testing and more testing. Oh yea, and a bit of new code as well, just so long as it's thoroughly tested across the range of supported environments.
"},{"location":"WLEDSR/Contributing-Code-to-SR-WLED/#can-i-help","title":"Can I help?","text":"Yes! This is a community project, and contributions are welcome! We're always up for a good PR(see above).
Just remember that any code you add will need to be maintained when we attempt to incorporate future versions of WLED. It's easy to add new code; maintaining it across multiple versions of WLED is a whole other matter. Be sparing with your additions.
"},{"location":"WLEDSR/Contributors-and-credits/","title":"Contributors and credits","text":"I2S digital sound modules utilize the industry-standard 24-bit I\u00b2S interface. The I\u00b2S interface allows to connect them directly to an ESP32 (but NOT an ESP8266). The INMP441, and also the recently tested ICS-43434 (thanks to Serg74) work very well with SR WLED, and they perform much better than any analog device at a comparable price.
from INMP441, ICS-43434 from PDM (e.g. SPM1423) from Other to ESP32 GPIO L/R SEL SEL Gnd ground => left channel. Don't leave this pin unconnected! SD DATA DOUT 32 serial data WS CLK LRCK 15 left right clock SCK -- BCLK 14 serial clock -- -- MCLK 0 master clock (if needed) VDD 3V3 VDD 3.3V power don't use 5V! GND GND GND Gnd ground, 0V
ESP32 pins in the table are just examples. In fact any available GPIO can be used for I\u00b2S on ESP32. * SD can be either an in/out pin (gpio < 34) or an input-only pin (gpi >= 34), * while WS and SCK must be in/out pins (gpio < 34).
See also \u21d2 Sound setting examples for common microphones
"},{"location":"WLEDSR/Digital-Microphone-Hookup/#microphone-type-sr-wled-sound-settings","title":"Microphone type (SR-WLED sound settings) )","text":"Generic I2S
for INMP441, ICS-43434, and other non-PDM devicesGeneric I2S PDM
for PDM microphones like SPM1423SPH0645
for adafruit SPH0645ES7243
for Lyra-T mini, and other board that have the ES7243 chipGeneric I2S with Mclk
only for devices that have an addition pin for 'master clock'Important: please make sure that your I2S device provides sound input on the LEFT audio channel! For the INMP441 this is achieved by wiring the 'L/R' connection to GND (ground). Only exception is the \"ES7243\" driver, which is always using the RIGHT audio channel.
"},{"location":"WLEDSR/Digital-Microphone-Hookup/#pins","title":"Pins","text":"Since 0.12.0, you can change I2S GPIO pins in the Sound Settings interface; on ESP32 any available GPIO can be used for I\u00b2S. The 'SD' signal could also be mapped to an input-only (GPI) pin (*), if you are low on GPIO pins. You'll need to reboot when done with pin assignment - don't forget to \"save\". To reboot, please press 'reset' on your ESP32. Unfortunately a restart by software (\"soft reboot\") is not always sufficient to activate new driver settings.
"},{"location":"WLEDSR/Digital-Microphone-Hookup/#line-in","title":"Line-in","text":"In addition to I2S microphones, there are solutions available for line-in via I2S. We already have driver support for Boards/Shields with \"es7243\" chip, and we're investigating \"es8388\".
Other I2S ADC (analog-to-digital-converter) devices and microphones that have a standard I2S interface may already work with WLED-SR, by using one of the I2S \"Generic\" drivers (Generic I2S
, Generic I2S PDM
, or Generic I2S with Mclk
). It is important however that sound input comes on the LEFT audio channel. Please keep in mind that this is a spare-time open source project - we do our best to make generic drivers but we cannot test with all available devices.
(*) Due to a problem that was fixed very recently, its not possible to use input-only GPI pins in older releases of SR WLED. There will be no warning if you try to do so. This problem is solved in the latest release version of SR WLED.
In old releases, you need to change GPIO pins used by defining I2S_WS
, I2S_SD
, and I2S_SCK
in your PlatformIO config, or by editing the values in audio_reactive.h.
We do not have these digital microphones running on an ESP8266.
Having problems getting the INMP441 running with WLED? Here's a test sketch (which you can compile with the Arduino IDE): https://pastebin.com/Ua7s7LYF . If you are still having a problem with that sketch, change the line with ONLY_LEFT to ONLY_RIGHT. If that works, you'll need to go into audio_source.h and change that line.
Initial I2S support by @spedione
"},{"location":"WLEDSR/Digital-Microphone-Hookup/#some-i2s-audio-modules-and-boards","title":"Some I2S audio modules and boards","text":""},{"location":"WLEDSR/Digital-Microphone-Hookup/#imnp441","title":"IMNP441","text":"This is the IMNP441; you can find it in many shops including Amazon and Aliexpress. It works very well with SR WLED.
"},{"location":"WLEDSR/Digital-Microphone-Hookup/#ics-43434","title":"ICS-43434","text":"
Here's the first board I've seen with the ICS-43434 at: https://www.tindie.com/products/serg74/digital-i2s-microphone-ics-43434-add-on/
"},{"location":"WLEDSR/Digital-Microphone-Hookup/#i2s-adc-for-line-in","title":"I2S ADC for Line-In","text":"
It is recomended to capture audio using a digital input for Line-In rather than the analog solution, see this guide Line-Input
"},{"location":"WLEDSR/Digital-Microphone-Hookup/#es7243-based-boards","title":"ES7243 based boards","text":"
with I2S on-board microphone and I2S Line-In (SR WLED support not available yet, but is supported in MoonModules)
ESP32 Lyra-T V4.3
Ai-Thinker ESP32 Audio Kit v2.2
"},{"location":"WLEDSR/Digital-Microphone-Hookup/#other-ideas-needs-some-work-to-make-it-work","title":"Other Ideas (needs some work to make it work)","text":""},{"location":"WLEDSR/Digital-Microphone-Hookup/#use-a-second-esp32-as-bluetooth-audio-to-i2s-device","title":"use a second esp32 as bluetooth audio to I2S device","text":"
In principle, its possible to have a second ESP32 that provides sound input to WLED via I2S.
the library from pschatzmann has examples for how to connect an I2S DAC for playing music from Bluetooth on a speaker. The main difference for SR-WLED should be to put the \"bluetooth ESP\" into \"I2S slave\" mode (instead of being the \"I2S Master\"). There is some information on this website: https://www.eevblog.com/forum/microcontrollers/esp32-as-i2s-(audio)-slave
make sure the \"I2S slave\" device is sending 24bit or 16bit Phillips Standard data format.
Use this code to read and calculate the average from the INMP441/ICS-43434 microphone on an ESP32 or ESP8266
/* \n * ESP32 I2S Noise Level Example.\n * \n * By: maspetsberger\n * \n * Updated by: Andrew Tuline\n * \n * This example calculates a mean noise level.\n * \n * Tie the L/R pin to ground. Other pins are listed below.\n * VDD goes to 3.3V\n * GND goes to Gnd \n * \n */\n\n#include <driver/i2s.h>\n\n#define I2S_WS 15 // aka LRCL\n#define I2S_SD 32 // aka DOUT\n#define I2S_SCK 14 // aka BCLK\n\nconst i2s_port_t I2S_PORT = I2S_NUM_0;\nconst int BLOCK_SIZE = 64;\nconst int SAMPLE_RATE = 10240;\n\nfloat mean = 0;\nbool INMP_flag = 0;\n\nvoid setup() {\n\n Serial.begin(115200);\n\n Serial.println(\"Configuring I2S...\");\n esp_err_t i2s_err;\n\n // The I2S config as per the example\n const i2s_config_t i2s_config = {\n .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_RX), // Receive, not transfer\n .sample_rate = SAMPLE_RATE, // 16KHz\n .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT, // could only get it to work with 32bits\n .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, // LEFT when pin is tied to ground.\n .communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),\n .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, // Interrupt level 1\n .dma_buf_count = 8, // number of buffers\n .dma_buf_len = BLOCK_SIZE // samples per buffer\n };\n\n // The pin config as per the setup\n const i2s_pin_config_t pin_config = {\n .bck_io_num = I2S_SCK, // BCLK aka SCK\n .ws_io_num = I2S_WS, // LRCL aka WS\n .data_out_num = -1, // not used (only for speakers)\n .data_in_num = I2S_SD // DOUT aka SD\n };\n\n // Configuring the I2S driver and pins.\n // This function must be called before any I2S driver read/write operations.\n i2s_err = i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL);\n if (i2s_err != ESP_OK) {\n Serial.printf(\"Failed installing driver: %d\\n\", i2s_err);\n while (true);\n }\n i2s_err = i2s_set_pin(I2S_PORT, &pin_config);\n if (i2s_err != ESP_OK) {\n Serial.printf(\"Failed setting pin: %d\\n\", i2s_err);\n while (true);\n }\n Serial.println(\"I2S driver installed.\");\n\n delay(1000); // Enough time to see these messages. This need to be BEFORE the INMP test.\n\n getINMP();\n if (mean != 0.0) {\n Serial.println(\"INMP is present.\");\n INMP_flag = 1;\n }\n\n} // setup()\n\n\n\nvoid loop() {\n\n if (INMP_flag) {\n getINMP();\n Serial.print(abs(mean)); Serial.print(\" \");\n Serial.println(1600);\n\n } else {\n // Analog Read here!!\n }\n\n} // loop()\n\n\n\nvoid getINMP() {\n // Read multiple samples at once and calculate the sound pressure\n int32_t samples[BLOCK_SIZE];\n int num_bytes_read = i2s_read_bytes(I2S_PORT, \n (char *)samples, \n BLOCK_SIZE, // the doc says bytes, but its elements.\n portMAX_DELAY); // no timeout\n\n int samples_read = num_bytes_read / 8;\n if (samples_read > 0) {\n\n for (int i = 0; i < samples_read; ++i) {\n mean += samples[i];\n }\n mean = mean/BLOCK_SIZE/16384;\n } \n}\n
"},{"location":"WLEDSR/End-user-guide/","title":"End user guide","text":""},{"location":"WLEDSR/End-user-guide/#introduction","title":"Introduction","text":"As WLED Sound Reactive is a fork of WLED, a general End User Guide can be found here.
This page will show Sound Reactive specific information (in the near future)
"},{"location":"WLEDSR/First-Time-Setup/","title":"First Time Setup","text":""},{"location":"WLEDSR/First-Time-Setup/#introduction","title":"Introduction","text":"The sound reactive version of WLED provides all of the functionality of WLED with a few caveats:
Start out with a small strip of ~30 LED's before setting up a large installation.
Grounding may also be a problem. For example, my line-in setup picked up a lot of noise when my ESP32 board was connected to the USB port on my PC, but NO noise when powered by a USB power bank.
After uploading WLED to the ESP, use your phone and connect to the WLED-AP using the password 'wled1234'. Click 'Login to network' when the notification about this shows up. You are then transfered to the WLED's start page, and here we should click \"WIFI SETTINGS\" to connect to the local network. Fill in the settings for your local Wifi network, and then click 'Save & Connect'. The device will reboot and if everything worked it will now be connected to the local network. Finding it's IP-address can be done via the network routers administration page, or via an mobile app like Fing were you can find a new device called \"wled-WLED\". Open this IP in a webbrowser to access WLED's control page.
"},{"location":"WLEDSR/First-Time-Setup/#wifi-and-leds","title":"Wifi and LEDs","text":"Disclaimer: The information below is for the latest release version of SR WLED. If you use an older release, please divide _Gain values by 4._
Here's a starting point table of Squelch and Gain settings for different input types:
Input (I2S digital) Squelch Gain Type comments INMP441 6 60 Generic I2S ICS-43434 16 30 Generic I2S SPM1423 tbd tbd Generic I2S PDM M5StickC, M5AtomU SPH0654 tbd tbd SPH0654 ES7243 tbd tbd ES7243 ESP32 Lyra-T Mini Line-In CS5343 tbd tbd Generic I2S with Mclk MCLK to GPIO0 Input (ADC analog) Squelch Gain Type MAX9814 @40dB 10 80 Generic Analog Line-In 8 120 Generic Analog INMP411 20 80 Generic Analog MAX4466 16 120 Generic Analog"},{"location":"WLEDSR/First-Time-Setup/#analog-or-i2s-digital","title":"Analog or I2S Digital?","text":"We recommend using an I2S digital microphone, like INMP441, ICS-43434, or PDM microphones.
Analog input (Microphone or Line-in) is also possible, however you might have power fluctuation (3.3V) and noise issues when using these. Analog devices are handled by the \"ADC1\" unit of your ESP32. Problems can be expected when connecting \"analog buttons\" (Potentiometer) to the same ADC1 unit.
Finally Analog Microphones often work best when placed very close to the sound source, while digital ones like the INMP441 can easily pick up sound from several meters apart. With the analog MAX4466, we found that 30-50cm is an optimal distance.
"},{"location":"WLEDSR/First-Time-Setup/#agc","title":"AGC","text":"Automatic gain control (AGC) is not enabled by default in SR WLED, because of so many different input types and ambient noise in different environments. We don't know what your 'quiet' is. In addition, the LED's should NOT be reacting when it IS quiet, so it's up to you to first make those adjustments. In addition, sensitivity can be further adjusted with either the Intensity or Speed slider in many of the animations.
While an improved autonomous gain control (iAGC) feature is available since version 0.13.1, it is still very important that you first find a good Squelch setting for your environment. Afterwards you can enable AGC and let the controller adjust input levels automatically.
"},{"location":"WLEDSR/First-Time-Setup/#noise-and-spikes","title":"Noise and Spikes","text":"While providing a lot of functionality, the ESP8266 and the ESP32 boards (typical ones) we have been using, have experienced a lot of spurious noise on their ADC pins. This has also been discussed at length on various ESP related forums. Methods that may help remediate this include:
Disable the WiFi sleep mode.
Use shielded wiring for your analog sampling pin.
We've had a lot of fun creating our audio reactive fork of WLED, and we've got more to come.
"},{"location":"WLEDSR/Future-Directions/#wish-list","title":"Wish List","text":"Topic Notes Skills Required \u2714\ufe0f Dynamic sliders/controls Allow additional sliders to be hidden by default, or displayed depending on the effect. Javascript, XML, JSON, HTML, CSS \u2714\ufe0f Improved default values for sliders Allow improved default values for sliders and on a per SEGMENT basis. Javascript, XML, JSON, HTML Add 2D Library support Add a full 2D library for FastLED functionality C, System \u2714\ufe0f Add SEGMENT support for 2D Improve SEGMENT capabilities Everything Improved/documented QA process We need to be able to better test our significant updates. A test/release plan would be a good start. ITIL Coordinated light show To have delayed/coordinated lighting effects in different devices. To run on Android. Kotlin (for Android), C Multi-pin To support SR WLED with SEGMENTS and multi-pin per-device squelch + gain see https://github.com/atuline/WLED/issues/221 for users who configure several sound inputs (use one at a time) it might be useful to have squelch/gain settings for each device. C++Our focus for new functionality should be specific to sound reactivity. Otherwise, we should get some idea as to if/when AirCoookie is planning to implement this functionality.
"},{"location":"WLEDSR/Future-Directions/#outstanding-issues","title":"Outstanding Issues","text":"Issue Notes"},{"location":"WLEDSR/Home/","title":"Introduction","text":"The WLEDSR help you can find here have been copied from https://github.com/atuline/WLED/wiki.
In this section you will find everything related to sound for versions <= 0.13
These pages are here temporarily: Aim is to migrate them step by step to 0.14 general and MM specific pages (Sound Reactive).
"},{"location":"WLEDSR/Home/#wled-sound-reactive-introduction","title":"WLED Sound Reactive Introduction","text":"This is a FORK of the original WLED code as found at wled.me. It provides basic sound reactivity for both the ESP8266 and ESP32 platforms as well as FFT sound reactivity for the ESP32.
Due to the performance limitations of the ESP8266, we decided to separate the ESP8266 and ESP32 code in order to provide a more stable build for the ESP8266. Beginning with version 0.10.2 and moving forward, ESP8266 support has been removed from the master branch. It receives very limited support and updates and is located at ESP8266 Branch.
We have also disabled functionality for other interfaces, such as Alexa, Blynk, Cronixie, Huesync, Infrared. If you would like to enable them, you will need to modify wled.h, compile and upload to your device. If you have any issues, please engage the Discord community, as we only support functionality for the web interface.
"},{"location":"WLEDSR/Home/#features","title":"Features","text":"We do our best to perform upstream merges with the original WLED. Our fork includes:
Other members of the WLED Discord group have provided code and testing support as well. Thanks all!
"},{"location":"WLEDSR/Home/#knowledge-and-pre-requisites","title":"Knowledge and Pre-Requisites","text":"Before attempting to compile this fork of WLED with Platform IO (the Arduino IDE is no longer viable for this project), make sure you CAN compile the one from wled.me.
If you are unable to compile WLED, please consider flashing your device with binaries instead.
"},{"location":"WLEDSR/Home/#hardware-used","title":"Hardware used","text":"Using the WLED 0.10 codebase, our code has been tested with:
For more information, see our Analog Audio Input Options or Digital Audio Input Options page.
"},{"location":"WLEDSR/Home/#default-pins-used","title":"Default pins used","text":"Please consider joining the WLED Discord groups where we have dedicated channels to discuss this project, your projects, and answer any questions you may have.
Join Discord to discuss beta testing of our sound reactive fork of WLED.
Join Discord to discuss AirCookie's WLED.
We can also be found on reddit at r/soundreactive.
"},{"location":"WLEDSR/Home/#support-forums","title":"Support Forums","text":"IMPORTANT: Before attempting to compile this fork of WLED, make sure you can compile the original WLED - instructions are here. If you are unable to compile WLED, please consider flashing your device with binaries instead.
If you managed to compile original WLED, test your new skills and compile the soundreactive fork of WLED.
"},{"location":"WLEDSR/Installing-and-Compiling/#installing-pre-built-binaries","title":"Installing pre-built binaries","text":""},{"location":"WLEDSR/Installing-and-Compiling/#downloading-usb-drivers","title":"Downloading USB Drivers","text":"Download the CH340 drivers at https://www.wemos.cc/en/latest/ch340_driver.html
"},{"location":"WLEDSR/Installing-and-Compiling/#flashing-from-binary","title":"Flashing From Binary","text":"The Sound Reactive WLED binaries for ESP32 are located here.
SR WLED releases are also included in this web-based installer: https://wled-install.github.io
"},{"location":"WLEDSR/Installing-and-Compiling/#flashing-esp32-binaries-with-esptool","title":"Flashing ESP32 Binaries with esptool","text":"Warning: We had to change the partition size on the ESP32 in order to 'fit' all the new features. This means that the 'old way' of upgrading/flashing, no longer work unfortunately. You cannot use ESPHome Flasher, and you cannot use OTA from a build prior to v0.13.0-b5.
esptool.exe erase_flash
esptool.exe write_flash 0x0 esp32_bootloader_v4.bin
esptool write_flash 0x10000 WLEDSR_0.13.X_soundReactive_esp32dev.bin
Note: If you Flash via another method, you will definitely need to perform a Factory Reset. Cycling the power is also a requirement if you're doing anything with I2S.
"},{"location":"WLEDSR/Installing-and-Compiling/#flashing-esp8266-binaries","title":"Flashing ESP8266 Binaries","text":"You can find some unofficial SR WLED binaries, including intermediate development builds for ESP32, here:
"},{"location":"WLEDSR/Installing-and-Compiling/#installation-services","title":"Installation services","text":"Please keep in mind that these sites are not maintained by the SR WLED team. You may find old outdated binaries, or binaries that might not work on generic ESP32 hardware. So please compare build number and dates, and read descriptions before installing one of these.
"},{"location":"WLEDSR/Installing-and-Compiling/#compiling-from-platform-io","title":"Compiling from Platform IO","text":""},{"location":"WLEDSR/Installing-and-Compiling/#getting-started","title":"Getting started","text":"\u21db first read https://mm.kno.wled.ge/advanced/compiling-wled/ \u2192 use source code from https://github.com/atuline/WLED/tree/master \u2192 start with one of the sound reactive compile environments, like env:soundReactive_esp32dev
\u2192 read wled00/wled.h
, add your own settings to wled00/my_config.h
\u2192 put your own compile environment(s) into platformio_override.ini.
SoundReactive has some additional compile time options - see wled00/audio_reactive.h
and wled00/audio_source.h
.
Note: We have long since stopped compiling WLED with the Arduino IDE.
"},{"location":"WLEDSR/Installing-and-Compiling/#disabled-feature-of-wled","title":"Disabled Feature of WLED","text":"Some features of \"standard WLED\" are by default disabled in SR WLED. These extended features have shown negative impacts on performance and stability - we need all available \"power\" to run sound analysis. For example, they possibly use too much memory (FLASH or RAM), can lead to lags in animations, or may cause slow responses to sound input.
The same is true for many WLED usermods: they might work (like 4LineDisplay), but could have side-effects on our sound reactive features so we disabled them in our \"official\" firmware builds.
"},{"location":"WLEDSR/Installing-and-Compiling/#how-to-shoot-yourself-in-the-foot","title":"How to Shoot Yourself in the Foot","text":"If you're keen to use a disabled WLED feature, in your personal build of SR-WLED:
-D DISABLE_...
flag in your build environment (platformio.ini, or platformio_override.ini), and comment it out or remove it.If a feature has been disabled explicitly in wled.h, then there is usually a good technical reason for that decision. Please don't write bug reports for feature that were disabled explicitly.
If you still want that feature, you can un-disable it like this
Add to your wled00/my_config.h
// re-activate Alexa support. Yes I know this is not supported officially. \n// I don't mind if animations will sometimes \"stutter\" and lag behind the sound.\n#ifdef WLED_DISABLE_ALEXA\n #undef WLED_DISABLE_ALEXA\n#endif\n\n// re-activate MQTT support. Yes I know this is not supported officially. \n// I am ready to take good care of my hung, non-responsive device if necessary.\n#ifndef WLED_ENABLE_MQTT\n #define WLED_ENABLE_MQTT\n #ifdef WLED_DISABLE_MQTT\n #undef WLED_DISABLE_MQTT\n #endif\n#endif\n\n// re-activate IR receiver support. Yes I know this is not supported officially. \n// I can live with my LEDs flickering sometimes, and effects stuttering randomly.\n#ifdef WLED_DISABLE_INFRARED\n #undef WLED_DISABLE_INFRARED\n#endif\n
"},{"location":"WLEDSR/LED-Preferences/","title":"2D LED Preferences","text":""},{"location":"WLEDSR/LED-Preferences/#led-preferences-for-sound-reactive-wled","title":"LED Preferences for Sound Reactive WLED","text":"The sound reactive fork of WLED supports multiple layouts of a 2D matrix led panel as well as multiple identical 2D matrix led panels. Many effects were written with a 16x16 panel in mind, so some 2D effects may not display properly on a panel/matrix of a different size.
"},{"location":"WLEDSR/LED-Preferences/#2d-matrix","title":"2D Matrix","text":"2D effects are projected on a 2 dimensional matrix.
A specific led is identified by led[x,y] where led[0,0] is in the top left corner (logical layer)
Setting name Value Range Description Master/Dev Width 1..x Width of the matrix Master Height 1..y Height of the matrix MasterNote: width x height should match LED count!
"},{"location":"WLEDSR/LED-Preferences/#2d-panels","title":"2D Panels","text":"A matrix is made of 1 or more identical physical led panels (physical layer)
Setting name Value Range Description Master/Dev Multiple panels Y/N No if only one panel, yes if more than one Dev Horizontal panels 1..x Number of panels side by side Dev Vertical panels 1..y Number of panels above each other DevNote: Panel width = matrix width / horizontal panels and panel height = matrix height / vertical panels
Note: Total panels = horizontal * vertical
"},{"location":"WLEDSR/LED-Preferences/#2d-panel-layout","title":"2D Panel layout","text":"Specify how a led panel is wired.
This is in most cases different from the logical layer (first led top left). Parameters here translate the logical layer (led[x,y]) to the physical layer (led[0] .. led[n]).
Setting name Value Range Description Master/Dev First led position Top/Bottom & Left/Right Where is the first led positioned Dev (replacing flipmajor/minor) Orientation Horizontal / Vertical Are rows of leds wired horizontal or vertical Dev (replacing rowMajor) Serpentine Y/N Are rows of leds wired zig-zag or not Master Transpose Y/N Swap the axes (otherwise no swap). Don't use on non-square panels DevNote: If multiple panels are used, they must be identical.
"},{"location":"WLEDSR/LED-Preferences/#example","title":"Example:","text":"I have a 2D matrix of 6 - 8x8 panels. They are connected sequentially with a total of 24 led's wide and 16 led's high.
The first led of each panel starts in the top left corner, the subsequent led is to the right of it (horizontally), and the panel is in a serpentine layout. These should be the settings for that layout:
"},{"location":"WLEDSR/Modifying-Sound-Reactive-WLED/","title":"Modifying Sound Reactive WLED","text":""},{"location":"WLEDSR/Modifying-Sound-Reactive-WLED/#changing-web-ui","title":"Changing Web UI","text":"In order to conserve space, Web UI interface are represented as a series of wled00/html_ui.h, wled00/html_settings.h and wled00/html_other.h files which contain C/C++ strings with specific parts of the Web UI.
These files are automatically created from source files available in wled00/data folder. To generate files, install NodeJS 11.0+ globally. After that, recreate html_*.h files by running in the repo directory:
> npm install\n> npm run build\n
If you want to test changes to the UI, it is easiest to work with the local wled00/data/index.htm file. You just need to enter the IP address of a WLED 0.10.0 or newer instance into the popup. If you accidentally input an incorrect IP or want to test with a different instance, clear the local storage (in Chrome: Developer Tools -> Application -> Local Storage)
If you continuously modify files in the wled00/data directory, you want to monitor these changes to make local html_*.h files being updated automatically. To do this, run this in repo directory:
> npm run dev\n
This will start monitoring wled00/data folder for changes.
WARNING!!! Be careful with changing the javascript in HTML files! For example function GetV() {}
must be the last javascript function in the <script>
element as it will be replaced by automatically generated code to fetch relevant settings from EEPROM. See tools/cdata.js for the replacement rules which run for every *.htm file in wled00/data.
If you'd like some help with your device, these are the types of things we would be asking:
We have disabled (and do not support) additional services such as IR, Alexa, Blynk, MQTT and so on. In order to enable them, you'll need to go into the code (see wled.h), enable the service and then compile/upload. The WLED SR team does not support these services.
If you are referring to code, please provide a link to the version you are referring to.
Is your device working in AP mode?
Got too much noise? Try lowering the current draw/brightness and clean up the wiring.
MAX4466/ESP32 Sampling results - Quiet room
MAX4466/ESP32 Sampling results - Talking
The other analog input options should provide something similar.
"},{"location":"WLEDSR/My--device--is-not-working/#udp-sound-sync-issues","title":"UDP Sound Sync Issues","text":"We received a support request reporting that UDP sound synchronization will take down a Wi-Fi network. The challenge with troubleshooting WiFi is that you need to configure your packet sniffer in monitor mode, something which is very difficult to achieve with most workstations. As a result, we are unable to see a lot of Wi-Fi network traffic.
One setting to change on 'WiFi Setup' is to check on \"Disable WiFi sleep\" mode.
As for UDP support, this article may shed some light on the challenges:
https://superuser.com/questions/1287485/udp-broadcasting-not-working-on-some-routers
In the meantime, UDP Sound sync has been configured to transmit 50 packets per second.
"},{"location":"WLEDSR/News/","title":"News","text":"What's possibly on the horizon (no dates given):
We've since added several 2D routines to WLED and in the process have determined that our ESP32 binary now consumes about 98.5% of flash memory, or in oil industry terms. . . We have reached peak Flash. As a result, we're going to look carefully into ALL of the animations and see which ones consume the most flash and with the least coolness. In the meantime, we've updated SR WLED to support a very recent Master of 0.12.0, which has seen some changes/fixes since it was originally released. Special thanks to THATDONFC for keeping SR WLED in sync with Aircoookie's updates. It's not a small job.
"},{"location":"WLEDSR/News/#january-13-2021","title":"January 13, 2021","text":"During the development of our sound reactive version of WLED, we've had several challenges with WiFi along with the ADC capability of the ESP devices.
"},{"location":"WLEDSR/Noise-and-Spikes/#esp8266","title":"ESP8266","text":"After the code refactoring of WLED from .ino to .cpp files around April 2020, our ESP8266 code lost connection between the user interface and the ESP8266's web server. This eventually culimated in a re-write of a stripped down version of SR WLED dedicated just for the ESP8266. It included the UDP sound sync as a receiver (only), but supported none of the FFT or 2D functionality. This stripped down version seems to be stable, however that platform is now deprecated from further development.
"},{"location":"WLEDSR/Noise-and-Spikes/#esp32","title":"ESP32","text":"Although the ESP32 did lose connection with the web server, it was nowhere near as bad as the ESP8266.
"},{"location":"WLEDSR/Noise-and-Spikes/#both-platforms","title":"Both platforms","text":"On both platforms, we encountered significant spikes when using the analog ADC when the WiFi is active. There are numerous articles on this issue, along with various methods to reduce the noise. We've found that an I2S microphone, such as the INMP441 or ICS-43434 will provide a better response than any of the analog microphones or input methods that we support.
Here's some test results with the analog input, including strong spikes observed very frequently.
Here's some references:
Note: According to atomic14 in the above videos, the I2S microphones do not exhibit the issues found with the analog microphones.
"},{"location":"WLEDSR/Non-Reactive-Animations/","title":"Non-Reactive Animations","text":"Note 1: Due to its limited capability, we have disabled 2D animations on the ESP8266 platform. Note 2: The 2D routines require a minimum of 4 pixels in both directions. If you see blinking red, your 2D settings don't match the requirements. (not required in latest dev) Note 3: As we continue to develop SR WLED, some animations may appear or disappear. It's still a work very much in progress. Some may only appear in the dev branch for now. Note 6: In dev branch, sliders have been renamed from FFT Low to Custom 1, FFT High to Custom 2 and FFT Custom to Custom 3.
See also Reactive animations
See List of effects and palettes for AC Animations.
See ScottrBaileys GIF visualizer for animations of the effects
Effect Description Sliders \u2699\ufe0f ARTI-FX Define your own effects, see here No controls (yet) Flow Stripe Strip with rotating colours. Speed: Controls a speed timer Intensity: Controls another timer Perlin Move Using Perlin Noise for movement. Speed: Speed of elementsIntensity: # of pixelsFFT Low: Fade rate Wavesins Beat waves and phase shifting. Looks OK in 2D'ish as well. Speed: SpeedIntensity: Varying brightnessFFT Low: Starting colourFFT High: Range of coloursFFT Custom: More fun to adjust 2D Colored Bursts Multiple lines. Speed: Speed of linesIntensity: Number of lines 2D DNA A very cool DNA like pattern. Select a palette. Speed: Scroll speedIntensity: Blur 2D DNA Spiral Spiraling DNA pattern. Speed: Speed.Intensity: Frequency 2D Drift A rotating caleidoscope. Speed: Speed of rotation.Intensity: Blur 2D Fire2012 Mark Kriegsman's fire routine. n/a 2D Firenoise Using Perlin Noise for fire. Speed: Yscale.Intensity: Scale 2D Frizzles Moving patterns. Speed: One thingIntensity: Another thing 2D Gameoflife Scrolling game of life. Speed: Speed Intensity: Starting grid 2D Hiphotic A moving plasma. Speed: One directionIntensity: Other direction 2D Lissajous A frequency based Lissajous pattern. Speed: Frequency of cosIntensity: Frequency of sin 2D Matrix The Matrix in 2D. Speed: Affects the speed of the movementIntensity: Number of lines 2D Metaballs A cool plasma type effect. n/a 2D Plasma A plasma effect. Speed: Affects the speed of the movementFFT Low: Shifts the coloursFFT High: Distance from the plasma 2D Plasma Ball A ball of plasma. Speed: Speed. Intensity: 2D Polar Lights The northern lights. Speed: Speed.Intensity: Frequency.FFT Low: Palette rotation 2D Pool Noise Looking at a pool. n/a 2D Pulser Travelling waves. Speed: Speed. Intensity: Blur 2D Sindots Moving/rotating pattern. Speed: Speed. Intensity: Length/size 2D Squared Swirl Boxes moving around. fft3: Blur amount 2D Sun radiation The sun! Doesn't support segments. Speed: VarianceIntensity: Brightness 2D Twister A large twister. Speed: Speed Intensity: Phases 2D Tartan tbd 2D Julia tbd 2D Game of life tbd 2D Black hole tbd 2D Noise tbd"},{"location":"WLEDSR/Non-Reactive-Animations/#2d-clock-overlay","title":"2D Clock Overlay","text":"To configure, go to Time & Macros setting
Time setup: fill in required parameters
Clock: Clock overlay; Analog Clock, check Show 5min marks, uncheck the rest
"},{"location":"WLEDSR/Non-Reactive-Animations/#2d-animations","title":"2D Animations","text":"Oh, and special thanks are in order for urish for creating wokwi, Elliot and his team for soulmatelights and Stepko and ldirko for some awesome 2D animations. With their approval, we were able to convert and publish several of their animations to use with WLED.
"},{"location":"WLEDSR/On-Lossy-Colours/","title":"On Lossy Colours","text":""},{"location":"WLEDSR/On-Lossy-Colours/#issue","title":"Issue","text":"The following code moves the pixels down the line, but as it gets to the end, the intensity decreases significantly:
setPixelColor(i, getPixelColor(i-1));
getPixelColor()
is lossy, whereas setPixelColor()
perfectly sets the intended color. Unfortunately, the raw pixel memory buffer is also lossy, since it has to save the values scaled by master brightness. And unfortunately, if you do s = x\\*b /255
, later doing x = s\\*255/b
won't yield exactly the same result (thanks integer division). To solve this problem, we would need a secondary pixel data buffer.
See: https://github.com/Aircoookie/WLED/issues/820
"},{"location":"WLEDSR/On-Lossy-Colours/#workarounds","title":"Workarounds","text":"As a workaround, you could allocate memory for each function on the fly as a double buffer and use that, or you could hard code an array. Either way, you need to double up on the memory requirements and that is extremely limited with the ESP8266 and not recommended for that platform.
"},{"location":"WLEDSR/On-Lossy-Colours/#allocate-memory","title":"Allocate memory","text":"if (!SEGENV.allocateData(SEGLEN)) return mode_static(); // Allocation failed\nbyte* myVal = SEGENV.data; // Could also be an int or long or whatever.\n
In this case, we are using that byte defined array for some function, but NOT to store full color values. You could then refer to myVal[0]
up through myVal[SEGLEN-1]
within the routine for that function. You could also define a long
, then allocate the memory for it, and then store your colors in the array until you need to transfer them to the NeoPixel buffer at the end of your routine. See the transfer code below. One problem with dynamic memory allocation at the firmware level is that it can become segmented and fail.
"},{"location":"WLEDSR/On-Lossy-Colours/#hard-coded-array","title":"Hard-coded array","text":"First off, I would encapsulate ALL of this with #ifndef
statements because you can't guarantee memory available on an ESP8266. In FX.cpp, you would define globally:
#ifndef ESP8266\nuint32_t ledData[1500]; // Or whatever value.\n#endif\n
Similarly, you would encapsulate all functions and definitions that support that array. In the (encapsulated) animation, you would do the following: uint16_t WS2812FX::mode_myMode(void) {\n\n#ifndef ESP8266\n\n uint32_t* leds = ledData;\n\n// PERFORM ANIMATION MAGIC HERE!!\n\n for (int i = SEGLEN; i > 0; i--) { // You can shift LED's the FastLED way.\n leds[i] = leds[i-1];\n }\n\n for (int i= 0; i < SEGLEN; i++) { // Now send to the NeoPixelBus array\n c.h = (leds[i] >> 16) & 0xFF;\n c.s = (leds[i] >> 8) &0xFF;\n c.v = leds[i] & 0xFF;\n color = c; // Implicit conversion to RGB supplied by FastLED\n setPixelColor(i, color.red, color.green, color.blue);\n }\n#else\n// DO SOMETHING ELSE IF YOU WANT. Maybe a fade_out(32);\n#endif\n\n return FRAMETIME;\n} // mode_myMode()\n
"},{"location":"WLEDSR/Other-Links/","title":"Other","text":""},{"location":"WLEDSR/Other-Links/#sr-wled-interfacing","title":"SR WLED interfacing","text":"Let's investigate persistent variables for the Arduino and how to use them, and then see how we can do so in WLED.
Normally, for a given Arduino sketch you can define variables as follows:
uint8_t var1 = 5; // A persistent global variable that is defined once.\n\n void setup() {\n Serial.begin(115200);\n }\n\n void loop() {\n routine1();\n }\n\n void routine1() {\n uint8_t var2; // A non-persistent local variable.\n static uint8_t var3; // A persistent local variable.\n\n Serial.print(var1); Serial.print(\"\\t\"); Serial.print(var2); Serial.print(\"\\t\"); Serial.println(var3);\n\n var1 = 7;\n var2 = 10;\n var3 = 25;\n\n delay(1000);\n }\n
The first time you run through the loop, we'll see the following, where only var1 has been assigned a non-zero value:
5 0 0\n
At the end of the first loop, all the variables were assigned values. The second time through the loop, var1 was already changed to 7 in the first loop, while var2 is non-persistent and has yet to have a value assigned in this loop. The variable var3 is a 'persistent' local variable, with a value assigned in the first pass of the loop. Output will be:
7 0 25\n
So, we have global and local variables, as well as persistent and non-persistent ones. Local variables require the 'static' keyword in order for them to keep their values (or be persistent) between function calls, while ALL global variables are persistent.
"},{"location":"WLEDSR/Persistent-Variables-and-WLED/#enter-wled","title":"Enter WLED . . .","text":"Although you CAN use the static keyword in a WLED animation to define a persistent variable, that variable will have the same value for ALL of the segments, and may not result in the desired properties. As a result, you may need to define a persistent variable unique to each SEGMENT.
WLED has a SEGMENT runtime structure that supports persistency. The only problem is that it has a limited number of pre-defined variables for generic use by animations (in FX.cpp). The readily available variables (as defined in FX.h) are:
uint16_t SEGENV.aux0; // Available for your routine.\nuint16_t SEGENV.aux1 // Available for your routine.\nbyte* SEGENV.data; // Available for your routine.\n
SEGENV.aux0 and SEGENV.aux1 are both unsigned 16 bit values, which you can use as persistent variables in your routines and will be unique for each SEGMENT. The question is, what if you need:
At that point, you'll need to make use of that *byte SEGENV.data pointer and allocate memory for it and then redefine how it's used. Let's examine some methods to do so and review some of the animations in FX.cpp to do so. WLED has a method called SEGENT.allocateData() which allocates memory for your animation. Here's some examples of how to use that.
"},{"location":"WLEDSR/Persistent-Variables-and-WLED/#basic-memory-allocation","title":"Basic Memory Allocation","text":"In its simplest form, the routine mode_dynamic() just performs a basic request to allocate space for the length of a given SEGMENT with:
` if (!SEGENV.allocateData(SEGLEN)) return mode_static(); // If it fails, WLED runs mode_static().
It doesn't make use of additional variables and is probably a good idea to implement on other animations, especially in a limited environment such as the ESP01 and with a considerable number of LED's.
"},{"location":"WLEDSR/Persistent-Variables-and-WLED/#an-array","title":"An Array","text":"Next up is mode_multi_comet(), which reserves space for 8 uint16_t values for an array of comets.
if (!SEGENV.allocateData(sizeof(uint16_t) * 8)) return mode_static(); //Allocates based on the size of 8 uint16_t variables\n\n uint16_t* comets = reinterpret_cast<uint16_t*>(SEGENV.data); // It then redefined that byte* pointer to uint16_t comets[16].\n\n Now you can use things like:\n\n for (int i=0; i<8; i++) {\n comets[i] = 65535; // Or other uint16_t value.\n }\n
"},{"location":"WLEDSR/Persistent-Variables-and-WLED/#a-structure","title":"A Structure","text":"Finally, we'll look into ripple_base(), which allocates persistent memory for a 'Ripple' structure. First off, we define the structure externally to the animation and call it 'ripple'.
typedef struct Ripple {\n int8_t state;\n uint8_t color;\n uint16_t pos;\n } ripple;\n
From within the ripple_base() routine, we determine the number of ripples we want to support for each segment. In this case, we'll say:
` uint16_t maxRipples = 1 + (SEGLEN >> 2);
Next, we determine how much memory we need, where 'sizeof' returns number of bytes occupied by a variable of a given type.
` uint16_t dataSize = sizeof(ripple) * maxRipples;
Next, we allocate the memory, and then re-define it as our structure:
if (!SEGENV.allocateData(dataSize)) return mode_static();\n Ripple* ripples = reinterpret_cast<Ripple*>(SEGENV.data);\n
Now, we can use our structure, up to maxRipples-1:
for (uint16_t i = 0; i < maxRipples; i++) {\n ripples[i].pos = ???; // uint16_t\n ripples[i].state = ???; // int8_t\n ripples[i].color = ???; // uint8_t\n }\n
"},{"location":"WLEDSR/Persistent-Variables-and-WLED/#a-floating-point-variable","title":"A Floating Point Variable","text":"As an exercise, let's just allocate a single floating point variable:
if (!SEGENV.allocateData(sizeof(float))) return mode_static();\n float* expAdj = reinterpret_cast<float*>(SEGENV.data); // We then redefine that byte* pointer to a float.\n
We should now be able to use the persistent floating point variable 'expAdj' with our routine and it should work with ALL segments indepently of each other.
expAdj = 1.2345;\n
"},{"location":"WLEDSR/Reactive-Animations/","title":"Sound Reactive Animations","text":"Note 1: Effects beginning with \u266a
(*
in list below) are volume only.
Note 2: Effects beginning with \u266b
(**
in list below) use FFT (Fast Fourier Transforms) for frequency detection.
Note 3: We have also not added 2D animations to the ESP8266 platform. ESP8266 is depricated in SR WLED, so we recommend that you use ESP32.
Note 4: The 2D routines require a minimum of 4 pixels in both directions. If you see blinking red, your 2D settings don't match the requirements. (not required in latest dev)
Note 5: As we continue to develop SR WLED, some animations may appear or disappear. It's still a work very much in progress. Some may only appear in the dev branch for now.
Note 6: In dev branch, sliders have been renamed from FFT Low to Custom 1, FFT High to Custom 2 and FFT Custom to Custom 3.
See also Non reactive animations
See List of effects and palettes for AC Animations.
See ScottrBaileys GIF visualizer for animations of the effects
Effect Description Sliders * 2D Swirl Several blurred circles. Looks good with pink plasma palette. Supports AGC. Speed: Speed Intensity: SensitivityFFT Low: Blur * 2D Waverly Noise waves with some sound Speed: AmplificationIntensity: Sensitivity * Gravcenter Volume reactive vu-meter from center with gravity and perlin noise. Speed: Rate of fall Intensity: Sensitivity * Gravcentric Volume reactive vu-meter from center with gravity. Volume provides index to (time rotating) palette colour. Speed: Rate of fall Intensity: Sensitivity * Gravimeter Volume reactive vu-meter with gravity and perlin noise. Speed: Rate of fall Intensity: Sensitivity * Juggles Juggling balls. Speed: Yes Intensity: # of balls * Matripix Similar to Matrix. Speed: yes Intensity: Brightness * Midnoise Perlin noise emanating from center. Speed: Fade rate Intensity: Maximum length * Noisefire A perlin noise based volume reactive fire routine. n/a * Noisemeter Volume reactive vu-meter. Speed: Fade rate Intensity: Width * Pixels Random pixels. Speed: Fade rate Intensity: # of pixels * Pixelwave Pixels emanating from center. Speed: yes Intensity: Sensitivity * Plasmoid Sine wave based plasma. Intensity: # of pixels * Puddlepeak Blast coloured puddles randomly up and down the strand with the 'beat'. Speed: Adjust fade rate. Intensity: Size of puddles FFT High: 256 freq bin select on ESP32. FFT Custom: Volume comparator on ESP32 * Puddles Blast coloured puddles based on volume. Speed: Fade rate Intensity: Size of puddle * Ripple Peak Peak detection triggers ripples. Intensity: Max number of ripples. FFT High: 256 freq bin select on ESP32 FFT Custom: Volume comparator on ESP32 * Waterfall A volume AND FFT version of a Waterfall that has 'beat' support. Speed: Speed Intensity: Adjust colour ** 2D CenterBars A 16x16 spectral analysis routine emanating from the center Speed: Bar Speed Intensity: Ripple time FFT Custom1: Center horizontally FFT Custom2: Center vertically FFT Custom3: Color vertically ** 2D Funky Plank A 2D wall of reactivity running from bottom to top Speed: Scroll Speed FFT Custom1: Number of bands ** 2D GEQ A 16x16 graphic equalizer. Speed: Bar Speed Intensity: Ripple timeFFT Custom1: Number of bands ** Binmap Map bins 3-255 throughout the length of the LEDs. This does not work with UDP sync.Values are not normalized. Intensity: Max volume ** Blurz Flash an fftResult bin per frame and then blur/fade. Speed: Fade Rate Intensity: Blurring ** DJLight An effect emanating from the center to the edges. Speed: Speed ** Freqmap Map the loudest frequency throughout the length of the LED's. Speed: Fade rateIntensity: Starting colour ** Freqmatrix See below See below ** Freqpixels Random pixels coloured by frequency. Speed: Fade rateIntensity: Starting colour and number of pixels ** Freqwave See below See below ** Gravfreq VU Meter from center. Log of frequency is index to center colour. Speed: Rate of fallIntensity: Sensitivity ** Noisemove Using perlin noise as movement for different frequency bins. Speed: Speed of perlin movement Intensity: Fade rate ** Rocktaves Colours the same for each note between octaves, with sine wave going back and forth. Speed: n/aIntensity: n/a ** Waterfall FFT version of a Waterfall. Speed: Speed Intensity: Adjust colourFFT High: 256 freq bin select on ESP32 FFT Custom: Volume comparator on ESP32 ** DJ Light tbd ** 2D Akemi tbd"},{"location":"WLEDSR/Reactive-Animations/#slider-usage","title":"Slider Usage","text":"Please see the brief slider descripion for each effect in the rightmost column above.
"},{"location":"WLEDSR/Reactive-Animations/#speedintensity","title":"Speed/Intensity","text":"These typically reflect the value of their namesake. Intensity would typically be number of LED's lit, or brightness of the LED's
"},{"location":"WLEDSR/Reactive-Animations/#fft-sliders","title":"FFT Sliders","text":"These may get renamed in the future and could be used for FFT routines OR for additional effect adjustments.
"},{"location":"WLEDSR/Reactive-Animations/#peak-detection","title":"Peak Detection","text":"This is NOT beat detection, but rather samples that are louder than a the current average plus a slider adjustable value.
"},{"location":"WLEDSR/Reactive-Animations/#automatic-gain-control","title":"Automatic Gain Control","text":"We are just beginning to add Automatic Gain Control to the routines, starting with 2D Swirl. This setting is only available on the LED Preferences page on the ESP32.
"},{"location":"WLEDSR/Reactive-Animations/#fft-routines","title":"FFT Routines","text":""},{"location":"WLEDSR/Reactive-Animations/#additional-effect-notes","title":"Additional effect notes","text":""},{"location":"WLEDSR/Reactive-Animations/#freqmatrix","title":"Freqmatrix","text":"The temporal tail for this animation starts at the beginning of the Segment rather than in the center of the segment.
Sliders used:
Slider usage is described in the rightmost column for each effect. In general, the sliders are configured for:
This effect maps the major frequencies from the incoming signal to colors in the HSV color space. From the low notes being mapped to red (0) to the high notes being mapped to blue (255) and everything in between. The band you are looking at can be restricted by the FFT Low and FFT High sliders. We are digitizing at 10240Hz, meaning the highest frequency bin that you can find is 5120Hz, which for most music is just fine.
Sliders used:
When you first connect to a WLED device in AP mode, there is some really annoying behavior on the captive portal implementation in Android. The captive portal is the limited browser you are forwarded to in order to login to a web site. What happens is that if you go into 'Effects', you can't scroll up. In order to get around that, click the three dots at the top right of the page, select 'Use Network as is', then open up Chrome and navigate to the site at 4.3.2.1.
"},{"location":"WLEDSR/Running-Sound-Reactive-WLED/#initial-sound-reactive-settings","title":"Initial Sound Reactive Settings","text":"On the \"Sound Settings\" page, configure the Squelch for a value (default is 10) to reduce your background noise for volume reactive effects. Volume reactive effects start with a single '*'. Typically, values between 4 and 20 should suffice. The higher the number, the greater the background noise is suppressed.
Configure the Gain setting (default is 60) to change the \"perceived volume\" of the input signal. More info on Squelch and Gain here.
"},{"location":"WLEDSR/Running-Sound-Reactive-WLED/#initial-2d-settings-esp32-only","title":"Initial 2D Settings - ESP32 Only","text":"When changing any values in the LED settings page, you'll need to update the 2D settings. If not using a 2D matrix, you can set them to 1 x or vice versa. If using a 2D matrix, configure these values for width x height. A value of less than 4 in either dimension will not work with some of the 2D animations.
The serpentine parameter configures whether the LED's are wired up in a continuous/serpentine layout or top to bottom and repeat.
"},{"location":"WLEDSR/Running-Sound-Reactive-WLED/#initial-udp-sync-settings","title":"Initial UDP Sync Settings","text":"Devices can be configured as 'disabled', 'transmit' or 'receive' UDP sound. This is completely independent of the 'Sync' button, which synchronizes effects.
As a result, you can run multiple types of sound reactive animations when UDP Sound Sync is enabled. This feature provides a subset of the sound and FFT data to several 'slave' devices. As a result, some FFT enabled routines will not function in this mode. You must RESET the ESP32 after you enable/disable this on the Sync settings page.
"},{"location":"WLEDSR/Running-Sound-Reactive-WLED/#connect-to-wled","title":"Connect to WLED","text":"See WLED General Led Settings
"},{"location":"WLEDSR/Settings/#led-settings-for-sound-reactive-additions","title":"LED Settings for Sound Reactive Additions","text":"See LED Preferences
"},{"location":"WLEDSR/Settings/#sound-reactive-settings","title":"Sound Reactive Settings","text":"See Sound Settings
"},{"location":"WLEDSR/Squelch-and-Gain/","title":"Squelch and Gain","text":""},{"location":"WLEDSR/Squelch-and-Gain/#introduction","title":"Introduction","text":"In order to accommodate a wide range of audio inputs, ambient environments and string lengths, we have added user configurable squelch (noise reduction/suppression) and gain controls on the LED settings page for the volume reactive animations.
"},{"location":"WLEDSR/Squelch-and-Gain/#squelch","title":"Squelch","text":"Adjust this value on the LED Settings page so that the leds are only activated above a certain 'background noise' level.
"},{"location":"WLEDSR/Squelch-and-Gain/#gain","title":"Gain","text":"Line-in signals are typically much lower than that of some of the microphones. Rather than use an auto gain function, you can manually adjust the gain from 1 to 255, which translate up to almost 6.0 gain.
In addition, the 'Intensity' slider can sometimes adjust an animation to simulate increased gain.
"},{"location":"WLEDSR/Squelch-and-Gain/#how-to","title":"How To","text":"Here's a method to setup squelch and gain for your SR WLED Device.
From faulty microphones to flaky wiring, to WiFi related issues, particularly in AP mode, getting reliable and spike free sound sampling with WLED and in particular analog sampling has been a challenge. Digital microphones such as the INMP441, the ICS-43434 provide the best results.
"},{"location":"WLEDSR/Testing/","title":"Testing","text":"IMPORTANT NOTE:
When testing the UI, make sure to refresh your web browser. It may have cached incorrect information.
"},{"location":"WLEDSR/Testing/#compile","title":"Compile","text":"UDP Sound Sync is a feature to synchronize (share) the sound input of a 'master' device with one or more 'slave' devices. All devices must be running the same release of SR WLED, and they must be in the same local network. Sound Sync is not available in \"upstream\" WLED by Aircookie. Sound Sync is also different from direct LEDs control using protocols like E1.31, DMX, DDP or AdaLight.
UDP Sound Sync does not sync the actual animations, but rather transmits summary audio sampling information to several devices that still run their own animations locally. In a nutshell, it means that several devices can share a single microphone.
"},{"location":"WLEDSR/UDP-Sound-Sync/#setup","title":"Setup","text":"Before configuring UDP Sound Sync, make sure you have gone into the WiFi Preferences and clicked on 'Disable WiFi sleep' at the bottom of the page. It has caused us innumerable problems in the past.
In order to configure UDP sound sync, the \u2018master\u2019 needs to be an ESP32 along with an audio input.
You would then to go the \u2018Sync Interfaces\u2019 page and configure the 'Audio Sync' at the bottom of the page. Transmit
for the ESP32 and Receive
for devices without an audio input (either ESP32's or ESP8266's). Make sure the UDP port is the same on all devices.
This does not sync the actual animations, but rather just the transmission of summary audio sampling information (as best we can).
In order to change the UDP Sync Mode (Disabled/Transmit/Receive), you need to power-cycle the ESP32/ESP8266.
"},{"location":"WLEDSR/UDP-Sound-Sync/#technical","title":"Technical","text":"When an ESP32 is configured for audio transmission, it will connect to a UDP Multicast address, and begin sending a single UDP Multicast packet containing the data used to generate sound-reactive animations out to any other devices that are configured to receive on the same network. The following information is transmitted:
"},{"location":"WLEDSR/UDP-Sound-Sync/#v1-format-used-in-sr-wled-up-to-013x","title":"V1 format, used in SR WLED up to 0.13.x","text":"#define UDP_SYNC_HEADER \"00001\"\nstruct audioSyncPacket {\n char header[6] = UDP_SYNC_HEADER;\n uint8_t myVals[32]; // 32 Bytes\n int sampleAgc; // 04 Bytes\n int sampleRaw; // 04 Bytes\n float sampleAvg; // 04 Bytes\n bool samplePeak; // 01 Bytes\n uint8_t fftResult[16]; // 16 Bytes - FFT results, one byte per GEQ channel\n double FFT_Magnitude; // 08 Bytes\n double FFT_MajorPeak; // 08 Bytes\n};\n
UDP_SYNC_HEADER is a versioning number that's defined in audio_reactive.h
"},{"location":"WLEDSR/UDP-Sound-Sync/#v2-format-wled-version-0140-including-moonmodules-fork","title":"V2 Format - WLED version >= 0.14.0 (including MoonModules fork)","text":"#define UDP_SYNC_HEADER_V2 \"00002\"\n// new \"V2\" AC 0.14.0 audiosync struct - 40 Bytes\nstruct audioSyncPacket_v2 {\n char header[6] = UDP_SYNC_HEADER_V2; // 06 bytes, last byte is '\\0' as string terminator.\n float sampleRaw; // 04 Bytes - either \"sampleRaw\" or \"rawSampleAgc\" depending on soundAgc setting\n float sampleSmth; // 04 Bytes - either \"sampleAvg\" or \"sampleAgc\" depending on soundAgc setting\n uint8_t samplePeak; // 01 Bytes - 0 no peak; >=1 peak detected. In future, this will also provide peak Magnitude\n uint8_t reserved1; // 01 Bytes - reserved for future extensions like loudness\n uint8_t fftResult[16]; // 16 Bytes - FFT results, one byte per GEQ channel\n float FFT_Magnitude; // 04 Bytes - magnitude of strongest peak in FFT\n float FFT_MajorPeak; // 04 Bytes - frequency of strongest peak in FFT\n};\n
The V2 format expects that AGC is performed by the sender, so there is no need to transmit \"AGC\" and \"non-AGC\" samples separately. To save bandwidth, the myvals[]
array was removed, and all numbers are either float
or uint8_t
.
SR-WLED 0.13.3 still sends out V1 format, however it is able to receive and decode V2 format, too.
"},{"location":"WLEDSR/UDP-Sound-Sync/#what-else","title":"What else ?","text":"You might want to take a look at this library, which allows to send and receive WLED Audio Sync data independent from WLED.
When an ESP32 or ESP8266 is configured to receive audio data from another device, the receiver will disable any onboard microphone sampling and FFT processing, in favor of audio data received from the network. Any time a UDP Multicast packet is received from a transmitter, it will be treated as a discrete microphone sample and stored in memory the same way it would be if it were a local microphone.
An ESP8266 will not be able to use any FFT data transmitted from an ESP32, as a result of the differences in hardware and software.
The UDP \u00a0Multicast\u00a0 IP is 239.0.0.1
, and the default UDP port is 11988
.
UDP port can be changed in WLED config pages, for example to have several groups of devices by assigning different UDP ports to each group.
UDP multicast is generally not very reliable with typical \"consumer grade hardware\". Some users found that creating a \"port forwarding rule\" on their local Wifi router helps. For example, you could create a \"dynamic port forwarding rule\" for UDP port 11988.
UDP Sound sync brought to you by @spedione on Discord.
Reference: https://github.com/Aircoookie/WLED/wiki/UDP-Realtime-Control
"},{"location":"WLEDSR/Using-my-PC-for-the-Sound/","title":"Using my PC for the Sound","text":"Q. Is it possible to use my PC for the sound and without using the microphone, or any ADC pins on the board.
The sound reactive fork of WLED was designed as an all-in-one unit that doesn't require the intervention of a PC. You can setup a display and have it run completely independently. It supports your PC's analog line-out signal, several analog microphones, an INMP441 digital microphone, as well as UDP sound sync:
https://mm.kno.wled.ge/WLEDSR/UDP-Sound-Sync
To answer this question, there is not a direct, built in way, except for the line-out signal. Although we support UDP sound sync, someone would have to write a program for their OS of choice to capture the sound from the PC, perform FFT calculations, and UDP transmit the sampled data (the packet matching our sound reactive WLED data structure). That's a non-trivial course of action.
All that being said, there are a couple ways to achieve this:
For windows, there is WledSRServer (https://github.com/Victoare/SR-WLED-audio-server-win) which is a small application that is using the mentioned sound capture, FFT calculation and UDP packet sending mechanism.
There is also LedFx (as found at https://github.com/LedFx/LedFx) which is an another solution for this use case with a different approach. Since WLED supports UDP, DDP, and E1.31 DMX protocols, you can use the sound reactive LedFx running on your PC to control a WLED device. There's an excellent video on setting this environment up at https://www.youtube.com/watch?v=ipSfQdfX4fE.
LedFx will then directly control the LED's on your WLED device, although you can still revert to native WLED animations.
"},{"location":"WLEDSR/WLED-Programming-Notes/","title":"Introduction","text":"This version of WLED contains sound reactive routines, which are prefaced with a * FX_NAME
for volume reactive routines and ** FX_NAME
for FFT routines. Each is controllable by the intensity and/or speed sliders. Some routines also include 3 dedicated FFT control sliders.
**Caveat: As our sound reactive fork of WLED evolves, some of this content may become out of date. We'll update as we become aware of any issues.
Contents:
Caveat: Some information on this page is in our 'dev' branch only and not yet ready for prime time.
"},{"location":"WLEDSR/WLED-Programming-Notes/#http-api-links","title":"HTTP API Links","text":"I hope to work on an Android application in the future, so I'm keeping notes on the HTTP API. * https://tynick.com/blog/01-28-2020/controlling-wled-with-raspberry-pi-using-the-wled-api/ * https://github.com/Aircoookie/WLED/wiki/HTTP-request-API
"},{"location":"WLEDSR/WLED-Programming-Notes/#updating-fxh-line-numbers-will-vary","title":"Updating FX.h (line numbers will vary)","text":"Append the new function(s) and use current functions as templates. Cannot add any functions without accompanying index entry.
"},{"location":"WLEDSR/WLED-Programming-Notes/#wled-support-functions","title":"WLED Support Functions","text":"fade_out(uint8_t rate);
- This is CRITICAL!!!blur(uint8_t blur_amount);
- Can be useful.color_wheel(uint8_t index);
- This has history with NeoPixel library. I use palettes instead.SEGLEN
// uint16_t - Segment length._segment_index
// uint8_t - Current segment being displayed.
SEGMENT.length
// uint16_t - Segment length (but not for ESP8266 :^/ )
SEGMENT.intensity
// uint8_t - You can use this from the slider.SEGMENT.speed
// uint8_t - You can use this from the slider.SEGMENT.palette
// uint8_t - Current palette. Otherwise SEGCOLOR(0) and SEGCOLOR(1).SEGMENT.mode
// uint8_t - Current mode.now
// uint32_t \u2013 Millis counter.SEGENV.call
// uint32_t \u2013 Counter each time a routine is called. Can be used for 'setup'.SEGENV.next_time
// uint32_t \u2013 Millis counter.SEGENV.step
// uint32_t - Counter each time a routine is called.SEGENV.aux0
// uint16_t - Available for use as a SEGMENT specific persistent variable.SEGENV.aux1
// uint16_t - Available for use as a SEGMENT specific persistent variable.You DO NOT use delay statements here, except to keep the watchdog happy. Here is the awesome FastLED method of timing/scheduling (which DOES NOT work with segments):
EVERY_N_MILLISECONDS_I(pixTimer, SEGMENT.speed) {\n pixTimer.setPeriod(256 - SEGMENT.speed);\n // Put your display code here.\n}\n
Here's the standard blink without delay version:
long lastTime = 0;\nint delayMs = 2000; // We want to do something every 2 seconds.\n\nvoid userLoop()\n{\n if (millis()-lastTime > delayMs)\n {\n lastTime = millis();\n //do something you want to do every 2 seconds\n }\n}\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#displaying-the-leds","title":"Displaying the LED's.","text":"We were used to FastLED.show(). Well, no longer, and this has some disadvantages.
CRGB myCol = ColorFromPalette(currentPalette, index, brightness, LINEARBLEND);\nsetPixelColor(myLED, myCol.red, myCol.green, myCol.blue);\n
The next line supports SEGCOLOR(0) and SEGCOLOR(1) if no palette (i.e. default) is selected:
setPixelColor(i, color_blend(SEGCOLOR(1), color_from_palette(index, false, PALETTE_SOLID_WRAP, 0), pixBri));\n
where, i
is the location, index
is the color and pixBri
is the brightness.
Now, onto the disadvantage. . The problem is that you can perform a getPixelColor
and move it to another LED with setPixelColor
. After moving to about 10 pixels, the LED is now black. This is because of the built-in scaling and addressing the memory that's used for DMA transfer. Unfortunately, we don't get a nice lossless leds[location]
as we do with FastLED.
WLED uses the NeoPixelBus library to drive the LED's directly, however, a significant amount of FastLED functionality has been enabled in WLED. Things included:
What is NOT included: * FastLED.show()
* FastLED pixel setup * FastLED power management * Working directly with the leds[x]
array * fill_rainbow
and related routines that directly affect the array * fade
/nscale
, you need to use the WLED equivalent
These will be used so that we can address leds[x] in our routines with the known and lossless FastLED method rather than the lossy NeoPixelBus method. We'll also be using these for ancillary functions, i.e. heat[x] as used in fire2012.
Since you cannot define variable arrays in C, we need other methods to do so for our functions.
The WLED method has been to malloc() some memory as follows:
if (!SEGENV.allocateData(SEGLEN)) return mode_static();\n byte *heat = SEGENV.data;\n heat[value] = 25;\n
For the 2D and FastLED data array functionality, the developers of this fork are not comfortable with the malloc()
method of memory allocation and have decided to create large fixed arrays instead and to create pointers for use with variable-length arrays.
Already declared in FX.cpp:
uint32_t ledData[MAX_LEDS]; // Currently 1500 as defined in const.h. Used for conversion from NeoPixelBus to FastLED. RGB or RGBW.\n uint32_t dataStore[4096]; // For ancillary functions. Can use any data type.\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#using-crgb-color-space","title":"Using CRGB Color Space","text":" CRGB *leds = (CRGB *)ledData; // Define the pointer and override the default data type.\n leds[0] = CRGB::Red;\n leds[1] = ColorFromPalette(currentPalette, index, bright, LINEARBLEND);\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#display-the-crgb-array","title":"Display the CRGB Array","text":"First, define a function and add to FX.h
void WS2812FX::setPixels(CRGB* leds) {\n for (int i=0; i<SEGLEN; i++) {\n setPixelColor(i, leds[i].red, leds[i].green, leds[i].blue);\n } \n}\n
You can now use FastLED address methods, AND it works with segments. Then, you can call this function at the end of your routine as follows:
setPixels(leds);\n return FRAMETIME;\n} // End of your routine.\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#proposed-using-chsv-colour-space","title":"Proposed - Using CHSV Colour Space","text":" CHSV *leds = (CHSV *)ledData;\n leds[i] = CHSV(25, 255,255);\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#proposed-display-the-chsv-colour-space","title":"Proposed - Display the CHSV Colour Space","text":"The leds[]
array is already defined in the CHSV color space.
CRGB color;\n for (int i=0; i<SEGLEN; i++) {\n color = leds[i];\n setPixelColor(i, color.red, color.green, color.blue);\n }\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#current-use-of-the-chsv-colour-space","title":"Current Use of the CHSV Colour Space","text":"As used in one of the FFT animations (** Freqmatrix) in FX.cpp around line 4079.
uint32_t *leds = ledData;\n CHSV c;\n c = CHSV(20, 255, 255);\n leds[i] = (c.h << 16) + (c.s << 8) + (c.v );\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#current-display-of-chsv-array","title":"Current Display of CHSV array","text":" for (int i=0; i<SEGLEN; i++) {\n c.h = (leds[i] >> 16) & 0xFF;\n c.s = (leds[i] >> 8) &0xFF;\n c.v = leds[i] & 0xFF;\n color = c;\n setPixelColor(i, color.red, color.green, color.blue);\n }\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#how-to-use-a-non-dynamically-created-variable-array","title":"How to use a non-dynamically created variable array","text":"We'll use that large dataStore array that was defined globally in FX.cpp. Although it was defined as a unint32_t
, you can still use smaller dynamic arrays and override the data type using pointers with a function:
uint8_t *myArray = (uint8_t *)dataStore; // Just make sure you don't go over.
You can now use it as a 1D or quasi 2D array, i.e.
myArray[5] = 4; // 1D array\n myArray[5*matrixWidth + 4] = 10; // 2D array\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#2d-changes","title":"2D Changes","text":"We have implemented an advanced XY() function to support not only panels of varying sizes and orientations, but also for multiple (identical) panels.
Animations have been written so that the top left led in the panel(s) is, well, at the top left.
We do not (yet) have animation specific orientation settings. If you would like to do so, for any given 2D animation, you'll need to swap the parameters for the XY() function as well as changing the for loop parameter from height to width (or vice versa).
"},{"location":"WLEDSR/WLED-Programming-Notes/#sound-reactive-eeprom-layout","title":"Sound Reactive EEPROM Layout","text":"We've expanded EEPSIZE
in const.h to 4095 for ESP32 and 3300 for ESP8266 due to our additional requirements. We started saving values at 3072 defined as EEP_AUDIO
. Although we'd like to apply SEGMENT specific settings, we may have some challenges with the FFT sliders. We're not sure at this point.
How do we store FFT slider values in EEPROM for WLED presets? WLED Presets are 20-byte blocks (slots) stored in EEPROM. There is space reserved in EEPROM for 25 slots from 400-899. Currently, 18 of the 20 bytes are being used by WLED. This presents a problem for us since, at the time of writing, we have 3 bytes that we need to store for our FFT sliders. We didn't want to attempt to rewrite the entire WLED preset protocol as that would surely introduce unnecessary headaches.
To solve this problem, we reserved 25 5-byte blocks (slots) in EEPROM from 3175-3299. With the space in EEPROM allocated, we can now save/retrieve FFT slider data to/from WLED presets.
Byte Data 0 FFT1 Slider Value 1 FFT2 Slider Value 2 FFT3 Slider Value 3 ZERO (Reserved) 4 ZERO (Reserved)"},{"location":"WLEDSR/WLED-Programming-Notes/#on-frame-rates","title":"On Frame Rates","text":"WLED limits the frame rate, and it's apparently because the LED's start flashing if the frame rate is too high. The standard for maintaining a consistent frame rate when writing any animations is to make sure you add to the end of your animation:
return FRAMETIME;
If you wish to increase the frame rate, have a look at fx.h with:
#define MIN_SHOW_DELAY 15
Also, in fx_fcn.h, there's:
if (nowUp - _lastShow<MIN_SHOW_DELAY) return;
Some animations may break when the users start implementing SEGMENTS. Issues encountered were:
Here's a replacement for EVERY_N_MILLIS()
uint8_t secondHand = millis()/(256-SEGMENT.speed) % 10;\n if (SEGENV.aux0 != secondHand) {\n SEGENV.aux0 = secondHand;\n <rest of code goes here>\n }\n
"},{"location":"WLEDSR/WLED-Programming-Notes/#getpixel-and-setpixel","title":"getPixel and setPixel","text":"In the FastLED world, we could cascade led information with things like:
leds[i+1] = leds[i];\n
That's not an option with WLED (unless you use the *ledData method described above), because it doesn't have the leds[] array. Instead, you have:
setPixelColor(i+1,getPixelColor(i)); \n
The problem, however is that while the FastLED method preserves the original pixel information, the 'WLED' method is lossy, and eventually the cascaded led's will fade out entirely. The workaround, as previously shown, is to create an array used by the segment that preserves the LED information. AirCoookie's method is to allocate memory on the fly for this. For instance:
if (!SEGENV.allocateData(SEGLEN)) return mode_static(); // allocation failed\n SEGENV.data[SEGLEN-1] = 0; // a byte value\n
If you want, you can give it another name with:
if (!SEGENV.allocateData(SEGLEN)) return mode_static(); // allocation failed\n byte* heat = SEGENV.data;\n heat[SEGLEN-1] = 0; // a byte value\n
You now have SEGENV.data[SEGLEN] allocated for your use. Adding a structure for use with your segment is a whole other level of complexity and can be found by examining mode_multi_comet and mode_oscillate among others. Just search for SEGENV.allocateData in FX.cpp.
"},{"location":"WLEDSR/wip/","title":"Work in Progress","text":"This page is work in progress
Check WLED Atuline Wiki for original content
Template text:
"},{"location":"WLEDSR/wip/#fork-specific-info","title":"Fork specific info","text":""},{"location":"WLEDSR/wip/#wled-sr","title":"WLED SR","text":""},{"location":"about/contributors/","title":"Contributors and Credits","text":"This page is to honor the work of all the people who helped to make WLED what it is today!
"},{"location":"about/contributors/#direct-contributors-to-wled-code","title":"Direct Contributors to WLED code","text":"Everyone you see on the Contributors page and: 8bitbrett made the WiFi auto connect QR code with the Aircoookie/WLED logo! adamo made the animated Discord server logo! @blazoncek makes countless new features and improvements to many parts of WLED! @debsahu provided the HomeAssistant autodiscovery and a lot of help with PIO! @ewowi numerous optimizations; 2D, audio and various user mod improvements. MoonModules maintainer. @frenck made an amazing, stable and feature-packed native integration with HomeAssistant! @Moustachauve added palette visualisation and developped the WLED Native app for Android and iOS! @pbolduc DDP UDP synchronization, UI improvements and user mods. @photocromax helped bring the Live visualization feature to life. @raymiec is currently working on creating the best clients for Android and iOS! @scottrbailey added JSON IR remote and gif visualizations for the docs. @softhack007 audio processing, new MCU support, code reviews, and various optimizations. MoonModules maintainer. @StormPie, the creator of the awesome mobile UI! @timothybrown added MQTT authentication! @viknet365 ported the Meteor effect! @wiesendaniel added the configuration for the PlatformIO IDE! @YeonV provided the initial HomeAssistant MQTT light config! @werkstrom added PixelArt converter
This list is incomplete.
"},{"location":"about/contributors/#testing-contributors-and-supporters","title":"Testing, Contributors and Supporters","text":"This list has been redacted for privacy reasons. If you've contributed to the project by testing a lot, helping the community, or sending me a gift, feel free to edit this page and add yourself (maintain alphabetical order) \ud83d\ude04 Thank you very much, your help is truly appreciated! Put two spaces behind your name, else the line break will not appear in the final page! ALDIY - user support, documentation, beta tester @Def3nder @DutchmanNL DrZzs (Justin A.) Dylan L. Fil Quindor (Andries F.) - designed Dig-Quad, Dig-Uno, etc. @Serg74 - designed controllers and shields - contributes code - hosts nightly build binaries Tonyno - tireless user support and documentation Wladi - contributes documentation and maintains WLED FAQ unofficial documentation.
"},{"location":"about/contributors/#used-libraries-and-dependencies","title":"Used Libraries and Dependencies","text":"ESP8266/ESP32 Arduino Core NeoPixelBus by Makuna FastLED library ESPAsyncTCP by me-no-dev ESPAsyncUDP by me-no-dev (as of 0.9.0) ESPAsyncWebServer by me-no-dev ArduinoJSON by bblanchon async-mqtt-client by marvinroger WS2812FX by kitesurfer1404 (modified) IRremoteESP8266 by markszabo (optional) Timezone by JChristensen Blynk library (compacted) E1.31 library by forkineye (modified) Espalexa by Aircoookie (modified) Many included FastLED effects are modified versions of kriegsman's gists!
WLED implements Art-Net\u2122 Designed by and Copyright Artistic Licence Holdings Ltd
WebServer_tng by bbx10 (ESP32, up to 0.8.3) PubSubClient by knolleary (modified, up to 0.8.3)
iro.js colorpicker by James Daniel! Classic UI icons by Linearicons created by Perxis!
If you would like to appear in this list for a contribution you made or be removed from it, feel free to contact me!
"},{"location":"about/privacy-policy/","title":"Privacy Policy","text":"By using the WLED embedded system code, the WLED iOS mobile application, the WLED Android mobile application, web client, or associated Services, no personally identifiable data is collected, transmitted and/or stored on external servers. No data is processed in any way not absolutely required for the operation of the Service.
This https://mm.kno.wled.ge page is hosted using GitHub Pages. While the author of this page does not collect any personally identifiable data, the service provider GitHub \"may collect User Personal Information from visitors to [the] GitHub Pages website, including logs of visitor IP addresses, to comply with legal obligations, and to maintain the security and integrity of the Website and the Service.\" (https://docs.github.com/en/github/site-policy/github-privacy-statement#github-pages) This is outside the influence of the author.
"},{"location":"about/privacy-policy/#overview-of-collected-data","title":"Overview of collected data","text":"The embedded system internally stores configuration data, including, but not limited to the user's WiFi credentials. This data is deletable by the user. External read access to sensitive data is blocked. No user or configuration data is sent to any system outside the users local network, unless the user modifies the Software or network configuration.
The mobile apps internally store data regarding connected devices, including, but not limited to the device's network-local IP addresses.
Using the provided Support services (including, but not limited to GitHub, Discord and E-mail), only the information you choose to disclose will be processed. Privacy policies and Terms of Service of service providers apply.
In accordance with the Service MIT license, THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
If you have inquiries regarding this Policy please feel free to contact me at: dev.aircoookie@gmail,com
"},{"location":"about/roadmap/","title":"Upcoming Features","text":"These are currently on my list of what COULD be implemented, there is no guarantee if and when they will be available!
WLED supports mixing 2D and 1D setup on the same unit, the expected result is that you could use 2D fixture and still chain a strip after or setup a strip and then a matrix after on the same pin.
Note: If the matrix is chained after the strip, then use reversing at the bus level, i.e. check Reversed (rotated 180\u00b0) in LED & Hardware setup. This may also require you reverse segment.
"},{"location":"advanced/audio-reactive/","title":"Audio Reactive WLED","text":""},{"location":"advanced/audio-reactive/#what-is-audio-reactive-wled","title":"What is Audio Reactive WLED?","text":"Audio Reactive WLED is a possibility of using WLED controllers in such a way that the LEDs react to music and light up in time. First time this was implemented by a Sound Reactive Fork. As of WLED version 0.14.0-beta1 an usermod is available for original WLED too. Currently only ESP32 microcontrollers are supported.
"},{"location":"advanced/audio-reactive/#hardware-required","title":"Hardware required","text":"The audio must be \"feed\" into the microcontroller. There are basically two options: using microphones or line-in adapters.
"},{"location":"advanced/audio-reactive/#microphones-supported","title":"Microphones supported","text":"Three microphone types are supported:
"},{"location":"advanced/audio-reactive/#1-analog-microphones","title":"1. Analog microphones","text":"Examples are MAX4466 (not really good) and MAX9814 (slightly better). These microphones are easy to use: you just have to connect 3.3V, GND and the analog output from the microphone to an ADC input (Analog-to-Digital Converter) of ESP32. However, the big disadvantage is the quality: both from the microphones themselves and from the ADCs integrated into microcontrollers, which are actually not well suited for audio processing and highly influenced by the power supply noise.
Analog microphones and analog buttons (potentiometers) rule out each other
WLED can use analog microphones or analog buttons but not both at the same time!
"},{"location":"advanced/audio-reactive/#2-i2s-digital-microphones","title":"2. I2S digital microphones","text":"Examples are INMP441 and ICS-43434/ICS-43432. These have an integrated ADC and already output a digital signal. The advantage is the best possible quality. The disadvantage is higher complexity (you need several PINs for a digital signal). For proper trouble-free operation keep wires between the microphone and ESP32 as short as possible and solder them properly.
There are also some commercial controllers with integrated digital microphone or plug-in capability available. Be sure to setup correct GPIOs according to the information you typically will find printed on the board or in user manual.
"},{"location":"advanced/audio-reactive/#3-pdm-microphones","title":"3. PDM microphones","text":"An example is SPM1423. In principle, these are also digital microphones with an integrated Sigma-Delta ADC. They are slightly cheaper than I2S microphones, require one PIN less and the quality is quite good.
"},{"location":"advanced/audio-reactive/#line-in-options","title":"Line-In options","text":"Similar to microphones there are options for analog or digital line-in adapters. In both cases you use line-out (AUX) or headphone-out signal of your sound system/TV/Smartphone/etc.
"},{"location":"advanced/audio-reactive/#1-analog-line-in-option","title":"1. Analog line-in option","text":"At least a simple analog circuit as shown below is required to prepare the analog line-out signal and to feed it to the ADC converter of ESP32 microcontroller. In this case, the whole thing works like with an analog microphone. The quality is not the best here either because the ESP32 ADC is not particularly good at converting audio signals and the signal conditioning circuitry is very simple, but not very good. In addition, the sensitivity can be quite poor, so that the whole thing only works at a higher volume of the signal.
In some cases, you can do it without this circuit and connect the GND of the audio source and an audio channel (left or right) directly to ESP32 ADC Pin (GND and analog input, e.g. GPIO36 pin on the ESP32). This solution is rather quite dirty workaround and might work well or not at all.
"},{"location":"advanced/audio-reactive/#2-line-in-to-i2s-adapter","title":"2. Line-in to I2S adapter","text":"Line-in to I2S adapter converts the analog line-out or headphone signal into a digital I2S signal that can be proceed by ESP32. There are some general or for WLED specially developed analog-to-I2S adapters based on for example CirrusLogic CS5343, TI PCM1808 or es7243 chips on the market. In this case, the whole thing works like with a digital I2S microphone. The only difference to I2S microphone is that you at least need an extra PIN for MCLK (Master Clock) signal, which can only be generated by the ESP32 on GPIOs 0, 1 or 3. The other complication is that MCLK is a high frequency signal and must be wired extremely accurate and have short wires. Some adapter types also require more additional signals. For stability it is better to use ready-to-use controller with special Line-In to I2S adapter or DIY PCB design where you can integrate general analog-to-I2S adapter directly without long wires.
For some more details please refer to Sound Reactive WLED WIKI
"},{"location":"advanced/audio-reactive/#software-required","title":"Software required","text":"Because audio reactive capability is currently implemented as a usermod, you need WLED compiled with this usermod included or use Sound Reactive WLED fork. The official WEB-based WLED installer does not include original WLED with audio reactive usermod, but offers Sound Reactive WLED as an option. The unofficial WEB-based WLED installer offers more options including original WLED with audio reactive usermod.
"},{"location":"advanced/buildflags/","title":"WLED MoonModules Build Flags","text":"Version at time of page update: WLEDMM 0.14.0-b15.23 - commit 244a613
Sourced by: S\u00f6ren#5281 Organized and updated by: Troy#2642
Flags/functions specific to WLED MoonModules are denoted with the \u263e icon.
"},{"location":"advanced/buildflags/#basic-usage","title":"Basic Usage","text":""},{"location":"advanced/buildflags/#in-my_configh-or-in-the-cc-code","title":"In \"my_config.h\" or in the C/C++ code","text":"For entries with no parameter, prefix with #define
like #define WLED_DEBUG
For entries with a numeric parameter, use the syntax of #define LEDPIN 16
For non-numeric entries use quotes like #define WLED_AP_SSID \"MY-WLED-AP\"
For items with no parameter, prefix with -D
like -D WLED_DEBUG
For entries with a numeric parameter, use the syntax of -D LEDPIN=16
For non-numeric entries use both types of quotes like -D SERVERNAME='\"WLED-C3\"'
lib_ignore = IRremoteESP8266
to your platformio.ini or platformio_override.ini file WLED_DISABLE_WEBSOCKETS Disables the websockets WLED_DISABLE_MQTT Disables MQTT support. Warning: This may break your build unless you disable several other things as well. WLED_DISABLE_SOUND Disables sound features... but why would you do that? :D WLED_DISABLE_2D Disables 2D Features WLED_DISABLE_LOXONE Disable Loxone support"},{"location":"advanced/buildflags/#audio-responsive-build-flags","title":"Audio Responsive build flags","text":"Flag Description SR_SQUELCH Sets the default squelch setting. Recommend 10 SR_GAIN Sets the defauly gain setting. Recommend 40 AUDIOPIN Analog audio pin SR_DMTYPE 0=none/disabled/analog ; 1=generic I2S I2S_SDPIN Default I2S sd/data/dout input pin I2S_WSPIN Default I2S ws/clk/lrck pin I2S_CKPIN Default I2S sck/bclk pin MCLK_PIN Default I2S master clock/mclk pin I2S_USE_16BIT_SAMPLES Use if I2S input are already 16-bit. Likely not the case for most setups. ES7243_SDAPIN I2C SDA pin for ES7243 boards ES7243_SCLPIN I2C SCL pin for ES7243 boards ES7243_ADDR Sets the ES7243 I2c address. Default is usually correct. ES8388_ADDR Sets the ES8388 I2C address. Default is usually correct. SR_DEBUG Turns on sound-reactive specific debug messages UM_AUDIOREACTIVE_USE_NEW_FFT Turns on the new FFT code. \u263e Should be the default currently in most builds. MIC_LOGGER Turns on mic logging for debug purposes. You may be able to graph this output. FFT_SAMPLING_LOG FFT sampling debug log. I2S_USE_RIGHT_CHANNEL Tells I2S to use the right channel. Defaults to the left. I2S_SAMPLE_DOWNSCALE_TO_16BIT Enabled by default unless I2S_USE_16BIT_SAMPLES
is defined."},{"location":"advanced/buildflags/#battery-usermod","title":"Battery usermod","text":"Flag Description USERMOD_BATTERY_MEASUREMENT_PIN Pin to measure the voltage, defaults to GPIO35 on ESP32 and A0 on ESP8266 USERMOD_BATTERY_MEASUREMENT_INTERVAL Interval to measure voltage in ms, defaults to 30s USERMOD_BATTERY_MIN_VOLTAGE Minimal voltage in volt, defaults to 3.2V if use lipo and min voltage is not set, if min voltage is not set and use lipo is set the dafault is 2.6V USERMOD_BATTERY_USE_LIPO Use LiPo discharge curve calculations USERMOD_BATTERY_MAX_VOLTAGE Max voltage in volt, defaults to 4.2V if not set USERMOD_BATTERY_TOTAL_CAPACITY capacity in mAh defaults to 3100mAh if not set USERMOD_BATTERY_CALIBRATION offset or calibration value to fine tune the calculated voltage USERMOD_BATTERY_AUTO_OFF_ENABLED auto-off feature, defaults to true USERMOD_BATTERY_AUTO_OFF_THRESHOLD Percentage theshold to turn power off USERMOD_BATTERY_LOW_POWER_INDICATOR_ENABLED low power indication feature, defaults to true USERMOD_BATTERY_LOW_POWER_INDICATOR_PRESET preset to use when low power threshold is hit - defaults to 0 USERMOD_BATTERY_LOW_POWER_INDICATOR_THRESHOLD percent - defaults to 20 USERMOD_BATTERY_LOW_POWER_INDICATOR_DURATION seconds - defaults to 5"},{"location":"advanced/buildflags/#bh1750-usermod","title":"BH1750 usermod","text":"Flag Description USERMOD_BH1750_MAX_MEASUREMENT_INTERVAL the max frequency to check photoresistorin milliseconds, 10 seconds USERMOD_BH1750_MIN_MEASUREMENT_INTERVAL the min frequency to check photoresistor in milliseconds, 500 ms USERMOD_BH1750_FIRST_MEASUREMENT_AT how many milliseconds after boot to take first measurement, 10 seconds USERMOD_BH1750_OFFSET_VALUE only report if differance grater than offset value, default 1"},{"location":"advanced/buildflags/#boblight-usermod","title":"BOBlight usermod","text":"Flag Description BOB_PORT Boblight port, defaults to 19333"},{"location":"advanced/buildflags/#buzzer-usermod","title":"Buzzer usermod","text":"Flag Description USERMOD_BUZZER_PIN Buzzer pin, defaults to GPIO32"},{"location":"advanced/buildflags/#dht-usermod","title":"DHT usermod","text":"Flag Description USERMOD_DHT_DHTTYPE 11=DHT 11, 21=DHT 21, 22:DHT 22 (AM2302), AM2321 *** default USERMOD_DHT_MEASUREMENT_INTERVAL the frequency to check sensorin milliseconds, 1 minute USERMOD_DHT_FIRST_MEASUREMENT_AT how many seconds after boot to take first measurementin milliseconds, 90 seconds USERMOD_DHT_PIN defaults to 21 onm ESP32 and 4 on esp8266 USERMOD_DHT_MQTT Publish measurements to the MQTT broker USERMOD_DHT_STATS For debug, report delay stats USERMOD_DHT_CELSIUS Display temperatures in Celcius"},{"location":"advanced/buildflags/#bme280-usermod","title":"BME280 usermod","text":"Flag Description Celsius Display temperatures in Celcius"},{"location":"advanced/buildflags/#enclosure-usermod","title":"Enclosure usermod","text":"Flag Description Celsius Display temperatures in Celcius"},{"location":"advanced/buildflags/#mqttswitch-usermod","title":"MQTTSWITCH usermod","text":"Flag Description MQTTSWITCHPINS define MQTTSWITCHPINSe.g. -D MQTTSWITCHPINS=\"12, 0, 2\" MQTTSWITCHINVERT invert the switch pins, default all active high MQTTSWITCHDEFAULTS default behavior, default all off"},{"location":"advanced/buildflags/#multi-relay-usermod","title":"Multi Relay usermod","text":"Flag Description MULTI_RELAY_MAX_RELAYS default to 4 MULTI_RELAY_PINS defaults to -1"},{"location":"advanced/buildflags/#my92xx-usermod","title":"MY92XX usermod","text":"Flag Description DEBUG_MY92XX Enable Debug"},{"location":"advanced/buildflags/#pir-usermod","title":"PIR usermod","text":"Flag Description PIR_SENSOR_PIN defaults to GPIO23 on ESP32 and GPIO13 on ESP8266 PIR_SENSOR_OFF_SEC in milliseconds, defaults to 600ms USERMOD_PIR_SENSOR_SWITCH Enables PIR Usermod"},{"location":"advanced/buildflags/#pwm-fan-usermod","title":"PWM Fan usermod","text":"Flag Description TACHO_PIN defaults to -1 PWM_PIN defaults to -1"},{"location":"advanced/buildflags/#pwm-output-usermod","title":"PWM OUTPUT usermod","text":"Flag Description USERMOD_PWM_OUTPUT_PINS default to 3"},{"location":"advanced/buildflags/#photoresistor-usermod","title":"Photoresistor usermod","text":"Flag Description USERMOD_SN_PHOTORESISTOR_MEASUREMENT_INTERVAL the frequency to check photoresistor in milliseconds, 10 seconds USERMOD_SN_PHOTORESISTOR_FIRST_MEASUREMENT_AT how many milliseconds after boot to take first measurement, 10 seconds USERMOD_SN_PHOTORESISTOR_REFERENCE_VOLTAGE supplied voltage USERMOD_SN_PHOTORESISTOR_ADC_PRECISION defaults to 1024 USERMOD_SN_PHOTORESISTOR_RESISTOR_VALUE defaults to 10k USERMOD_SN_PHOTORESISTOR_OFFSET_VALUE only report if differance grater than offset value, defaults to 5"},{"location":"advanced/buildflags/#sd-card-usermod","title":"SD card usermod","text":"Flag Description WLED_USE_SD_MMC Use when SD card is connected via MMC WLED_USE_SD_SPI Use when SD card is connected via SPI. Use the usermode page to set SPI pins SD_ADAPTER Enables SD card functionality."},{"location":"advanced/buildflags/#st7790-usermod","title":"ST7790 usermod","text":"Flag Description USER_SETUP_LOADED Detects if an external user setup file for the display was used in the library code itself ST7789_DRIVER Enables ST7789 driver TFT_WIDTH TFT display width TFT_HEIGHT TFT display height TFT_MOSI Display MOSI pin TFT_SCLK Display SCLK pin TFT_DC Display DC pin TFT_RST Display reset pin LOAD_GLCD Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH. Default enabled. LOAD_FONT2 Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters LOAD_FONT4 Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters LOAD_FONT6 Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm LOAD_FONT7 Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. LOAD_FONT8 Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. LOAD_FONT8N Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT LOAD_GFXFF FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts TFT_BL Display backlight pin"},{"location":"advanced/buildflags/#stairway-whipe-usermod","title":"Stairway whipe usermod","text":"Flag Description STAIRCASE_WIPE_OFF If enabled, fade out versus doing a reverse wipe in the effect"},{"location":"advanced/buildflags/#temperature-usermod","title":"Temperature usermod","text":"Flag Description TEMPERATURE_PIN defaults to 18 on ESP32 and 14 on ESP8266 USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL the frequency to check temperature in milliseconds, 1 minute"},{"location":"advanced/buildflags/#ttgo-t-display","title":"TTGO T-Display","text":"Flag Description TFT_DISPOFF defaults to 0x28 TFT_SLPIN defaults to 0x10"},{"location":"advanced/buildflags/#autosave-usermod","title":"autosave usermod","text":"Flag Description AUTOSAVE_AFTER_SEC in seconds, default 15s AUTOSAVE_PRESET_NUM defaults to 250 USERMOD_AUTO_SAVE_ON_BOOT defaults to false"},{"location":"advanced/buildflags/#four-line-display-usermod","title":"four line display usermod","text":"Flag Description FLD_PIN_SCL defaults to i2c_scl value FLD_PIN_SDA defaults to i2c_sda value FLD_PIN_CLOCKSPI defaults to spi_sclk value FLD_PIN_DATASPI defaults to spi_mosi value FLD_PIN_CS defaults to spi_cs value FLD_PIN_DC defaults to 19 on esp32 and 12 on esp8266 FLD_PIN_RESET defaults to 26 on esp32 and 16 on esp8266 FLD_TYPE defaults to SSD1306 or SSD1306_SDI if FLD_SPI_DEFAULT is set"},{"location":"advanced/buildflags/#four-line-display-alt-usermod","title":"four line display alt usermod","text":"Flag Description FLD_PIN_SCL defaults to i2c_scl value FLD_PIN_SDA defaults to i2c_sda value FLD_PIN_CLOCKSPI defaults to spi_sclk value FLD_PIN_DATASPI defaults to spi_mosi value FLD_PIN_CS defaults to spi_cs value FLD_PIN_DC defaults to 19 on esp32 and 12 on esp8266 FLD_PIN_RESET defaults to 26 on esp32 and 16 on esp8266 FLD_TYPE defaults to SSD1306 or SSD1306_SDI if FLD_SPI_DEFAULT is set"},{"location":"advanced/buildflags/#encoder-usermod","title":"encoder usermod","text":"Flag Description ENCODER_DT_PIN defaults to 12 ENCODER_CLK_PIN defaults to 14 ENCODER_SW_PIN defaults to 13 USERMOD_ROTARY_ENCODER_GPIO defaults to INPUT_PULLUP"},{"location":"advanced/buildflags/#encoder-alt-usermod","title":"encoder alt usermod","text":"Flag Description ENCODER_DT_PIN defaults to 12 ENCODER_CLK_PIN defaults to 14 ENCODER_SW_PIN defaults to 13 USERMOD_ROTARY_ENCODER_GPIO defaults to INPUT_PULLUP"},{"location":"advanced/buildflags/#vl53l0x-usermod","title":"VL53L0X usermod","text":"Flag Description VL53L0X_MAX_RANGE_MM max range in millimeters to react for motions, defaults to 230 VL53L0X_MIN_RANGE_OFFSET minimal range in millimeters that sensor can detect. Used in long motions to correct brightness calculation, defaults to 60 VL53L0X_DELAY_MS how often to get data from sensor, defaults to 100 VL53L0X_LONG_MOTION_DELAY_MS switch onto \"long motion\" action after this delay,defaults to 1000"},{"location":"advanced/compile-analog/","title":"Compile Analog WLED","text":"Moved, see How to compile WLED
"},{"location":"advanced/compile-arduino-esp32/","title":"Compiling a Custom Arduino-ESP32 Build","text":"Why? Well, WLED is itself reliant on a very big pile of code, and that code is provided in a binary format so you don't need to compile all the code for \"WiFi Support\" (for example) every time you compile WLED. We don't compile it, we just haul it in as a precompiled library.
The downside to this is bloat (we don't use Bluetooth, for example) and some options that are sane for \"all users\" but perhaps not the fastest options for WLED.
We'll be building arduino-esp32 release 2.x with IDF 4.4.x, which is required for S3 and other modern ESP32 variants.
This requires MacOS or Linux. If you're using Windows, then the Windows Subsystem for Linux works great too as it's Ubuntu based, which matches the docs perfectly and works flawlessly with this.
git clone -b release/v4.4 https://github.com/espressif/esp32-arduino-lib-builder
release/v2.x
to make things easier.git clone -b release/v2.x https://github.com/YOUR-GITHUB/arduino-esp32/
esp32-arduino-lib-builder
directory and run ./build.sh
and it should make you a fully default build for all boards and the current IDF for 4.4.x!There's several things that are not obvious when building arduino-esp32 - like \"how do I make my customizations actually get used in the build?\"
I'll be using the ESP32-S3 as the build target here, but the same general idea works for other boards.
Run the menuconfig for your board variant: * ./build.sh -t esp32s3 -b menuconfig
and set your options * Generally, you only will want to modify things in \"Arduino Configuration\" and the menus below it (Arduino TinyUSB, Compiler options, etc) * This will create an sdkconfig
file in the root of esp32-arduino-lib-builder
This file is functionally useless because the build system will use configs/defconfig.common
with configs/defconfig.esp32s3
and then add your sdkconfig
file - which means most of your modifications will be overwritten by the defaults and we do not want that.
To get your new build to use your menuconfig created build file:
esp32-arduino-lib-builder
folder.cd configs
cp defconfig.common defconfig.common.org
to make a backupcp defconfig.esp32s3 defconfig.esp32s3.org
to make a backuprm defconfig.esp32s3
to get rid of the S3 defaultstouch defconfig.esp32s3
to make a blank file so nothing complains during the buildcp ../sdkconfig defconfig.common
to put your options into the build file../build.sh -c /path/to/your/arduino-esp32/ -t esp32s3
/path/to/your/arduino-esp32/
There are other ways to do this, but with this method your previous choices are reflected as the default options when you run menuconfig
again.
NOTE: You could make a blank defconfig.common
file and cp ../sdkconfig defconfig.esp32s3
if you want to make different board configs with menuconfig.
In order to undo this if you things aren't working and you can't remember which options you changed, just cp defconfig.common.org defconfig.common
and cp defconfig.esp32s3.org defconfig.esp32s3
and then menuconfig
will start with the original \"sane\" defaults again.
This is useful because IDF v4.4.7 and above have differences that might cause WLED to break without some patching on your part, at least in MoonModules WLED.
Note the commit and the version tag, then run your build with those included:
Build with ./build.sh -I v4.4.6 -i 3572900 -c /path/to/your/arduino-esp32/ -t esp32s3
instead of ./build.sh -c /path/to/your/arduino-esp32/ -t esp32s3
UNTESTED: You should be able to repeat the steps above for a different target and it'll copy those to the appropriate directories in /path/to/your/arduino-esp32/
to add them to your repo on commit+push.
It does seem easier to build things one at a time, and only the boards you actually use - because it takes a LONG TIME to build all the targets.
"},{"location":"advanced/compile-arduino-esp32/#using-o2-to-build","title":"Using -O2 to build","text":"IF you selected Compiler Options ---> Optimization Level ---> Optimize for performance (-O2)
in menuconfig (which I think you should try!) you may need to adjust esp32-arduino-lib-builder
to get it to build, due to some bugs in how it treats compiler some warnings as errors when they are not.
esp32-arduino-lib-builder
folder.nano esp-idf/CMakeLists.txt
if(NOT BOOTLOADER_BUILD)
block, in the elseif(CONFIG_COMPILER_OPTIMIZATION_PERF)
block, set it like this: elseif(CONFIG_COMPILER_OPTIMIZATION_PERF)\n list(APPEND compile_options \"-O2\")\n list(APPEND compile_options \"-Wno-stringop-truncation\")\n list(APPEND compile_options \"-Wno-stringop-overflow\")\n list(APPEND compile_options \"-Wno-maybe-uninitialized\")\n
If you really want to experiment, you can change -O2
to -O3
or even -Ofast
but only -O2
seems to work for everything in my custom builds. Other compiler flags can be inserted in here as well to various outcomes.If a build is failing due to a compiler warning, you can edit the above block in esp-idf/CMakeLists.txt
to add more -Wno-compiler-warning-that-is-failing
lines to suppress and perhaps get past the particular warning that's causing the build to fail. All options DO need to be added one-per-line or it breaks the build system.
After you've done all this and ./build.sh -I v4.4.6 -i 3572900 -c /path/to/your/arduino-esp32/ -t esp32s3
(or whatever) has succeeded, you can now commit this to your repo and use it in PlatformIO:
cd /path/to/your/arduino-esp32/
git commit -a
git push
In your PlatformIO build for your board:
platform_packages = platformio/framework-arduinoespressif32 @ https://github.com/YOURUSER/arduino-esp32.git#release/v2.x @ 2.0.17+sha.{commit}\n toolchain-riscv32-esp@~12.2\n toolchain-xtensa-esp32s3@~12.2\nboard_build.arduino.upstream_packages = no\n
The \"{commit}\" is a good way to tell PIO to redownload your new modified code as you create and commit new builds. This is 7 characters and shown in your GitHub account with the last commit you did. (Weirdly if you look at your git push
output it'll show 8 characters - you can just use the first 7 and drop the last character.) The \"toolchain\" lines are entirely optional - I'm using a newer compiler here in testing. YMMV, etc.
Version 2.0.17 is the current version as of wiring this, but that can/will likely change in the future, so adjust accordingly. If you change the underlying IDF version, this version won't change automatically - and it doesn't really matter. If you want to be very correct, you can edit arduino-esp32/package.json
with the correct version of arduino-esp32 for your IDF (with IDF v4.4.6 it should be 2.0.14, for example), or whatever custom version you want it to be.
You can figure out the IDF to arduino-esp32 version mapping by looking thru https://github.com/espressif/arduino-esp32/releases if you really want everything to be correct, even if it doesn't actually matter in your actual build in PIO.
"},{"location":"advanced/compile-wled/","title":"Compile WLED","text":"Moved, see How to compile WLED
"},{"location":"advanced/compiling-wled/","title":"Compiling WLED","text":"You want to add custom features to WLED, use non-default pins, or add in a usermod? You've found the right place!
WLED has come to rely on so many dependencies in the latest versions that building with the Arduino IDE is no longer recommended. Instead, installing Visual Studio Code and its PlatformIO (PIO) extension is easier, as it will install the ESP Arduino core, all the required libraries and the correct compilation settings for you automatically.
"},{"location":"advanced/compiling-wled/#preparations","title":"Preparations","text":"git clone https://github.com/Aircoookie/WLED.git
in some folder. (You can also use GitHub Desktop or download the latest source code from https://github.com/Aircoookie/WLED under the Code
dropdown menu as a .zip file.) Alternatively fork the WLED project first and download it from your fork. cd WLED
.npm install\n
platformio ide
and install the PlatformIO extension File -> Open Folder
and open that root WLED folder (the one that contains platformio.ini
, NOT the wled00
folder) Tip
Make sure Git Client is installed on your system. You can get it here.
platformio.ini
.default_envs = travis_esp8266, travis_esp32
to comment it out.; default_envs =
. Please remove BOTH the ;
and the whitespace behind it to correctly uncomment the line. For most ESP8266 boards, the d1_mini
environment is best.Picture Guide
Success!
If you get one of these two errors, hit the checkmark icon once again to compile and that time the code should build without problems!
error: wled00\\wled00.ino.cpp: No such file or directory
FileNotFoundError: [WinError 2] The system cannot find the file specified: '[...].sconsign37.dblite'
Once you've confirmed VSCode with Platformio is set up correctly, you can add/define overrides to allow you to use non-default pins, add a usermod, or add other custom features.
platformio_override.ini.sample
into a new file called platformio_override.ini
. Make sure platformio_override.ini
is in the same folder as platformio.ini
.default_envs = WLED_tasmota_1M
with the line you uncommented in platformio.ini
in the previous steps (from Compilation guide (PlatformIO)). Example: default_envs = d1_mini
platformio.ini
scroll down until you see #-------------------- # WLED BUILDS #--------------------
[env:d1_mini]
platformio_override.ini
overwriting the build environment section that was already there.build_flags =
-D
overrides on this new line, giving each -D
it's own new line.Tip
This step is optional and only recommended if you want to install the same binary to multiple boards. For testing, it is easiest to upload directly from PlatformIO
The .bin file is located in the subfolder /build_output/firmware
in your WLED folder. The binary will have the same name as your environment.
All that's left to do is flash this .bin file onto your ESP board and then connect it to WiFi.
"},{"location":"advanced/compiling-wled/#compilation-guide-arduino-ide-not-recommended","title":"Compilation guide (Arduino IDE, not recommended)","text":"Warning
This method is outdated. The source is no longer officially checked to be buildable with the Arduino IDE. Using PlatformIO is strongly advised.
Follow a guide to setup your Arduino IDE (I am using version 1.8.9) with the ESP8266 libraries. For current compiles I recommend the latest Arduino core version 2.7.4. If you do not wish to install all libraries manually it is recommended to download the PlatformIO extension for VS Code (see above).
Run the following command to build the Web UI files: npm run build
You will need to install a few libraries:
* Please see the installation guide. You might need to enable a define in the library code.
All other dependencies are included with WLED for convenience.
Sketch -> Export compiled Binary
and upload with any ESP flashing tool.)ESP8266:
ESP8266-07 (External Antenna):
ESP-07s (External Antenna):
ESP32:
Warning
Note: These options change the documented access point name and password. The WLED community does not recommend changing these settings unless you are familiar with the risks.
Three compile time defines are available to modify the access point name. These are WLED_AP_SSID
, WLED_AP_PASS
, and WLED_AP_SSID_UNIQUE
. Defining WLED_AP_SSID
will set the SSID to the value of the define. Defining WLED_AP_PASS
will set the password to the value of the define. Defining WLED_AP_SSID_UNIQUE
will append the last 6 digits of the MAC address to the SSID.
WLED_AP_SSID
and WLED_AP_PASS
are string values, and as such need to be defined with \"
surrounding them. For example, #define WLED_AP_SSID \"MyWLED\"
or -D WLED_AP_SSID='\"MyWLED\"'
in the build_flags
of platformio.ini
.
Defining WLED_AP_SSID
will set the SSID to the value of the define. This is useful to set a device specific access point name. For example, if you have multiple WLED devices, you can set the SSID to the device name.
WLED_AP_SSID
is a string value, and as such needs to be defined with \"
surrounding it. For example, #define WLED_AP_SSID \"MyWLED\"
or -D WLED_AP_SSID='\"MyWLED\"'
in the build_flags
of platformio.ini
.
Defining WLED_AP_PASS
will set the password to the value of the define. This is useful to set a device specific access point password. For example, if you have multiple WLED devices, you can set the password to the device name.
Tip
If WLED_AP_PASS
is defined, but WLED_AP_SSID
is not, the compilation will fail. Ensure you define both WLED_AP_SSID
and WLED_AP_PASS
if you wish to change the access point password. Please also change the SSID if you wish to set a custom password.
WLED_AP_PASS
is a string value, and as such needs to be defined with \"
surrounding it. For example, #define WLED_AP_PASS \"MyWLEDPass\"
or -D WLED_AP_PASS='\"MyWLEDPass\"'
in the build_flags
of platformio.ini
.
Defining WLED_AP_SSID_UNIQUE
will append the last 6 digits of the MAC address to the SSID. This is useful to set a device specific access point name with a common prefix. For example, if you have multiple WLED devices, you can set the SSID to ChristmasTree-
followed by the last 6 digits of the MAC address.
WLED_AP_SSID_UNIQUE
is a boolean value, and as such only needs to be defined or not. For example, #define WLED_AP_SSID_UNIQUE
or -D WLED_AP_SSID_UNIQUE
in the build_flags
of platformio.ini
.
For custom devices in platformio_override.ini
:
[env:mywled]\nboard = esp32dev\nplatform = ${esp32.platform}\nplatform_packages = ${esp32.platform_packages}\nbuild_unflags = ${common.build_unflags}\nbuild_flags =\n ${common.build_flags_esp32}\n -D WLED_AP_SSID_UNIQUE\n -D WLED_AP_SSID='\"MyWLED\"'\n -D WLED_AP_PASS='\"MyWLEDPass\"'\nlib_deps = ${esp32.lib_deps}\nmonitor_filters = esp32_exception_decoder\nboard_build.partitions = ${esp32.default_partitions}\n
In my_config.h
:
#define WLED_AP_SSID_UNIQUE\n#define WLED_AP_SSID \"MyWLED\"\n#define WLED_AP_PASS \"MyWLEDPass\"\n
"},{"location":"advanced/custom-features/","title":"Custom Features","text":"Warning
Note: this page is now out of date, see updated functionality in the code (WLED/usermods/EXAMPLE_v2)
This page is intended for those wishing to modify the WLED code to add their own functionality.
"},{"location":"advanced/custom-features/#basics","title":"Basics","text":"Programming is done in the Arduino IDE. There is a special file, usermod.cpp
, to write your own code. (however, if you think your code may be relevant to many users, feel free to code it in directly and open a pull request)
This file has three empty methods: - userSetup()
is called after loading settings but before connecting to WiFi. Use it to start own interfaces if it does not depend on WiFi (IR, Sensors, GPIOs,...). Also you can use it to load custom settings or to specify own server pages with the server.on()
method. - userConnected()
is called once WiFi is connected. Use it to connect to external servers or init interfaces using wiFi. - userLoop()
is called by the main loop()
function.
If you know what you're doing, you may choose to change the value of any global variable declared in wled.h
. However, for basic color and brightness changes, these are the most important:
After updating the color, you must call the colorUpdated(int)
method. If you want to send a notification with the new color to other ESPs, use colorUpdated(NOTIFIER_CALL_MODE_DIRECT_CHANGE)
, otherwise colorUpdated(NOTIFIER_CALL_MODE_NO_NOTIFY)
.
If you'd just like a simple modification that requires timing (like sending a request every 2 seconds), please never use the delay()
function in your userLoop()
! It will block everything else and WLED will become unresponsive and effects won't work! Instead, try this instead:
long lastTime = 0;\nint delayMs = 2000; //we want to do something every 2 seconds\n\nvoid userLoop()\n{\n if (millis()-lastTime > delayMs)\n {\n lastTime = millis();\n //do something you want to do every 2 seconds\n }\n}\n
"},{"location":"advanced/custom-features/#internal-segments-api","title":"Internal Segments API","text":"You can use Segments from your code to set different parts of the strip to different colors or effects. This can be very useful for highly customized installations, clocks, ...
To set a segment, use strip.setSegment(id, start, stop);
, where id is the segment ID, start is the first LED of the segment and stop is the LED after the last one in the segment.
To edit the configuration of a segment, use:
WS2812FX::Segment& seg = strip.getSegment(id);\n//set color (i=0 is primary, i=1 secondary i=2 tertiary)\nseg.colors[i] = ((myWhite << 24) | ((myRed&0xFF) << 16) | ((myGreen&0xFF) << 8) | ((myBlue&0xFF)));\n//set effect config\nseg.mode = myFxI;\nseg.speed = mySpeed;\nseg.intensity = myIntensity;\nseg.palette = myPaletteId;\n
Keep in mind that this will not cause interface updates as of 0.8.6. For that, you still need to use colorUpdated(NOTIFIER_CALL_MODE_DIRECT_CHANGE)
"},{"location":"advanced/custom-features/#create-arti-fx","title":"Create ARTI-FX","text":"It is possible to create your own effects and add them to the FX library. The relevant files for that are FX.cpp
and FX.h
.
Here is a step-by-step guide on how to make your effect:
Take a look at some of the effects in FX.cpp
to see how they are implemented!
Add your own routine in FX.cpp starting with: uint16_t WS2812FX::mode_custom
Add to total number of effects in FX.h line 110: #define MODE_COUNT
Add your mode number (ie#define FX_MODE_CUSTOM 110
) in FX.h around line 200.
Add your mode around line 400 of FX.h, like so: _mode[FX_MODE_CUSTOM] = &WS2812FX::mode_custom;
Add it to the functions in FX.h around line 600:mode_custom(void),
Give it a name at the bottom (10 modes per line) in JSON_mode_names[]
. Wrap your name in quotes just like the others.
Compile, upload and enjoy! Your new effect will automatically be added to the list in the web ui.
If you programmed a nice effect you want to share, submit a pull request!
"},{"location":"advanced/custom-features/#create-a-custom-effect-as-usermod","title":"Create a custom effect as usermod","text":"Since 0.14
This feature was introduced with version 0.14.
It is possible to add new effects in form of a usermod.
Use 255
for the effect ID as it is a placeholder for \"1st available slot\". If you want a permanent ID use whatever is not used by built-in effects or other usermod's effects. It is possible to call addEffect(255,...) multiple times to add more effects without a collision of IDs.
uint16_t mode_blink(void) {\n ...\n return FRAMETIME;\n}\n\nstatic const char _data_FX_MODE_BLINK[] PROGMEM = \"Blink@!,Duty cycle;!,!;!;01\";\n\nclass BlinkUsermod : public Usermod\n{\n public:\n void setup()\n {\n strip.addEffect(255, &mode_blink, _data_FX_MODE_BLINK);\n }\n\n void loop()\n {\n }\n\n uint16_t getId()\n {\n return USERMOD_ID_...;\n }\n};\n
For details about the format of the configuration string see effect metadata.
"},{"location":"advanced/custom-features/#changing-web-ui","title":"Changing Web UI","text":"In order to conserve space, the Web UI interface is represented as a series of wled00/html_*.h
files which contain C/C++ strings with specific parts of the Web UI.
These files are automatically created from source files available in wled00/data
folder. To generate files, install Node.js 20 or higher globally. After that, recreate html_*.h
files by running in the repo directory:
> npm install\n> npm run build\n
If you want to test changes to the UI, it is easiest to work with the local wled00/data/index.htm
file. You just need to enter the IP address of a WLED 0.10.0 or newer instance into the popup. If you accidentally input an incorrect IP or want to test with a different instance, clear the local storage (in Chrome: Developer Tools -> Application -> Local Storage)
If you continuously modify files in the wled00/data directory, you want to monitor these changes to make local html_*.h files being updated automatically. To do this, run this in repo directory:
> npm run dev\n
This will start monitoring wled00/data folder for changes. However, you will probably never need this, as npm run build
is automatically executed before compiling. The html_*.h
files will only be created or updated if changes have been made to the wled00/data
folder. If you still want to recreate the files, you can use this command:
> npm run build -- -f\n
WARNING!! Be careful with changing the javascript in HTML files! For example function GetV() {}
must be the last javascript function in the <script>
element as it will be replaced by automatically generated code to fetch relevant settings from EEPROM. See tools/cdata.js
for the replacement rules which run for every *.htm file in wled00/data
.
Recompile and flash WLED!
"},{"location":"advanced/ddp/","title":"Virtual LEDs via DDP/ArtNet","text":""},{"location":"advanced/ddp/#overview","title":"Overview","text":"Virtual LEDs allow you to remotely \"attach\" LEDs from multiple ESPs or other dedicated hardware to a controlling instanec of WLED. These LEDs can be added to WLED just like physical pins.
On the controlling instance of WLED, go to Config > LED Preferences.
Select DDP RGB (Network) or Art-Net RGB (Network) as the LED type and enter the Length (number of LEDs on the remote WLED or other hardware device), then enter the destinatoon device's IP address.
Multiple remote WLED instances or other controller hardware can be setup this way.
For DDP the controlling WLED instance must be running at least 0.13 firmware while the remotes can be older. As usual, best perfomance is obtained by using an ESP32 for the controlling device. You can use an ESP8266, but only with a small number of LEDs (<300).
Art-Net is only implemented in MoonModules at or above 0.14.0.b1.18.
If your board supports Ethernet, use it. Ethernet is better than WiFi for the most stable performance.
"},{"location":"advanced/ddp/#ddp","title":"DDP","text":"Essentially the same type of transport as Art-Net, but the protocols are not compatible.
If you are using WLED -> WLED virtual LEDs, DDP should give the best performance - although this improvement should be marginal.
If you can't use DDP, Art-Net has a MUCH wider adoption.
"},{"location":"advanced/ddp/#art-net","title":"Art-Net","text":"\ud83c\udf1c
Art-Net universe output starts at zero. This is not currently configurable in WLED. Zero is the commonly expected starting universe for Art-Net. Channel output starts at one and is not currently configurable in WLED. One is the expected first channel in Art-Net.
For RGB LEDs, a full universe (170 RGB pixels) produces 510 channels - channels 511 and 512 will not be transmitted. This is common practice in Art-Net transmit and most implementations will expect this.
Art-Net output follows xLights' implementation of packet sequence numbering and universe-channel alignment, and transmits in RGB order. The first pixel output data will always be 0:1:R, 0:2:G, 0:3:B for universe:channel:colorpart.
This Art-Net implementation does ignore the \"always specify length of data as an even number\" part of the official specifications. If you encounter this issue, please file a bug report. Even Art-Net themselves say that this has been widely ignored and receivers should not expect an even value in the data length part of the packet.
"},{"location":"advanced/ddp/#background","title":"Background","text":"By TroyHacks
First there was DMX (DMX512). It was great for controlling lighting fixtures - \"set light to red\" sort of thing. \"Pan head to the left\". \"Dim the lights.\"
Then someone decided that DMX should work over the network rather than RS485 networks (usually over an XLR-style cable).
So Art-Net and E1.31 were born. DDP came later and improved upon the idea, but DDP isn't as widely supported yet and likely won't be outside of software.
All of these are the same premise as DMX512 - send packets of 8-bit numbers to remote systems. E1.31 and Art-Net are aligned with DMX512 and can send 512 channels per packet/universe, whereas DDP can send up to 1440 channels.
THEN a bunch of idiots (us) got into the game with massive LED panels.
To send LED data over the network, we still use a network form of DMX - E1.31, Art-Net, and DDP are all \"network DMX\".
You can think of an LED strip (or matrix) as a LOT of dimmable lights:
You have a red dimmable light. You have a green dimmable light. You have a blue dimmable light.
That's channels 1,2, and 3 - and they makes up one RGB LED.
A DMX universe is 512 channels (1440 in DDP). You can fit 170 LEDs into 510 channels (170 LEDs each having 3 channels - R, G, and B) or up to 128 RGBW lights. (Cureently WLED supports both RGB and RGBW internally for Art-Net... but you can only select RGB from the GUI.)
...and then you skip to the next universe and start at channel 1 again.
The issue with Art-Net and E1.31 (and DMX512, really) is that the sequence of numbers are just a list of numbers. There's no context to these numbers in the packet so it's up to the receiving end to understand these numbers in a meaningful fashion. DDP can some context - RGB, RGBW, HSL, and grayscale are all possible to identify in addition to unstructured data. DDP can also specify the bits per pixel, allowing 1, 4, 8, 16, 24 or 32-bit values. DMX/Art-Net/E1.31 are always 8-bit, in the range of 0-255.
"},{"location":"advanced/ddp/#using-art-netdmxe131-to-contol-the-wled-interface","title":"Using Art-Net/DMX/E1.31 to contol the WLED interface","text":"This is with WLED set to \"Effect\" in: Settings > Sync Interfaces > Network DMX Input > DMX Mode > \"Effect\"
Using this table:
Channel Property 1 Master Dimmer 2 Effect mode ID 3 Effect speed 4 Effect intensity 5 Effect palette ID 6 Effect option 7 Red Primary 8 Green Primary 9 Blue Primary 10 Red Secondary 11 Green Secondary 12 Blue Secondary 13 Red Tertiary 14 Green Tertiary 15 Blue TertiaryWhen using Art-Net \"Effect\" mode in WLED, those 15 sliders in QLC+ send control data to the 15 parameters in the table.
This is with WLED set to \"Multi RGB\" in: Settings > Sync Interfaces > Network DMX Input > DMX Mode > \"Multi RGB\"
Could you use QLC+ to send data to a matrix or strip? Absolutely! (But you shouldn't. Normally you will use something like xLights or Jinx that \"know\" how to talk to massive amounts of LEDs over the network.)
The catch is that you need THREE sliders (R/G/B) for every LED.
1,2,3 = pixel 1. (set to red) 4,5,6 = pixel 2. (set to green) 7,8,9 = pixel 3. (set to blue) 10,11,12 = pixel 4. (set to white, all sliders up)
With a panel of 768 pixels, you only need... 2304 sliders to set them all. \ud83d\ude04
All of the \"DMX mode\" settings tell WLED how to interperate the incoming DMX data (through whatever Network DMX protocol you're using)
\"Multi RGB\" is for lighting lots of pixels. \"Effect\" is for controlling the WLED instance itself. ...and the others have their own special methods, some combine both \"Effect\" and \"Multi RGB\" functionality.
WLED -> WLED works fine, of course. Mostly tested with the receiving WLED set to \"Multi RGB\". There's better ways to sync control between WLED (like... the \"Sync\" button)
xLights -> WLED works fine with any protocol they both speak, and WLED set to \"Multi RGB\"
Jinx -> WLED works fine with any protocol they both speak, and WLED set to \"Multi RGB\". Jinx has the absolute worst mapping setup, but some of the coolest effects.
WLED -> Jinx technically works, but Jinx only takes a few settings over \"network DMX\" to remote control the GUI. This will require some tinkering and perhaps building a custom WLED for yourself.
"},{"location":"advanced/ddp/#todo","title":"TODO","text":"I've proposed \"DMX into WLED via a physical DMX wire (RS485).\" This would be equivalent to \"Effect\" (and will likely be based on that mapping) so that you could plug WLED boards into a DMX512 cable and have it \"do a thing\" when you push a slider on the lighting control board/software. This feature does not currently exist, but is being worked on.
"},{"location":"advanced/esp32-recovery/","title":"ESP32 Recovery","text":"In Platformio IDE open a new terminal and type: pio run -v -t upload When you see the \"Connecting........\" abort the upload.
Below you can see Esptool commands, that was used by Platformio. Now you able to find all files that we need to build the binary (screenshot for visualization):
Prepare files and memory addresses according picture below:
Click button \u201cCombineBin\u201d. Now you have your binary file with Bootloader.
It is possible to interface WLED with home automation systems and other 3rd party software. You can use any API WLED provides (JSON, HTTP, UDP, MQTT), JSON is preferred. This page is intended for sample code and configs others use to control WLED from various 3rd party software:
HomeAssistant and NodeRED flows
"},{"location":"advanced/home-automation/#domoticz","title":"Domoticz:","text":"Please see here!
"},{"location":"advanced/home-automation/#home-assistant","title":"Home Assistant","text":""},{"location":"advanced/home-automation/#using-the-native-integration","title":"Using the native integration","text":"Compatibility notice
WLED devices are not supported by Home Assistant 2022.2 or later if a CCT bus is configured or White Balance Correction
is enabled.
We hope to resolve this issue as soon as possible. As a temporary workaround you can enable the option Calculate CCT from RGB
in LED settings.
WLED can be configured using the integrations in the Home Assistant frontend.
Menu: Configuration -> Integrations.
In most cases, the WLED devices will be automatically discovered by Home Assistant. Those automatically discovered WLED devices are listed on the integrations page.
If for some reason (e.g., due to lack of mDNS support on your network), the WLED device isn't discovered, it can be added manually.
Click on the +
sign to add an integration and click on WLED. After completing the configuration flow, the WLED integration will be available.
WLED integration documentation
"},{"location":"advanced/home-automation/#using-mqtt","title":"Using MQTT","text":"Alternatively, MQTT can be used (not recommended). Auto discovery is no longer supported since version 0.9 of WLED. In case you want to configure the device manually:
Expand to show MQTT configurationlight:\n - platform: mqtt\n name: \"Kitchen Floor Lights\"\n command_topic: \"wled/all\"\n brightness_command_topic: \"wled/all\"\n rgb_command_topic: \"wled/all/col\"\n rgb_command_template: \"{{ '#%02x%02x%02x' | format(red, green, blue)}}\"\n effect_command_topic : \"wled/all/api\"\n effect_list:\n - \"FX=0\"\n - \"FX=1\"\n - \"FX=2\"\n - \"FX=3\"\n - \"FX=4\"\n - \"FX=5\"\n - \"FX=6\"\n - \"FX=7\"\n - \"FX=8\"\n - \"FX=9\"\n - \"FX=10\"\n - \"FX=11\"\n - \"FX=12\"\n - \"FX=13\"\n - \"FX=14\"\n - \"FX=15\"\n - \"FX=16\"\n - \"FX=17\"\n - \"FX=18\"\n - \"FX=19\"\n - \"FX=20\"\n - \"FX=21\"\n - \"FX=22\"\n - \"FX=23\"\n - \"FX=24\"\n - \"FX=25\"\n - \"FX=26\"\n - \"FX=27\"\n - \"FX=28\"\n - \"FX=29\"\n - \"FX=30\"\n - \"FX=31\"\n - \"FX=32\"\n - \"FX=33\"\n - \"FX=34\"\n - \"FX=35\"\n - \"FX=36\"\n - \"FX=37\"\n - \"FX=38\"\n - \"FX=39\"\n - \"FX=40\"\n
by @acid2000 Config json which is sent via autodiscovery:
{\n \"name\": \"WLED Light\",\n \"stat_t\": \"wled/840d8e989815/c\",\n \"cmd_t\": \"wled/840d8e989815\",\n \"rgb_stat_t\": \"wled/840d8e989815/c\",\n \"rgb_cmd_t\": \"wled/840d8e989815/col\",\n \"bri_cmd_t\": \"wled/840d8e989815\",\n \"bri_stat_t\": \"wled/840d8e989815/g\",\n \"fx_cmd_t\": \"wled/840d8e989815/api\",\n \"fx_stat_t\": \"wled/840d8e989815/api\",\n \"bri_val_tpl\": \"{{value}}\",\n \"rgb_cmd_tpl\": \"{{'#%02x%02x%02x' | format(red, green, blue)}}\",\n \"rgb_val_tpl\": \"{{value[1:3]|int(base=16)}},{{value[3:5]|int(base=16)}},{{value[5:7]|int(base=16)}}\",\n \"qos\": 0,\n \"opt\": true,\n \"pl_on\": \"ON\",\n \"pl_off\": \"OFF\",\n \"fx_val_tpl\": \"{{value}}\",\n \"fx_list\": [\n \"[FX=00] Solid\", \"[FX=01] Blink\", \"[FX=02] Breathe\", \"[FX=03] Wipe\", \"[FX=04] Wipe Random\", \n \"[FX=05] Random Colors\", \"[FX=06] Sweep\", \"[FX=07] Dynamic\", \"[FX=08] Colorloop\", \n \"[FX=09] Rainbow\", \"[FX=10] Scan\", \"[FX=11] Dual Scan\", \"[FX=12] Fade\", \"[FX=13] Chase\", \n \"[FX=14] Chase Rainbow\", \"[FX=15] Running\", \"[FX=16] Saw\", \"[FX=17] Twinkle\", \"[FX=18] Dissolve\",\n \"[FX=19] Dissolve Rnd\", \"[FX=20] Sparkle\", \"[FX=21] Dark Sparkle\", \"[FX=22] Sparkle+\", \n \"[FX=23] Strobe\", \"[FX=24] Strobe Rainbow\", \"[FX=25] Mega Strobe\", \"[FX=26] Blink Rainbow\", \n \"[FX=27] Android\", \"[FX=28] Chase\", \"[FX=29] Chase Random\", \"[FX=30] Chase Rainbow\", \n \"[FX=31] Chase Flash\", \"[FX=32] Chase Flash Rnd\", \"[FX=33] Rainbow Runner\", \"[FX=34] Colorful\", \n \"[FX=35] Traffic Light\", \"[FX=36] Sweep Random\", \"[FX=37] Running 2\", \"[FX=38] Red & Blue\", \n \"[FX=39] Stream\", \"[FX=40] Scanner\", \"[FX=41] Lighthouse\", \"[FX=42] Fireworks\", \"[FX=43] Rain\", \n \"[FX=44] Merry Christmas\", \"[FX=45] Fire Flicker\", \"[FX=46] Gradient\", \"[FX=47] Loading\", \n \"[FX=48] In Out\", \"[FX=49] In In\", \"[FX=50] Out Out\", \"[FX=51] Out In\", \"[FX=52] Circus\", \n \"[FX=53] Halloween\", \"[FX=54] Tri Chase\", \"[FX=55] Tri Wipe\", \"[FX=56] Tri Fade\", \n \"[FX=57] Lightning\", \"[FX=58] ICU\", \"[FX=59] Multi Comet\", \"[FX=60] Dual Scanner\", \n \"[FX=61] Stream 2\", \"[FX=62] Oscillate\", \"[FX=63] Pride 2015\", \"[FX=64] Juggle\", \n \"[FX=65] Palette\", \"[FX=66] Fire 2012\", \"[FX=67] Colorwaves\", \"[FX=68] BPM\", \n \"[FX=69] Fill Noise\", \"[FX=70] Noise 1\", \"[FX=71] Noise 2\", \"[FX=72] Noise 3\", \"[FX=73] Noise 4\",\n \"[FX=74] Colortwinkle\", \"[FX=75] Lake\", \"[FX=76] Meteor\", \"[FX=77] Smooth Meteor\", \n \"[FX=78] Railway\", \"[FX=79] Ripple\"\n ]\n}\n
"},{"location":"advanced/home-automation/#indigo-domotics","title":"Indigo Domotics:","text":"Please see here!
"},{"location":"advanced/home-automation/#openhab","title":"openHAB:","text":"In openHAB 3 based environments you are able to use the native openHAB WLED Binding, which also supports discovery of your WLED devices.
For older openHAB (2.5.x) environmantes the connection can be configured via MQTT broker & Openhab MQTT Binding (2.5x) with configuration files Please find the details here
"},{"location":"advanced/longdata/","title":"Long Data Line configurations","text":"Addressable LEDs are controlled over a data line(s) based on 5V TTL (Transistor-Transistor-Logic) signals. Over long distances (> 5m) keeping those signals \"clean\" and well defined for the LED they're meant to drive can be difficult. While there are many methods used to get good results over 10m and longer runs (in-line resistors, voltage boosters, sacrificial pixels, etc.) they are often problematic and unreliable. There is a method specifically designed to send high speed (~1Mhz) TTL data over long (10's to 100's of meter) distances: using a differential pair.
Commonly known as RS485, differential pair transmission for LED's takes the single data line from your MCU (ESP32, ESP8266, etc) and translates that into a differential signal that is sent across two wires instead of one. A transmitter unit (Tx) at the MCU takes in the single data signal and outputs 2 lines usually called A+ and B-. At the LED strip a matching receiver unit (Rx) takes the A+, B- signals as inputs and outputs clean and accurate 5V LED data that can directly feed the strip. The only thing that needs to connect the TxRx pair is a pair of wires and a common ground. The wires don't carry much current at all (~50mA) and can often be a light wire pair from a length of Cat5e or 22/4 alarm wire.
The distance between the Tx and Rx devices can easily be 30m. With Cat5e UTP wire you can reliably reach 150m or more.
Note, there is no need for a level shifter with the Tx module. Typical transmitters are spec'd for a minimum 2.4V High level input which is well within the output range of a 3.3V MCU. The only other thing to note about the TxRx pair is that they usually require 5V to operate and often have a 120 ohm termination resistor across the A+,B- connections. Those resistors are important to maintain the integrity of the transmitted data.
A TxRx pair can also be used in the middle of a run of LED's when the distance to the next strip is long. Just put a Tx unit at the end of the first strip and the Rx unit at the start of the next strip.
The individual Tx and Rx units are fairly inexpensive and can found on Amazon or via Aliexpress usually for less than $2 USD each (try \"RS485 TTL interface\").
"},{"location":"advanced/longdata/#examples-wiring-diagrams","title":"Examples wiring diagrams","text":"Here are basic wiring diagrams for two of the more common TTL-RS485 boards generally found:
RS485 board defaults to Tx mode:
RS485 board defaults to RX (has extra safety components)
"},{"location":"advanced/mapping/","title":"Mapping","text":"WLED now has the ability to remap your LED strip programmatically.
"},{"location":"advanced/mapping/#what-is-it","title":"What is it?","text":"This allows us to treat the WLED strip as if it is wired in any way - we can then use the mapping feature to address the strip in any order. This allows for matrix support, serpentine runs and such.
"},{"location":"advanced/mapping/#how-do-we-do-it","title":"How do we do it?","text":"Navigate to the edit page for your WLED device by adding /edit
to its' address - for example, https://my-led-device.local/edit Use this edit page to create a file called ledmap.json
.
ledmap.json
file needs to be a JSON formatted file with the the key being \"map\" and the value being an array of numbers representing the new order of pixels. The position of values in the array is the \"natural\" order of LEDs and the value entered is the new position.
The ArduinoJSON library is *extremely*** white-space sensitive. If your ledmap.json
file is not working, check for white-spaces where they should not be. The LED positions are zero-indexed.
Multiple maps are supported in the latest versions by using ledmapx.json
where x is a number. Maps can be selected in a preset using {\"ledmap\":x,...
.
Use -1 in the map for gaps/blank/nul LEDs.
"},{"location":"advanced/mapping/#examples","title":"Examples","text":"In the below example (formatted multiple ways), we remap a strip of four LEDs from a physical order of 0 1 2 3 into a new order of 0 2 1 3.
{\"map\":[0,2,1,3]}\n\n{\"map\":[\n0,2,1,3\n]}\n\n{\"map\":[\n0,2,\n1,3\n]}\n
This is another example that switches direction every 5 LEDs. It could be formatted any of the three ways demonstrated above.
{\"map\":[0, 1, 2, 3, 4, 9, 8, 7, 6, 5, 10, 11, 12, 13, 14,\n19, 18, 17, 16, 15, 20, 21, 22, 23, 24, 29, 28, 27, 26, 25]}\n
"},{"location":"advanced/mapping/#014-ac","title":"0.14 AC","text":"A ledmap is specified in a dropdown which can have the following values:
Unchanged: nothing will happen (if a ledmap is active, that ledmap will stay active)
width and height define the total width and height of the 2D coordinate space (this overrides 2D configuration settings)
Repository of ledmap examples: WLED-Effects/Ledmaps containing irregular 2D shapes (clouds and cube) and rings remapping (rings). For testing the different ledmaps upload presets.json in this folder to /edit
Example to enable Net debug , compile with the following flags
-D WLED_DEBUG
-D WLED_DEBUG_HOST='\"192.168.x.y\"' ;; to send debug messages over network to host 192.168.x.y - FQDN is also possible
-D WLED_DEBUG_NET_PORT=1878 ;; port for network debugging. default = 7868
To access net debug from the host type the following netcat example :
nc -l 1878 -u
Debug can be switched on and off in the Info tab:
"},{"location":"advanced/net-debug/#fork-specific-info","title":"Fork Specific info","text":""},{"location":"advanced/net-debug/#wled-mm","title":"WLED MM","text":"No need to specify ip address and port in platformio.ini and therefor hardcode in bin/esp32. Go to Sync Interfaces / Net debug and specify there. Set output to network pressing Net Debug in the info tab (default off after reboot).
See release notes v0.14.0-b15/manage netdebug serial logging in settings
"},{"location":"advanced/pir-sensors/","title":"Using PIR Sensors","text":""},{"location":"advanced/pir-sensors/#introduction","title":"Introduction","text":"WLED controllers can be used with PIR (Passive InfraRed) sensors for human presense detection. There are two types of sensors:
With integrated rotary potentiometers to adjust the sensitivity and the hold time. E.g. HC-SR501 type. These sensors can be connected to WLED and configured as a button.
Without integrated possibility to adjust the sensitivity and the hold time. E.g. HC-SR602 type. For these you have to compile WLED with a PIR Sensor Usermod to have these settings in the software.
This sensor type has the following features:
Three pins for connection (GND, supply voltage 5\u202612 V, data signal with 3.3V level). Ground (GND) and the supply voltage can be connected directly to a power supply unit (5 V or 12 V). Data signal can be connected directly to a GPIO of an ESP8266 or ESP32 controller.
Jumper to switch between two modes. In position 1, when a movement is detected, a HIGH level (3.3V) is output on the data signal and the adjustable holding time is maintained. The data signal then goes back to LOW (0V), regardless of whether the movement is still present or not. If the movement continues, the data signal is switched back to HIGH after a blocking time of approx. 2.5 s. In position 2 it works similarly, but the data signal does not go to LOW as long as the movement is still present. Only when the movement no longer exists for an adjustable holding time, the data signal goes to LOW. So, position 2 is what you normally need.
Poti for setting the holding time. If this is turned counterclockwise as far as it will go, the holding time is approx. 3\u20265 s. In the middle position it is approx. 100 s and in the end position clockwise approx. 200 s.
Poti for adjusting the sensitivity. This is approx. 3 to 7 meters and is set lower if you turn the potentiometer clockwise.
In WLED SW you have two options how the sensor can be used:
"},{"location":"advanced/pir-sensors/#option-1-as-a-switch","title":"Option 1: as a switch","text":"You set a button under \u201cConfig->\u201dLED Preferences\u201d so that you can set the GPIO used for the data signal and select \u201cSwitch\u201d. Then, when movement is detected, LEDs are switched on and go out after a holding time without movement.
"},{"location":"advanced/pir-sensors/#option-2-as-a-pir-sensor","title":"Option 2: as a PIR sensor","text":"You can set two presets, one of which is activated when movement is detected, and the other when there is no more movement and the hold time has expired. This gives more flexibility to set what exactly should happen.
"},{"location":"advanced/remote-access-ifttt/","title":"Remote Access / IFTTT","text":"WLED is open-source, DIY software. This means all services are hosted locally on your ESP8266/32. Therefore you can only control your lights from within your local (home) network.
If you need to control WLED from anywhere (the public internet) you can do so in multiple ways, some requiring additional hardware:
"},{"location":"advanced/remote-access-ifttt/#1-home-automation-systems","title":"1. Home Automation systems","text":"If you add your WLED device to your Home Automation system (e.g. Home Assistant or ioBroker), you can control WLED remotely if you have set up remote access for your Home Automation system, for example via Nabu Casa.
"},{"location":"advanced/remote-access-ifttt/#2-amazon-echo-device","title":"2. Amazon Echo device","text":"If you have set up your Alexa device to control WLED, you can just use the Alexa App or another Echo device linked to your account to control your lights (on/off and brightness only)
"},{"location":"advanced/remote-access-ifttt/#3-port-forwarding","title":"3. Port Forwarding","text":"Warning: An insecure HTTP connection is used, please do NOT edit sensitive info like the WiFi settings when connected via port forwarding! This method offers more flexibility, but is also more involved. Keep in mind this causes anyone with your IP address to have access to your ESP8266! Setting up an OTA lock password is a must to prevent attackers from acquiring your WiFi credentials!
To expose WLED to the internet, create a port forwarding rule for your ESP's IP local ip and port (80) in your router configuration. It is not recommended to use port 80 on your public IP address since 80 is scanned constantly by bots good and bad. Use a 5 digit port for better security. If your public IP changes a lot, make sure to also use a dynamic DNS service so your lights are always accessible. Unsure what any of this means or how to do it? Google for \"[your router model] port forwarding\"!
Additionally, this opens up many new possibilities for automation! You can use a service like IFTTT Webhooks to send automated WLED API calls that can do anything from turning on the lights at a set time to changing their color if you get a new email!
"},{"location":"advanced/remote-access-ifttt/#4-hue-sync","title":"4. Hue sync","text":"If you have a Philips hue setup and sync WLED to it, you can control your WLED lights in any way it's possible to control your hue lights (hue App, Alexa (including colors), any other service that uses Philips hue API)
"},{"location":"advanced/security/","title":"Security","text":"WLED was designed in a way that you should be safe to have a router port forwarding to control the system from the public internet. This page will tell you what you can expect by WLEDs security.
"},{"location":"advanced/security/#tldr-what-to-do","title":"TLDR - what to do?","text":"A: If you just operate WLED within a local network and/or with a secured Access Point (change the default password \"wled1234\"!!) you are fine.
If you have configured a port forwarding to control WLED from outside your local subnet, please make sure the setting \"OTA Lock\" is enabled and you have changed the default OTA password \"wledota\"! Also, NEVER edit sensitive data (like WiFi credentials) while connected via the port forwarding!
"},{"location":"advanced/security/#1-is-the-connection-itself-safe","title":"1: Is the connection itself safe?","text":"A: Technically not. The ESP8266 uses unencrypted HTTP traffic. Implementing HTTPS would take too much processing power and memory on this little device. This means an attacker could read your passwords during transmit. Therefore, to be safe, please do NOT change the AP/Client WiFi/OTA password from outside of your LAN via a forwarded port. If you are at home, you should be safe if your WiFi is secured. You can change any other setting while you're away, though. WLED doesn't send your actual password to the settings page, just its length.
"},{"location":"advanced/security/#2-what-do-you-mean-by-secure-then","title":"2: What do you mean by secure then?","text":"A: WLED comes with the ability to carry out a software update via WiFi (OTA). However, no one must be able to flash a malicious new binary firmware to steal your WiFi credentials or make your ESP part of a botnet. Therefore, you should enable the \"OTA Lock\" setting and change its default passphrase \"wledota\".
"},{"location":"advanced/security/#3-can-i-protect-the-light-configuration-or-the-settings-page","title":"3: Can I protect the light configuration or the settings page?","text":"A: Currently not. This is not sensitive information like your WiFi password. Anyone with your IP and port can control the lights. Open an issue if it should ever happen that somebody plays with your lights. I might consider adding an optional password lock then. For now, it is way too cumbersome for what it does.
"},{"location":"advanced/security/#4-i-want-to-do-a-software-update-but-it-says-ota-lock-active","title":"4: I want to do a software update, but it says \"OTA lock active\"?","text":"A: You need to go to the settings page. Untick the \"OTA Lock\" setting and input your passphrase in the field below it. Now apply the settings and reboot. After that you can carry out the software update. Don't forget to re-enable OTA Lock afterwards! To enable, you don't have to enter the passphrase, unless you want to change it. For the lock to work you need to apply and reboot again.
"},{"location":"advanced/security/#5-why-is-this-ota-lock-stuff-that-important","title":"5: Why is this OTA lock stuff that important?","text":"A: Your unencrypted WiFi password is stored in the module's EEPROM. It would be easy to \"update\" the software to a malicious version which sends your password to the attacker. OTA Lock makes sure only those with the passphrase may carry out a software update. And yes, while you can disable OTA lock by doing a factory reset, this would also kill the WiFi connection to the attacker.
"},{"location":"advanced/security/#6-anything-else","title":"6: Anything else?","text":"A: A personal tip from me is not to give anyone your IP to control the software who you do not wish to do so on a regular basis. It is not critical from a security standpoint, but it can be very annoying if someone plays with your lights, or even worse, change your AP credentials to the point where you can no longer access the module except via USB.
"},{"location":"advanced/wiring/","title":"Overview","text":"RGB LEDs can draw a lot of current (amps). While most people usually worry about the dangers from high voltage, low voltage + high amperage can be dangerous too, as it can easily become a fire hazard in certain circumstances. Depending on your setup size (the number of LEDs you want to drive), use these tips to help guide your wiring.
There are plenty of guides out there to help with power supply selection, which is out of scope of this page. Size your power supply to your installation both up and down, so you both provide them with enough current and don't introduce unnecessary risk. It's better to power 30 LEDs from a 10W (2A @5V) power supply than a 100W power supply, as you don't need to worry about the potential for as much energy flowing through small wires.
As you increase the number of LEDs, you increase the amps your power supply will need to be able to provide. The more amps you're working with, the more you need to be cautious about your wiring and fusing.
For example, if you want to power your LEDs off a sealed lead acid battery (e.g. a car battery), you need to be very careful about current. These kinds of batteries can supply hundreds of amps, so you need to ensure that you use fuses along the way to protect against shorts. If you're using USB pocket chargers on the other hand, they tend to be current limited (most provide only 1-2A max) so you can worry less about fusing there.
Make sure to also check out this great list of resources to help you learn!
"},{"location":"advanced/wiring/#small-setups-30-rgb-leds","title":"Small Setups (< 30 RGB LEDs)","text":"WLED has a great built-in automatic current-limiting feature, set to 850mA by default. If you have a very small setup (< 30 LEDs), you can use this feature to help simplify your wiring and keep things safe.
In most circumstances, it's best to power your LED strip directly from the power supply and wire power to your WLED control board in parallel.
{insert diagram here}
With the current limiting feature turned on and for very small setups (on the smaller side of 1-30 LEDs), you can power the LED strip directly through the USB port of D1 mini or similar board. That is, power comes in to the control board through the USB port and out to a 5V pin. Each board will be a little different, so it would be wise to verify that you can do this for your specific board. You want to ensure that there are no voltage regulators, diodes, or other components between the 5V pin and the USB port input that are going to be damaged by the high-current draw of the LEDs. You also want to ensure that any PCB traces are big enough that they don't heat up with increased current. Never try to draw more than 1A through a board's USB port like this; the boards really aren't designed for large amounts of current to flow through them.
When using this technique, make sure to add strain relief to your wires so that they don't flex and break. The easiest way to do this is to use hot glue. While you want to use plenty of hot glue, just be careful to not cover any components that are going to get hot with hot glue.
"},{"location":"advanced/wiring/#medium-setups-30-300-rgb-leds","title":"Medium Setups (30-300 RGB LEDs)","text":"For a medium-sized setup of 30-300 LEDs, you should find a power supply that can provide enough current (see the link above) and make sure to power the strip directly. For setups with more than 150 LEDs, you should consider power injection.
"},{"location":"advanced/wiring/#power-injection","title":"Power injection","text":"Power injection is where you connect multiple wires from your power supply to the strip in multiple places, usually once at the beginning and once at the end. This is needed because the LED strips can only pass a small amount of current through them and you need to ensure that all your power-hungry LEDs get fed enough power. If your LEDs are dim or discolored at one end of the strip, you should add power injection.
When doing power injection, make sure your wires are rated for the amperage you wish to send over them. You should also check the voltage drop if you're doing a particularly long run. As a rough guide, you should never use anything thinner than 22AWG wire for power injection.
For medium-sized setups, you should add fuses if your power supply is over 100W. Considering an inline fuse on each power injection line.
"},{"location":"advanced/wiring/#inline-fuses","title":"Inline Fuses","text":"You should place the fuse as close to the power supply as possible, on the positive lead, so that as much of the current flows through it as possible. That will cause the fuse to blow if the power injection line shorts or if the strip shorts, instead of causing your power injection wire or strip to heat up. Buy a fuse that's rated just over what you expect your LED strip to draw. For example, if you calculate that your LEDs will draw at most 4.5A, buy a 5A fuse.
First match your power injection wire size with the inline fuse's wire. If the inline fuse comes with 16AWG wire (it's usually printed on the wire itself in small type), you should use 16AWG or thicker wire for your power injection wire. If you use thinner wire, you weaken the utility of the inline fuse and risk your power injection wire heating up in the case of a failure.
To wire in an inline fuse, trim back the positive wire (not ground) of your power injection line enough to allow the inline fuse to be spliced in. Place a cut of heat-shrink tubing over the wire so that the cable can be insulated once your solder joint is complete. Strip and bend both wires of your splice so that they create hooks to mechanically reinforce the joint, then solder. Cover with the heat-shrink tubing and you're done! Now you have a beautiful, professional-looking fused power injection line.
"},{"location":"advanced/wiring/#larger-setups-300-rgb-leds","title":"Larger Setups (300+ RGB LEDs)","text":"The more power you're working with, the more you need to be careful about your wiring. If you're using a 150W or higher power supply or multiple power supplies, check out these tips:
"},{"location":"advanced/wiring/#wire-ferrules","title":"Wire ferrules","text":"If you're using stranded wire and lever-lock or screw terminals, all your wire \u2192 terminal connections should be terminated with a wire ferrule of the appropriate wire gauge.
This is because stranded wires can splay and lose tension over time, creating a weaker connection that could lead to sparking. Loose strands can also cause shorts or break off. The same is true for tinned stranded wires: the solder can deform (especially if it's heated), loosening the screw terminal, and cause a weaker electrical connection or complete failure. That said, untinned stranded wire in a screw terminal actually creates a better connection than tinned stranded wire, so for high current applications where they could possibly heat up, don't tin them if you don't have ferrules.
Shrouded wire ferrules also act as strain relief, minimizing mechanical damage if the wire moves at all. This is especially important for any installations that are mobile, could experience vibrations, or are installed/removed seasonally.
"},{"location":"advanced/wiring/#multiple-power-supplies","title":"Multiple power supplies","text":"When doing power injection with multiple power supplies never mix two power supplies on the same LED strip. You can connect grounds together, just never the positive rails. This means you need to segment your LEDs based on power supplies, including your power injection. For the same reasons listed below, never connect multiple power supplies to the same strip for power injection purposes, always fork one power supply and route it to the start/mid/end of the same strip.
Because multiple power supplies could have subtle variations in their positive voltages (e.g. 12.1V and 12.3V), this could lead to power flowing in ways that aren't expected or which could be damaging to your equipment. In general, wired power supplies don't like to be directly connected to other power supplies unless they are explicitly designed for that purpose. This is not true for cell batteries, which are usually fine with being connected in parallel provided all the battery voltage + chemistry are the same.
"},{"location":"advanced/wiring/#even-more-tips","title":"Even more tips","text":"Currently (as of summer 2023) only the microcontrollers from Espressif, types ESP8266 and ESP32 (with dual core) are fully supported. Some of the newer types like ESP32-C3, ESP32-S2 and ESP32-S3 are experimentally supported, but productive use is not recommended yet because some bugs are suspected. In addition, the installation of these newer types is not that easy: there are several hardware variations/boards for which the SW must be specially compiled. It should also be mentioned that some ESP32-C3 boards (so-called C3 mini V1.0.0) are still being sold on the market where WLAN does not work properly.
To try out WLED with 5V addressable strip a simple microcontroller board like ESP8266 D1 mini or ESP32 D1 mini is sufficient. The simplest setup might be like:
However, there are a few other things to keep in mind for a proper setup:
In the following some third-party controllers are listed. Please use a decent and neutral description when adding things to this list.
Gold Member indicates the product owner makes substantial contributions to the WLED community (financial, code, documentation and/or support).
Tip
Lists are in alphabetical order. The position of an item in the list does not indicate how good it is or if it will fit your use case. Please carefully compare all items in the category you are interested in, and you should find the one that suits your needs best in just a few minutes!
"},{"location":"basics/compatible-controllers/#controllers-with-wled-pre-installed","title":"Controllers with WLED pre-installed","text":"Info
Unless otherwise noted, controllers feature everything you need for most WLED setups, except a power supply, wiring and fuses, and of course the LEDs themselves!
Transparency Notice
Warning Products listed below under the name \"Athom\" are offered by the company ATHOM Technology Co., Ltd., based in China, which is not affiliated in any way with the European company Athom B.V., makers of the Homey smart home platform. There is an ongoing legal process against ATHOM Technology Co., Ltd. for possible trademark infringement.
Name Description 8 Port LED Distro This is an 8 port ESP32 based LED distro board running WLED. Distributing both power and data in 1 board. The WT32-ETH01 provides support for Wi-Fi or ethernet connections. It can be used with either 5v or 12v or 24v LED pixels. Also includes a USB-C port for programming, level shifter, 5 amp fuse on every port, multiple voltage inputs with no jumpers to set and phoenix connectors for easy wiring. A1-SLWF-02 ESP8266 WLED controller WLED specifically designed Controller that supports 5V-12V addressable strips from Ukrainian developers. Based on ESP8266. Slim design, sensor button, powered either by type-C or screw-terminal. Screwdriver included. Official store, worldwide, Tindie, for NL/BE/DE A1-SLWF-03 ESP32 WLED controller Built-in digital microphone ICS-43434 for soundReactive WLED, ESP32 + 16M, IR receiver, Sensor button, Type-C plug, DC-plug, Screw-terminal, 5-24V, Pinouts for DIY. Specifically designed Controller that supports 5V-24V addressable strips from Ukrainian developers. Slim design. Screwdriver + adhesive tapes included. Official store, worldwide, Tindie, Aliexpress. ABC! WLED Controller V41 / ESP32 Commercial controller for 5V LED strips. Based on ESP32 uC. Two outputs. Option for digital microphone or line-in-to-I2S Adapter for sound reactive WLED. Ready to use. Additional Relay&Fuse board available. (German shop & shipping only within Germany or to Poland). A similar one is available at WLED.SHOP. ABC! WLED Controller V43 / ESP32 based / 5V-24V Commercial controller board for 5V / 12V / 24V LED strips from creator of LED power, wiring and fuse calculator. Based on ESP32 uC. Preflashed SW. Up to four outputs. Option for digital microphone or line-in-to-I2S Adapter for sound reactive WLED. Automatic 5V/12V/24V recognition (no jumper/switch etc. required). Ethernet adapter is available. Enclosure is available too. German shop & shipping only within Germany or to Poland. ABC! WLED mini Controller V70 / ESP32 based / 5V-12V Commercial controller board for 5V / 12V LED strips from creator of LED power, wiring and fuse calculator. Based on ESP32 uC. Preflashed SW. Up to four outputs. Option for digital microphone or line-in-to-I2S Adapter for sound reactive WLED. Automatic 5V/12V recognition (no jumper/switch etc. required). Enclosure is available. German shop & shipping only within Germany or to Poland. Athom Light Strip Controller Simple controller with enclosure for reliably driving 3 pin 5V LEDs. Uses 2M ESP8266. Athom LS8P ESP32 Music Controller ESP32 based controller with dual output, microphone and IR. Comes with WLED preinstalled Athom High Power Addressable LED Strip Controller Higher power options than the above system. Supports optional clock output. Athom RGBW Light Strip Controller Has outputs for individual color channels. Cadsbi Motion Smart Ready to use solution with 3 output ports, an external antenna, in a high quality metal enclosure cod.m WLED Controller WLED Controller for 5V/12V/24V strips based in ESP32, complete in case, with plug, including level shifter with 2/4 outputs. Commercially available in Germany throughout Europe. Detailed wiring schemes and documentation. Domestic Automation LLC Plug in design makes it the easiest and quickest preinstalled WLED controller to setup! Modular design allows for simple plug-in addition of Motion sensors, Button control, 12V lights and more. Snap track makes for universal mounting. Includes built in fuses and power relay for safety and control. Available on Amazon here E8-WiFi Plus The E8-WiFi Plus is an advanced 8-port WLED pixel controller built on the robust ESP32 microcontroller, designed for maximum performance and flexibility. It comes fully pre-assembled, supporting a wide voltage range from 5V to 24V DC. With a high output current capacity of up to 30A across all 8 outputs, each is fused by a 5A auto fuse. Features include an external antenna for improved WiFi coverage, dual power input for reliability, spring terminals for easy connections, and a micro-SD card slot for standalone operations. An IR receiver is also included, along with extra connectivity options like access to extra GPIOs and the I2C bus. The controller is also compatible with Xlights, to be used in light shows. ESP8266 Pixel Controller DIY board for 5V/12V LED strips with TTL or RS485 output using a Wemos D1 mini, integrated fuse, pluggable terminal block, 3D printed module case ESPthings.io ET-AL01 DIY board for 5 Analog channels and/or up to 5 Digital LED channels (or a combination of the latter as required), Integrated level shifter, 5v/12/24v compatibility, 4x pull-up/down GPIO, serial interface and power distribution terminals. Can be used with Wemos D1-style ESP8266 or ESP32 boards. ESP32 WLED Pico Board ESP32 WLED pico board,super small form factor, ready to buy on Tindie and Tindie EU. Integrated level shifter, exposed pins for extending functionality , on board I2S microphone, Firmware is here. Project page is here Hikari Pocket-sized, battery powered RGBW light HighSet WLED Controller India ESP32 Based Ready to use WLED device for 5V Pixel LEDs with Shift Resistor Pre-Installed & 4 Outputs in Premium Quality Sealed Enclosure, Customized Orders also Welcomed. IOT4WLED Ready to use hardware for WLED! Laterna Based on an ESP32 for digital LED and RBG/RGBW LED strips with support for 5V, 12V and 24V LED strips. (Up to 4 channels) Laterna Mini V3 Small ESP32 based controller with optional digital microphone integrated for digital 5V LED strips. Laterna Stick USB Stick like ESP32 based controller for digital 5V LED strips. LedBox V3 LedBox V3 by StanleyProjects is the ultimate sound-reactive addressable LED controller powered by ESP32-S3. It is compatible with 5-12V addressable LED strips (WS281x, SK6812, etc.), supporting both 3(data) and 4(data,clock) wire signal protocols. It has a digital MEMS microphone, MOSFET, logic-level converter, button, IR demodulator, variable imedance-matching resistor, USB-C port, and a safety resettable fuse, all in a compact 3D printable case. The board can be purchased here and comes flashed with WLED-MM. Luminxa v2.2.2 ESP32 My Baby's Got LED Certified open hardware. Easy plug-and-play WLED board for those that don't want to figure out the hardware - you won't even need a screwdriver to get started. PC power supply (ATX) powers three 5V injection points on 8A fuses. For sale now on Tindie! Full details on the github repo and maker's website. QuinLED Dig2go Designed to be the quickest and easiest 5v addressable LEDs controller available! Powered simply by using a USB-C input (just like your phone!) for a true plug and play experience. Recommended for small projects up to 15W and very complete with built-in \"power cut\" circuit when the LEDs are off to minimize idle power consumption, LED data level-shifter, built in protection circuits (including fuses), IR receiver, high quality digital microphone with audio reactive effects and even has some easy to use expansion ports for extra buttons or for instance an I2C screen! All of this is housed in a high-quality custom plastic case (not 3D printed) and small enough to fit in the palm of your hand! Comes ready to go, pre-flashed with WLED and even combined with power supply and/or LED strip in different bundles! Buy here! QuinLED Dig-Octa The Dig-Octa system is for your medium to very large projects! It comes fully pre-assembled and is the ideal board to drive 5v-24v digitally addressable LEDs. The system is composed of brain- and power-boards and is designed to be fully stackable in various configurations of both types of boards, to perfectly adapt to your needs. Some features are: 8 LED data-channels, built-in level-shifters and resistor switchers, Ethernet and external antenna WiFi, auto 5v-24v compatibility, high current handling (up to 50A to 100A!), fully fused inputs and outputs, dedicated relay circuit, I2C temperature sensor, and much more! Comes pre-flashed with WLED and is highly recommended for medium to very large projects. Buy here! QuinLED Dig-Quad 2021 updated version! DIY/Pre-Assembled board for 4 (5) channel digital LED driving. Integrated level shifters, temperature sensor option, Auto 5v-24v compatibility, pull-up/down GPIO and power distribution terminals with 5x onboard fuses for easy LED power injection. Recommended to use (and comes with) with custom QuinLED-ESP32. Pre-assembled and pre-flashed with WLED available to buy!. Aircoookie's personal recommendation for large-size WLED projects with advanced power and output requirements. QuinLED Dig-Uno 2021 updated version! DIY/Pre-Assembled board for digital LED driving. Integrated level shifters, temperature sensor option, Auto 5v-24v compatibility, pull-up/down GPIO and safety features such as a onboard fuse. Recommended to use (and comes with) with custom QuinLED-ESP32. Pre-assembled and pre-flashed with WLED available to buy!. Aircoookie's personal recommendation for medium-size WLED projects.\\ Simple WLED Board Very simple DIY board, minimum of required components, option for 5V/12V LEDs. Easy to solder (no SMT components). Simple to understand connection schematics and pictures. Can be used with ESP8266 or ESP32 in D1 mini Format. SJM Autoprod rgbw, rgbw2+, rgbw4 Complete, fully-sealed, analog and digital controllers for vehicular use. rgbw has one RGBW channel, rgbw2+ has two analog, RGBW channels plus two/four addressable outputs (requires external 5V source for 5V LEDs). rgbw4 has four analog RGBW channels. 2+ and 4 support 12V or PWM/analog inputs and have internal PTC \"fuses\". WiFi Controlled Desk Lamp Open source PCB for WLED WLED ESP32 Universal Controller ready to buy on Tindie, 100% compatible with WLED project. Integrated level shifter, 2 outputs for LEDs strips, 1 fused out for LED strip, relay for energy-saving, temperature sensor, PWM fan header, USB port for re-programming. Headers for shields to extend functionality. Available shields for controller is here, Firmware is here. WLED Waterproof Controller with external antenna DIY board, designed for use outside permanently and for longer range Wi-Fi connection. No SMD components means it is easier to solder for DIYers. 100% compatible with WLED project. Level shifter, fuse for LED strip, resettable fuse for Wi-Fi module, exposed I2C interface for display or sensors, relay for energy-saving and 1-wire temperature sensor. Build around ESP-07S module. Firmware is here WLED Wemos Mini Shield shield board, ready to buy on Tindie also Tindie EU. Integrated level shifter, 2 outputs for LEDs strips, 1 fused out for LED strip, resettable fuse for the development board, exposed I2C interface for display or sensors. Exposed pins Digital microphones. Works with Wemos D1 mini and D1-style ESP32 boards. Firmware is here. Yet Another WLED Controller Small and simple device for 5V addressable LED strips with minimum components and fully assembled by PCB manufacturing service in standard case. Firmware is here"},{"location":"basics/compatible-controllers/#controllers-wled-can-be-installed-to","title":"Controllers WLED can be installed to","text":"Warning
If the controller does not have a USB port and no firmware supporting wireless updates pre-installed, installing WLED to it requires an FTDI flasher and in some cases, soldering.
Name Chip Description ESPixelStick v3 ESP8266 The ESPixelStick V3 is a WiFi Pixel and DMX single output controller built around the ESP8266 platform. It utilizes industry standard E1.31 sACN and DDP protocols for control of up to 680 WS2811 pixels (4 Universes) or 63 GECE Pixels. The output passes through a built-in RS485 transceiver, allowing for driving DMX and differential Renard inputs (or using a differential receiver for long-distance between board and first pixel). The on board switching regulator allows you to power the ESPixelStick with 5V-24V -- Just match the voltage of the pixels you are using, no voltage configuration is required. Note: Does not come preconfigured with WLED, you must flash the ESP8266 yourself. SP108e v2 ESP8285 Hardware-Modification required and different versions exists! 8285-based 2M Controller that supports addressable RGBWW LED strips, also with CLK line (like ATA102). 5-24v DC input, 85mm x 45mm x 23mm. Vendors list spledapps 'Led Shop' as the supporting mobile application. Board is silk screened with 'SP108e'. No pads are exposed and a second processor is used to control the LEDs. Pin7 of that processor needs to be grounded to hold it in reset state. Then you can connect GPIO0 to GND and TX, RX, VCC, GND for flashing. Connect GPIO2 to R4 for DATA out and GPIO13 to R3 for CLK out. Flashed via PlatformIO, esptool. OTA updates work. Pics of pinout here: https://github.com/psxde/sp108e-led-controller/raw/main/sp108ev2_inside.png SP501e ESP8285 8285-based 1M Controller that supports both Addressable and PWM-based RGBWW LED strips. Note that recent versions have 2M. 5-24v DC input, 55mm x 26mm, sold under BTF lighting, RGBZone, etc. Vendors all list 'Fairynest' as the supporting mobile application. Board is silk screened with 'SP5XXe' but no other markings. Serial pads are exposed on the back-side of the board with GND and GPIO0 right next to each other and thus Flash access fairly straight forward. GPIO 0 must be pulled to GND at boot and throughout the flashing process. I/O configuration: LEDPIN is 'GPIO3' for addressable (note this pin is limited to approx. 250 LEDs), BTNPIN is GPIO 1. PWM pin out for RGBWW: CW: 14, WW: 12, B: 13, R: 15 and G: 4. Flashed via PlatformIO, ESPHome and Tasmotizer. Pics of board here: https://github.com/Operation760/SP501e-RGB-LED-Controller-/blob/master/SP501e_top_bottom_traced.jpg Flashing Connections: https://github.com/tonyn0/sp501e-flashing/blob/main/sp501e%20flash.png SP511e ESP8285 An ESP8285 2MB controller with 3 case buttons, built in mic, IR receiver, 38 key remote, and dual outputs. The dual outputs are connected to the same data pin. There is a step-by-step guide for Installing WLED on SP511E Controller. ESP LED Strip WIFI Control Board [ESP Version] ESP8266 Controller for addressable or analog LEDs (RGBW), 6-27VDC input, no level shifter, reset and boot buttons, enclosure. NOTE: Although this uses high-current transistors, they used jumpers on two of the connections so you are limited to their current rating (3A?)."},{"location":"basics/compatible-controllers/#wled-shields-to-be-use-with-esp8266esp32-controller-boards","title":"WLED shields to be use with ESP8266/ESP32 controller boards","text":"Name Description ABC! WLED Shield, all-purpose, for ESP8266/ESP32 Commercial WLED Shield for 5V/12V LED strips. To be used with ESP8266 or ESP32 in D1 mini format (including ESP32-C3, ESP32-S2 and ESP32-S3). Up to four outputs. Option for digital microphone or line-in-to-I2S Adapter for sound reactive WLED (with ESP32 only!). Automatic 5V/12V recognition (no jumper/switch etc. required). Enclosure is available too. German shop & shipping currently only within Germany or to Poland. ESP-01 WLED shield shield board for ESP-01 board, ready to buy on Tindie. Integrated level shifter, 3 outputs for various configurations, mosfet for 1 analog channel, Firmware is here. WLED Wemos shield shield board, ready to buy on Tindie also Tindie EU or DIY 100% compatible with WLED project and WLED sound reactive fork. Integrated level shifter, 4 outputs for LEDs strips, 1 fused out for LED strip, resettable fuse for the development board, exposed I2C interface for display or sensors, relay for energy-saving and 1-wire temperature sensor. Exposed pins for Analog and Digital microphones. Works with Wemos D1 mini and D1-style ESP32 boards. Firmware is here."},{"location":"basics/compatible-controllers/#other-products-wled-can-be-installed-to","title":"Other products WLED can be installed to","text":"Name Chip Description Athom 15W bulb ESP8266 (2M flash) 15W bulb with RGB, warm white, and cold white LEDs. Compatible with all voltages, available form factors E27, B22 and GU10 Merkury MI-BW210-999W ESP8285 Tuya Style WiFi Led light bulb, Warm White + RGB. There are two versions of this same bulb sold in the same packaging only way to check is to look at the bulb, EBEQPW92 uses PWM led control and is compatible with WLED however EBEQPW06 uses an SM16716 chip and is not currently compatible with WLED. Managed to flash using tuya-convert and a custom WLED build with the following analog pinout: B:4, G:5, R:13, W:14. Extras disabled to allow OTA, OTA only way to flash this, programming headers are not internally available. Shelly RGBW2 ESP8266 For \"analog\" LED use only! Runs on 12-24VDC. One button and one input. Pins: R=12, G=15, B=14, W=4. Finished, commercial product that can be flashed. More info and flashing docs"},{"location":"basics/compatible-controllers/#raw-esp8266esp32-boards","title":"Raw ESP8266/ESP32 boards","text":"Tip
While these can work like the controllers above without extra hardware, you might get flickering without adding an external levelshifter. Using them without a controller board/shield is only recommended if you like tinkering with electronic projects.
Name Chip Description Adafruit Feather Huzzah ESP8266 General-purpose ESP8266 Board with USB, battery connector, etc. D1 mini-style ESP32 ESP32 A nice compact ESP32 development board. D1 mini compatible layout. ESP-01 ESP8266 One of the first and cheapest ESP8266 boards available. Not recommended for general WLED installs (needs external USB/serial chip, voltage converter, only has 1mb of flash, so soon no wireless updates possible) ESP32 DevKitC v4 ESP32 The original ESP32 Development Board made by Espressif Systems. ESP32 Mini Dev Board 16mb by SerKo (aka Serg) ESP32 ESP32 Dev Board with latest WROOM-32E module, USB Type-C, PTC fused, over-voltage protection. D1 Mini32 form factor and compatible pin out H803 WiFi ESP8266 ESP8266EX based controller with level shifter inside. Data pin GPIO1 Clock pin GPIO14. Tested with WS2813 strip and Firmware fork is here. Heltec WiFi Kit 8 ESP8266 Another alternative of ESP8266 board. OLED display 128X32 pixel, battery charger on board. Almost the same functionality and price as the Wemos board. Plus it can be used in projects with external batteries. Lolin32 Lite ESP32 Low cost ESP32 board optimized for battery usage. Does not have a 5v pin but can be powered with 5v on battery connector. NodeMCU ESP8266 Another popular ESP8266 development board. A bit bigger than the D1 and has pins pre-soldered. There are multiple versions with slight differences, not all are tested. NodeMCU-32s ESP32 The most common ESP32 development board. Works well, depending on the board you might have to press the \"Boot\" button while USB flashing Olimex ESP32 POE ESP32 Ethernet (PoE) and WiFi, though usage of the ethernet port requires a custom compile. The PoE should not be used to power LEDs due to a maximum throughput of 4W. For most installations, standard ethernet should be used, supplying power through the 5V pin. QuinLED-ESP32 Custom design D1 Mini32 formfactor ESP32 module Fed up with the bad quality of generic ESP32 modules on the market, designed my own \"beefed up\" version. Available in multiple versions: QuinLED-ESP32-AB (Antenna Board), QuinLED-ESP32-AE (Antenna External), QuinLED-ESP32-ABE (Antenna Board + Ethernet). Aircoookie's recommendation for running WLED. RE5V1C ESP8285 5v DC input - onboard 10A relay TwilightLord-ESP32 ESP32 ESP32 Dev Board with latest WROOM-32E module, USB Type-C, 800mA LDO, 8MB flash and PTC fused. D1 Mini32 form factor and compatible pin out.16MB Flash version also available Wemos D1 mini ESP8266 An affordable ESP8266 development board. Aircoookie's recommendation for running WLED if you want an ESP8266 board. Current version: 3.1.0 Wemos D1 mini Pro ESP8266 A newer development board with an external antenna connector. Works very well with WLED. Recommended if your signal strength is too low with another board. Current version: 2.0.0. Version 1.0.0 has the same form factor as the D1 mini. WT32-ETH01 ESP32 Under development! Ethernet (non-PoE) and WiFi enabled alternative to the Olimex boards, for 1/4 the cost. Features no PoE, and requires initial flashing of a custom compiled image using a FTDI or similar USB to serial converter."},{"location":"basics/compatible-hardware/","title":"Other Hardware","text":"Still under construction, feel free to add to the list!
This page lists some third-party hardware and/or tools that are working with WLED!
Please use a decent and neutral description when adding things to this list.
Tip
Lists are in alphabetical order. The position of an item in the list does not indicate how good it is or if it will fit your use case. Please carefully compare all items in the category you are interested in, and you should find the one that suits your needs best in just a few minutes!
"},{"location":"basics/compatible-hardware/#addressable-led-strips","title":"Addressable LED Strips","text":"Sorting: 5v data only, 5v Data + Clock, 12v data only
Type Voltage Comments SK6812 5v/12v RGBW WS2811 5v usually found in IP68 sealed 12mm pixel strings WS2812B 5v WS2813 5v has a backup data line APA102 5v using 2 data pins, Clock and Data LPD8806 5v using 2 data pins, Clock and Data WS2801 5v using 2 data pins, Clock and Data SK9822 5v using 2 data pins, Clock and Data GS8208 12v TM1814 12v RGBW WS2811 12v usually 3-LED segments, has data-line resistor WS2815 12v has a backup data line"},{"location":"basics/compatible-hardware/#non-addressable-led-strips","title":"Non-Addressable LED Strips","text":"WLED supports non-addressable LED strips as well. Unlike addressable strips, non-addressable strips require a pin for each \"color\" channel. To drive these strips, additional circuits (MOSFETs) are required. As of v0.13.1, WLED supports single color, CCT, RGB, RGBW and RGBCCT strips. These strips are commonly found at 12 or 24 volts. The default PWM frequency for dimming is 880 Hz on ESP8266 and 19531 Hz for ESP32.
"},{"location":"basics/compatible-hardware/#controllers-with-wled-pre-installed","title":"Controllers with WLED pre-installed","text":"Info
Unless otherwise noted, controllers feature everything you need for most WLED setups, except a power supply, wiring and fuses, and of course the LEDs themselves!
Name Description 8 Port LED Distro This is an 8 port ESP32 based LED distro board running WLED. Distributing both power and data in 1 board. The WT32-ETH01 provides support for Wi-Fi or ethernet connections. It can be used with either 5v or 12v or 24v LED pixels. Also includes a USB-C port for programming, level shifter, 5 amp fuse on every port, multiple voltage inputs with no jumpers to set and phoenix connectors for easy wiring. A1-SLWF-02 WLED controller WLED dedicatedly designed Controller that supports 5V-12V addressable strips from Ukrainian developers. Based on ESP8266. Slim design, sensor button, powered either by type-C or screw-terminal. Screwdriver included. Worldwide delivery. ABC! WLED Controller / ESP8266 Commercial controller for 5V LED strips. Based on ESP8266 uC. Two outputs. Ready to use. Additional Relay&Fuse board available. (German shop & shipping only within Germany). A similar one is available at WLED.SHOP ABC! WLED Controller / ESP32 Commercial controller for 5V LED strips. Based on ESP32 uC. Two outputs. Option for digital microphone / sound reactive. Ready to use. Additional Relay&Fuse board available. (German shop & shipping only within Germany). A similar one is available at WLED.SHOP. ABC! WLED Shield, all-purpose, for ESP8266/ESP32 Commercial WLED Shield for 5V/12V LED strips. To be used with ESP8266 or ESP32 in D1 mini format. Two outputs. Option for digital microphone / sound reactive (with ESP32). Automatic 5V/12V recognition (no jumper/switch etc. required). Enclosure is available too. German shop & shipping currently only within Germany. Athom Light Strip Controller Simple controller with enclosure for reliably driving 3 pin 5V LEDs. Uses 2M ESP8266. Athom High Power Addressable LED Strip Controller Higher power options than the above system. Supports optional clock output. Athom LS8P ESP32 Music Controller ESP32 based controller with dual output, microphone and IR. Comes with WLED preinstalled Athom RGBW Light Strip Controller Has outputs for individual color channels. Cadsbi Motion Smart Ready to use solution with 3 output ports, an external antenna, in a high quality metal enclosure cod.m Wi-Fi Pixel Controller Fully completed control PCB with level shifter, terminals and case - pre-flashed with WLED! ESP8266 Pixel Controller DIY board for 5V/12V LED strips with TTL or RS485 output using a Wemos D1 mini, integrated fuse, pluggable terminal block, 3D printed module case ESPthings.io ET-AL01 DIY board for 5 Analog channels and/or up to 5 Digital LED channels (or a combination of the latter as required), Integrated level shifter, 5v/12/24v compatibility, 4x pull-up/down GPIO, serial interface and power distribution terminals. Can be used with Wemos D1-style ESP8266 or ESP32 boards. ESP32 WLED pico board ESP32 WLED pico board,super small form factor, ready to buy on Tindie and Tindie EU. Integrated level shifter, exposed pins for extending functionality , on board I2S microphone, Firmware is here. Project page is here IOT4WLED Ready to use hardware for WLED! Laterna Based on an ESP32 for digital LED and RBG/RGBW LED strips with support for 5V, 12V and 24V LED strips. (Up to 4 channels) Laterna Mini V3 Small ESP32 based controller with optional digital microphone integrated for digital 5V LED strips. Laterna Stick USB Stick like ESP32 based controller for digital 5V LED strips. LedBox V2 LedBox V2 by StanleyProjects is a fully contained, sound reactive, ESP32 based module for controlling 5-12V addressable LED strips (WS2812, SK6812, etc.), supporting both 3-(VDD,DAT,GND) and 4-(VDD,DAT,CLK,GND) pin configuration. It includes a digital MEMS microphone, button and IR control, and a safety resettable fuse, all in a compact 3D printable case. The board comes all setup, flashed with sound reactive WLED fork, and can be purchased here. Luminxa v2.2.2 ESP32 My Baby's Got LED Certified open hardware. Easy plug-and-play WLED board for those that don't want to figure out the hardware - you won't even need a screwdriver to get started. PC power supply (ATX) powers three 5V injection points on 8A fuses. For sale now on Tindie! Full details on the github repo and maker's website. QuinLED Dig2go Designed to be the quickest and easiest 5v addressable LEDs controller available! Powered simply by using a USB-C input (just like your phone!) for a true plug and play experience. Recommended for small projects up to 15W and very complete with built-in \"power cut\" circuit when the LEDs are off to minimize idle power consumption, LED data level-shifter, built in protection circuits (including fuses), IR receiver, high quality digital microphone with audio reactive effects and even has some easy to use expansion ports for extra buttons or for instance an I2C screen! All of this is housed in a high-quality custom plastic case (not 3D printed) and small enough to fit in the palm of your hand! Comes ready to go, pre-flashed with WLED and even combined with power supply and/or LED strip in different bundles! Buy here! QuinLED Dig-Uno 2021 updated version! DIY/Pre-Assembled board for digital LED driving. Integrated level shifters, temperature sensor option, Auto 5v-24v compatibility, pull-up/down GPIO and safety features such as a onboard fuse. Recommended to use (and comes with) with custom QuinLED-ESP32. Pre-assembled and pre-flashed with WLED available to buy!. Aircoookie's personal recommendation for medium-size WLED projects. QuinLED Dig-Quad 2021 updated version! DIY/Pre-Assembled board for 4 (5) channel digital LED driving. Integrated level shifters, temperature sensor option, Auto 5v-24v compatibility, pull-up/down GPIO and power distribution terminals with 5x onboard fuses for easy LED power injection. Recommended to use (and comes with) with custom QuinLED-ESP32. Pre-assembled and pre-flashed with WLED available to buy!. Aircoookie's personal recommendation for large-size WLED projects with advanced power and output requirements. QuinLED Dig-Octa The Dig-Octa system is for your medium to very large projects! It comes fully pre-assembled and is the ideal board to drive 5v-24v digitally addressable LEDs. The system is composed of brain- and power-boards and is designed to be fully stackable in various configurations of both types of boards, to perfectly adapt to your needs. Some features are: 8 LED data-channels, built-in level-shifters and resistor switchers, Ethernet and external antenna WiFi, auto 5v-24v compatibility, high current handling (up to 50A to 100A!), fully fused inputs and outputs, dedicated relay circuit, I2C temperature sensor, and much more! Comes pre-flashed with WLED and is highly recommended for medium to very large projects. Buy here! Simple WLED Board Very simple DIY board, minimum of required components, option for 5V/12V LEDs. Easy to solder (no SMT components). Simple to understand connection schematics and pictures. Can be used with ESP8266 or ESP32 in D1 mini Format. sjm autoprod rgbw, rgbw2+, rgbw4 Complete, fully-sealed, analog and digital controllers for vehicular use. rgbw has one RGBW channel, rgbw2+ has two analog, RGBW channels plus two/four addressable outputs (requires external 5V source for 5V LEDs). rgbw4 has four analog RGBW channels. 2+ and 4 support 12V or PWM/analog inputs and have internal PTC \"fuses\". WiFi Controlled Desk Lamp Open source PCB for WLED Yet Another WLED Controller Small and simple device for 5V addressable LED strips with minimum components and fully assembled by PCB manufacturing service in standard case. Firmware is here"},{"location":"basics/compatible-hardware/#controllers-on-tindie","title":"Controllers on Tindie","text":"\ud83c\udf1c
Name Description WLED ESP32 universal controller ready to buy on Tindie, 100% compatible with WLED project. Integrated level shifter, 2 outputs for LEDs strips, 1 fused out for LED strip, relay for energy-saving, temperature sensor, PWM fan header, USB port for re-programing. Headers for shields to extend functionality. Available shields for controller is here, Firmware is here. ESP-01 WLED shield shield board for ESP-01 board, ready to buy on Tindie. Integrated level shifter, 3 outputs for various configurations, mosfet for 1 analog channel, Firmware is here. WLED Wemos mini shield shield board, ready to buy on Tindie also Tindie EU. Integrated level shifter, 2 outputs for LEDs strips, 1 fused out for LED strip, resettable fuse for the development board, exposed I2C interface for display or sensors. Exposed pins Digital microphones. Works with Wemos D1 mini and D1-style ESP32 boards. Firmware is here. WLED Wemos shield shield board, ready to buy on Tindie also Tindie EU or DIY 100% compatible with WLED project and WLED sound reactive fork. Integrated level shifter, 4 outputs for LEDs strips, 1 fused out for LED strip, resettable fuse for the development board, exposed I2C interface for display or sensors, relay for energy-saving and 1-wire temperature sensor. Exposed pins for Analog and Digital microphones. Works with Wemos D1 mini and D1-style ESP32 boards. Firmware is here. WLED waterproof controller with external antenna DIY board, designed for use outside permanently and for longer range Wi-Fi connection. No SMD components means it is easier to solder for DIYers. 100% compatible with WLED project. Level shifter, fuse for LED strip, resettable fuse for Wi-Fi module, exposed I2C interface for display or sensors, relay for energy-saving and 1-wire temperature sensor. Build around ESP-07S module. Firmware is here"},{"location":"basics/compatible-hardware/#controllers-wled-can-be-installed-to","title":"Controllers WLED can be installed to","text":"Warning
If the controller does not have a USB port and no firmware supporting wireless updates pre-installed, installing WLED to it requires an FTDI flasher and in some cases, soldering.
Name Chip Description ESPixelStick v3 ESP8266 The ESPixelStick V3 is a WiFi Pixel and DMX single output controller built around the ESP8266 platform. It utilizes industry standard E1.31 sACN and DDP protocols for control of up to 680 WS2811 pixels (4 Universes) or 63 GECE Pixels. The output passes through a built-in RS485 transceiver, allowing for driving DMX and differential Renard inputs (or using a differential receiver for long-distance between board and first pixel). The on board switching regulator allows you to power the ESPixelStick with 5V-24V -- Just match the voltage of the pixels you are using, no voltage configuration is required. Note: Does not come preconfigured with WLED, you must flash the ESP8266 yourself. SP108e v2 ESP8285 Hardware-Modification required and different versions exists! 8285-based 2M Controller that supports addressable RGBWW LED strips, also with CLK line (like ATA102). 5-24v DC input, 85mm x 45mm x 23mm. Vendors list spledapps 'Led Shop' as the supporting mobile application. Board is silk screened with 'SP108e'. No pads are exposed and a second processor is used to control the LEDs. Pin7 of that processor needs to be grounded to hold it in reset state. Then you can connect GPIO0 to GND and TX, RX, VCC, GND for flashing. Connect GPIO2 to R4 for DATA out and GPIO13 to R3 for CLK out. Flashed via PlatformIO, esptool. OTA updates work. Pics of pinout here: https://github.com/psxde/sp108e-led-controller/raw/main/sp108ev2_inside.png SP501e ESP8285 8285-based 1M Controller that supports both Addressable and PWM-based RGBWW LED strips. Note that recent versions have 2M. 5-24v DC input, 55mm x 26mm, sold under BTF lighting, RGBZone, etc. Vendors all list 'Fairynest' as the supporting mobile application. Board is silk screened with 'SP5XXe' but no other markings. Serial pads are exposed on the back-side of the board with GND and GPIO0 right next to each other and thus Flash access fairly straight forward. GPIO 0 must be pulled to GND at boot and throughout the flashing process. I/O configuration: LEDPIN is 'GPIO3' for addressable (note this pin is limited to approx. 250 LEDs), BTNPIN is GPIO 1. PWM pin out for RGBWW: CW: 14, WW: 12, B: 13, R: 15 and G: 4. Flashed via PlatformIO, ESPHome and Tasmotizer. Pics of board here: https://github.com/Operation760/SP501e-RGB-LED-Controller-/blob/master/SP501e_top_bottom_traced.jpg Flashing Connections: https://github.com/tonyn0/sp501e-flashing/blob/main/sp501e%20flash.png SP511e ESP8285 An ESP8285 2MB controller with 3 case buttons, built in mic, IR receiver, 38 key remote, and dual outputs. The dual outputs are connected to the same data pin. There is a step-by-step guide for Installing WLED on SP511E Controller. ESP LED Strip WIFI Control Board [ESP Version] ESP8266 Controller for addressable or analog LEDs (RGBW), 6-27VDC input, no level shifter, reset and boot buttons, enclosure. NOTE: Although this uses high-current transistors, they used jumpers on two of the connections so you are limited to their current rating (3A?)."},{"location":"basics/compatible-hardware/#other-products-wled-can-be-installed-to","title":"Other products WLED can be installed to","text":"Name Chip Description Merkury MI-BW210-999W ESP8285 Tuya Style WiFi Led light bulb, Warm White + RGB. There are two versions of this same bulb sold in the same packaging only way to check is to look at the bulb, EBEQPW92 uses PWM led control and is compatible with WLED however EBEQPW06 uses an SM16716 chip and is not currently compatible with WLED. Managed to flash using tuya-convert and a custom WLED build with the following analog pinout: B:4, G:5, R:13, W:14. Extras disabled to allow OTA, OTA only way to flash this, programming headers are not internally available. Shelly RGBW2 ESP8266 For \"analog\" LED use only! Runs on 12-24VDC. One button and one input. Pins: R=12, G=15, B=14, W=4. Finished, commercial product that can be flashed. More info and flashing docs Athom 15W bulb ESP8266 (2M flash) 15W bulb with RGB, warm white, and cold white LEDs. Compatible with all voltages, available form factors E27, B22 and GU10"},{"location":"basics/compatible-hardware/#raw-esp8266esp32-boards","title":"Raw ESP8266/ESP32 boards","text":"Tip
While these can work like the controllers above without extra hardware, you might get flickering without adding an external levelshifter. Using them without a controller board/shield is only recommended if you like tinkering with electronic projects.
Name Chip Description Adafruit Feather Huzzah ESP8266 General-purpose ESP8266 Board with USB, battery connector, etc. D1 mini-style ESP32 ESP32 A nice compact ESP32 development board. D1 mini compatible layout. ESP32 DevKitC v4 ESP32 The original ESP32 Development Board made by Espressif Systems. H803 WiFi ESP8266 ESP8266EX based controller with level shifter inside. Data pin GPIO1 Clock pin GPIO14. Tested with WS2813 strip and Firmware fork is here. NodeMCU-32s ESP32 The most common ESP32 development board. Works well, depending on the board you might have to press the \"Boot\" button while USB flashing Heltec WiFi Kit 8 ESP8266 Another alternative of ESP8266 board. OLED display 128X32 pixel, battery charger on board. Almost the same functionality and price as the Wemos board. Plus it can be used in projects with external batteries. NodeMCU ESP8266 Another popular ESP8266 development board. A bit bigger than the D1 and has pins pre-soldered. There are multiple versions with slight differences, not all are tested. ESP-01 ESP8266 One of the first and cheapest ESP8266 boards available. Not recommended for general WLED installs (needs external USB/serial chip, voltage converter, only has 1mb of flash, so soon no wireless updates possible) Olimex ESP32 POE ESP32 Ethernet (PoE) and WiFi, though usage of the ethernet port requires a custom compile. The PoE should not be used to power LEDs due to a maximum throughput of 4W. For most installations, standard ethernet should be used, supplying power through the 5V pin. QuinLED-ESP32 Custom design D1 Mini32 formfactor ESP32 module Fed up with the bad quality of generic ESP32 modules on the market, designed my own \"beefed up\" version. Available in multiple versions: QuinLED-ESP32-AB (Antenna Board), QuinLED-ESP32-AE (Antenna External), QuinLED-ESP32-ABE (Antenna Board + Ethernet). Aircoookie's recommendation for running WLED. RE5V1C ESP8285 5v DC input - onboard 10A relay TwilightLord-ESP32 ESP32 ESP32 Dev Board with latest WROOM-32E module, USB Type-C, 800mA LDO, 8MB flash and PTC fused. D1 Mini32 form factor and compatible pin out.16MB Flash version also available Wemos D1 mini ESP8266 An affordable ESP8266 development board. Aircoookie's recommendation for running WLED if you want an ESP8266 board. Current version: 3.1.0 Wemos D1 mini Pro ESP8266 A newer development board with an external antenna connector. Works very well with WLED. Recommended if your signal strength is too low with another board. Current version: 2.0.0. Version 1.0.0 has the same form factor as the D1 mini. WT32-ETH01 ESP32 Under development! Ethernet (non-PoE) and WiFi enabled alternative to the Olimex boards, for 1/4 the cost. Features no PoE, and requires initial flashing of a custom compiled image using a FTDI or similar USB to serial converter."},{"location":"basics/compatible-hardware/#esp32-boards-on-tindie","title":"ESP32 boards on Tindie","text":"\ud83c\udf1c
Name Description ESP32 mini dev board 16mb by SerKo (aka Serg). Buy on Tindie US or Tindie EU. ESP32 Dev Board with latest WROOM-32E module, USB Type-C, PTC fused, over-voltage protection. D1 Mini32 form factor and compatible pin out ESP32 pico board with digital microphone by SerKo (aka Serg). Buy on Tindie US or Tindie EU. ESP32-pico-D4 development board with integrated ics-43434 microphone"},{"location":"basics/compatible-hardware/#microphones-on-tindie","title":"Microphones on Tindie","text":"\ud83c\udf1c
Name Description Digital I2S microphone ICS-43434 by SerKo (aka Serg). Buy on Tindie US or Tindie EU. Digital I2S PDM microphone SPM1423 by SerKo (aka Serg). Buy on Tindie EU."},{"location":"basics/compatible-hardware/#useful-boards-and-addons","title":"Useful boards and addons","text":"Name Description ESP32 Ethernet Network Shield Ethernet Shield (10/100Mbps) for ESP32 boards. Stackable with D1 Mini32 form factor boards. Wemos D1 mini Level Shifter Shield A level shifter shield (74HCT125) - by Evil Genius Labs LLC. WIZmote remote control Remote control using radio network. Compatible with WLED (vesions 0.14.0-beta3 and above). No additional receiver required."},{"location":"basics/compatible-hardware/#compatible-pc-rgb-fans-and-argb-accessories","title":"Compatible PC RGB Fans and ARGB accessories","text":"Brand Model Comments Corsair HD120 Fan Uses WS2812B, data-in only PCCOOLER Moonlight 5-pack Fans Uses WS2812B, includes Data-out connector to keep each fan uniquely addressable if wired in series like traditional LED strips Any 5v 3-pin ARGB for PC Any PC RGB device that supports the 5v 3-pin ARGB motherboard header should work fine with WLED. All the major motherboard vendors support the Corsair HD120 and PCCOOLER fans listed, so we can safely assume any device that supports motherboard ARGB 5V 3-Pin standard will work with WLED."},{"location":"basics/compatible-hardware/#levelshifters","title":"Levelshifters","text":"Name Description SN74AHCT125 Aircoookie's recommended levelshifter. Often used in DIY and commercial controllers. SN74AHCT32 Same pinout as above can be used. This is just an OR gate, but any AHCT gate can be used if inputs are connected appropriately. ;) SN74HCT125N Slower, cheaper version. Works just as well for WS2812, but not recommended for APA102. SN74LVC2T45 Modern bus transceiver with voltage translation Yet Another WLED Controller TXS0102, TXS0108 Bidirectional levelshifters that may work fine with WLED (if possible, 74AHCT gates should be preferred as they support both longer data lines and faster protocols) F-Amp Level shifter/data boosterWarning
I2C shifters are generally too slow for addressable LEDs, so don't use them.
Further reading: Logic Level Shifters for Driving LED Strips
How to connect Levelshifters:
"},{"location":"basics/compatible-hardware/#usbttl-adapters","title":"USB/TTL adapters","text":"Name Description CH340 CH340 module instead of CP2102, PL2303 or FTDI/FTDT. The CH340 can deliver more current which is needed while the flash process depending on the board type. The timing is also much more stable. For boards with an USB/TTL adapter onboard this is NOT needed ESP uploader CP2102N module. Same USB to UART converter as many recent Dev boards using. Featuring latest USB-C connector. For use with many ESP32, ESP8266, ESP8255 and Tuya based modules. 3.3V logic and 5V power pass through for custom boards."},{"location":"basics/compatible-hardware/#miscellaneous","title":"Miscellaneous","text":"Sorting: Sensors, Displays, Actuators
Name Description HC-SR501 \u00a0PIR sensor with adjustable sensitivity and on time delay (suitable as a button). HC-SR602 \u00a0PIR sensor (not suitable as a button but can be used with PIR sensor usermod). TSOP38238 IR receiver compatible with most IR remotes. SSD1305 I2C display, can be used with 4 Line Display usermod. SSD1306 I2C & SPI display, can be used with 4 Line Display usermod. DS18B20 Recommended temperature sensor for use with WLED. Compatible with the Temperature usermod Display shield Various configurations. Compatible with the ESP32 WLED dev board also can be used with ESP32 mini dev boards. 12V Relay & Fuse board Integrates two relays and two 10 A fuses. Suitable for WLED setups with 12 V LED Strips. 5V relay Relay module. Some will require 5V to trigger so you will need level-shifted output (similar as for LEDs) for proper functionality or a circuit with transistor or MOSFET. 5V Relay & Fuse board Integrates two relays and two 10 A fuses. Suitable for WLED setups with 5V LED Strips."},{"location":"basics/compatible-led-strips/","title":"Compatible LED strips","text":"WLED supports two types of LED strips: the so-called digital addressable LED strips and the so-called analog non-addressable LED strips.
"},{"location":"basics/compatible-led-strips/#addressable-led-strips","title":"Addressable LED Strips","text":"Addressable LED Strips allows to control individual LEDs separately. This enables you to use many effects. The supported types are listed below. There are sometimes new types coming onto the market that have a compatible control protocol.
Sorting: 5v data only, 5v Data + Clock, 12v data only
Type Voltage Comments SK6812 5v/12v RGBW WS2811 5v usually found in IP68 sealed 12mm pixel strings WS2812B 5v WS2813 5v has a backup data line APA102 5v using 2 data pins, Clock and Data LPD8806 5v using 2 data pins, Clock and Data WS2801 5v using 2 data pins, Clock and Data SK9822 5v using 2 data pins, Clock and Data UCS8903 5v GS8208 12v TM1814 12v RGBW WS2811 12v usually 3-LED segments, has data-line resistor WS2814 12v/24v RGBW, 3-LED groups (12V) / 6-LED groups (24V) as one logical LED. Must be controlled as SK6812 type, color order: BRG, swap W and G (this option is available since WLED 0.14.0-b1) WS2815 12v has a backup data line LPD6803 12v P9813 5-24 v TM1829 5-24 v UCS8904 5-24 v RGBW"},{"location":"basics/compatible-led-strips/#non-addressable-led-strips","title":"Non-Addressable LED Strips","text":"WLED supports non-addressable LED strips as well. Unlike addressable strips, non-addressable strips require a pin for each \"color\" channel and all LEDs are controlled the same way. To drive these strips, additional circuits (MOSFETs) are required. A basic circuit diagram is shown here. You need one MOSFET and one GPIO per color. It should be noted that the MOSFETs are destroyed very quickly in the event of an overload. To reduce the risk of fire and prevent personal injury, additional circuit elements should be implemented to protect MOSFETs from overtemperature and overload. Depending on the type, fuses are too slow for this! You might consider using self-protected MOSFETs too or the entire MOSFET circuit can be packed into a fire-retardant (e.g. metallic) housing.
As of v0.13.1, WLED supports single color, CCT, RGB, RGBW and RGBCCT strips. These strips are commonly found at 12 or 24 volts. The default PWM frequency for dimming is 880 Hz on ESP8266 and 19531 Hz for ESP32. The commercially available so-called RGB(W) LED amplifiers can also be used (also called repeaters/boosters). These typically include optocouplers and MOSFET circuitry (1 to 5 channels) and can be used, for example, as follows:
Note that there is no GND connection between the controller and the amplifier. And this despite the fact that with all other WLED circuits it is always said that all GNDs must be connected to each other. This special feature is due to the fact that the inputs of the amplifier are galvanically decoupled from the outputs by optocouplers and the amplifier in this circuit is used slightly differently than its usual application.
You can connect the GPIOs directly (3.3V signal level) to the input of the amplifier or, if you use a ready-made WLED controller, you can also use the data outputs (of the level shifter, i.e. 5 V signal level). You can also use both at the same time:
The amplifier shown in the picture is a cheap product. Its advantage is a metal case. However, its circuit is very simple:
The simple structure means that the duty cycle of the PWM signal (the ratio between pulse and period duration) at the output is slightly distorted compared to the input. In many cases this is not critical, but it does result in the color composition of an RGB strip being slightly distorted. A significantly better (and slightly more expensive) version is described in this article (in German, includes schematics). Here the MOSFETs are controlled with push-pull drivers. This and some other measures in the circuit mean that the PWM signal is reproduced very accurately at the output. There are some other types of LED amplifiers on the market (e.g. MiBoxer RGBW amplifiers and similar ones) that DO NOT work as described above because they require higher input voltage.
"},{"location":"basics/compatible-software/","title":"Compatible Software","text":"Still under construction, feel free to add to the list!
This page lists some third-party software that can interface with WLED!
"},{"location":"basics/compatible-software/#controllers","title":"Controllers","text":"Controllers use the WLED API to change the current light settings.
Name Description Home Assistant Versatile and feature rich home automation system. Out-of-the-box WLED integration with automatic discovery. Homey pro with the D.A.L.O.R App Home automation system, WLED integration via the D.A.L.O.R. app with automatic discovery. ioBroker adapter Versatile and feature rich home automation system. Out-of-the-box WLED integration with automatic discovery. Lumia Stream Allows for control of your lights from streaming software node-red-contrib-wled Node-RED nodes for WLED OctoPrint-WLED Connect your OctoPrint install to your WLED install using this plugin to show things like printer status, progress and more! openHAB Another more professional feature rich home automation system. WLED integration made easy. Link 2 WLED-GUI This is a cross-platform desktop app for WLED. You can use it on Windows, Linux and Mac. WLED Native for Android WLED Native for iOS An alternative version of the WLED app with a similar user interface to the official one that looks close to the native OS style guidelines and has a few more features added on top of it. wledQuickControl macOS 11.0+ Menu Bar app for controlling power and brightness. WinLED Windows App for controlling WLED Instance (Brighness, Power, Presets, Effects...). Also usable from Traybar for quick actions. ## SourcesSource programs generate light data and stream them to WLED in real time.
Name Description LedFx A music visualization tool written in Python. Connects to WLED via E1.31 or UDP. Dr.Zzs tutorial video Prismatik WLED-WiFi (native) Ambilight via WiFi or serial - natively supports UDP (WARLS, DRGB, DNRGB protocols). Prismatik WLED-WiFi (plugin) Ambilight via WiFi - a Plugin alternative for Prismatik WLED support. xLights xLights is a Light Sequencer and Show scheduler which works with WLED. Dr.Zzs has made some videos to set it up. Intro Video Hyperion.ng Hyperion is an open-source Bias or Ambient Lighting implementation which you might know from TV manufacturers. It supports many LED devices and video grabbers. Support for WLED through UDPraw at port 19446 or E1.31. Tutorial video, Dr.Zzs video Hyperion (Classic) Hyperion is an open-source Bias or Ambient Lighting implementation which you might know from TV manufacturers. It supports many LED devices and video grabbers. Support for WLED through UDPraw at port 19446 or E1.31. Enigmalight Ambilight clone for broadcom based linux receivers. It supports many LED devices. Support for WLED through USB Adalight/Momo. Download to various forums use the WEB search function of your browser. Q Light Controller+ QLC+ is a free and cross-platform software to control DMX or analog lighting systems like moving heads, dimmers, scanners etc. QLC+ runs on Linux, Windows (XP+), macOS (10.7+) and the Raspberry Pi. WLED can be used with E1.31 (sACN). use major version 4, as 5 is in development."},{"location":"basics/compatible-software/#various","title":"Various","text":"Name Description Logitech WLED Sync Windows tray application to sync Logitech gaming peripherals to WLED."},{"location":"basics/compiling-wled/","title":"Compiling WLED","text":"Moved, see How to compile WLED
"},{"location":"basics/faq/","title":"FAQ","text":"This page will continually get updated with questions often asked.
"},{"location":"basics/faq/#contents","title":"Contents","text":""},{"location":"basics/faq/#installation","title":"Installation","text":"Please see this page.
"},{"location":"basics/faq/#ive-flashed-a-bin-but-i-get-no-response-at-all","title":"I've flashed a bin, but i get no response at all","text":"Some users report first erasing the flash (yes, even on a new device) sometimes helps .
"},{"location":"basics/faq/#connection-issues_1","title":"Connection issues","text":""},{"location":"basics/faq/#once-i-attach-leds-i-cant-connect-to-the-esp-anymore","title":"Once I attach LEDs, I can't connect to the ESP anymore!","text":"The gpio2/D4 pin needs to be high (pullup) at powerup time for the controller to boot successfully. If you accidentally connected the strip the wrong way (if it has arrows printed on, make sure they face away from the pin, otherwise pay attention to the DIN printing). Most strips have the 3-pin male JST connector with 3 holes on the input side. Some users have reported troubles booting even with the direction being correct. In that case, please try adding a 3.3 or 4.7kOhms resistor between the data pin and 3v3 pin!
"},{"location":"basics/faq/#i-have-entered-my-wifi-credentials-and-rebooted-but-i-can-not-connect-to-the-module-now","title":"I have entered my WiFi credentials and rebooted, but I can not connect to the module now!","text":"If you did not enter a static IP, the module will automatically obtain a dynamic IP from the router. You can check it in the router configuration or in the settings page, if the Access Point is still enabled. An easier way is to use the WLED Android app which features automatic discovery!
"},{"location":"basics/faq/#the-module-once-was-connected-but-i-can-no-longer-reach-it","title":"The module once was connected, but I can no longer reach it","text":"First, make sure you can reach the connected WiFi yourself (with another device). See if you can connect to the Access Point, then go to 4.3.2.1/reset. Else, power-cycle the module manually.
"},{"location":"basics/faq/#the-wled-xxxlocal-address-mdns-does-not-work","title":"The wled-xxx.local address (mDNS) does not work","text":"This only works with Apple devices out of the box. You can install Bonjour to make it work in Windows. For Android there is no convenient way to achieve it, though you can use apps like \"Bonjour search\" to find the IP. I highly recommend you install the WLED app, which makes automatic discovery easy!
"},{"location":"basics/faq/#is-it-safe-to-do-a-port-forwarding-to-the-public-internet-to-control-the-lights-from-anywhere","title":"Is it safe to do a port forwarding to the public internet to control the lights from anywhere?","text":"See this page.
"},{"location":"basics/faq/#my-device-is-unresponsive-or-animations-lag","title":"My device is unresponsive or animations lag!","text":"You are probably using too many sync interfaces. Please only enable one of Hue sync, MQTT, or Blynk at a time. For optimal performance, use two devices and sync them via the UDP notifier. Maybe you are also using a very high amount of LEDs. 750 is the recommended maximum. If using E1.31 feature on an ESP32, try \"Disabling WiFi Sleep\" in the WiFi setup section to reduce lag/stuttering of visual effects.
"},{"location":"basics/faq/#im-having-a-bootloop-leds-turn-on-every-5seconds","title":"I'm having a bootloop! (LEDs turn on every ~5seconds)","text":"Please open an issue or message me on Discord to resolve your issue. Most of the time, wiping the flash (Arduino IDE compile setting: Erase flash -> All flash contents) resolves the issue. Unfortunately it will also reset all your settings and presets. You can also try if using a different ESP resolves the issue. If you compiled with lwip version 2, try version 1.4 Higher Bandwidth instead!
"},{"location":"basics/faq/#still-having-connection-issuesconnection-dropping-what-more-can-i-check","title":"Still having connection issues/connection dropping: what more can i check?","text":"Try disabling \"Emulate Alexa device\" in Sync settings before entering your home Wifi credentials. Check whether mDNS is on or off and toggle it: does it make a difference? Same for 'NTP'. Same for 'Sync Send'. Check your router: is your 2.4Ghz on band 1: if not, try it please. If you have the possibility to try another 8266, please try it.
"},{"location":"basics/faq/#i-am-running-realtime-eg-e131-and-not-all-of-my-leds-are-driven-fluently","title":"I am running realtime (e.g. E1.31) and not all of my LEDs are driven fluently!","text":"Realtime effect streaming uses a rather large bandwidth as data is transmitted uncompressed. For example, to drive 1000 LEDs at 30 fps, you will need a data rate of 720 kBit/s, which is difficult to achieve with most cheap ESP boards over WiFi. Even if you split the total amount of LEDs across multiple controllers, your WiFi network could become the limiting factor quickly. The best way to ensure a low-latency, reliable, fluid stream when using large quantities of LEDs is to invest in a wired Ethernet ESP32 board like QuinLED-Dig boards with ethernet or the Olimex ESP32-POE.
There is a 9 DMX universe limit by default in WLED. You can raise it in line 240 of const.h (E131_MAX_UNIVERSE_COUNT 9) and compile your own binary, but the performance of 2000 LEDs over WiFi will likely not be good unless you use an Ethernet enabled board.
If Ethernet is not an option, decrease your LED count as far as possible, lower the frame rate in the sending software and make sure the WiFi signal reception of the board is good. Even without Ethernet, a board with an external antenna is significantly better than a PCB antenna board.
Furthermore I suggest using the DDP protocol if available in your sender software (available in xLights). DDP has a smaller packet header and because of the reduced overhead the fluidity of your animations will be a bit better.
"},{"location":"basics/faq/#compilation-issues_1","title":"Compilation issues","text":""},{"location":"basics/faq/#when-compiling-wled-in-vs-code-using-platformio-i-get-an-error","title":"When compiling WLED in VS Code using platformio, I get an error","text":"Try building again. If the error says the wled00.ino.cpp
or .sconsign27.db.dblite
file could not be found, this often helps. You can also try this!
Please make sure you have connected the strip to GPIO2 and it is sufficiently powered.
"},{"location":"basics/faq/#my-leds-dont-get-as-bright-as-they-should","title":"My LEDs don't get as bright as they should!","text":"If the brightness slider in the UI is already at maximum, try checking the auto brightness limiter in the LED settings. Set the milliamp limit to slightly below the rating of your power supply. If the LEDs are still too dim or change color towards the end of the strip, there may be a significant voltage drop. Try injecting 5v power at the end or middle of the strip with some appropriate cabling.
"},{"location":"basics/faq/#my-leds-are-unable-to-be-set-into-an-consistent-solid-color","title":"My LEDs are unable to be set into an consistent solid color","text":"If the LEDs should be individually addressable, like the SK6812, but instead they only behave as either RED,GREEN OR BlUE pixels (in a row). You might not have enabled (settings -> led preferences) \"LEDs are 4-channel type (RGBW)\" for an RGBW/RGBWW/RGBNW strip. This behaviour is accompanied by WLED being unable to address all LEDs, if you specify the exact amount of LEDs in the strip.
"},{"location":"basics/faq/#when-i-select-green-the-leds-turn-red","title":"When I select green, the LEDs turn red!","text":"Depending on the type of LEDs used, Red and Green or other colors might be reversed. You can change the order in LED settings. WS2812B and most related chips use GRB, WS2811 uses RGB in most cases.
"},{"location":"basics/faq/#my-leds-act-funny-and-flicker-randomly","title":"My LEDs act funny and flicker randomly","text":""},{"location":"basics/faq/#reason-1","title":"Reason 1","text":"If you use an external 5V power supply for your LEDs, please connect the GND of power supply, LEDs, and ESP. Otherwise, the LEDs can't read the data signal from the ESP.
"},{"location":"basics/faq/#reason-2","title":"Reason 2","text":"The ESP8266 is a 3.3V microcontroller while the WS2812B LED uses 5V. I have personally got away with this in most cases, but you should technically add a level shifter. A string of WS2811 did not work in one case (pure static white). A possible workaround is chaining a single WS2812B pixel in front and checking \"Skip first LED\" in the settings. My recommended levelshifter is the SN74AHCT125N, also used in the QuinLED Dig-Uno board. If you don't have a level shifter, you can use this creative workaround.
"},{"location":"basics/faq/#reason-3","title":"Reason 3","text":"Your data line can only be so long. Try out with less or thicker wire between your data pin on your controller and the LED strip, or add (see video) some voltage booster (which can make even 40m data wire length work ;-)).
"},{"location":"basics/faq/#reason-4","title":"Reason 4","text":"If they don't flicker, but display funny colors, try switching between RGB/RGBW modes in LED settings.
"},{"location":"basics/faq/#not-all-my-leds-turn-on","title":"Not all my LEDs turn on","text":""},{"location":"basics/faq/#reason-1_1","title":"Reason 1","text":"By default the LED count is set to 30. If you have more and can power them, go to LED settings and increase the LED count! Please also enter the milliamp rating of your 5v power supply for optimal brightness in the field below it. Do not increase the mA number if you power LEDs directly from the 5V pin of the ESP!
See here for maximum recommended LED counts.
"},{"location":"basics/faq/#reason-2_1","title":"Reason 2","text":"An LED in your chain may be broken. Try another strip or removing the first LED that doesn't light up. Make sure you are in solid effect mode and the LED count is set high enough first!
"},{"location":"basics/faq/#how-to-turn-off-the-bright-blue-onboard-led","title":"How to turn off the bright blue onboard LED?","text":"This LED can be very distracting. Unfortunately it can't easily be disabled as it shares the gpio2/D4 pin with the LED output. It is turned off together with your LEDs (unless they require Off Refresh
to be active) Currently there are 3 workarounds:
LEDPIN
, although the default is recommended for stable operationAlthough pins D1 and D2 are usually regarded the best GPIO pins to use in an ESP8266 project, D4 is the default in WLED, despite having two major and one minor drawback. The major drawbacks are the permanently lit blue onboard LEDs and the fact that the pin level needs to be high (pullup) at powerup or the controller will not boot. A minor drawback is that the Serial1
bus can not be used, but this is irrelevant in most cases, as the USB/serial converter is connected to the other Serial
interface. The reason for using this pin is that it uses UART hardware driving, which increases stability and decreases CPU overhead especially with larger amounts of pixels.
The problem is the DMA hardware driving method used on (just) that pin. It works well, but uses 4x (!) as much RAM memory as the UART hardware driving on pin 2 and the bitbang driver on all other pins.
"},{"location":"basics/faq/#what-led-strip-hardware-is-supported-by-wled","title":"What LED strip hardware is supported by WLED?","text":"The compatible chipsets for the color-coding are
1 pin:
WS2812B (5V)
SK6805 (3 colors)
2 pins (clock CI and data DI) chips:
APA102
Beside the digital addressable LED strips the good old analog LED strips are supported, too:
WiFi Lighting Effects Driver. Also it has LED in the name and is similar to the official term for WiFi, WLAN!
"},{"location":"basics/faq/#what-do-the-wled-version-names-mean","title":"What do the WLED version names mean?","text":"WLED version names are Japanese! Here is a nice list of their meanings:
Version Name Kanji Meaning 0.10 Namigai \u6d6a\u8c9d Geoduck (don't google it!) 0.11.0 Mirai \u672a\u6765 Future 0.11.1 Fumikiri \u8e0f\u5207 Railroad crossing 0.12 Hikari \u5149 Light 0.13 Toki \u6642 Time 0.14 Hoshi \u661f Star 0.15 K\u014dsen \u5149\u7dda Ray of light N/A Kuuhaku \u7a7a\u767d Blank"},{"location":"basics/faq/#what-is-the-difference-between-the-brightness-sliders-in-the-web-ui","title":"What is the difference between the brightness sliders in the web UI?","text":"There are three brightness slider types in the web UI. The white one in the top bar is the master brightness - it scales down every single color and all effects, palettes and segments by the same factor.
In contrast, the slider underneath the color wheel only applies to the currently selected color and will not affect the brightness of other colors or Palettes. It is recommended to use this slider only if you like a darker version of a color alongside other, brighter colors. It should not be used to control the overall brightness, so it is preferable to leave it on maximum and instead use the master brightness control.
There is a third brightness slider in each Segment panel. This serves the same purpose as master brightness, but limited to that segment. Please note that this does not override the master brightness, but instead is an additional downscaling. (If you set both Master and Segment brightness sliders to 50%, the resulting brightness is 25%)
"},{"location":"basics/faq/#my-segments-are-gone-after-a-reboot","title":"My Segments are gone after a reboot!","text":"Segments are non-persistant by default. If you want to load your preset at every startup, just do the following:
16
Boot Preset
to 16
This will be improved in a future release, so that you will be able to save multiple segment configurations!
"},{"location":"basics/faq/#what-is-the-difference-between-the-wled-app-and-the-wled-native-app","title":"What is the difference between the WLED app and the WLED Native app?","text":"The WLED app is the official app developped by the same people that brought you WLED. WLED Native is an initiative by community member Moustachauve to bring an interface that is closer to the native operating system look of your device and some new features.
WLED Native has a few more features available, like a tablet interface for Android and can keep track of changes to the device IP address better.
While WLED Native is not the official app, it is officially endorsed and trusted by the WLED maintainers.
"},{"location":"basics/faq/#may-i-sell-a-product-running-wled","title":"May I sell a product running WLED?","text":"WLED is licensed under the MIT license, thus you are free to use it in any way you wish as long as you retain the copyright notice and accept that I am not to be held liable for anything regarding your use of the software. For product pages, a link to the WLED GitHub repository would be hugely appreciated !
"},{"location":"basics/faq/#my-question-or-solution-is-not-on-this-page_1","title":"My question or solution is not on this page","text":""},{"location":"basics/faq/#check-out-the-wled-forum","title":"Check out the WLED forum!","text":"You can check out and use the WLED Discourse forum.
"},{"location":"basics/faq/#look-through-the-issues","title":"Look through the Issues","text":"Maybe someone already reported your issue, so everybody supplying support would be grateful if you take some time to search through the existing issues.
"},{"location":"basics/faq/#if-i-report-a-new-issue-what-do-i-need-to-share","title":"If I report a new Issue, what do i need to share?","text":"When you create a ticket, please share:
Version Info
Unless noted otherwise, all information applies to the latest release (v0.13.3).
"},{"location":"basics/getting-started/#quick-start-guide","title":"Quick start guide","text":"1. Connect a WS2812B-compatible RGB(W) led strip to GPIO2
. On most ESP8266 based development boards, this pin is labeled D4
; on ESP32 based boards, use IO16
or G16
or 16
. If the connecting wire cannot be kept short, use a level shifter/translator. Optionally, connect a normally open pushbutton to GPIO0
(NodeMCU/Wemos pin D3
, on ESP32 use IO17
) and ground for configurable actions. Note: Board pin naming varies depending on the manufacturer. Please use the board pinout from the specific board you purchased and use the GPIO pins to reference this guide. Make sure to connect ESP and LED-strip grounds together!
While using an ESP8266 and LEDs that have clock and data, you can either use hardware SPI (mostly faster) or software SPI.
GPIO14
(SCLK) for clock and GPIO13
(MOSI) for data.GPIO1
(TxD) for clock and GPIO2
(D4) for data. For safe operation, it is recommended to size your power wires correctly and to integrate fuses. For reference, you may use this LED power, wiring and fuse calculator.
For analog LEDs, the MOSFETs IRLZ44N or STP55NF06L are good candidates. Partial, example circuit:
2. Flash the software to your ESP module! There are two options for this step:
I just want to use WLED! (install release binary)
I want to modify WLED (compile from source code)
If everything worked the first thirty LEDs will light up in bright orange to stimulate courage, friendliness and success!
3. Use a WiFi device to connect to the access point WLED-AP
using the default password wled1234
. You can also just scan this QR code:
WLED-AP is not showing up!
If you do not see the WLED-AP
SSID, the default SSID may have been changed at compile time.
Go to the IP 4.3.2.1
in your browser to control your lights! You should also be able to connect to wled.me
if in access point mode (embedded DNS server).
To connect your WLED module to your home Wifi:
1. Click on the Config (gear) icon to edit your WLED module settings and choose \"Wifi Setup\".
2. For most home networks, simply enter your Wifi network's name and network password. You can also change the mDNS address for your WLED module here.
3. Click Save & Connect at the bottom of the page.
4. Reconnect your device to your home's Wifi network.
5. Check the device list in your router's user interface for the IP of the WLED device within your local network. For easy automatic discovery, use the WLED app! Have fun with the WLED software!
"},{"location":"basics/getting-started/#default-gpio-usage","title":"Default GPIO Usage","text":"These are only defaults
All pins can be changed in the Hardware section of LED settings. Please note that these are GPIO numbers, please consult a pinout for your board to find the labeled pin (e.g D4
= GPIO2
on most ESP8266 boards). When using an ESP8266 board, it's recommended to use pins GPIO1
, GPIO2
, or GPIO3
for LED Data; using other pins will require bit-banging and may cause slow performance and/or issues elsewhere (such as with IR decoding).
Method 1: Reflashing the new update like a new install (see above).
Method 2: The software has an integrated OTA software update capability. First you have to enable it by typing in the correct OTA passphrase (default: \"wledota\") in the settings menu. Remove the tick in the checkbox \"OTA locked\". Then save settings and reboot the ESP. Then you can select \"Manual OTA update\" in Security settings and upload a release binary. After you are done, it is recommended to lock the OTA function again. To do so, tick the checkbox again (you can change the passphrase by typing in a new one now). Reboot. If you try to access the update page now, you should see the message \"OTA lock active\".
Method 3: ArduinoOTA is also supported.
If you own multiple devices and want to update them
Since v0.13 of WLED source code includes shell/command prompt scripts which is allow you to update multiple devices with a single command. Please check tools
subfolder for multi-update
scripts (.cmd or .sh). You will need to modify them to include IP addresses of your WLED devices and assign firmware binary file for each device. If you are using Windows, make sure you install curl
utility somewhere in your PATH
(curl is included with Windows 10 since build 17063). This will only work if \"OTA Lock\" is disabled.
Tip
This is by far the easiest and fastest way to get WLED up and running!
Make sure you are running a recent desktop Chrome or Edge browser and head over to the WLED installer site! If you are updating an existing version of WLED, make sure to uncheck \"Clean install\" so that your settings are kept. This installer is not yet available for ESPs with flash chips smaller than 4MB (e.g. ESP01)
Tip
After using the standard WLED installer, microphone hardware sometimes cannot be initialized properly by WLED. For flashing the MoonModules version of WLED, we recommend using this installer site: https://wled-install.github.io/
"},{"location":"basics/install-binary/#flashing-method-2-esptool","title":"Flashing method 2: esptool","text":"-port COM3
attribute after write_flash
esptool.py write_flash 0x0 ./WLED_XXX.bin\n
"},{"location":"basics/install-binary/#esp32","title":"ESP32","text":"Firstly, flash the version 4 bootloader file, which you can find here. This step only has to be done once, to update afterwards the bootloader does not have to be re-installed.
esptool.py write_flash 0x0 ./esp32_bootloader_v4.bin\n
Caution
This boolader file is only for \"classic ESP32\" boards. You need a different bootloader for esp32-S3/-S2/-C3.
Now you can flash the actual firmware binary. Keep in mind the bootloader needs to have a flash offset of 0, but the firmware 0x10000.
esptool.py write_flash 0x10000 ./WLED_XXX.bin \n
When esptool.py says Connecting...
, some ESP32 boards require you to hold the boot button (to the right of the USB port) for a few seconds
write_flash
again (Note: this will erase all settings stored on the ESP!)esptool.py erase_flash\n
If you have a MagicHome controller, here is a good video tutorial on how to flash it.
"},{"location":"basics/install-binary/#esp8266-flashing-method-3-esp-home-flasher-tool","title":"ESP8266 Flashing method 3: ESP Home Flasher tool","text":"Warning
Don't use ESP Home Flasher for ESP32 boards. On ESP32, ESP Home Flasher will make the filesystem very small (61kB), which leads to issues making presets. Please consider using WLED ESP Flasher, or the web installer or esptool.
This is a GUI-based tool recommended by some users as easier to use than esptool. For some boards, you might have to press some buttons after uploading:
Hold both buttons down, plug it in, start flashing, then when it tries to detect, let go of the button to the left of the USB as you look at it, then when it detects the board type, let go of the other button.
If running Windows, you need a driver from here: https://www.wemos.cc/en/latest/ch340_driver.html before your computer will show the COM port in ESPhome Flasher. With a Wemos D1 mini you do not need to hold down the reset button while flashing.
Tip
For ESP32 boards, you can use this WLED ESP Flasher instead of ESP Home Flasher. Please wait at least 90 seconds after installing, to be sure you don't interrupt WLED when formatting its flash filesystem.
"},{"location":"basics/install-binary/#flashing-method-4-ota-update","title":"Flashing method 4: OTA update","text":"You can alternatively use my basic HTTP OTA updater sketch and upload the binary! This requires the Arduino IDE and ESP8266 core installed. If your device is already running a firmware with built-in OTA capability, you can probably use that as well.
"},{"location":"basics/install-binary/#what-binary-should-i-use","title":"What binary should I use?","text":"I always recommend to use the latest release. Starting from WLED 0.12.0, pins can be configured in LED settings and specific binaries for different LED pins or types are no longer needed. Please use the following binary for these boards respectively:
Binary Name For devices WLED_0.x.x_ESP8266.bin NodeMCU, Wemos D1 mini, ESP-12, all ESP8266 with 4MB flash. Recommended. WLED_0.x.x_ESP32.bin All ESP32 devices (try this if the WLED-AP doesn't appear after flashing) WLED_0.x.x_ESP32_Ethernet.bin ESP32 devices with an Ethernet interface. Also works with WiFi only. WLED_0.x.x_ESP01.bin ESP-01 (black PCB), most Sonoff devices, ESP8265, all ESP8266 with 1MB flash. This binary has the full feature set, but wireless updates will not work. WLED_0.x.x_ESP02.bin All ESP8266 with 2MB flash, Athom bulbs. This binary has the full feature set, but wireless updates will not work (for more detail see this. For wireless updates use WLED_0.x.x_ESP02.bin.gz firmware instead. WLED_0.x.x_ESP02.bin.gz All ESP8266 with 2MB flash, Athom bulbs, wireless update are possible with this firmware. esp32_bootloader.bin Not a WLED release. To be flashed to a brand new ESP32 before flashing the WLED binary itself.Legacy binary format (up to 0.11.1)
Binary Name For devices WLED_0.x.x_ESP8266_1M_ota.bin ESP-01 (black PCB), most Sonoff devices, ESP8265, all ESP8266 with 1MB flash. This binary has some interfaces disabled (Alexa, Blynk, Hue sync, Infrared) in order for wireless updates to continue working. WLED_0.x.x_ESP8266_1M_full.bin ESP-01 (black PCB), most Sonoff devices, ESP8265, all ESP8266 with 1MB flash. This binary has the full feature set, but wireless updates will not work. WLED_0.x.x_ESP8266_512k.bin ESP-01 (blue PCB), older Sonoff devices, all ESP8266 with 512kB flash. Interfaces (Alexa, Blynk, Hue sync, Infrared) disabled, no OTA. Support will not be possible in future versions. WLED_0.x.x_ESP8266_ledpinY.bin Custom build for 4MB flash ESP8266 and WS2812B. LED pin is changed (default is GPIO2). (This is GPIOY and not DY for the D to GPIO mapping, check your boards spec!) WLED_0.x.x_ESP8266_apa102.bin Custom build for 4MB flash ESP8266 and APA102 LEDs (clock pin GPIO0, data GPIO2). WLED_0.x.x_ESP8266_ws2801.bin Custom build for 4MB flash ESP8266 and WS2801 LEDs (clock pin GPIO0, data GPIO2). WLED_0.x.x_ESP32_ledpinY.bin Custom build for ESP32 and WS2812b. LED pin is changed (default is GPIO2). LED pin 16 is useful for the QuinLed-Dig-Uno board with ESP32."},{"location":"basics/install-gui/","title":"Installation using ESP GUI","text":""},{"location":"basics/install-gui/#1-downloading-the-firmware-bin-file","title":"1. Downloading the firmware bin file","text":"You can find precompiled .bin files on the release page. Be sure to download the latest version. This file looks something like this:
WLED_[...]_ESP[...].bin
If you are not sure what binary you should use look at this page: What binary should I use?
"},{"location":"basics/install-gui/#2-downloading-the-flash-download-tools","title":"2. Downloading the Flash Download Tools","text":"Espressif has an official GUI tool for Windows. It has a lot of options and can be used for the ESP8266 and ESP32. You can find it on Espressif's download page here! (if the link changed, just search for esp flash download tool
on Google)
After downloading the file, unzip it and start flash_download_tools_v3.6.8.exe
.
After starting flash_download_tools_v[...].exe
there should pop up two small windows. Now just click on the Developer Mode
andESP8266 DownloadTool
button. Now a new window opens.
WLED_[...]_ESP[...].bin
file by clicking on the first ...
button0x0
Default
button80Mhz
32Mbit
COM1
)921600
Verify that everything looks like the two picture below \u00b0ESPTool settings
(optionally) click on ERASE to erase the entire flash chip
START
Now the firmware will be flashed to the ESP. When the firmware flashing was successful you see this: . Finally restart your board.
Next steps: Quick start guide
"},{"location":"basics/install-wled-flasher/","title":"Installation using ESP GUI - WLED Flasher","text":""},{"location":"basics/install-wled-flasher/#1-downloading-wled-firmware-bin-file","title":"1. Downloading WLED firmware bin file","text":"You can find precompiled .bin files on the official release page. Also available alternative with precompiled usermods
If you are not sure what binary you should use look at this page: What binary should I use?
"},{"location":"basics/install-wled-flasher/#2-downloading-the-esp-wled-flasher","title":"2. Downloading the ESP WLED Flasher","text":"You can find and download flasher here!
After downloading a file, unzip it and start
"},{"location":"basics/install-wled-flasher/#3-flashing-firmware-bin-files","title":"3. Flashing firmware bin files","text":"When flasher start, choose Serial port
(it must be a port your board is connected to).
Next , choose downloaded BIN file
.
Click on Flash ESP
.
Now WLED firmware will be flashed to the ESP. Wait until process is finished and you will see Ada
message.
Next steps: Quick start guide
"},{"location":"basics/top5_mistakes/","title":"TOP 5 mistakes","text":""},{"location":"basics/top5_mistakes/#asking-for-help","title":"Asking for help","text":"Before asking for help on Discord or on other platforms, check the following top 5 most common mistakes while setting up WLED. If you then still have troubles and are going to ask for help, provide as much informtion as possile: describe your setup, make photos, provide screenshots of your settings.
"},{"location":"basics/top5_mistakes/#top-5-mistakes","title":"TOP 5 mistakes:","text":"Don't know yet how to solder? Unsure how to connect your LEDs safely? How to find the perfect power supply? No worries, we have collected a few helpful links for you to learn more about these and more topics:
"},{"location":"basics/tutorials/#wled-specific-tutorials","title":"WLED specific tutorials","text":"Resource Maker Type Date Info Beginner's guide to freak'n cool Holiday LEDs DrZzs Video (23:22) 12 Oct 2019 Excellent guide for getting started with WLED! How to Set Colors and Effects, Save Presets, Make Sync Groups, add a Button, & Macros for Scheduling DrZzs Video (23:39) 29 Oct 2019 Learn about some cool additional WLED features! Make your LEDs dance to music! DrZzs Video (11:30) 17 Nov 2019 How to install LedFx and connect it to WLED for quick sound reactive effects! Getting started with WLED tynick Article 11 Mar 2019 Complete and excellent guide on how to flash and get WLED up and running! How to Compile WLED (from scratch) Quindor Video (02:15:00) 22 Dec 2020 How to compile WLED yourself from scratch (most info in first 30 minutes) WLED with QuinLED-Dig-Uno Install Tutorial Quindor Video (11:13) 21 Sept 2019 Initial flash and setup of WLED on QuinLED-Dig-Uno board Integrating WLED into Home Assistant Quindor Video (8:22) 25 Nov 2019 How to use a WLED node in Home Assistant Holiday LEDs Step-by-step with WLED & Home Assistant KPeyanski Video (20:38) 28 Oct 2020 Complete and great wiring, installation and HA setup tutorial HOW-TO: Holiday LED Strip Lights, Home Assistant and WLED KPeyanski Article 23 Jul 2022 Same as the above video, but in text form! Smart Ping Pong LED Lamp - Quick&Simple DIY bitluni Video (18:19) 13 Sept 2020 Construction, wiring and flashing of a cool looking and easy to make lamp WLED tutorial series (in Russian/\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c) Gelmer Article Series 11 Jun 2023 \u0421\u0435\u0440\u0438\u044f \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432 \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c: \u041a\u0430\u043a \u043f\u0440\u043e\u0448\u0438\u0442\u044c WLED \u0438 LED FX \u0432 ESP01 \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f WLED: \u0411\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0443\u043d\u043d\u0435\u043b\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u043e\u043b\u0438\u043a\u0430 IKEA Lack Alchemist Video (9:16) / Video (13:09) 19 Aug 2022 \u041f\u0440\u043e\u0448\u0438\u0432\u043a\u0430, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b. \u041f\u0440\u0438\u043c\u0435\u0440 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b. ESP8266 based LED controller for WS2812b strip. WLED Firmware + OpenHAB (in Russian) Room31 Video (17:04) 11 Mar 2020 How to use WLED on an ESP32 (German) Bitbastelei/Adlerweb Video (11:00) 1 Nov 2020 DIY Ambilight using WLED and a Relay jangrewe Article ? Wiki page with schematics and instructions for Hyperion, etc. Adding Smarts and Color to an IKEA Lamp apop880 Article 21 May 2021 Tutorial on upgrading a basic IKEA lamp with WLED"},{"location":"basics/tutorials/#digital-led-knowledge","title":"Digital LED knowledge","text":"Resource Maker Type Info Adafruit NeoPixel \u00dcberguide Adafruit Article Everything that's important at a glance. Highly recommended for newcomers to digital LEDs Digital LED Power Usage Quindor Article/Spreadsheet/Video Helps you plan the power usage of your installation Power calculation and injection live stream Quindor Video (2:24:52) Tons of great questions and answers. Live calculations, drawings, 5v vs 12v, strip comparisons, etc. Difference between LED strip types The Hook Up Video (14:41) What is the best LED strip for your project? 7 Common LED Strip FAILS and How To Avoid Them The Hook Up Video (12:14) Make your project look much better! Power Injection demystified Spiker Lights Article What is power injection and how much do I need? Common(sharing) Ground / Multiple power supplies Article When using more than one power supply."},{"location":"basics/tutorials/#tools-skills","title":"Tools & Skills","text":"Resource Maker Type Info How to Solder Beauty and the Bolt Video (9:50) Soldering new leads to LED strip Quindor Video (8:24) Soldering Tutorial Part 2 EEVblog Video (34:05) Detailed tutorial on soldering, see parts 1 and 3 for even more info) Voltage Drop Calculator Tool Another Voltage Drop Calculator Tool Pixel/Bullet Voltage Drop Calc Tool 5 and 12V Combined Wire Gauge Calculator Tool Wire Size/Ampacity Tool Use chassis wiringAdd more categories as needed :)
"},{"location":"features/cct/","title":"White handling","text":""},{"location":"features/cct/#white-channels-handling","title":"White channel(s) handling","text":"Besides addressable RGB and RGBW bus types, WLED 0.13.0 also supports PWM CCT (correlated color temperature) lights.
"},{"location":"features/cct/#auto-white-handling","title":"Auto white handling","text":"Many effects and realtime sources are based on an RGB color model, which necessitates a method to calculate a white channel value from the RGB value for lights that support more than RGB.
WLED offers four auto white modes, one of which can be selected in LED settings using the option Auto-calculate white channel from RGB
. This option is only shown if at least one bus with White channel support is present.
White channel
slider in the user interface, RGB-only effects and most realtime sources will leave the white channel off. Dual The White channel
slider is present in the UI and works the same as in None
mode, however if the slider value is 0 (far left), the Brighter
mode is used for auto white calculation. This is the default auto white mode. Accurate
and Brighter
methods are applied on a per-pixel basis, so they also work in color palettes and realtime effects!
If enabled in LED settings, WB correction allows either making all pixels colder or warmer on a per-segment basis using a slider in the main user interface. This is applied to the RGB color only, after the auto white channel calculation.
"},{"location":"features/cct/#cct-handling","title":"CCT handling","text":"WLED starting with version 0.13.0 also supports bus types with two white channels, one with a warm color temperature (e.g. 2700 Kelvin, reddish white) and one with a cold white color temperature (e.g. 8000 Kelvin, bluish white).
Since as of the release of version 0.13.0 no adjustable CCT addressable LEDs are supported*, this only applies to PWM analog LED outputs.
*SK6812 WWA (with 3 channels, warm white, cold white and amber) are supported, but treated as if RGB using the WS281x
bus type. White spectrum support for this LED type will be added at a later point.
The overall brightness of the white channels is determined from the auto-white calculation outlined above, and as such is identical in behavior to that of single white channel busses.
The color temperature is set either on a per-segment basis via a dedicated slider in the UI, or if Calculate CCT from RGB
is enabled in LED settings, is estimated on a per-pixel basis from the set RGB color (e.g. setting Red results in the warmest, setting Blue results in the coldest possible white). The former has the advantage of granular white spectrum control independent of the set RGB color, while the latter enables control of the color temperature from all effects and realtime sources.
Setting this to 0% results in a more even brightness output across the supported temperature range, as the fading between the warm and cold white channels is linear.
Setting this to 100% results in the highest peak brightness output at the neutral white point (CCT value 127
), as both white channels are active at 100%.
Warning
Make sure your setup can handle driving both white channels at maximum output simultaneously. This results in a higher heat output and might reduce the lifetime of your LEDs. For example, bulbs by Athom are designed for linear blending (0%) and may be damaged by attempting to use additive blending.\n
You can limit the maximum allowed additive blending at build time using the WLED_MAX_CCT_BLEND
macro. For example, add -D WLED_MAX_CCT_BLEND=0
to your build flags to force linear blending only.
By default, PWM CCT bus types set the value of the warm and cold white channels. If your hardware uses an IC that controls the color temperature based on one PWM signal and the overall brightness on the other, please use the build flag -D WLED_USE_IC_CCT
in a custom compilation. (the 15W bulb by Athom uses this method)
Please see here for more info on how to handle WLED CCT from integrations.
"},{"location":"features/effects/","title":"Effects","text":"Version Info
Effects above 117 are only available 0.14+ or Sound Reactive forks. Retired Effects - Can't find an old favorite? Look here.
"},{"location":"features/effects/#effect-overlay","title":"Effect Overlay","text":"Some effects can be overlaid on the background of another effect. To use overlay, set up segments with overlapping pixels. The overlay effect must be playing on the segment with the higher id. If the Overlay option is checked, the background will not be painted and the effect from the lower segment will be displayed.
To aid in showing where colors vs palettes are used, all effects are rendered with the Party palette and the colors: Primary (Fx) (or black) Secondary (Bg) Tertiary (Cs). For 2D effects the background (secondary) color is set to black.
ID Effect Description Flags Colors Parms 186 Akemi The WLED mascot rocking to your tunes. \u25a6 \u266b Head palette, Arms & Legs, Eyes & Mouth Color speed, Dance 27 Android Section of varying length running \u22ee \ud83c\udfa8 Fx, Bg Speed, Width 38 Aurora Simulation of the Aurora Borealis \u22ee \ud83c\udfa8 1, 2, 3 Speed, Intensity 183 Black Hole Colorful dots orbiting a white black hole. \u25a6 Fade rate, Outer Y freq., Outer X freq., Inner X freq., Inner Y freq. 115 Blends Blends random colors across palette \u22ee \ud83c\udfa8 Shift speed, Blend speed 1 Blink Blinks between primary and secondary color \u22ee \ud83c\udfa8 Fx, Bg Speed, Duty cycle 26 Blink Rainbow Same as blink, cycles through the rainbow \u22ee \ud83c\udfa8 Fx, Bg Frequency, Blink duration 121 Blobs No really, they are blobs. \u25a6 \ud83c\udfa8 Fx Speed, # blobs, Blur 163 Blurz \u263e \u22ee \u266b \ud83c\udfa8 Fx, Color mix Fade rate, Blur 91 Bouncing Balls Bouncing ball effect \u22ee \ud83c\udfa8 Fx, Bg, Cs Gravity, # of balls, Overlay 68 Bpm Pulses moving back and forth on palette \u22ee \ud83c\udfa8 Fx Speed 2 Breathe Fades between primary and secondary color \u22ee \ud83c\udfa8 Fx, Bg Speed 88 Candle Flicker resembling a candle flame \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 102 Candle Multi Like candle effect, but each LED has it's own flicker pattern \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 28 Chase 2 LEDs in primary color running on secondary \u22ee \ud83c\udfa8 Fx, Bg, Cs Speed, Width 37 Chase 2 Pattern of n LEDs primary and n LEDs secondary moves along the strip \u22ee \ud83c\udfa8 Fx, Bg Speed, Width 54 Chase 3 Like Chase, but with 3 colors \u22ee \ud83c\udfa8 1, 2, 3 Speed, Size 31 Chase Flash 2 LEDs flash in secondary color while the rest is lit in primary. The flashing LEDs wander from start to end \u22ee \ud83c\udfa8 Bg, Fx Speed 32 Chase Flash Rnd Like Chase Flash, but the 2 LEDs flash in random colors and leaves a random color behind \u22ee \ud83c\udfa8 Fx, Bg Speed 30 Chase Rainbow Like 28 but leaves trail of rainbow \u22ee \ud83c\udfa8 Fx, Bg Speed, Width 29 Chase Random Like Chase but leaves trail of random color \u22ee \ud83c\udfa8 Fx, Cs Speed, Width 111 Chunchun Birds flying in a circle formation \u22ee \ud83c\udfa8 Fx, Bg Speed, Gap size 167 Colored Bursts Rotating rays of color. \u25a6 \ud83c\udfa8 Speed, # of lines, Blur, Gradient, Dots 34 Colorful Shifting Red-Amber-Green-Blue pattern \u22ee \ud83c\udfa8 1, 2, 3 Speed, Saturation 8 Colorloop Cycle all LEDs through the rainbow colors \u22ee \ud83c\udfa8 Speed, Saturation 74 Colortwinkles LEDs light up randomly in random colors and fade off again \u22ee \ud83c\udfa8 Fade speed, Spawn speed 67 Colorwaves Like Pride 2015, but uses palettes \u22ee \ud83c\udfa8 Fx Speed, Hue 119 Crazy Bees Bees darting from flower to flower. \u25a6 Speed, Blur 159 DJ Light An effect emanating from the center to the edges. \u22ee \u266b Speed, Candy Factory 152 DNA A very cool DNA like pattern. \u25a6 \ud83c\udfa8 Scroll speed, Blur 182 DNA Spiral Spiraling DNA pattern \u25a6 \ud83c\udfa8 Scroll speed, Y frequency 112 Dancing Shadows Moving spotlights \u22ee \ud83c\udfa8 Fx Speed, # of shadows 18 Dissolve Fills LEDs with primary in random order, then off again \u22ee \ud83c\udfa8 Fx, Bg Repeat speed, Dissolve speed, Random 19 Dissolve Rnd Fills LEDs with random colors in random order, then off again \u22ee \ud83c\udfa8 Bg Repeat speed, Dissolve speed 124 Distortion Waves Distorted sine waves with a psychedelic flair. \u25a6 Speed, Scale 164 Drift A rotating kaleidoscope. \u25a6 \ud83c\udfa8 Rotation speed, Blur amount 123 Drift Rose Spinning arms that adds and removes nodes as it winds and unwinds. \u25a6 Fade, Blur 96 Drip Water dripping effect \u22ee \ud83c\udfa8 Fx, Bg Gravity, # of drips, Overlay 7 Dynamic Sets each LED to a random color \u22ee \ud83c\udfa8 Speed, Intensity, Smooth 117 Dynamic Smooth Like Dynamic, but with smooth palette blends \u22ee \ud83c\udfa8 Speed, Intensity 12 Fade Fades smoothly between primary and secondary color \u22ee \ud83c\udfa8 Fx, Bg Speed 49 Fairy Inspired by twinkle style Christmas lights. \u22ee \ud83c\udfa8 Fx, Bg Speed, # of flashers 51 Fairytwinkle Like Colortwinkle, but starting from all lit \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 69 Fill Noise Noise pattern \u22ee \ud83c\udfa8 Fx Speed 66 Fire 2012 Simulates flickering fire in red and yellow \u22ee \ud83c\udfa8 Cooling, Spark rate, Boost 45 Fire Flicker LEDs randomly flickering \u22ee \ud83c\udfa8 Fx Speed, Intensity 149 Firenoise Using Perlin Noise for fire. \u25a6 \ud83c\udfa8 X scale, Y scale 42 Fireworks Random color blobs light up, then fade again \u22ee \u25a6 \ud83c\udfa8 Fx, Bg Frequency 90 Fireworks 1D one dimension fireworks with flare \u22ee \u25a6 \ud83c\udfa8 Fx, Bg Gravity, Firing side 89 Fireworks Starburst Exploding multicolor fireworks \u22ee \ud83c\udfa8 Bg Chance, Fragments, Overlay 110 Flow Blend of palette and spot effects \u22ee \ud83c\udfa8 Speed, Zones 179 Flow Stripe Strip with rotating colours. \u22ee Hue speed, Effect speed 155 Freqmap Map the loudest frequency throughout the length of the LED's. \u22ee \u266b \ud83c\udfa8 Fx, Bg Fade rate, Starting color, Smooth mover \u263e 138 Freqmatrix The temporal tail for this animation starts at the beginning of the Segment rather than in the center of the segment. \u22ee \u266b Speed, Sound effect, Low bin, High bin, Sensivity 141 Freqpixels Random pixels coloured by frequency. \u22ee \u266b Fade rate, Starting color and # of pixels 137 Freqwave Maps the major frequencies from the incoming signal to colors in the HSV color space. \u22ee \u266b Speed, Sound effect, Low bin, High bin, Pre-amp, Musical Scale \u263e 177 Frizzles Moving patterns. \u25a6 \ud83c\udfa8 X frequency, Y frequency, Blur 160 Funky Plank A 2D wall of reactivity running from bottom to top \u25a6 \u266b Scroll speed, # of bands 139 GEQ \u263e \u25a6 \u266b \ud83c\udfa8 Fx, Peaks Fade speed, Ripple decay, # of bands, Color bars, Smooth bars \u263e 172 Game Of Life Scrolling game of life. \u25a6 \ud83c\udfa8 Fx, Bg Speed, All colors \u263e 120 Ghost Rider Color changing ghost riding a kite... in a tornado. \u25a6 \ud83c\udfa8 Fade rate, Blur 87 Glitter Rainbow with white sparkles \u22ee \ud83c\udfa8 1, 2, Glitter color Speed, Intensity, Overlay 46 Gradient Moves a saturation gradient of the primary color along the strip \u22ee \ud83c\udfa8 Fx, Bg Speed, Spread 156 Gravcenter Volume reactive vu-meter from center with gravity and perlin noise. \u22ee \u266a \ud83c\udfa8 Fx, Bg Rate of fall, Sensitivity 157 Gravcentric Volume reactive vu-meter from center with gravity. Volume provides index to (time rotating) palette colour. \u22ee \u266a \ud83c\udfa8 Fx, Bg Rate of fall, Sensitivity 158 Gravfreq \u263e \u22ee \u266b \ud83c\udfa8 Fx, Bg Rate of fall, Sensivity 132 Gravimeter \u263e \u22ee \u266a \ud83c\udfa8 Fx, Bg Rate of fall, Sensitivity, Invert Palette, Sound Pressure, AGC debug 82 Halloween Eyes One Pair of blinking eyes at random intervals along strip \u22ee \u25a6 \ud83c\udfa8 Fx, Bg Duration, Eye fade time, Overlay 100 Heartbeat led strip pulsing rhythm similar to a heart beat \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 180 Hiphotic A moving plasma. \u25a6 \ud83c\udfa8 Fx X scale, Y scale, Speed 58 ICU Two \"eyes\" running on opposite sides of the strip \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity, Overlay 64 Juggle Eight colored dots running, leaving trails \u22ee \ud83c\udfa8 Speed, Trail 130 Juggles Juggling balls. \u22ee \u266a \ud83c\udfa8 Fx, Bg Speed, # of balls 168 Julia Animated Julia set fractal named after mathematician Gaston Julia. \u25a6 \ud83c\udfa8 Fx Max iterations per pixel, X center, Y center, Area size 75 Lake Calm palette waving \u22ee \ud83c\udfa8 Fx Speed 41 Lighthouse Dot moves from start to end, leaving behind a fading trail \u22ee \ud83c\udfa8 Fx, Bg Speed, Fade rate 57 Lightning Short random white strobe similar to a lightning bolt \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity, Overlay 176 Lissajous \u263e \u25a6 \ud83c\udfa8 Fx X frequency, Fade rate, Speed, \u263e Smooth Style 47 Loading Moves a sawtooth pattern along the strip \u22ee \ud83c\udfa8 Fx, Bg Speed, Fade 131 Matripix \u263e \u22ee \u266a \ud83c\udfa8 Fx, Bg Speed, Brightness, Frequency Colors, Sound Pressure 153 Matrix The Matrix, on a 2D matrix. \u25a6 Spawn, Trail Speed, Spawning rate, Trail, Custom color 154 Metaballs A cool plasma type effect. \u25a6 \ud83c\udfa8 Speed 76 Meteor The primary color creates a trail of randomly decaying color \u22ee \ud83c\udfa8 Fx Speed, Trail length 77 Meteor Smooth Smoothly animated meteor \u22ee \ud83c\udfa8 Fx Speed, Trail length 135 Midnoise Perlin noise emanating from center. \u22ee \u266a \ud83c\udfa8 Fx, Bg Fade rate, Max. length 59 Multi Comet Like Scanner, but creates multiple trails \u22ee 70 Noise 1 Fast Noise shift pattern \u22ee \ud83c\udfa8 Fx Speed 71 Noise 2 Fast Noise shift pattern \u22ee \ud83c\udfa8 Fx Speed 72 Noise 3 Noise shift pattern \u22ee \ud83c\udfa8 Fx Speed 73 Noise 4 Noise sparkle pattern \u22ee \ud83c\udfa8 Fx Speed 107 Noise Pal Peaceful noise that's slow and with gradually changing palettes \u22ee \ud83c\udfa8 Speed, Scale 146 Noise2D \u25a6 \ud83c\udfa8 Speed, Scale 143 Noisefire A perlin noise based volume reactive fire routine. \u22ee \u266a Speed, Intensity 136 Noisemeter Volume reactive vu-meter. \u22ee \u266a \ud83c\udfa8 Fx, Bg Fade rate, Width 145 Noisemove Using perlin noise as movement for different frequency bins. \u22ee \u266b \ud83c\udfa8 Fx, Bg Speed of perlin movement, Fade rate 126 Octopus A cephalopod stuck in a whirlpool. \u25a6 \ud83c\udfa8 Speed, Offset X, Offset Y, Legs 62 Oscillate Areas of primary and secondary colors move between opposite ends, combining colors where they touch \u22ee 101 Pacifica Gentle ocean waves \u22ee \ud83c\udfa8 Speed, Angle 65 Palette Running color palette \u22ee \ud83c\udfa8 Cycle speed 98 Percent Lights up a percentage of segment \u22ee \ud83c\udfa8 Fx, Bg % of fill, One color 147 Perlin Move Using Perlin Noise for movement. \u22ee \ud83c\udfa8 Fx, Bg Speed, # of pixels, Fade rate 105 Phased Sine waves (in sourcecode) \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 109 Phased Noise Noisy sine waves \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 128 Pixels Random pixels \u22ee \u266a \ud83c\udfa8 Fx, Bg Fade rate, # of pixels 129 Pixelwave Pixels emanating from center \u22ee \u266a \ud83c\udfa8 Fx, Bg Speed, Sensitivity 97 Plasma Plasma lamp \u22ee \ud83c\udfa8 Fx Phase, Intensity 178 Plasma Ball A ball of plasma. \u25a6 \ud83c\udfa8 Speed, Fade, Blur 133 Plasmoid Sine wave based plasma. \u22ee \u266a \ud83c\udfa8 Fx, Bg Phase, # of pixels 174 Polar Lights The northern lights. \u25a6 Speed, Scale 95 Popcorn popping kernels \u22ee \ud83c\udfa8 Fx, Bg, Cs Speed, Intensity, Overlay 63 Pride 2015 Rainbow cycling with brightness variation \u22ee Speed 144 Puddlepeak Blast coloured puddles randomly up and down the strand with the 'beat'. \u22ee \u266a \ud83c\udfa8 Fx, Bg Fade rate, Puddle size, Select bin, Volume (min) 134 Puddles Blast coloured puddles based on volume. \u22ee \u266a \ud83c\udfa8 Fx, Bg Fade rate, Puddle size 162 Pulser Travelling waves. \u25a6 \ud83c\udfa8 Speed, Blur 78 Railway Shows primary and secondary color on alternating LEDs. All LEDs fade to their opposite color and back again \u22ee \ud83c\udfa8 1, 2 Speed, Smoothness 43 Rain Like Fireworks, but the blobs move \u22ee \u25a6 \ud83c\udfa8 Fx, Bg Speed, Spawning rate 9 Rainbow Displays rainbow colors along the whole strip \u22ee \ud83c\udfa8 Speed, Size 33 Rainbow Runner Like Chase, but the 2 LEDs light up in rainbow colors and leave a primary color trail \u22ee \ud83c\udfa8 Bg Speed, Size 5 Random Colors Applies a new random color to all LEDs \u22ee \ud83c\udfa8 Speed, Fade time 79 Ripple Effect resembling random water ripples \u22ee \u25a6 \ud83c\udfa8 Bg Speed, Wave #, Overlay 148 Ripple Peak Peak detection triggers ripples. \u22ee \u266a \ud83c\udfa8 Fx, Bg Fade rate, Max # of ripples, Select bin, Volume (min) 99 Ripple Rainbow Like ripple, but with a dimly lit changing background \u22ee \u25a6 \ud83c\udfa8 Speed, Wave # 185 Rocktaves Colours the same for each note between octaves, with sine wave going back and forth. \u22ee \u266b \ud83c\udfa8 Fx, Bg 15 Running Sine Waves scrolling \u22ee \ud83c\udfa8 Fx, Bg Speed, Wave width 52 Running Dual Sine waves in both directions \u22ee \ud83c\udfa8 L, Bg, R Speed, Wave width 16 Saw Sawtooth Waves scrolling \u22ee \ud83c\udfa8 Fx, Bg Speed, Width 10 Scan A single primary colored light wanders between start and end \u22ee \ud83c\udfa8 Fx, Bg, Cs Speed, # of dots, Overlay 11 Scan Dual Same as Scan but uses two lights starting at both ends \u22ee \ud83c\udfa8 Fx, Bg, Cs Speed, # of dots, Overlay 40 Scanner Dot moves between ends, leaving behind a fading trail \u22ee \ud83c\udfa8 Fx, Bg Speed, Fade rate 60 Scanner Dual Like Scanner, but with two dots running on opposite sides \u22ee \ud83c\udfa8 Fx, Bg, Cs Speed, Fade rate 122 Scrolling Text Edit segment name to set text (variables #DATE, #TIME, #DDMM, #MMDD, #HHMM, #HH, #MM; suffix with 0 to have leading 0s, i.e. #DATE0. MM specific: #FPS = current frames per second; #POW=estimated power (Ampere). Use segment grouping to increase text size on a large matrix. \u25a6 \ud83c\udfa8 Fx, Bg, Gradient Speed, Y Offset, Trail, Font size, Gradient, Overlay 181 Sindots Dots revolving in a circle while the 'camera' \u25a6 \ud83c\udfa8 Speed, Dot distance, Fade rate, Blur 108 Sine Controllable sine waves \u22ee 92 Sinelon Fastled sinusoidal moving eye \u22ee \ud83c\udfa8 Fx, Bg, Cs Speed, Trail 93 Sinelon Dual Sinelon from both directions \u22ee \ud83c\udfa8 Fx, Bg, Cs Speed, Trail 94 Sinelon Rainbow Sinelon in rainbow colours \u22ee \ud83c\udfa8 Cs Speed, Trail 125 Soap Like soap bubbles, but lasts longer. \u25a6 \ud83c\udfa8 Speed, Smoothness 0 Solid Solid primary color on all LEDs \u22ee 103 Solid Glitter Like Glitter, but with solid color background \u22ee Bg, Glitter color Intensity 83 Solid Pattern Speed sets number of LEDs on, intensity sets off \u22ee \ud83c\udfa8 Fg, Bg Fg size, Bg size 84 Solid Pattern Tri Solid Pattern with three colors \u22ee 1, 2, 3 Size 118 Spaceships Circling ships with fading trails. Homage to 80s spaceship shooter games. \u25a6 \ud83c\udfa8 Speed, Blur 20 Sparkle Single random LEDs light up in the primary color for a short time, secondary is background \u22ee \ud83c\udfa8 Fx, Bg Speed, Overlay 21 Sparkle Dark All LEDs are lit in the primary color, single random LEDs turn off for a short time \u22ee \ud83c\udfa8 Bg, Fx Speed, Intensity, Overlay 22 Sparkle+ All LEDs are lit in the primary color, multiple random LEDs turn off for a short time \u22ee \ud83c\udfa8 Bg, Fx Speed, Intensity, Overlay 85 Spots Solid lights with even distance \u22ee \ud83c\udfa8 Fx, Bg Spread, Width, Overlay 86 Spots Fade Spots, getting bigger and smaller \u22ee \ud83c\udfa8 Fx, Bg Spread, Width, Overlay 150 Squared Swirl Boxes moving around \u25a6 \ud83c\udfa8 Blur 61 Stream 2 \u263e \u22ee Speed 39 Stream \u263e \u22ee \ud83c\udfa8 Speed, Zone size 23 Strobe All LEDs are lit in the secondary color, all LEDs flash in a single short burst in primary color \u22ee \ud83c\udfa8 Fx, Bg Speed 25 Strobe Mega All LEDs are lit in the secondary color, all LEDs flash in several short bursts in primary color \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 24 Strobe Rainbow Same as strobe, cycles through the rainbow \u22ee \ud83c\udfa8 Bg Speed 166 Sun Radiation The sun! Doesn't support segments. \u25a6 Variance, Brightness 104 Sunrise Simulates a gradual sunrise or sunset. Speed sets: 0 - static sun, 1 - 60: sunrise time in minutes,60 - 120: sunset time in minutes - 60, above: \"breathing\" rise and set \u22ee \ud83c\udfa8 Time [min], Width 6 Sweep Switches between primary and secondary, switching LEDs one by one, start to end to start \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 36 Sweep Random Like Sweep, but uses random colors \u22ee \ud83c\udfa8 Speed 175 Swirl Several blurred circles. Looks good with pink plasma palette. Supports AGC. \u25a6 \u266a \ud83c\udfa8 Bg Swirl Speed, Sensitivity, Blur 116 TV Simulator TV light spill simulation \u22ee Speed, Intensity 173 Tartan Plaid pattern of horizontal and vertical bands. Makes a great kilt. \u25a6 \ud83c\udfa8 X scale, Y scale, Sharpness 44 Tetrix Falling blocks stack \u22ee \ud83c\udfa8 Fx, Bg Speed, Width, One color 13 Theater Pattern of one lit and two unlit LEDs running \u22ee \ud83c\udfa8 Fx, Bg Speed, Gap size 14 Theater Rainbow Same as Theater but uses colors of the rainbow \u22ee \ud83c\udfa8 Bg Speed, Gap size 35 Traffic Light Emulates a traffic light \u22ee \ud83c\udfa8 Bg Speed, US style 56 Tri Fade Fades the whole strip from primary color to secondary color to off \u22ee \ud83c\udfa8 1, 2, 3 Speed 55 Tri Wipe Like Wipe but turns LEDs off as \"third color\" \u22ee \ud83c\udfa8 1, 2, 3 Speed 17 Twinkle Random LEDs light up in the primary color with secondary as background \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 81 Twinklecat Twinkling with fast in / slow out \u22ee \ud83c\udfa8 Speed, Twinkle rate 80 Twinklefox FastLED gentle twinkling with slow fade in/out \u22ee \ud83c\udfa8 Speed, Twinkle rate 106 Twinkleup Twinkle effect with fade-in \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 50 Two Dots Two areas sweeping \u22ee \ud83c\udfa8 1, 2, Bg Speed, Dot size, Overlay 113 Washing Machine Spins, slows, reverses directions \u22ee \ud83c\udfa8 Speed, Intensity 140 Waterfall A volume AND FFT version of a Waterfall that has 'beat' support. \u22ee \u266b \ud83c\udfa8 Fx, Bg Speed, Adjust color, Select bin, Volume (min) 165 Waverly \u263e \u25a6 \u266a \ud83c\udfa8 Amplification, Sensitivity, No Clouds, Sound Pressure, AGC debug 184 Wavesins Beat waves and phase shifting. Looks OK in 2D'ish as well. \u22ee \ud83c\udfa8 Fx Speed, Brightness variation, Starting color, Range of colors, Color variation 127 Waving Cell If a bunch of eucaryotes went to a sports stadium and did the wave, it would look exactly like this. \u25a6 \ud83c\udfa8 Speed, Amplitude 1, Amplitude 2, Amplitude 3 3 Wipe Switches between primary and secondary, switching LEDs one by one, start to end \u22ee \ud83c\udfa8 Fx, Bg Speed, Intensity 4 Wipe Random Same as Wipe, but uses random colors \u22ee \ud83c\udfa8 Speed 207 Y\ud83d\udca1Big_Caleido \u263e \u25a6 Speed 224 Y\ud83d\udca1Caleido1 \u263e \u25a6 Speed 223 Y\ud83d\udca1Caleido2 \u263e \u25a6 Speed 222 Y\ud83d\udca1Caleido3 \u263e \u25a6 Speed 226 Y\ud83d\udca1Center_Field \u263e \u25a6 Speed 228 Y\ud83d\udca1Chasing_Spirals \u263e \u25a6 Speed 197 Y\ud83d\udca1Complex_Kaleido \u263e \u25a6 Speed 196 Y\ud83d\udca1Complex_Kaleido_2 \u263e \u25a6 Speed 195 Y\ud83d\udca1Complex_Kaleido_3 \u263e \u25a6 Speed 194 Y\ud83d\udca1Complex_Kaleido_4 \u263e \u25a6 Speed 193 Y\ud83d\udca1Complex_Kaleido_5 \u263e \u25a6 Speed 192 Y\ud83d\udca1Complex_Kaleido_6 \u263e \u25a6 Speed 225 Y\ud83d\udca1Distance_Experiment \u263e \u25a6 Speed 216 Y\ud83d\udca1Hot_Blob \u263e \u25a6 Speed 221 Y\ud83d\udca1Lava1 \u263e \u25a6 Speed 189 Y\ud83d\udca1Module_Experiment1 \u263e \u25a6 Speed 48 Y\ud83d\udca1Module_Experiment10 \u263e \u25a6 Speed 188 Y\ud83d\udca1Module_Experiment2 \u263e \u25a6 Speed 171 Y\ud83d\udca1Module_Experiment3 \u263e \u25a6 Speed 169 Y\ud83d\udca1Module_Experiment4 \u263e \u25a6 Speed 161 Y\ud83d\udca1Module_Experiment5 \u263e \u25a6 Speed 151 Y\ud83d\udca1Module_Experiment6 \u263e \u25a6 Speed 142 Y\ud83d\udca1Module_Experiment7 \u263e \u25a6 Speed 114 Y\ud83d\udca1Module_Experiment8 \u263e \u25a6 Speed 53 Y\ud83d\udca1Module_Experiment9 \u263e \u25a6 Speed 190 Y\ud83d\udca1Parametric_Water \u263e \u25a6 Speed 213 Y\ud83d\udca1Polar_Waves \u263e \u25a6 Speed 212 Y\ud83d\udca1RGB_Blobs \u263e \u25a6 Speed 211 Y\ud83d\udca1RGB_Blobs2 \u263e \u25a6 Speed 210 Y\ud83d\udca1RGB_Blobs3 \u263e \u25a6 Speed 209 Y\ud83d\udca1RGB_Blobs4 \u263e \u25a6 Speed 208 Y\ud83d\udca1RGB_Blobs5 \u263e \u25a6 Speed 229 Y\ud83d\udca1Rotating_Blob \u263e \u25a6 Speed 206 Y\ud83d\udca1SM1 \u263e \u25a6 Speed 198 Y\ud83d\udca1SM10 \u263e \u25a6 Speed 205 Y\ud83d\udca1SM2 \u263e \u25a6 Speed 204 Y\ud83d\udca1SM3 \u263e \u25a6 Speed 203 Y\ud83d\udca1SM4 \u263e \u25a6 Speed 202 Y\ud83d\udca1SM5 \u263e \u25a6 Speed 201 Y\ud83d\udca1SM6 \u263e \u25a6 Speed 200 Y\ud83d\udca1SM8 \u263e \u25a6 Speed 199 Y\ud83d\udca1SM9 \u263e \u25a6 Speed 220 Y\ud83d\udca1Scaledemo1 \u263e \u25a6 Speed 214 Y\ud83d\udca1Slow_Fade \u263e \u25a6 Speed 218 Y\ud83d\udca1Spiralus \u263e \u25a6 Speed 217 Y\ud83d\udca1Spiralus2 \u263e \u25a6 Speed 191 Y\ud83d\udca1Water \u263e \u25a6 Speed 227 Y\ud83d\udca1Waves \u263e \u25a6 Speed 219 Y\ud83d\udca1Yves \u263e \u25a6 Speed 215 Y\ud83d\udca1Zoom \u263e \u25a6 Speed 170 Y\ud83d\udca1Zoom2 \u263e \u25a6 Speed 187 \u2699\ufe0f ARTI-FX \u263e \u22ee \ud83c\udfa8 Fx Speed, Intensity, Custom 1, Custom 2, Custom 3 \u22ee \ud83c\udfa8 Fx Speed, Intensity, Custom 1, Custom 2, Custom 3"},{"location":"features/effects/#retired-effects","title":"Retired Effects","text":"Some effects get retired when they can be recreated with newer, more general effects.
Removed Effect Replacement Retired After Candy Cane Chase 2 - red/white 0.14.0 Dissolve Rnd Dissolve 0.14.0 Dynamic Smooth Dynamic 0.14.0 Halloween Chase 2 0.14.0 Merry Christmas Chase 2 - red/green 0.12.0 Police Two Dot 0.14.0 Police All Two Dots - red/blue w/ full intensity 0.13.0 Two Areas Two Dots - full intensity 0.13.0"},{"location":"features/ethernet-lan/","title":"Ethernet (LAN) compatibility","text":""},{"location":"features/ethernet-lan/#introduction","title":"Introduction","text":"WLED controllers are usually integrated into local network wirelessly (via WiFi). But there is also possibility to integrate WLED Controller into your network via Ethernet (LAN). Currently only ESP32 based controllers support Ethernet (classic, NOT new types like -S2, -C3, -S3 etc.).
"},{"location":"features/ethernet-lan/#preconditions-and-important-notes","title":"Preconditions and important notes","text":"Go to \"Config\" and then to \"WiFi Setup\". At the bottom of this page select the Ethernet type you use. Then click on \"Save & Connect\". Ready!
"},{"location":"features/ethernet-lan/#ethernet-controllers-and-adapters-supported-by-wled-as-of-november-2023","title":"Ethernet controllers and adapters supported by WLED (as of November 2023)","text":"Note: all controllers use GPIOs 19, 21, 22, 25, 26, 27 as they are required for ethernet and can not be changed. GPIOs additionally used are given in the table.
Name Features additional GPIOs used ABC! WLED V43 & compatible Isolated shield in accordance with IEEE 802.3 standard; LAN8720 based with proper reset line; adapter developed as Plug& Play solution for ABC! WLED Controller V43 but also might be used with other ESP32 boards 5, 17, 23, 33 ESP32-POE General purpose controller with integrated Ethernet 12, 17, 18, 23 ESP32Deux 17, 18, 23 KIT-VE Board from Espressif (ESP microcontroller manufacture company) 0, 5, 18, 23 QuinLED-Dig-Octa & T-ETH-POE 17, 18, 23 QuinLED-ESP32 5, 17, 18, 23 Serg74-ETH32 5, 17, 18, 23 TwilightLord-ESP32 5, 17, 18, 23 WESP32 0, 16, 17 WT32-ETH01 0, 16, 18, 23"},{"location":"features/macros/","title":"Macros","text":"Info
Also see Presets for 0.11.0+.
You are able to set custom actions (\"Macros\") in Time & Macro settings for the following events:
&M=
Boot preset
in 0.11)Each macro has the format of a standard HTTP API call without the IP. Optionally, the \"win&\" may be omitted. For example, the macro \"A=255\" sets the brightness to maximum. \"R=255&G=160&B=0\" sets the color to orange. You can specify up to 16 macros. (up to 250 in WLED 0.11 since the Macro functionality has been merged into the Presets feature)
Examples of how to use API-calls and define macros can be found in this issue and in this one.
The simplest macro example is getting a button to do your bidding. The default pin to which a button can be connected is GPIO 0 (D3 on NodeMCU, D1 Mini and others). Even though WLED uses the internal pull up resistors on input pins, this pin is ideally externally pulled high to 3.3V with a 10k resistor. The configured macro executes when the pin is pulled low (grounded). The desired macro is entered on the Time/Macros configuration page and then assigned to a short, long or double press. Like this:
The \"T=2\" macro toggles power to the LEDs (in this case long press). The \"FX=~\" macro steps through the effects (in this case short press).
You can set a preset to P1=1&P2=3&PL=~
, enter the preset number for your button, and this will step through presets 1 and 3. Change the \"3\" to whatever your highest preset is that you want to include.
The default (built-in) actions for button 0 are short-press: toggle on/off and long-press: select random color. Long-pressing for more than 6 seconds will open the WLED-AP with the default password (wled1234
). For further buttons, the default action for short press is cycling effects, long press ramp brightness, and double press cycle palettes.
Multiple buttons are implemented since 0.13 and allow a few different types of buttons to be connected to the ESP:
Button GPIO pin and type can be selected in the LED Settings page.
Each momentary button can have 3 different Presets assigned, for short press, long press or double press. Momentary push-buttons by default trigger shortly after the release of a button, to be able to detect if it has been pressed short, long or twice. When configuring the same preset number for short, long and double press, it will trigger directly when being pressed as of WLED 0.14.0-b2-2306020.
For switch type buttons you can assign only 2 presets, one for transition of switch from LOW to HIGH and second for the opposite transition from HIGH to LOW.
Selecting 0 for preset will use the default action. If you find that the default action is inverted for switch, please create presets for On and Off actions and assign them appropriately.
For assigning Presets to buttons use Time & Macros settings page.
Note: Button 0 has two, built-in functions. 1. Hold it down for >6 seconds and the Wi-Fi settings will be reset to default. 2. Hold it down for >12 seconds and flash memory is erased.
"},{"location":"features/macros/#analog-button","title":"Analog button","text":"Starting in WLED 0.13, analog \"buttons\" (e.g. a potentiometer) are supported. With the Short and Long columns set to 0, set the Double column in Button Actions to one of these values to configure:
Property Value Global brightness 250 Effect speed 249 Effect intensity 248 Palette 247 Primary color hue 200 Segment N opacity 0-32This potentiometer should be supplied 3.3V and GND, with it's output supplied to A0 (or any other ADC pin you specify), recommended 10K\u03a9 or greater.
Do not use ESP32 ADC2 GPIO pins for analog buttons
On ESP8266, you can only have a single analog button on pin A0, the pin set in the settings UI is ignored. On ESP32, only ADC1 pins will work for analog input while WiFi is active (pins 32-39). ADC2 pins will not work.
"},{"location":"features/macros/#global-brightness","title":"Global brightness","text":"Users planning to use a potentiometer for global brightness should be aware that wled is configured to turn off when the potentiometer is adjusted to either extreme - both maximum and minimum adjustments. Users who desire to disable this functionality may do so on the hardware side by adding resistors between the potentiometer and the rails.
Adding a resistor between the potentiometer and 3.3V prevents A0 from fully reaching 3.3V and allows the potentiometer to be adjusted to the maximum adjustment without powering off wled. A value of 7.5%-10% of the potentiometer value should be sufficient for this (~750\u03a9 for a 10K\u03a9 potentiometer). Similarly, added resistance between the potentiometer and GND prevents A0 from reaching 0V, and allows the potentiometer to be adjusted to the minimum adjustment without powering off wled. A value of 3-5% of the potentiometer value should be sufficient (~500\u03a9 for a 10K\u03a9 potentiomenter).
In both instances, the added resistances will slightly reduce the overall adjustment range, with a larger reduction for larger resistor choices. As such, A user who desires the maximum possible adjustment range should determine their needed resistance values experimentally by installing the potentiometer, adjusting for stable behavior at the desired extrema, measuring the voltage on A0, using the voltage divider equation to determine the optimal resistance, then retesting for confirmation.
"},{"location":"features/multi-strip/","title":"Multi-strip Support","text":""},{"location":"features/multi-strip/#multi-strip-support","title":"Multi strip support","text":"Starting in WLED 0.12.0, you are able to use multiple LED outputs from one ESP board! Pins and LED numbers can be easily configured in LED settings, you don't need to re-compile code for your specific setup. Custom binaries for multiple pins are now also a thing of the past!
There are a few tips and recomendations to keep in mind when designing your setup:
"},{"location":"features/multi-strip/#general","title":"General","text":"See Virtual Leds
"},{"location":"features/palettes/","title":"Palettes","text":"Version Info
Beginning in 0.14 up to 10 Custom Palletes can be uploaded.
PaletteID Name Description 0 Default The palette is automatically selected depending on the effect. For most effects, this is the primary color 1 Random Cycle The palette changes to a random one every few seconds. Subject to change 2 Color 1 A palette consisting only of the primary color 3 Colors 1 & 2 Consists of the primary and secondary color 4 Color Gradient A palette which is a mixture of all segment colors 5 Colors Only Contains primary, secondary and tertiary colors 6 Party Rainbow without green hues 7 Cloud Gray-blueish colors 8 Lava Dark red, yellow and bright white 9 Ocean Blue, teal and white colors 10 Forest Yellow and green hues 11 Rainbow Every hue 12 Rainbow bands Rainbow colors with black spots in-between 13 Sunset Dark blue with purple, red and yellow hues 14 Rivendell Desaturated greens 15 Breeze Teal colors with varying brightness 16 Red & Blue Red running on blue 17 Yellowout Yellow, fading out 18 Analoguous Red running on blue 19 Splash Vibrant pink and magenta 20 Pastel Different hues with very little saturation 21 Sunset 2 Yellow and white running on dim blue 22 Beech Different shades of light blue 23 Vintage Warm white running on very dim red 24 Departure Greens and white fading out 25 Landscape Blue, white and green gradient 26 Beach Teal and yellow gradient fading out 27 Sherbet Bright white, pink and mint colors 28 Hult White, magenta and teal 29 Hult 64 Teal and yellow hues 30 Drywet Blue and yellow gradient 31 Jul Pastel green and red 32 Grintage Yellow fading out 33 Rewhi Bright orange on desaturated purple 34 Tertiary Red, green and blue gradient 35 Fire White, yellow and fading red gradient 36 Icefire Same as Fire, but with blue colors 37 Cyane Desaturated pastel colors 38 Light Pink Desaturated purple hues 39 Autumn Three white fields surrounded by yellow and dim red 40 Magenta White with magenta and blue 41 Magred Magenta and red hues 42 Yelmag Magenta and red hues with a yellow 43 Yelblu Blue with a little yellow 44 Orange & Teal An Orange - Gray - Teal gradient 45 Tiamat A bright meteor with blue, teal and magenta hues 46 April Night Dark blue background with colorful snowflakes 47 Orangery Orange and yellow tones 48 C9 Christmas lights palette. Red - amber - green - blue 49 Sakura Pink and rose tones 50 Aurora Greens on dark blue 51 Atlantica Greens & Blues of the ocean 52 C9 2 C9 plus yellow 53 C9 New C9, but brighter and with a less purple blue 54 Temperature Temperature mapping 55 Aurora 2 Aurora with some pinks & blue 56 Retro Clown Yellow to purple gradient 57 Candy Vivid yellows, magenta, salmon and blues 58 Toxy Reaf Vivid aqua to purple gradient 59 Fairy Reaf Bright aqua to purple gradient 60 Semi Blue Dark blues with a bright blue burst 61 Pink Candy White, pinks and purple 62 Red Reaf Blue, aqua and red gradient 63 Aqua Flash Aqua gradient with a flash of yellow and white 64 Yelblu Hot Yellow, red, blue spectrum 65 Lite Light Faint white and purple 66 Red Flash Red gradient with burst of white in the center 67 Blink Red Dark blue to dark red gradient with burst of purple 68 Red Shift Vibrant yellow to blue gradient with magenta, purple and red 69 Red Tide Waves of yellow, orange and red 70 Candy2 Faded gradient of yellow, salmon and blue 71 Audio Responsive Ratio \ud83c\udf1c\ud83c\udfb8 Dynamic palette based on FFT audio analysis - sets the RGB value based on the relative amplitude of different frequencies 72 Audio Responsive Hue \ud83c\udf1c\ud83c\udfb8 Dynamic palette based on FFT audio analysis - sets the hue based on that frequency 73 Audio Responsive Ramp \ud83c\udf1c\ud83c\udfb8 Dynamic palette based on FFT audio analysis - palette that starts with black, but color based on audio data ### Custom PalettesAs of 0.14, up to 10 custom palettes can be uploaded by the user in JSON files named palette0.json
through palette9.json
The format closely resembles that of the palettes defined in palettes.h
with a position (0-255), red, green, blue for each color. An example of the content would be:
{\"palette\":[ \n 0, 255, 33, 4, \n 43, 255, 68, 25,\n 86, 255, 7, 25,\n 127, 255, 82, 103,\n 170, 255, 255, 242,\n 209, 42, 255, 22,\n 255, 87, 255, 65]}\n
Once a palette[0-9].json file has been created, it can be uploaded to the controller using the /edit
page (http://[controller-ip]/edit). The controller must be rebooted (/win&RB
) before the newly uploaded palettes will be available. After reboot, the custom palette(s) will be named ~ Custom [0-9] ~
in the Palettes section of the user interface.
The Pixel Art Converter tool aims to make it easier to show pixel art on a LED matrix panel, by converting any image to 2D pixel art and sending it to the WLED device. The file types PNG, JPG, WEBP and GIF have been tested to work with the tool.
"},{"location":"features/pixel-art-converter/#installation-approaches","title":"Installation Approaches","text":"There are three ways to install the pixel art converter:
pixartmin.htm
from the WLED-PixelArtConverter repositorypixartmin.htm
in a browserCompilation required
Compiling WLED from the source code is required. Follow the instructions on compiling WLED to do this.
-D WLED_ENABLE_PIXART
under the line that starts with build_flags =
in platformio_override.ini
Network connection
A network connection is required to connect to the CDN, hosting the JS library Ace, an embedded code editor.
pixartmin.html
file from the WLED-PixelArtConverter repositoryhttp://[device_ip_address]/edit
pixartmin.html
file using the UIhttp://[device_ip_address]/pixartmin.html
2D LED panels are natively supported by WLED but need some configuration for the software to show the 2D grid correctly.
2D Configuration
settings menu in WLED2D Matrix
Serpentine option
Setting the serpentine LED panel option incorrectly can lead to very confusing results that look almost correct but not quite. Enabling or Disabling the option depends on the characteristics of the 2D matrix
"},{"location":"features/pixel-art-converter/#usage","title":"Usage","text":"The Pixel Art Generator does not yet have a link in the WLED front-end, therefore head over to the web page: http://[device_ip_address]/pixart.htm
(default DHCP IP-address link).
On the web page:
Select an image that should be shown on the matrix display
This example uses a 16x16 pixel, happy version of the WLED mascot Akemi by Aircoookie.
A preview is displayed further down the web page.
Scaling option
It can help to use the Scale image
option, depending on the image size used.
Click on \"Send to device\" to push the generated image to the WLED device.
Presets can be used to save your favorite light configurations to apply later! You can compare them to the \"scenes\" feature present in some other smart devices.
"},{"location":"features/presets/#new-version-011","title":"New version (0.11+)","text":""},{"location":"features/presets/#overview","title":"Overview","text":"WLED 0.11.0 contains a major overhaul of presets, storing them in a /presets.json
file in an internal filesystem. This enables many new features, you can now have up to 250 presets and each of them can save all segments which are set up! Speaking of segments, the maximum number has been increased to 12 on ESP8266 and 16 on ESP32! Presets can now also contain both HTTP and JSON API commands, replacing the previous Macro functionality. Each preset can be named, so you'll be able to access it more easily!
The new preset system is quite a bit more advanced than the previous one, thus it is likely not as self-explanatory to use. Here you can find what each setting does and how to make best use of it!
\"Create Preset\" button Use this to save the current state as a permanent preset, or to add a new API macro.
Preset name Enter a nice name for your preset here. I would recommend putting something short, but to the point here, like Epic fireworks
or Slow fade
. All special characters and emoji are permitted (however, there must not be more than 6 consecutive whitespaces) If you leave this empty, you'll get a name based on the preset ID number, like Preset 16
.
Quick load label You can optionally add a short label up to 2 characters or 1 emoji long. It will show up in a small circle on top of the preset list for extra quick access without scrolling! I recommend using this for the presets you truly love.
Use current state/Overwrite with state This is enabled by default when adding a new preset and disabled when editing an existing preset. When enabled, it will write the current segment config, including all colors and effect, to the preset. When disabled, it will instead give you a textfield to enter a custom API command or show you the command currently saved.
Include brightness If disabled, the brightness value is not included in the preset. This can be useful e.g. when you want to control the brightness manually and want the preset to only set the effect.
Save segment bounds This is an important one. Make sure it is enabled for your boot preset, so that your segment config is properly restored on boot! When disabled, the segment start and stop LEDs are not included in the preset. This can be useful if you plan to make changes to your segment setup and don't want your presets to always reset it to the point it was when the preset was saved.
API command This accepts any HTTP or JSON API command! (only visible if the current state checkbox is unchecked) It replaces the previous macro functionality. If you know your JSON, you can even create playlists of other presets!
Some basic examples of API commands:
HTTP API JSON API Description T=2 {\"on\":\"t\"} Switch between on and off state (toggle). So when LEDs are off, they turn on and vice versa. T=1 {\"on\":true} The LEDs turn on (or no change if they were already on) T=0 {\"on\":false} The LEDs are switched off (or no change if they were already off) n.a. {\"on\":true, \"tt\":0} The LEDs are switched on, the LEDs light up immediately without slowly dimming, regardless of the global setting \u201eTransition\u201c. A=128 {\"bri\": 128} The brightness is set to 50%. Minimum value is 0, maximum value (100%) is 255. Therefore 128 means the brightness of 50% A=~10 {\"bri\":\"~10\"} The brightness is increased by 10. So if this was 100 before, it will be 110. A=~-20 {\"bri\":\"~-10\"} The brightness is decreased by 20. So if this was 100 before, it will be 80. R=255&G=0&B=0 {\"seg\":[{\"col\":[[255,0,0]]}]} The color of LEDs is set to red R=0&G=255&B=0&A=128&FX=0 {\"seg\":[{\"fx\":0, \"col\":[[0,255,0]]}], \"bri\":128} The color of LEDs is set to green, brightness to 50% (value 128) and effect to solid (FX=0) P1=1&P2=3&PL=~ {\"ps\":\"1~ 3~\"} Iterate between presets with IDs 1 to 3: When called up, the next preset is called up and so on in cycle: 1->2->3->1->2->3->1->\u2026Save to ID This is the ID the preset will be saved to. When creating a new preset, you likely won't have to change it as the lowest unused ID will be chosen automatically. If you change the ID on an existing preset and save, you can copy it to the new ID - change the name though.
Save and Delete buttons Now these are self-explanatory, but I said I'd cover each point :)
ID This is the number you'll want to use to apply this preset from a timed macro or automation!
"},{"location":"features/presets/#a-note-on-performance","title":"A note on performance","text":"This new preset system is quite fast where it matters, reading the presets. Applying a preset will typically take less than a tenth of a second.
However, due to a design choice of the LittleFS filesystem used by WLED, random writes to the preset file are very resource intensive. This means that while updating your presets, you might notice your light freezing and becoming unresponsive for up to a few seconds. Adding new presets is usually very fast, those performance issues will occur once you delete/edit/overwrite older presets and your preset file becomes very large, or when adding presets after deleting older ones.
I'm looking into ways to mitigate this situation as soon as possible! Meanwhile, to keep things snappy, I would recommend not having more than 50-ish single segment or a dozen of multi-segment presets.
"},{"location":"features/presets/#what-about-my-cool-presets-from-earlier-versions","title":"What about my cool presets from earlier versions?","text":"Don't worry, they (as well as your settings) will be automatically imported to the new system! And if you ever need to downgrade to v0.10 for some reason, they will still be there (although any changes made in v0.11 won't be applied)
"},{"location":"features/presets/#obtaining-preset-list","title":"Obtaining preset list","text":"Obtaining the preset list is possible with the /presets.json file Seeing the name of the current preset with the API only is not possible, you can only obtain its ID. Then you'd need some code to match it with the entries from presets.json (this is also what the UI does). See section \"Backing up/restoring presets\".
"},{"location":"features/presets/#saving-named-presets","title":"Saving named presets","text":"Save a named preset with {\"psave\":<preset number here>;\"n\":\"Preset name\",\"ib\":true,\"sb\":true}
To backup all presets, go to [WLED-IP]/edit
(OTA lock must be off), right click the presets.json
file and download! To restore, use the Choose file
and Upload
buttons.
Tip
If you want to create a preset that turns on the light to the last effect displayed, uncheck Use current state
and enter T=1
into the API Command field.
WLED supports schedules - that is, applying presets at a certain time automatically. Here is a simple guide to get it set up quickly!
Time & Macros
section in the WLED settings. Time-controlled presets
. There are 8 different timer slots available. Preset
column, enter the preset ID you noted earlier. -Hours are measured with the 24-hour clock, where midnight is 0:00. Entering \"24\" will instead activate the preset hourly.Note
This only applies the preset at the start of the specified minute. If you set up two presets, one to turn on the light at 7 and another to turn it off at 8, if WLED is booted at 7:30, the light will not turn on. This should not be an issue in most applications.
"},{"location":"features/presets/#applying-presets-at-sunrise-and-sunset","title":"Applying presets at sunrise and sunset","text":"Applying a preset at sunrise and/or sunset is also supported, the last two timed preset slots are used for this. To calculate the times, WLED needs your location. This is possible with the \"Get Location\" button in Time & Macro settings if accessed via a browser. If you are using the WLED app, you will need to open locate.wled.me in your browser and copy the coordinates over to the settings page manually. With the Minutes input field, you may specify an offset of up to 59 minutes before or 59 minutes after the actual sunrise/set time.
Location
Sunrise and sunset calculation do not work if you live in the polar circles (latitude >66.6N or >66.6S).
"},{"location":"features/presets/#earlier-versions-up-to-010","title":"Earlier versions (up to 0.10)","text":"There are 16 preset slots in total. In 0.9.0, the last preset (16) is capable of saving the entire segment configuration. All other presets only save a single segment (main segment, the first one by default) and restore that preset to all selected segments.
In the Favorites tab, the number buttons from 1-16 are the different save slots. Find a config you like, then toggle Saving mode on and click on a number to save the preset to that slot. If Saving mode is toggled off, you can restore presets with a single click.
"},{"location":"features/presets/#preset-cycle-up-to-0121","title":"Preset cycle (up to 0.12.1)","text":"With this feature, you can create an animation by automatically swapping between presets within a specified range. Keep in mind that any changes you make to effects/colors will be overridden once the system applies the next preset.
If you want to start the preset cycle on boot, go to LED settings and tick \"Save current preset cycle configuration as boot default
To modify the duration of the preset cycle, ensure the preset cycle box is unchecked before entering a new time value. Once updated, the preset cycle can be enabled again\"
Playlists supersede Preset cycle in 0.13.
"},{"location":"features/relay-control/","title":"Control a Relay","text":"Digital LED strips still use power when seemingly switched off, about 1W per 200 LEDs. In case you want to prevent that, you can completely cut power to the LEDs by adding a relay to your circuit. It is toggled by WLED when WLED is turned on/off (in the UI, or through other interfaces). No pin is allocated for a relay by default, but can be easily set in the LED preferences page. Previously, GPIO12 (Pin D6 on many devices) was set as the default and is confirmed to work well on most boards except the ESP32-C3.
When you decide that you want WLED to control a relay, make sure you buy a suitable relay board. Check what voltage you can supply from your controller to relay (available 3.3V or 5V pin or different voltage from external power source), and make sure the relay can be controlled by voltage level your board is providing (3.3V CMOS, 5V TTL). Note, some relays come with a jumper that lets you configure whether the relay switches at high or low level of signal, giving you maximum flexibility.
This page gives a clear description using a light bulb instead of a LED strip. And instead of the D1 mentioned there, with WLED, you use the pin you set.
The default WLED behavior is to turn the relay pin on (high) when the LEDs are on and off (low) when the LEDs are off. This can be changed in the LED Preferences page. Many relays are powered when the signal is LOW. See this thread.
Sometimes people ask whether they can control more than one relay through WLED, including controlling this all via Alexa. Controlling an extra relay separately from the RGB lights is not something WLED is designed to do, however you can modify the code to add that functionality. For that, make sure you can compile WLED from source unmodified first. Then, change #define ESPALEXA_MAXDEVICES 1 in line 71 of the wled.h file to 2. After that, just follow the API documentation on https://github.com/Aircoookie/Espalexa to add a new EspalexaDevice to the alexa.cpp file
Second option for controlling multiple relays is using a Multi Relay usermod. As with Alexa you will need to compile WLED from source an include Multi Relay usermod either by including -D USERMOD_MULTI_RELAY
in PlatformIO.ini or adding #define USERMOD_MULTI_RELAY
in wled.h
or my_config.h
. You can also override default number of relays by defining MULTI_RELAY_MAX_RELAYS
. Configuring usermod is done using Usermod settings page where you can define GPIO pins used, wether relay activates on HIGH or LOW logic, if the activation has any delay and if the relay can be controlled from the outside using MQTT message (external). MQTT topic for controlling relays is wled/[device]/relay/[relay_id]/command
and accepts on
, off
and toggle
messages. When the relay changes state a message with on
or off
is sent with the topic wled/[device]/relay/[relay_id]
.
How To: Use WLED to switch external relay with PIR sensor without affecting WLED state
If you do not want PIR (motion) sensor attached to WLED controller to trigger change of WLED state, but still want to control a legacy light, fan, etc. use the Multi Relay usermod and another relay attached to WLED controller. Create two presets for relay control (shown for switching relay off) and set up PIR and multi relay usermods as shown.
If you do not want button relay control just leave relay button at -1, the same goes for PIR sensor parameters (leave nighttime-only and/or off-only unchecked). Adjust preset numbers and GPIO pins to your liking. Multi relay usermod can also switch relay using MQTT messages or HTTP requests (check source code for available commands). Of course if you configured MQTT on your WLED device PIR sensor usermod will publish /motion topic to MQTT broker for your HA integration.
"},{"location":"features/segments/","title":"Segments","text":"Info
Starting in WLED 0.9.0, Segments are supported.
This feature allows you to set different zones on the LED strip, each running a different effect or color.
A segment is selected if the checkmark next to the segment number is checked. Changes you make to color or effects will apply to all selected segments. The color/effect that is shown in the web UI is that of the first selected segment.
There is one main segment, Segment 0 by default. This segment has a few important differences to the rest of the segments:
Tip: If you divide your strip into two segments, reverse the second one and select both, you can achieve very nice symmetrical effects!
Segment 0 has a Start LED of 0 and a Stop LED equal to the LED Count you defined in Configuration, LED Preferences. The Stop LED is not included in the Segment. Currently you can create a maximum of 10 segments. Presets 1-15 use only Segment 0 by default. Preset 16 is the only Preset that saves settings for Segments 1-10.
To display segment information select the down arrow in the Segment box. To add a Segment select \u201c+ Add Segment\u201d. Enter the Start and Stop LED as appropriate. Grouping and Spacing control the organization of the LEDs within the selected effect. To reverse the direction of an effect select Reverse Direction. To delete a Segment select the trash can. To save your Segment settings select the checkmark to the right of the Start and Stop LED numbers.
"},{"location":"features/segments/#grouping-and-spacing","title":"Grouping and Spacing","text":"When an effect changes the color of one LED, it is really changing the color of one LED group. Since the default group size is one, the effect normally only changes a single LED. When Grouping is set to two, the effect will light two LEDs using the same color. The two LEDs are treated as a single virtual LED.
To illustrate this, we can create a segment with 12 LEDS (physically referred to as LED 0 to LED 11) and select an effect that repeats three colors. When Grouping is set to one we see a repeating pattern of one red LED, one blue LED, and one green LED. When Grouping is set to two the segment of 12 physical LEDs becomes a segment of 6 virtual LEDs (virtualLED 0 to virtualLED 5). The same effect will now set the color of each virtual LED (which consists of two physical LEDs). The pattern becomes two red LEDs followed by two blue LEDs then two green LEDs.
Setting LED Output Grouping 1 Spacing 0 Grouping 2 Spacing 0As the pattern cycles, the group of LEDs will move together.
Setting LED Output Grouping 1 Spacing 0 Grouping 2 Spacing 0Spacing controls the space or gap between LEDs. The default spacing is zero, so normally there is no space between LEDs. When Spacing is set to one, every other LED will be lit. The number of virtual LEDs in the strip will be half the number of physical LEDs.
Again, we can create a segment with 12 LEDS (physically referred to as LED 0 to LED 11) and select an effect that repeats three colors. When Spacing is set to zero we see a repeating pattern of one red LED, one blue LED, and one green LED. When Spacing is set to one the segment of 12 physical LEDs becomes a segment of 6 virtual LEDs (virtualLED 0 to virtualLED 5). The same effect will now set the color of each virtual LED (which consists of the even numbered physical LEDs). The pattern becomes one red LED followed by a blank LED, one blue LED followed by a blank LED, then one green LED followed by a blank LED.
Setting LED Output Grouping 1 Spacing 0 Grouping 1 Spacing 1As the pattern cycles, only the virtual LEDs will be lit - the blank LEDs in between the virtual LEDs will always be off.
Setting LED Output Grouping 1 Spacing 0 Grouping 1 Spacing 1Grouping and Spacing can be combined to create many different custom LED layouts. In the example below, the strip of 12 physical LEDs has been configured to function as four virtual LEDs with a small gap between them.
Setting LED Output Grouping 2 Spacing 1 Grouping 2 Spacing 1"},{"location":"features/segments/#interleaving","title":"Interleaving","text":"This is an easy way to get a repeating pattern of colors using one segment per color.
"},{"location":"features/segments/#offset-in-a-segment","title":"Offset in a segment","text":"By default effects start in the first LED in the segment and finish in the last one. If the offset parameter in a segment is used, the effect start will be moved by the number of positions entered. It will continue to the last LED and then finish with the initial positions that were skipped.
For instance, let's assume assume a strip of 12 LEDs with the positions numbered as follows (like the examples above):
An offset value of 5 will make the effect start in the physical position 5, continue to position 11 and then finish with positions 0 through 4, like this:
A negative offset value is allowed and represents an offset starting from the last position in the segment. In our previous example, an offset of -2 will start the effect in position 10, like this:
The offset values is prioritized over grouping and/or spacing. For example, if the offset is 2, grouping 4 and spacing 1, the first group of 4 LEDs will start at the physical position number 2.
"},{"location":"features/segments/#effect-overlay","title":"Effect Overlay","text":"Some effects can be overlaid on the background of another effect. To use overlay, set up segments with overlapping pixels. The overlay effect must be playing on the segment with the higher id. If the Overlay option is checked, the background will not be painted and the effect from the lower segment will be displayed.
"},{"location":"features/settings/","title":"Settings","text":"Web-configurable settings are split in multiple sub-pages. This page is meant to clarify the purpose of each setting.
"},{"location":"features/settings/#wifi-settings","title":"WiFi Settings","text":"This sub-page offers options to connect the ESP to different WiFi/WLAN devices. (This section applies to WLED 0.8.5.)
Setting name Value Range Description Network Name String 0..32 The name (SSID) of your home WiFi. Spaces and some other characters are not supported. Network password String 0..64 The password of your home WiFi Static IP 4x 0..256 An optional static IPv4 address Static gateway 4x 0..255 In a static config, your gateway's IPv4 address Static subnet 4x 0..255 In a static config, this normally is 255.255.255.0 mDNS address String 0..32 Name of your device for the Bonjour/Zeroconf protocol Client IP - The current IP of the ESP in the home network AP SSID String 0..32 The name of the ESPs internal WiFi hotspot (Access Point) Hide AP name Y/N The ESPs Access Point won't appear in WiFi lists of other devices AP password String 0..64 The password of the ESPs WiFi Access Point AP WiFi channel 1..13 The 2.4G WiFi band of the AP. For advanced users AP opens select Condition on when to open the AP AP IP - The Access Point IPv4 address of the ESP (is 192.168.4.1 in most cases) WiFi sleep Y/N Disabling WiFi sleep can increase reliability, but increases power consumption"},{"location":"features/settings/#led-preferences","title":"LED Preferences","text":"This sub-page configures your LED & Hardware setup. (This section applies to WLED 0.14.1.)
Setting name Value Range Default Description Enable automatic brightness limiter on/off on Have WLED automatically reduce overall brightness so that maximum current draw from the power supply stays below a specified level Maximum current 300\u201365000 mA 850 mA Maximum allowable current draw that WLED will target [only appears if \"Enable automatic brightness limiter\" is on] LED voltage multiple options \"5V default (55mA)\" Voltage/type of LEDs [only appears if \"Enable automatic brightness limiter\" is on] Custom max. current 1\u2013255 50 Current draw of a single LED pixel set to full white [only appears if \"LED voltage\" is set to \"Custom\"]"},{"location":"features/settings/#hardware-setup","title":"Hardware Setup","text":""},{"location":"features/settings/#led-outputs","title":"LED outputs","text":"WLED supports multiple outputs. To add an output, click the plus button at the bottom of the \"LED outputs\": section; to remove the last output, click the minus button. Bellow the plus/minus buttons is an indication of how much of the memory allocated to LEDs is being used by the configuration.
All outputs share the same address space within WLED. By default, the first pixel of an output will be given an address that is one higher than the last pixel of the previous output, but this can be altered.
Each output has the following settings:
Setting name Value Range Default Description Type (represented by the output's number) multiple options WS281x Select the type of LEDs this output will be controlling Color order muliple options \"GRB\" Select which order your LEDs process color information (e.g. if your LEDs display red and green swapped, try changing it) [only appears if \"Type\" is set to a type that supports color order] Start/Index integer cummulative length of all previous outputs Define which address this output (or its first pixel) should use within WLED's address space [only editable if \"Custom bus start indices\" is on] Length integer 1 Define how many pixels are connected to this output [only appears if \"Type\" is set to a type that supports multiple pixels] (Data/Clk) GPIO(s) integer (blank) Tell WLED which GPIO pin(s) this output is connected to [number and description of GPIO settings will depend on the output's selected type] Reversed (rotated 180\u00b0) on/off off Mirrors the LEDs (last LED is first) [only appears if \"Type\" is set to a type that supports multiple pixels] Skip first LEDs 0\u2013length 0 Will turn off the first one or more LEDs and shift those remaining by that number (e.g. if the first LEDs are only used as a signal repeater) [only appears if \"Type\" is set to a type that supports multiple pixels] Off Refresh on/off off (typically) WLED doesn't send out data if all of its outputs are off, but some pixels (notably TM1814) will go into a demo mode after a period of inactivity, and setting forces WLED to periodically send out additional \"off\" commands [only appears if \"Type\" is set to a type that supports multiple pixels; default is \"on\" if \"Type\" is set to \"TM1814\"] Inverted output on/off off Invert the output's state (i.e. if the output is bright when it's supposed to be dark, set this to \"on\") [only appears if \"Type\" is set to a type that supports output inversion] IP address IPv4 (blank) Set the IP address where the output data should be sent to [only appears if \"Type\" is set to a type that supports network output] Auto-calculate white chanel from RGB multiple options \"None\" Selects whether WLED should attempted to generate white-channel information for colors that are only defined as red, green, and blue values [only appears if \"Type\" is set to a type that has more than three color channels]The following settings apply to all LED outputs:
Setting name Value Range Default Description Make a segment for each output on/off off Will automatically create a segment for each output, including the correct Start LED and Stop LED settings Custom bus start indices on/off off When on, custom \"Start\" or \"Index\" values can be set for each output (e.g. output 2 can be set so that it shows up as LED address 200 regardless of output 1's length) Use global LED buffer on/off on (WLED-AC) Improves the performance of WLED-wide brightness controls (including Automatic Brightness Limiting) at the expense of additional memory usage (\ud83c\udf1c) Use global LED buffer on/off off (WLED-MM) Similar to WLED-AC, however does not improve color accuracy or brightness controls. it can be useful for \"stacking\" several effects onto each other.Additionally, one or more Color Order Overrides can be defined by clicking the plus button. This is useful when you have LEDs with two different color orders sharing the same output. The following settings are available for each override:
Setting name Value Range Default Description Start integer 0 Define which address this color override should start it Length integer 1 Define how many pixels in a row should have their color setting overridden Color order muliple options \"GRB\" Same as \"Color order\" above"},{"location":"features/settings/#other-settings","title":"Other settings","text":"(This section applies to WLED 0.8.5; some of these settings no longer appear in 0.14.1.)
Setting name Value Range Description Turn on after power up Y/N Whether the lights should turn on after a reset Apply preset 0..16 Preset to load at boot (0 = none) Use Gamma for brightness Y/N Will correct brightness changes to make it appear more linear. Advised to leave off Use Gamma for color Y/N Will correct colors to match those on a monitor. Strongly advised to keep on Brightness factor 1..255 Factor to change master brightness if it is to dim/bright for a certain configuration Crossfade Y/N Whether to have a smooth fading transitional effect when changing colors/brightness Transition time 0..65535 How many milliseconds the transition lasts Enable transition for secondary color Y/N Enable Palette transitions Y/N Enable transitions for palettes (not affected by transition time) Timed light duration 1..255 How long the nightlight should stay on Target brightness 0..255 What brightness the light should have after time is over. 0=off. Fade down Y/N Gradually fades down the light over the duration instead of turning it off at the end Palette blending select Choose how the palette wraps at the end (seam)"},{"location":"features/settings/#user-interface-settings","title":"User Interface settings","text":"This sub-page changes the look of the web interface. (This section applies to WLED 0.8.5.)
Setting name Value Range Description Server description String 1..32 The name of the device as shown on the top of the UI. Differs from Alexa device name Sync button toggles... Y/N If enabled, both send and receive are toggled by the button in UI. If disabled, only sending is toggled and receiving is kept as configured in Sync settings."},{"location":"features/settings/#sync-settings","title":"Sync settings","text":"This sub-page configures external software synchronization interfaces. (This section applies to WLED 0.8.5.)
Setting name Value Range Description On/Off button enabled Y/N Check if there is a physical pushbutton connected to GPIO0 Infrared receiver type select Type of infrared receiver Broadcast UDP port 1..65535 All WLED lights you want to group together must have the same port Receive Brightness Y/N If there is a sync notification, whether its brightness should be applied Color Y/N Whether the color of the synced device should be applied Effects Y/N Whether the effect settings should be applied Send on direct change Y/N Whether to send a sync notification when state changed via web UI or API Send on button press Y/N Whether to send sync when toggled by button or IR Send Alexa notifications Y/N Whether to send sync after changed by Alexa (you may use Alexa groups instead) Send Hue notifications Y/N Whether to send sync after a connected Philips light changed Send Macro notifications Y/N Whether to send sync after a macro was triggered Send notifications twice Y/N Sends notifications twice (if you have issues with UDP packet loss) Receive UDP realtime Y/N Receive live UDP stream data (DRGB, WARLS, ...) Use E1.31 multicast Y/N Listen on multicast IP instead of unicast E1.31 start universe 1..63000 Only applies for multicast. If you want to set different content, set ESPs at least 8 universes apart Timeout 100..65000 Time after which to resume normal mode once stream has stopped. 65000 will keep the data indefinitely Force max brightness Y/N Realtime stream with max. brightness (unless limited by power brightness limiter) Disable realtime gamma correction Y/N Check if your host software does gamma correction already Realtime LED offset -255..255 Shift the realtime input by how many LEDs Emulate Alexa device Y/N Allows you to control the light via the Amazon Echo voice assistant. Requires reboot Alexa Invocation name String 1..32 The name you want the device to have for control via Alexa. Choose something easy she can understand Device Auth token String 40 You will get this in an e-mail during Blynk setup MQTT Broker IP or String 0..32 Connect to this host MQTT broker Device topic String 0..32 MQTT topic unique to this light Group topic String 0..32 MQTT topic for all lights in a group (room, floor, ...) Hue Bridge IP 4x 0..255 Your Hue bridge IPv4 address. Should be static to avoid reassigning Poll Hue light 0..99 The ID of the hue lamp you want to sync WLED to every x ms 100..65000 How often to poll. Smaller numbers decrease lag but might hurt bridge responsiveness ... Y/N Turn polling on/off Receive On/Off Y/N Turn on/off like the hue light Brightness Y/N Set brightness to that of the hue light Color Y/N Set color to that of the hue light Hue status - Shows the current connection status to a hue bridge Baud rate Various Set the default Serial connection Baud Rate"},{"location":"features/settings/#time-settings","title":"Time settings","text":"This sub-page configures automation tasks. (This section applies to WLED 0.8.5.)
Setting name Value Range Description Get time from NTP Y/N Whether to get the current time from the internet Use 24h format Y/N Use 24h clock format instead of AM/PM Time zone - Your time zone. Open an issue if yours is unsupported. DST is applied automatically UTC offset -65000..65000 Seconds to offset. If you want e.g. 1h offset, use 3600 Current local time - The local time the ESP has acquired. If set up correctly, should equal actual time Clock overlay - The special overlay to use. Allows to display a clock on the strip Countdown mode Y/N Allows to have a visual countdown towards a specific date API macro fields 16x String 0..64 Allows you to define custom API calls which can be triggered by events Boot Macro 0..16 Which macro to trigger after WiFi connected (0 is default action) Alexa On/Off Macros 2x 0..16 Which macros to trigger when turning on/off via Alexa Button Macro 0..16 Macro to trigger if button is short pressed. Default action is on/off toggle. Long Press 0..16 Macro to trigger if button is long pressed (>0.7s). Default action is random color. Double press 0..16 Macro for double click on button. Countdown-Over Macro 0..16 Macro to trigger when the countdown is over Timed-Light-Over Macro 0..16 Macro to trigger when timed light is done"},{"location":"features/settings/#security-settings","title":"Security settings","text":"This sub-page manages permissions and updates. (This section applies to WLED 0.8.5.)
Setting name Value Range Description Enable OTA lock Y/N If enabled, no firmware updates may be done via WiFi and some settings can't be changed. Passphrase String 0..32 To disable OTA lock, you need a password. The default is \"wledota\". Change it! Deny access to WiFi settings Y/N Disables changes to WiFi settings while locked Disable recovery AP Y/N If enabled, the module will not open an Access Point if connection to home WiFi failed. Factory reset Y/N Deletes all custom settings data (passwords, configuration, macros, presets) Manual OTA - If OTA is enabled, you can upload new binary firmware Enable ArduinoOTA Y/N Useful for developers. Be careful, can even be left on when OTA locked!"},{"location":"features/subpages/","title":"Web GUI Sitemap","text":"This is the sitemap of the module server. Access with \\<ESP-IP>/path (Example: 192.168.8.4/settings)
Path Description OTA rights required Since version / Default UI, index page No 0.2 /update Upload new firmware Yes 0.3 /win HTTP Request API (since 0.3) No 0.3 /json JSON API No 0.8.4 /json/state JSON state object No 0.8.4 /json/info JSON information No 0.8.4 /json/eff Effect name list No 0.8.4 /json/pal Palette name list No 0.8.4 /json/live Current colors of LEDs No 0.9.0 /liveview Live preview of current LEDs No 0.9.0 /settings Settings index page No 0.2 /settings/wifi WiFi Settings page Cnfg 0.5.0 /settings/led LED Settings page No 0.5.0 /settings/ui UI Settings page No 0.5.0 /settings/sync Sync Settings page No 0.5.0 /settings/time Time Settings page No 0.5.0 /settings/sec Security Settings page Yes 0.5.0 /welcome New User Welcome page No 0.5.0 /sliders UI, index page No 0.5.0 /reset Reboot module No 0.3 /version Returns build version No 0.3 /uptime Returns runtime in ms No 0.4 /freeheap Returns free memory No 0.4 /favicon.ico Page icon No 0.2 /teapot :) No 0.5.0 /edit Filesystem editor Yes 0.2 /u Custom usermod page 0.8.4 (?) /cpal.htm Custom palette editor 0.14.0-b3 /pixart.htm 2D Pixel Art converter (not compiled by default) 0.14.0-b3 /pxmagic.htm 2D Image converter 0.14.0-b4"},{"location":"features/subpages/#removed-sites","title":"Removed sites","text":"Path Description OTA rights required Versions /list Lists SPIFFS contents (if USEFS) Yes 0.2-0.8.3 /easter Joke page No 0.6.2 only /power Returns an estimate of used LED current No 0.5.0-0.8.3 /build Returns details about the build No 0.5.0-0.8.3 /cleareeprom Resets to factory defaults Yes 0.3-0.6.4 /down Kills software. Hard reset required. Yes 0.3-0.6.4 /url Returns current light setup API url No 0.9.1-0.14.0-b3"},{"location":"interfaces/blynk/","title":"Blynk","text":"Warning
The official Blynk v1 server is shut down as of January 2023. WLED v0.14.0-b1 binaries no longer have Blynk support enabled by default. This only works with the legacy Blynk app, for which new signups have been closed by the Blynk developer. WLED will either move to Blynk 2.0 or a different solution soon.
You can use the free (if you only use it for 1 WLED light) IoT cloud Blynk to control your WLED Lights with the beautiful Blynk app for Android and iOS!
With Blynk, you can also even control your lights when you are not connected to your home network!
"},{"location":"interfaces/blynk/#installation","title":"Installation","text":"You can use the sync button in Blynk to sync other WLED ESPs, just like with the web UIs!
If you have doubts about the security of using a 3rd party IoT cloud, don't worry. WLED will only attempt to connect to Blynk if you put the device token string into Sync settings! Keep in mind that your ESP needs to connect to an external server, which may cause lag.
"},{"location":"interfaces/ddp/","title":"Distributed Display Protocol","text":"NOT TO BE CONFUSED WITH UDP.
DDP is a protocol designed by 3waylabs outlined here on their website.
WLED listens for DDP packets on port 4048, as outlined by the protocol. Check the DDP documentation for more info about packet structure.
*Notice WLED does not read the optional timecodes in DDP packet headers. If you are implementing the protocol to send packets to WLED, do not bother implementing it
"},{"location":"interfaces/ddp/#example-implementations","title":"Example implementations","text":"dgram
with wled-client
in clean NodeJS environment.Version Info
As of version v0.14.0-b25 MM-WLED supports DMX input via MAX485. This is great when ArtNet or e1.31/sACN over WIFI is not suitable
"},{"location":"interfaces/dmx-input/#features-and-limitations","title":"features and limitations","text":"For the DMX feature to work, you'll need to use the V4 build varients. Define all the pins you are using in the DMX input section of the Sync Interfaces menu
"},{"location":"interfaces/dmx-input/#hardware-setup","title":"hardware setup","text":"The DMX interface require the use of an RS484 adapter such as the MAX485 transceiver connected to the pins defined in setup of the ESP in order to handle DMX input and RDM input and output.
You will need to use three GPIO pins that support output.
Do NOT use the pins on your ESP32 labelled RX and TX as your DMX pins!
Connect the RS485 power pins as follows
For information about the use of DMX with ESP8266, you might like to read this tutorial by Robert Oostenveld. Note this is just background information about the hardware and you do not need any of the code listed here when using WLED output.
"},{"location":"interfaces/dmx-input/#questions","title":"questions","text":"If you have further questions about this feature, you can ask on DMX Input Discord or reach me via github (@netmindz) or via WLED Discord (netmindz).
"},{"location":"interfaces/dmx-output/","title":"DMX","text":""},{"location":"interfaces/dmx-output/#dmx-output","title":"DMX output","text":"Version Info
As of version 0.9.2 WLED supports DMX output via MAX485. This is great for controlling DMX LED PAR lamps with WLED patterns.
"},{"location":"interfaces/dmx-output/#features-and-limitations","title":"features and limitations","text":"For the DMX feature to work, you'll need to compile WLED from source. It's not a big deal, you can do it! Here is the Quick Start guide. There you'll find the section \"i want to modify WLED\".
make sure, you can compile the latest version of WLED without any issues. Then continue.
Once that works, in wled00/wled.h you need to change the line //#define WLED_ENABLE_DMX
to #define WLED_ENABLE_DMX
Yes, you just remove the //, which enables the line and therefore DMX support.
Once you successfully uploaded the sketch to your board, you'll find a new entry \"DMX Output\" in your settings menu.
Grab the manual for your lamp and maybe some snacks, look up the dmx channels and set everything up accordingly.
The DMX output required the use of a MAX485 transceiver connected to the TX-pin of the ESP in order to produce DMX output.
I am currently working on an open source PCB design to go along with this feature.
For information about the use of DMX with ESP8266, you might like to read this tutorial by Robert Oostenveld. Note this is just background information about the hardware and you do not need any of the code listed here when using WLED output.
If you need to use another pin for output than the TX-pin, you'll need to change this in the ESP-Dmx library itself. This setting is located in src/dependencies/dmx/ESPDMX.cpp on line 31.
"},{"location":"interfaces/dmx-output/#questions","title":"questions","text":"If you have further questions about this feature, you can reach me via github (@jwingefeld), ICQ (30914656) or via WLED Discord (JvPeek).
"},{"location":"interfaces/dmx-output/#other-references","title":"other references","text":"WLED supports the E1.31 (sACN) realtime light protocol.
Version Info
As of WLED v0.10.0, Art-Net is alternatively supported. All information on this page applies for Art-Net as well. You will need to switch to Art-Net mode in Sync settings and reboot once.
Version Info
As of WLED v0.11.0, DDP is alternatively supported. Using DDP, the Multi RGB DMX mode is always used regardless of the DMX mode setting (as it is no DMX) You will need to switch to DDP mode in Sync settings and reboot once.
Version Info
As > WLED 0.14.0-b1, DMX Effect mode channel mapping changed. This is a breaking change in E131 sync behavior. Existing DMX setups using WLED Effect mode are likely to break. Solution: Adopt external DMX channel mappings according to the new Effect mode channel layout.
"},{"location":"interfaces/e1.31-dmx/#features","title":"Features","text":"Note: WLED > 0.14.0-b1 implements a basic priority handling. To enable it set E1.31 port priority UI config > 0. Packages < config priority will always be skipped. Higher priority senders will overrule lower priority package senders (timeout 3 seconds). Non-zero start code and E1.31 preview data is ignored.
Note: If you see issued with lag, you may see better performance if you disable Wi-Fi Multimedia (WMM) Mode QoS on your router
"},{"location":"interfaces/e1.31-dmx/#general-recommendations","title":"General Recommendations","text":"We highly recommend the LedFx project in combination with WLED! Configure WLED first, ensure devices are powered on and connected to your WiFi. To add WLED devices, in the 'Device Management', click on the Find WLED devices button. If you want to manually add devices, use more than 170 LEDs with LedFx, you need to go to additional settings and set \"Universe Size\" to 510 when adding the WLED device!
"},{"location":"interfaces/e1.31-dmx/#settings","title":"Settings","text":""},{"location":"interfaces/e1.31-dmx/#dmx-types","title":"DMX types","text":"Select the mode you want to use in Sync settings.
"},{"location":"interfaces/e1.31-dmx/#disabled","title":"Disabled","text":"Incoming E1.31 packets will be ignored.
"},{"location":"interfaces/e1.31-dmx/#single-rgb","title":"Single RGB","text":"All LEDs are set to the same color. 3 Channels: Red, Green, Blue
"},{"location":"interfaces/e1.31-dmx/#single-drgb","title":"Single DRGB","text":"All LEDs are set to the same color. 4 Channels: Master Dimmer, Red, Green, Blue
"},{"location":"interfaces/e1.31-dmx/#effect","title":"Effect","text":"Not a realtime mode & only support 1 universe. Allows setting WLED effect properties over E1.31 with 15 channels.
Channel Property 1 Master Dimmer 2 Effect mode ID 3 Effect speed 4 Effect intensity 5 Effect palette ID 6 Effect option 7 Red Primary 8 Green Primary 9 Blue Primary 10 Red Secondary 11 Green Secondary 12 Blue Secondary 13 Red Tertiary 14 Green Tertiary 15 Blue TertiaryThe effect option
channel is divided into 128 macro parts to control the various states that a segment can be in.
Using 2D effect options on a 1D strip has no effect.
Value Reverse Mirror 1D to 2D Map (2D only) Transpose (2D only) Mirror Y (2D only) Reverse Y (2D only) 0..1 Pixels 2..3 Pixels x 4..5 Pixels x 6..7 Pixels x x 8..9 Pixels x 10..11 Pixels x x 12..13 Pixels x x 14..15 Pixels x x x 16..17 Bar 18..19 Bar x 20..21 Bar x 22..23 Bar x x 24..25 Bar x 26..27 Bar x x 28..29 Bar x x 30..31 Bar x x x 32..33 Arc 34..35 Arc x 36..37 Arc x 38..39 Arc x x 40..41 Arc x 42..43 Arc x x 44..45 Arc x x 46..47 Arc x x x 48..49 Corner 50..51 Corner x 52..53 Corner x 54..55 Corner x x 56..57 Corner x 58..59 Corner x x 60..61 Corner x x 62..63 Corner x x x 64..65 x Pixels 66..67 x Pixels x 68..69 x Pixels x 70..71 x Pixels x x 72..73 x Pixels x 74..75 x Pixels x x 76..77 x Pixels x x 78..79 x Pixels x x x 80..81 x Bar 82..83 x Bar x 84..85 x Bar x 86..87 x Bar x x 88..89 x Bar x 90..91 x Bar x x 92..93 x Bar x x 94..95 x Bar x x x 96..97 x Arc 98..99 x Arc x 100..101 x Arc x 102..103 x Arc x x 104..105 x Arc x 106..107 x Arc x x 108..109 x Arc x x 110..111 x Arc x x x 112..113 x Corner 114..115 x Corner x 116..117 x Corner x 118..119 x Corner x x 120..121 x Corner x 122..123 x Corner x x 124..125 x Corner x x 126..127 x Corner x x x 128..129 x Pixels 130..131 x Pixels x 132..133 x Pixels x 134..135 x Pixels x x 136..137 x Pixels x 138..139 x Pixels x x 140..141 x Pixels x x 142..143 x Pixels x x x 144..145 x Bar 146..147 x Bar x 148..149 x Bar x 150..151 x Bar x x 152..153 x Bar x 154..155 x Bar x x 156..157 x Bar x x 158..159 x Bar x x x 160..161 x Arc 162..163 x Arc x 164..165 x Arc x 166..167 x Arc x x 168..169 x Arc x 170..171 x Arc x x 172..173 x Arc x x 174..175 x Arc x x x 176..177 x Corner 178..179 x Corner x 180..181 x Corner x 182..183 x Corner x x 184..185 x Corner x 186..187 x Corner x x 188..189 x Corner x x 190..191 x Corner x x x 192..193 x x Pixels 194..195 x x Pixels x 196..197 x x Pixels x 198..199 x x Pixels x x 200..201 x x Pixels x 202..203 x x Pixels x x 204..205 x x Pixels x x 206..207 x x Pixels x x x 208..209 x x Bar 210..211 x x Bar x 212..213 x x Bar x 214..215 x x Bar x x 216..217 x x Bar x 218..219 x x Bar x x 220..221 x x Bar x x 222..223 x x Bar x x x 224..225 x x Arc 226..227 x x Arc x 228..229 x x Arc x 230..231 x x Arc x x 232..233 x x Arc x 234..235 x x Arc x x 236..237 x x Arc x x 238..239 x x Arc x x x 240..241 x x Corner 242..243 x x Corner x 244..245 x x Corner x 246..247 x x Corner x x 248..249 x x Corner x 250..251 x x Corner x x 252..253 x x Corner x x 254..255 x x Corner x x x"},{"location":"interfaces/e1.31-dmx/#effect-white","title":"Effect + White","text":"Same as Effect
with additional whites = 18 channels.
Same as Effect
with 15 channels per segment; expect channel 1 = \"Segment Dimmer\"
.
All effect segment modes introduce an additional DMX segment spacing
. If spacing s = 0
subsequent DMX addresses for all segments are created. When s > 0
a gap of s
DMX addresses between segments is used. To calculate segment DMX fixture addresses:
Segment DMX Address (i) = DMXAddress + i * (dmxEffectChannels + s)\n
Where DMXAddress
= start address as configured in UI, dmxEffectChannels
= 15|18 depending on selected effect segment mode, s
= address gap as configured in UI and i
is the index id of each segment as existing.
Note: 1 DMX universe = max 512 DMX addresses. So max number of segments depends on start address, selected segment mode and configured DMX segment spacing. To calculate how many segments can be controlled:
Max segments = floor[ (512 - DMXAddress) / (dmxEffectChannels + s) ]\n
"},{"location":"interfaces/e1.31-dmx/#effect-segment-white","title":"Effect Segment + White","text":"Same as Effect Segment
including whites, so it uses 18 DMX channels per segment.
3 Channels per LED in sequence. LED 0 Red, LED 0 Green, LED 0 Blue, LED 1 Red, ... Default mode, equivalent to pre-0.9.1 E1.31. This is the mode you want to use for xLights and LedFx.
"},{"location":"interfaces/e1.31-dmx/#multiple-rgbw","title":"Multiple RGBW","text":"Like Multiple RGB
+ additional white channels.
Like Multiple RGB
, but the first channel is a brightness control. Master Dimmer, LED 0 Red, LED 0 Green, ...
Trigger presets and control brightness. 2 Channels: Brightness, Preset ID
"},{"location":"interfaces/http-api/","title":"HTTP Request API","text":"Hint
While this API is not deprecated, it is highly recommended to use the JSON API instead of the HTTP API for new integrations, as it is structured in a better way and allows efficient use of newer features like segments, presets, and playlists.
WLED's HTTP API allows you to set many properties of your lights, even more than the index page UI supports, via a simple GET web request.
Help
Unsure how all this API stuff works? Check out this amazing guide by tynick!
The basic URL scheme is: [ipaddress]/win
. This will return an XML file with some current values (see bottom of page). Parameters can be added to control some of the variables.
192.168.4.1/win&A=255
sets the brightness to maximumled.local/win&A=128&FX=0
sets the brightness to half and the effect to SolidIn conjunction with a router port forwarding this can be used to automate WLED, for example via IFTTT.
Add one or multiple of the following parameters after the base URL/IP to change values: (if the parameter is unknown or the value illegal nothing will happen)
"},{"location":"interfaces/http-api/#led-control","title":"LED control","text":"Parameter Value Range Description Since Version &A= 0 to 255 Master brightness 0.2 &T= 0, 1, or 2 Master Off/On/Toggle 0.3 &R= 0 to 255 Primary Red value 0.2 &G= 0 to 255 Primary Green value 0.2 &B= 0 to 255 Primary Blue value 0.2 &W= 0 to 255 Primary White value 0.4 &FX= 0 to 101 LED Effect Index 0.3 &SX= 0 to 255 Effect Speed 0.3 &IX= 0 to 255 Effect Intensity 0.5.0 &FP= 0 to 46 FastLED Palette 0.8.0 &NL= 0 to 255 Nightlight active and duration in minutes 0.3 &ND none Toggles nightlight on but uses default duration 0.6.3 &NT= 0 to 255 Nightlight target brightness 0.5.0 &NF= 0 to 2 Fade Nightlight, 1 = fade brightness only, 2 = additionaly fade color from primary to secondary color 0.5.0"},{"location":"interfaces/http-api/#advanced","title":"Advanced","text":"Parameter Value Range Description Since Version &CL= HEX/DEC Primary color 0.8.0 &C2= HEX/DEC Secondary color 0.8.0 &C3= HEX/DEC Third color 0.8.0 &R2= 0 to 255 Secondary Red value 0.4 &G2= 0 to 255 Secondary Green value 0.4 &B2= 0 to 255 Secondary Blue value 0.4 &W2= 0 to 255 Secondary White value 0.4 &HU= 0 to 65535 Hue 0.5.1 &SA= 0 to 255 Saturation (only in conjunction with Hue) 0.5.1 &H2 none Hue + Saturation will set secondary color 0.5.1 &SR= 0 or 1 Set Primary/Secondary color to random hue 0.4 &SC none Swap primary and secondary color 0.4"},{"location":"interfaces/http-api/#use-of-hex-values","title":"Use of hex values","text":"Hex values need to be prefaced with the character h or H. The normal format is RRGGBB
. If the led strip is RGBW, the hex format is WWRRGGBB
. Note: In the UI the format is RRGGBBWW
, so the values cannot be copied without a transformation.
Loxone offers two commands. One for RGB values and one for brightness and color temperature.
Parameter Syntax Range Description Since Version &LX= BBBGGGRRR 0 - 100100100 Loxone RGB value for primary color. Each color (RRR
,GGG
,BBB
) is specified in the range from 0 to 100%. 0.11 &LX= 20bbbtttt 200002700 - 201006500 Loxone brightness and color temperature values for primary color. Brightness bbb
is specified in the range 0 to 100%. tttt
defines the color temperature in the range from 2700 to 6500 Kelvin. 0.11 &LY= BBBGGGRRR 0 - 100100100 Loxone RGB value for secondary color. Each color (RRR
,GGG
,BBB
) is specified in the range from 0 to 100%. 0.11 &LY= 20bbbtttt 200002700 - 201006500 Loxone brightness and color temperature values for secondary color. Brightness bbb
is specified in the range 0 to 100%. tttt
defines the color temperature in the range from 2700 to 6500 Kelvin. 0.11"},{"location":"interfaces/http-api/#notifications","title":"Notifications","text":"Parameter Value Range Description Since Version &RN= 0 or 1 Receive UDP Notifications 0.3 &SN= 0 or 1 Send UDP Notifications 0.3 &NN none No notification for this request 0.3 &HP= 0 to 99 Sets Hue polling light ID (0 is off) 0.5.1"},{"location":"interfaces/http-api/#presets","title":"Presets","text":"Parameter Value Range Description Since Version &PS= 1 to 16 Saves current setup to preset. Preset 255 can be used and is temporary/not persistent. 0.4 &PL= 1 to 250 Applies entire preset 0.4 &P1= 1 to 249 First cycle preset 0.6.3 &P2= 2 to 250 Last cycle preset 0.6.3 &TT= 0 to 65000 Set transition time (ms) 0.6.3"},{"location":"interfaces/http-api/#macros","title":"Macros","text":"Parameter Value Range Description Since Version &M= 1 to 16 Apply macro (deprecated, added for compatibility with pre-0.11 automations) 0.5.0"},{"location":"interfaces/http-api/#segments","title":"Segments","text":"It is highly recommended to use the JSON API when dealing with Segments.
Parameter Value Range Description Since Version &SM= 0 to 9 Set the main segment (values are reported to XML) 0.9.0 &SS= 0 to 9 Select segment to apply THIS api call to 0.9.0 &SV= 0, 1, or 2 Set segment selected (2 unselects others) 0.9.0 &S= 0 to ledcount-1 Set segment start 0.9.0 &S2= 0 to ledcount Set segment stop 0.9.0 &GP= 1 to 255 Set segment grouping 0.9.1 &SP= 0 to 255 Set segment spacing 0.9.1 &RV= 0 or 1 Reverse/Flip Segment direction 0.9.1 &SB= 0 to 255 Segment brightness 0.10.0"},{"location":"interfaces/http-api/#general-and-experimental","title":"General and Experimental","text":"Parameter Value Range Description Since Version &RB none Reboot WLED 0.10.0 (?) &ST= 32bit Current UTC time in Unix epoch 0.4 &CT= 32bit UTC time for countdown end 0.4 &MD= 0 or 1 Set slider mode to RGB/HSB 0.3 &AX= 0 to 255 Debug feature, can be configured for general IO 0.3 &IN none Server will not respond to this request (internal) 0.3 &OL= 0 to 255 Experimental overlays 0.3 &L= 0 to 255 Lock pixel 0.4 &L2= 0 to 255 Lock pixel range L to L2 0.4 &UL none Unlock instead (used in conjunction with L and L2) 0.4 &NX= String 1..6 Cronixie clockface 0.4 &NM= 0 or 1 Cronixie Time or Countdown mode 0.4 &NB= 0 or 1 Cronixie Backlight 0.4 &IT none Include UI color theme in API response 0.8.2 &RD= 0 or 1 Toggle realtime UDP 0.8.4 &LO= 0-2 Live data override. 0 is off, 1 is override until live data ends, 2 is override until ESP reboot 0.10.2 &NP none Advance to the next preset in a playlist 0.15"},{"location":"interfaces/http-api/#xml-response","title":"XML response","text":"This is the XML file sent as response to every API call.
Parameter Value Range Description ac 0 to 255 Master Brightness cl 3x 0..255 Primary Color RGB cs 3x 0..255 Secondary RGB ns 0 or 1 Notification Sending on nr 0 or 1 Notification Receive on nl 0 or 1 Nightlight active nf 0 or 2 Nightlight Fade type nd 0 to 255 Nightlight delay nt 0 to 255 Nightlight target brightness fx 0 to 73 Effect index sx 0 to 255 Effect speed ix 0 to 255 Effect intensity fp 0 to 43 FastLED palette wv -1 to 255 Primary White value ws 0 to 255 Secondary White ps 0 to 255 Current Preset cy 0 or 1 Preset Cycling enabled md 0 or 1 RGB or HSB UI mode ds String 0..32 Server description ss 0 to 12 Segment ID"},{"location":"interfaces/http-api/#in-decrementing-values","title":"In-/decrementing values","text":"You can use the ~
character to easily set values relative to their current value. This is currently supported for the following parameters: A, R, G, B, W, R2, G2, B2, W2, FX, SX, IX, FP, PL
For example, use PL=~
to go to the next preset. Using just ~
without a number will increase the value by 1, ~-
will decrease it by 1. The value will then wrap around, so using A=~-
when A is 0 will set A to 255.
You can also specify by how much to change the value. For example, using A=~10
will increase the brightness by 10. In case of using a number behind ~
, the value will clip (so it will not wrap around, if the maximum brightness is set, A=~10
will not have any effect)
To setup a Macro for a Button to advance to the next Preset, use win&P1=1&P2=30&PL=~ P1 will equal the first Preset of the rotation while P2 will be the last Preset.
"},{"location":"interfaces/infrared/","title":"Infrared","text":"Version Info
Since v0.8.2, infrared control from various IR remotes is supported for ESP8266 and since v0.9.0 for ESP32, too.
A dedicated infrared receiver module is required and must be connected to the WLED Controller. For example, KY-022 or TSOP38238 are confirmed to work and inexpensive. These receivers each have three pins: 3.3V, GND and IR data. IR data pin must be connected to a free GPIO pin. This GPIO must then be set as IR GPIO under \"Config->LED Preferences\" (The default sensor pin is GPIO4).
Warning
IR receiving will not work on ESP8266 if you use any LED pin other than GPIO 1, 2, or 3 for digital LED strips.
"},{"location":"interfaces/infrared/#supported-ir-remotes","title":"Supported IR remotes","text":"To use IR remote go to Settings
, Sync Interfaces
and change the value for Infrared receiver type
according to the IR remote type of the following list:
Since version WLED 14.0-beta3: An ESP-NOW compatible remote control is supported. An example of this is the \u201eWIZmote\u201c remote control. This is based on an ESP microcontroller. ESP-NOW can be activated in WLED settings. You have to enter the Hardware MAC address of the remote control. This is determined by clicking on any button on the remote control and copying the last received MAC address from the \"Last Seen\" field to the \"Hardware MAC\" field in WLED ESP-NOW settings (\u201cConfig->WiFi Setup\u201d) and saving it with \"Save\". Advantages: no special receiver needs to be attached to the WLED controller and the signals are transmitted via radio network. Therefore there is no line of sight between the remote control and the WLED controller required, as is the case with an IR remote control. The 4 buttons \"1\"-\"4\" of the WIZmote remote control are linked to presets 1 to 4. The meaning of other keys is self-explanatory. Attention: WIZmote needs two good quality AAA batteries to work properly. If the batteries are too weak, the correct signal will not be sent, even if the blue LED on the remote control lights up briefly, actually indicating signal transmission.
"},{"location":"interfaces/json-api/","title":"JSON API","text":"WLED versions since 0.8.4 implement a powerful JSON API over HTTP. It is accessible using the /json
subpage.
Sending a GET request will return an object similar to the sample below The response consists of four objects:
state
contains the current state of the light. All values may be modified by the client (see below)info
contains general information about the device. No value can be modified using this APIeffects
contains an array of the effect mode namespalettes
contains an array of the palette namesYou may also obtain those objects individually using the URLs /json/state
/json/info
/json/eff
, and /json/pal
.
Reserved effect IDs
In WLED versions 0.14+, some effects are unsupported in certain builds (e.g. some audio reactive effects may only work on ESP32). In order for each effect to have an unique ID on all devices, having unsupported ones in between supported ones is possible. If called, these will fallback to the Solid effect, in the effects list they have the name RSVD
or -
. To improve user experience, it is recommended to remove effects with the names RSVD
or -
form the UI effect selection.
WLED JSON API Library in rust. Even if you are not using rust, or don't know how to read rust, the up-to-date JSON structure is included and documented in this project.
"},{"location":"interfaces/json-api/#setting-new-values","title":"Setting new values","text":"Sending a POST request to /json
or /json/state
with (parts of) the state object will update the respective values. Example: {\"on\":true,\"bri\":255}
sets the brightness to maximum. {\"seg\":[{\"col\":[[0,255,200]]}]}
sets the color of the first segment to teal. {\"seg\":[{\"id\":X,\"on\":\"t\"}]}
and replacing X with the desired segment ID will toggle on or off that segment.
CURL example
This will toggle on and off and return the new state (v0.13+): curl -X POST \"http://[WLED-IP]/json/state\" -d '{\"on\":\"t\",\"v\":true}' -H \"Content-Type: application/json\"
Sample JSON API response (v0.8.4):
{\n \"state\": {\n \"on\": true,\n \"bri\": 127,\n \"transition\": 7,\n \"ps\": -1,\n \"pl\": -1,\n \"nl\": {\n \"on\": false,\n \"dur\": 60,\n \"fade\": true,\n \"tbri\": 0\n },\n \"udpn\": {\n \"send\": false,\n \"recv\": true\n },\n \"seg\": [{\n \"start\": 0,\n \"stop\": 20,\n \"len\": 20,\n \"col\": [\n [255, 160, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0]\n ],\n \"fx\": 0,\n \"sx\": 127,\n \"ix\": 127,\n \"pal\": 0,\n \"sel\": true,\n \"rev\": false,\n \"cln\": -1\n }]\n },\n \"info\": {\n \"ver\": \"0.8.4\",\n \"vid\": 1903252,\n \"leds\": {\n \"count\": 20,\n \"rgbw\": true,\n \"pin\": [2],\n \"pwr\": 0,\n \"maxpwr\": 65000,\n \"maxseg\": 1\n },\n \"name\": \"WLED Light\",\n \"udpport\": 21324,\n \"live\": false,\n \"fxcount\": 80,\n \"palcount\": 47,\n \"arch\": \"esp8266\",\n \"core\": \"2_4_2\",\n \"freeheap\": 13264,\n \"uptime\": 17985,\n \"opt\": 127,\n \"brand\": \"WLED\",\n \"product\": \"DIY light\",\n \"btype\": \"src\",\n \"mac\": \"60019423b441\"\n },\n \"effects\": [\n \"Solid\", \"Blink\", \"Breathe\", \"Wipe\", \"Wipe Random\", \"Random Colors\", \"Sweep\", \"Dynamic\", \"Colorloop\", \"Rainbow\",\n \"Scan\", \"Dual Scan\", \"Fade\", \"Chase\", \"Chase Rainbow\", \"Running\", \"Saw\", \"Twinkle\", \"Dissolve\", \"Dissolve Rnd\",\n \"Sparkle\", \"Dark Sparkle\", \"Sparkle+\", \"Strobe\", \"Strobe Rainbow\", \"Mega Strobe\", \"Blink Rainbow\", \"Android\", \"Chase\", \"Chase Random\",\n \"Chase Rainbow\", \"Chase Flash\", \"Chase Flash Rnd\", \"Rainbow Runner\", \"Colorful\", \"Traffic Light\", \"Sweep Random\", \"Running 2\", \"Red & Blue\",\"Stream\",\n \"Scanner\", \"Lighthouse\", \"Fireworks\", \"Rain\", \"Merry Christmas\", \"Fire Flicker\", \"Gradient\", \"Loading\", \"In Out\", \"In In\",\n \"Out Out\", \"Out In\", \"Circus\", \"Halloween\", \"Tri Chase\", \"Tri Wipe\", \"Tri Fade\", \"Lightning\", \"ICU\", \"Multi Comet\",\n \"Dual Scanner\", \"Stream 2\", \"Oscillate\", \"Pride 2015\", \"Juggle\", \"Palette\", \"Fire 2012\", \"Colorwaves\", \"BPM\", \"Fill Noise\", \"Noise 1\",\n \"Noise 2\", \"Noise 3\", \"Noise 4\", \"Colortwinkle\", \"Lake\", \"Meteor\", \"Smooth Meteor\", \"Railway\", \"Ripple\"\n ],\n \"palettes\": [\n \"Default\", \"Random Cycle\", \"Primary Color\", \"Based on Primary\", \"Set Colors\", \"Based on Set\", \"Party\", \"Cloud\", \"Lava\", \"Ocean\",\n \"Forest\", \"Rainbow\", \"Rainbow Bands\", \"Sunset\", \"Rivendell\", \"Breeze\", \"Red & Blue\", \"Yellowout\", \"Analogous\", \"Splash\",\n \"Pastel\", \"Sunset 2\", \"Beech\", \"Vintage\", \"Departure\", \"Landscape\", \"Beach\", \"Sherbet\", \"Hult\", \"Hult 64\",\n \"Drywet\", \"Jul\", \"Grintage\", \"Rewhi\", \"Tertiary\", \"Fire\", \"Icefire\", \"Cyane\", \"Light Pink\", \"Autumn\",\n \"Magenta\", \"Magred\", \"Yelmag\", \"Yelblu\", \"Orange & Teal\", \"Tiamat\", \"April Night\"\n ]\n}\n
"},{"location":"interfaces/json-api/#overview-of-values","title":"Overview of values","text":""},{"location":"interfaces/json-api/#state-object","title":"State object","text":"JSON key Value range Description on bool On/Off state of the light. You can also use \"t\"
instead of true
or false
to toggle. bri 0 to 255 Brightness of the light. If on is false
, contains last brightness when light was on (aka brightness when on is set to true). Setting bri to 0 is supported but it is recommended to use the range 1-255 and use on: false
to turn off. The state response will never have the value 0
for bri. transition 0 to 65535 Duration of the crossfade between different colors/brightness levels. One unit is 100ms, so a value of 4
results in atransition of 400ms. tt 0 to 65535 Similar to transition, but applies to just the current API call. Not included in state response. ps -1 to 250 ID of currently set preset. 1~17~
can be used to iterate through presets 1-17, or 4~10~r
to select random preset between presets 4 and 10 (inclusive). pss 0 to 65535 Bitwise indication of preset slots (0 - vacant, 1 - written). Always 0 in 0.11. Not changable. Removed as of v0.11.1 psave 1 to 250 (16 prior to 0.11) Save current light config (state) to specified preset slot. Not included in state response. pl -1 to 250 ID of currently set playlist. (read-olny) pdel 1 to 250 Preset ID to delete. Not included in state response. nl.on bool Nightlight currently active nl.dur 1 to 255 Duration of nightlight in minutes nl.fade bool If true
, the light will gradually dim over the course of the nightlight duration. If false
, it will instantly turn to the target brightness once the duration has elapsed. Removed in 0.13.0 (use mode instead) nl.mode 0 to 3 Nightlight mode (0: instant, 1: fade, 2: color fade, 3: sunrise) (available since 0.10.2) nl.tbri 0 to 255 Target brightness of nightlight feature nl.rem -1 to 15300 Remaining nightlight duration in seconds, -1 if not active. Only in state response, can not be set. udpn.send bool Send WLED broadcast (UDP sync) packet on state change udpn.recv bool Receive broadcast packets udpn.sgrp 0 to 255 Bitfield for broadcast send groups 1-8 udpn.rgrp 0 to 255 Bitfield for broadcast receive groups 1-8 udpn.nn bool Don't send a broadcast packet (applies to just the current API call). Not included in state response. v bool If set to true in a JSON POST command, the response will contain the full JSON state object. Not included in state response rb bool If set to true, device will reboot immediately. Not included in state response. live bool If set to true, enters realtime mode and blanks the LEDs. The realtime timeout option does not have an effect when this command is used, WLED will stay in realtime mode until the state (color/effect/segments, excluding brightness) is changed. It is expected that {\"live\":false}
is sent once live data sending is terminated. Not included in state response. lor 0, 1, or 2 Live data override. 0 is off, 1 is override until live data ends, 2 is override until ESP reboot (available since 0.10.0) time uint32 Set module time to unix timestamp. Not included in state response. mainseg 0 to info.leds.maxseg-1 Main Segment seg Object or Array of objects (see below) Segments are individual parts of the LED strip. Since 0.9.0 this enables running different effects on differentparts of the strip. playlist object Custom preset playlists. Not included in state response. (available since 0.11.0) tb uint32 Sets timebase for effects. Not reported. ledmap 0 to 9 Load specified ledmap (0 for ledmap.json
, 1-9 for ledmap1.json
to ledmap9.json
). See mapping. Not included in state response. (available since 0.14.0) rmcpal bool Remove last custom palette if set to true
. Not included in state response. (available since 0.14.0) np bool Advance to the next preset in a playlist if set to true
. Not included in state response. (available since 0.15)"},{"location":"interfaces/json-api/#contents-of-the-segment-object","title":"Contents of the segment object","text":"Notice: start, stop, and len are not changeable in 0.8.4. Any segment with id > 0 is ignored. Unless stated otherwise, every value may be changed via an HTTP POST request. The tertiary color is not gamma-corrected in 0.8.4, but is in subsequent releases.
JSON key Value range Description id 0 to info.maxseg -1 Zero-indexed ID of the segment. May be omitted, in that case the ID will be inferred from the order of the segment objects in the seg array. start 0 to info.leds.count -1 LED the segment starts at. For 2D set-up it determines column where segment starts, from top-left corner of the matrix. stop 0 to info.leds.count LED the segment stops at, not included in range. If stop is set to a lower or equal value than start (setting to0
is recommended), the segment is invalidated and deleted. For 2D set-up it determines column where segment stops, from top-left corner of the matrix. startY 0 to matrix width Start row from top-left corner of a matrix. (available since 0.14.0) stopY 1 to matrix height\u00a0 Stop row from top-left corner of matrix. (available since 0.14.0) len 0 to info.leds.count Length of the segment (stop - start). stop has preference, so if it is included, len is ignored. grp 0 to 255 Grouping (how many consecutive LEDs of the same segment will be grouped to the same color) spc 0 to 255 Spacing (how many LEDs are turned off and skipped between each group) of -len+1 to len Offset (how many LEDs to rotate the virtual start of the segments, available since 0.13.0) col array of colors Array that has up to 3 color arrays as elements, the primary, secondary (background) and tertiary colors of the segment. Each color is an array of 3 or 4 bytes, which represents a RGB(W) color, i.e. [[255,170,0],[0,0,0],[64,64,64]]
. It can also be represented as aan array of strings of hex values, i.e. [\"FFAA00\",\"000000\",\"404040\"]
for orange, black and grey. fx 0 to info.fxcount -1 ID of the effect or ~
to increment, ~-
to decrement, or \"r\"
for random. sx 0 to 255 Relative effect speed. ~
to increment, ~-
to decrement. ~10
to increment by 10, ~-10
to decrement by 10. ix 0 to 255 Effect intensity. ~
to increment, ~-
to decrement. ~10
to increment by 10, ~-10
to decrement by 10. c1 0 to 255 Effect custom slider 1. Custom sliders are hidden or displayed and labeled based on effect metadata. c2 0 to 255 Effect custom slider 2. c3 0 to 31 Effect custom slider 3. o1 bool Effect option 1. Custom options are hidden or displayed and labeled based on effect metadata. o2 bool Effect option 2. o3 bool Effect option 3. pal 0 to info.palcount -1 ID of the color palette or ~ to increment, ~- to decrement, or r for random. sel bool true
if the segment is selected. Selected segments will have their state (color/FX) updated by APIs that don't support segments (e.g. UDP sync, HTTP API). If no segment is selected, the first segment (id:0
) will behave as if selected. WLED will report the state of the first (lowest id) segment that is selected to APIs (HTTP, MQTT, Blynk...), or mainseg
in case no segment is selected and for the UDP API. Live data is always applied to all LEDs regardless of segment configuration. rev bool Flips the segment (in horizontal dimension for 2D set-up), causing animations to change direction. rY bool Flips the 2D segment in vertical dimension. (available since 0.14.0) on bool Turns on and off the individual segment. (available since 0.10.0) bri 0 to 255 Sets the individual segment brightness (available since 0.10.0) mi bool Mirrors the segment (in horizontal dimension for 2D set-up) (available since 0.10.2) mY bool Mirrors the 2D segment in vertical dimension. (available since 0.14.0) tp bool Transposes a segment (swaps X and Y dimensions). (available since 0.14.0) cct 0 to 255 or 1900 to 10091 White spectrum color temperature (available since 0.13.0) lx BBBGGGRRR
: 0 - 100100100 Loxone RGB value for primary color. Each color (RRR
,GGG
,BBB
) is specified in the range from 0 to 100%. Only available if Loxone is compiled in. lx 20bbbtttt
: 200002700 - 201006500 Loxone brightness and color temperature values for primary color. Brightness bbb
is specified in the range 0 to 100%. tttt
defines the color temperature in the range from 2700 to 6500 Kelvin. (available since 0.11.0, not included in state response) Only available if Loxone is compiled in. ly BBBGGGRRR
: 0 - 100100100 Loxone RGB value for secondary color. Each color (RRR
,GGG
,BBB
) is specified in the range from 0 to 100%. Only available if Loxone is compiled in. ly 20bbbtttt
: 200002700 - 201006500 Loxone brightness and color temperature values for secondary color. Brightness bbb
is specified in the range 0 to 100%. tttt
defines the color temperature in the range from 2700 to 6500 Kelvin. (available since 0.11.0, not included in state response) Only available if Loxone is compiled in. i array Individual LED control. Not included in state response (available since 0.10.2) frz bool freezes/unfreezes the current effect m12 0 to 4 [map1D2D.count] Setting of segment field 'Expand 1D FX'. (0: Pixels, 1: Bar, 2: Arc, 3: Corner) si 0 to 3 Setting of the sound simulation type for audio enhanced effects. (0: 'BeatSin', 1: 'WeWillRockYou', 2: '10_3', 3: '14_3') (as of 0.14.0-b1, there are these 4 types defined) fxdef bool Forces loading of effect defaults (speed, intensity, etc) from effect metadata. (available since 0.14.0) set 0 to 3 Assigns group or set ID to segment (not to be confused with grouping). Visual aid only (helps in UI). (available since 0.14.0) rpt bool Flag to repeat current segment settings by creating segments until all available LEDs are included in automatically created segments or maximum segments reached. Will also toggle reverse on every even segment. (available since 0.13.0)"},{"location":"interfaces/json-api/#info-object","title":"Info object","text":"No value may be changed by means of this API.
JSON key Value range Description ver string Version name. vid uint32 Build ID (YYMMDDB, B = daily build index). leds object Contains info about the LED setup. leds.cct booltrue
if the light supports color temperature control (available since 0.13.0, deprecated, use info.leds.lc) leds.count 1 to 1200 Total LED count. leds.fps 0 to 255 Current frames per second. (available since 0.12.0) leds.rgbw bool true
if LEDs are 4-channel (RGB + White). (deprecated, use info.leds.lc) leds.wv bool true
if a white channel slider should be displayed. (available since 0.10.0, deprecated, use info.leds.lc) leds.pin byte array LED strip pin(s). Always one element. Removed as of v0.13 leds.pwr 0 to 65000 Current LED power usage in milliamps as determined by the ABL. 0
if ABL is disabled. leds.maxpwr 0 to 65000 Maximum power budget in milliamps for the ABL. 0
if ABL is disabled. leds.maxseg byte Maximum number of segments supported by this version. leds.lc byte Logical AND of all active segment's virtual light capabilities leds.seglc byte array Per-segment virtual light capabilities str bool If true
, an UI with only a single button for toggling sync should toggle receive+send, otherwise send only name string Friendly name of the light. Intended for display in lists and titles. udpport uint16 The UDP port for realtime packets and WLED broadcast. live bool If true
, the software is currently receiving realtime data via UDP or E1.31. lm string Info about the realtime data source lip string Realtime data source IP address ws -1 to 8 Number of currently connected WebSockets clients. -1 indicates that WS is unsupported in this build. fxcount byte Number of effects included. palcount uint16 Number of palettes configured. wifi object Info about current signal strength wifi.bssid string The BSSID of the currently connected network. wifi.signal 0 to 100 Relative signal quality of the current connection. wifi.channel 1 to 14 The current WiFi channel. fs object Info about the embedded LittleFS filesystem (since 0.11.0) fs.u uint32 Estimate of used filesystem space in kilobytes fs.t uint32 Total filesystem size in kilobytes fs.pmt uint32 Unix timestamp for the last modification to the presets.json
file. Not accurate after boot or after using /edit
ndc -1 to 255 Number of other WLED devices discovered on the network. -1 if Node discovery disabled. (since 0.12.0) arch string Name of the platform. core string Version of the underlying (Arduino core) SDK. lwip 0, 1, or 2 Version of LwIP. 1 or 2 on ESP8266, 0 (does not apply) on ESP32. Deprecated, removal in 0.14.0 freeheap uint32 Bytes of heap memory (RAM) currently available. Problematic if <10k
. uptime uint32 Time since the last boot/reset in seconds. opt uint16 Used for debugging purposes only. brand string The producer/vendor of the light. Always WLED
for standard installations. product string The product name. Always FOSS
for standard installations. btype string The origin of the build. src
if a release version is compiled from source, bin
for an official release image, dev
for a development build (regardless of src/bin origin) and exp
for experimental versions. ogn
if the image is flashed to hardware by the vendor. Removed as of v0.10 mac string The hexadecimal hardware MAC address of the light, lowercase and without colons. ip string The IP address of this instance. Empty string if not connected. (since 0.13.0) Examples of frequently requested custom API:
Function/Effect API (Add to preset or call from other sources) Cycle presets between 1 and 6{\"ps\":\"1~6~\"}
Select random effect on all selected segments {\"seg\":{\"fx\":\"r\"}}
Select random palette between 5 and 10 on segment 2 {\"seg\":[{\"id\":2,\"pal\":\"5~10~r\"}]}
Change segment 0 name {\"seg\":[{\"id\":0,\"n\":\"Your custom ASCII text\"}]}
Freeze or unfreeze an effect {\"seg\":[{\"id\":0,\"frz\":true}]}
or {\"seg\":[{\"id\":0,\"frz\":false}]}
Night light {\"nl\":{\"on\":true,\"dur\":10,\"mode\":0}}
Increase brightness by 40 wrapping when maximum reached {\"bri\":\"w~40\"}
"},{"location":"interfaces/json-api/#per-segment-individual-led-control","title":"Per-segment individual LED control","text":"Using the i
property of the segment object, you can set the LED colors in the segment using the JSON API. Keep in mind that this is non-persistent, if the light is turned off the segment will return to effect mode. The segment is frozen when using individual control, the set effect will not run. To unfreeze the segment, click the \"eye\" icon, change any property of the segment or turn off the light.
To set individual LEDs starting from the beginning, use an array of Color arrays [255,0,0]
or hex values \"FF0000\"
. Hex values are more efficient than Color arrays and should be preferred when setting a large number of colors. {\"seg\":{\"i\":[\"FF0000\",\"00FF00\",\"0000FF\"]}}
or {\"seg\":{\"i\":[[255,0,0],[0,255,0],[0,0,255]]}}
will set the first LED red, the second green and the third blue.
To set individual LEDs, use the LED index followed by its color value. {\"seg\":{\"i\":[0,\"FF0000\",2,\"00FF00\",4,\"0000FF\"]}}
is the same as above, but leaves blank spaces between the lit LEDs.
To set ranges of LEDs, use the LED start and stop index followed by its color value. {\"seg\":{\"i\":[0,8,\"FF0000\",10,18,\"0000FF\"]}}
sets the first eight LEDs to red, leaves out two, and sets another 8 to blue.
To set a large number of colors, send multiple api calls of 256 colors at a time. {\"seg\": {\"i\":[0,\"CC0000\",\"00CC00\",\"0000CC\",\"CC0000\"...]}}
{\"seg\": {\"i\":[256,\"CC0000\",\"00CC00\",\"0000CC\",\"CC0000\"...]}}
{\"seg\": {\"i\":[512,\"CC0000\",\"00CC00\",\"0000CC\",\"CC0000\"...]}}
Do not make several calls in parallel, that is not optimal for the device. Instead make your call in sequence, where each call waits for the previous to complete before making a new one. How this is done depends on your choice of tool, but with CURL you que your commands by separating then with &&
i.e. CURL [command 1] && CURL [command 2] && CURL [command 3]
.
Command buffer size
If you are trying to set many LEDs and it fails to work, you can check your request here for length. Select ESP32 and Deserialize. If the required buffer size is above 10K for ESP8266 and 24K for ESP32, please split it into multiple sequential requests and consider using the Hex string syntax.
Keep in mind that the LED indices are segment-based, so LED 0 is the first LED of the segment, not of the entire strip. Segment features, including Grouping, Spacing, Mirroring and Reverse are functional.
Matrices are handled as a non-serpentine layout.
Brightness interaction
For your colors to apply correctly, make sure the desired brightness is set beforehand. Turning on the LEDs from an off state and setting individual LEDs in the same JSON request will not work!
"},{"location":"interfaces/json-api/#playlists","title":"Playlists","text":"(Available since 0.11.0)
Sample playlist API call:
{\n \"playlist\": {\n \"ps\": [26, 20, 18, 20],\n \"dur\": [30, 20, 10, 50],\n \"transition\": 0,\n \"repeat\": 10,\n \"end\": 21\n }\n}\n
This example applies preset ID 26 for 3 seconds, then preset 20 for 2 seconds, then preset 18 for 1 second, lastly preset 20 again for 5 seconds.This repeats 10 times, then preset 21 is applied.
Playlist object:
JSON key Description ps Array of preset ID integers to be applied in this order. dur Array of time each preset should be kept, in tenths of seconds. If only one integer is supplied, all presets will be kept for that time.Defaults to 10 seconds if not provided. transition Array of time each preset should transition to the next one, in tenths of seconds. If only one integer is supplied, all presets will transition for that time. Defaults to the current transition time if not provided. repeat How many times the entire playlist should cycle before finishing. Set to0
for an indefinite cycle. Default to indefinite if not provided. end Single preset ID to apply after the playlist finished. Has no effect when an indefinite cycle is set. If not provided, the light will stay on the last preset of the playlist."},{"location":"interfaces/json-api/#light-capabilities","title":"Light capabilities","text":"In order to e.g. only show color controls relevant to a given setup, it is necessary to obtain the color capabilities of the light. The info.leds.seglc
array can be used to do so on a per-segment level. It contains n+1
8-bit integers, where n
is the id
of the last active segment, each index corresponds to the segment with that ID. This integer indicates whether a given segment supports (24 bit) RGB colors, an extra (8 bit) white channel and/or adjustable color temperature (CCT):
Therefore:
lc
value Capabilities 0 None. Indicates a segment that does not have a bus within its range, e.g. because it is not active. 1 Supports RGB 2 Supports white channel only 3 Supports RGBW 4 Supports CCT only, no white channel (unused) 5 Supports CCT + RGB, no white channel (unused) 6 Supports CCT (including white channel) 7 Supports CCT (including white channel) + RGB Note that CCT is controllable per-segment, while RGB color and white channel have 3 color slots each per segment.
info.leds.lc
contains this info on a global level, and is a bitwise AND of the per-segment light capability values.
Please also see the general info about CCT.
"},{"location":"interfaces/json-api/#supported-value-ranges","title":"Supported value ranges","text":"Given that the white spectrum handling is agnostic to the true color temperature of the LEDs used, a relative range is preferred for the time being, where a value of 0
indicates the warmest possible color temperature, while a value of 255
indicates the coldest temperature.
It is also possible to pass a value in the range of 1900
to 10091
, in which case it is treated as a Kelvin color temperature, where 1900
is mapped to a relative value of 0
and 10091
to a relative value of 255
.
As such, it is unlikely to match the actual color temperature output by the light, therefore the relative values 0-255 are preferred for the time being.
In the future, an option to specify the Kelvin temperatures of the utilized hardware may be added, once this is done, a color temperature can be set to more accurately match other lights.
Therefore, for forward compatibility, your integration should expect both either a 0-255 value for seg.cct
, in which case it is a relative value, or an absolute Kelvin value in the range 1000-16000 K. In case a Kelvin value is provided, you can consider the color temperature as accurate, which is not possible with relative 0-255 values as the Kelvin points of the white channels are unknown. It is preferred that you set a new CCT value in the same range as received from WLED, that is, use 0-255 if the original value was within this range, and 1000-20000 K otherwise.
If your code relies on absolute Kelvin values, a reasonable estimate for the warm white point (relative 0
) could be 2700K, while cold white (relative 255
) could commonly be 6500K.
seg.cct
can always be set, but only has an effect on the physical state of the light if one or both of the following conditions is met:
Calculate CCT from RGB
is not enabledCCT support is indicated by info.leds.cct
being true
, in which case you can regard the instance as a CCT light and e.g. display a color temperature control.
Why effect metadata?
Prior to 0.14, user interfaces showed Speed and Intensity slider, palette controls, and all three color slots regardless of the effect selected. This may cause confusion to the user because controls are displayed that have no immediate effect in the current configuration. Effect metadata allows you to dynamically hide certain controls, so that the user only sees controls actually utilized by the selected effect mode.
Starting with WLED 0.14, effect metadata is available under the /json/fxdata
URL. This returns an array of strings with info.fxcount
entries. The string at a given index corresponds to the metadata of the effect with the same ID as that index. Metadata is stored in a memory-optimized string format, for example the Aurora effect has the metadata !,!;;!;1;sx=24,pal=50
.
The metadata string consists of up to five sections, separated by semicolons: <Effect parameters>;<Colors>;<Palette>;<Flags>;<Defaults>
The first section specifies the number and labels of effect parameters (e.g. speed, intensity). Up to 5 sliders and 3 checkboxes are supported (sx
,ix
,c1
,c2
,c3
,o1
,o2
,o3
parameters in the seg
object). For more details about the ranges of the sliders see contents-of-the-segment-object. Slider/checkbox labels are comma separated. An empty or missing label disables this control. !
specifies the default label is used:
The fallback value if this section is missing is two sliders, Effect speed and Effect intensity.
Examples:
Parameter string Displayed controls<empty>
No effect parameters ! 1 slider: Effect speed !,! 2 sliders: Effect speed + Effect intensity !,Phase 2 sliders: Effect speed + Phase ,Saturation,,,,Invert 1 slider (sets ix
parameter) and 1 checkbox: Saturation + Invert ,,,,,Random colors 1 checkbox: Random colors"},{"location":"interfaces/json-api/#colors","title":"Colors","text":"Up to 3 colors can be used. Please note that only the first two characters of the label are visible in the WLED UI. !
specifies the default label is used. The default labels for the color slots are Fx
, Bg
, and Cs
.
The fallback value if this section is missing is 3 colors: Fx
+ Bg
+ Cs
.
Examples:
Colors string Displayed controls<empty>
No color controls ! 1 color: Fx ,! 1 color: Bg !,! 2 colors: Fx + Bg 1,2,3 3 colors: 1 + 2 + 3"},{"location":"interfaces/json-api/#palette","title":"Palette","text":"If empty, the effect does not use palettes. If !
, palette selection is enabled.
The fallback value if this section is missing is palette selection enabled.
"},{"location":"interfaces/json-api/#flags","title":"Flags","text":"Flags allow filtering for effects with certain characteristics. They are a single character each and not comma-separated. Currently, the following flags are specified:
Flag Effect characteristic 0 Effect works well on a single LED. If flag 0 is present, flags 1/2/3 are omitted. (unused) 1 Effect is optimized for use on 1D LED strips. 2 Effect requires a 2D matrix setup (unless flag 1 is also present) 3 Effect requires a 3D cube (unless flags 1 and/or 2 are also present) (unused) v Effect is audio reactive, reacts to amplitude/volume. f Effect is audio reactive, reacts to audio frequency distribution.For example, a Flag string of 2v
denotes a volume reactive effect that is to be used on 2D matrices.
The fallback value if this section is missing is 1
, i.e. a 1D optimized effect.
Defaults are values for effect parameters that work particularly well on that effect. They are set automatically when the effect is selected in UI unless configured otherwis in UI settings. To specify defaults, use the standard segment parameter name (e.g. ix
) followed by an =
and the default value. For example, sx=24,pal=50
sets the effect speed to 24 (slow) and the palette to ID 50 (Aurora).
If no default is specified for a given parameter, it retains the current value.
"},{"location":"interfaces/json-api/#sensors","title":"Sensors","text":"Warning
This section about the Sensor API is a DRAFT specification. It is not yet implemented and subject to change.
Various types of sensors (e.g. for Temperature, light intensity, PIR) may be added to WLED via usermods. To allow read access to sensor data via the JSON API in a standardized way, the info.sensor
array is used.
If the info.sensor
array is missing or empty, no sensor values are exposed.
Each sensor/measurement is represented by an object within the info.sensor
array.
For example,
{\"type\":\"T\",\"n\":\"Outside\",\"val\":12}\n
refers to a 12 \u00b0C temperature measurement in Celsius with the sensor name \"Outside\".
The object may contain the following properties, of which all are optional, except type
.
\"b\"
and \"CL\"
types and custom type sensors. null
if the reading is invalid, either due to an error or because the first reading has not yet completed. unit string An explicit human-readable unit string for the measurement. If omitted, the default for the sensor type is used. error int or string If present and not null
,false
,0
or an empty string, a sensor error is indicated. May either be an integer error code or an error string. tc number Seconds of WLED uptime
when the value last changed substantially. The threshold for a \"substantial\" change is up to the implementation. This can for example be used to find when a PIR sensor was last activated. tm number Seconds of WLED uptime
when the last reading given by val
was obtained. ts number Seconds of WLED uptime
at the first measurement / start of measurement period. (required for Energy sensor type) min number Lower bound of possible value range max number Upper bound of possible value range u number Absolute uncertainty of the measurement model string Identification of the sensor hardware used"},{"location":"interfaces/json-api/#sensor-types","title":"Sensor types","text":"These are the standardized sensor types that may be implemented by usermods:
Type ID string Measurement type Default unit \"\" (empty string) Invalid sensor (reserved) - b Button/Boolean true/false c Custom user-defined sensor - q Electric charge As t Time s BL Battery Level % CL 24-bit RGB color hex string E Energy (ts
property required) J I Electric current A J Illuminance lx L Distance m Lp Sound pressure level dB M Mass kg N Number/count - P Power W Pe General purpose percentage % PL Power Level (signal strength) dBm Pr Pressure Pa R Electric Resistance Ohms RH Relative Humidity % T Temperature \u00b0C U Voltage V (other strings) Reserved, let us know if you need a new type added - If a client is only interested in certain sensor types (e.g. Temperature), it may disregard all other sensor objects.
"},{"location":"interfaces/json-api/#api","title":"API","text":"there is all routes for JSON API:
Important
Notice: The MQTT implementation is currently being restructured to provide a better experience for users of Home Assistant and other automation software. This will be a breaking change. For details regarding the rework, please see #207!
WLED versions from 0.8.0 up are able to connect to an MQTT broker for smart home control. Connection to both domains and IP servers is supported on port 1883.
Warning
Secure connections are not currently supported. I recommend only connecting to local MQTT brokers. In v0.8.4-0.8.6 only, WLED supports MQTT autodiscovery by the HomeAssistant software. This has been removed because of bootloop issues and in favor of the native HomeAssistant integration.
WLED will subscribe to up to six topics to change the state of the lights.
[mqttDeviceTopic]/api -> Send an API call (using the HTTP API or, since 0.11, JSON API syntax). You may omit the \"win\" and just send e.g. \"FX=73\"
[mqttGroupTopic]
The topic paths [mqttDeviceTopic] and [mqttGroupTopic] are customizable in Sync settings. If [mqttGroupTopic] is left empty, it will not subscribe to anything. An empty [mqttDeviceTopic] will instead be replaced with the default \"wled/macaddr\". [mqttDeviceTopic] is intended to be unique to one WLED device and just control that device. [mqttGroupTopic] is intended to control a group of or all WLED devices.
UDP notifications will be sent just as if the change was done via the UI or HTTP API.
Additionally, on light change, WLED will publish to 3 topics for MQTT clients to query the state of the light.
[mqttDeviceTopic]/g -> Contains current brightness as ASCII number 0-255
[mqttDeviceTopic]/c -> Contains current color as HEX (#RRGGBB if white is 0, else #WWRRGGBB)
[mqttDeviceTopic]/v -> Contains XML API response (same as HTTP API)
There is support for client ID and authentication, but this is presently transmitted over an unencrypted connection, so please do not use the same password for other services.
Attention
The maximum length of an MQTT message for WLED is only limited by free RAM.
"},{"location":"interfaces/philips-hue/","title":"Philips Hue","text":"WLED can sync to your Philips hue lights.
Info
This feature allows your WLED light to set it color to that of one of your Hue lights. It does NOT enable individual control of your WLED light from the hue app.
To activate it, please go to Sync settings, fill in the IP of your hue bridge. Also you need to fill in the numeric ID of the hue light you want to sync to. Newer versions of the Hue app do not display light IDs in the \"About\" section of the app anymore, to find it, the app Hue Config Viewer
is highly recommended. It is available on the Play Store as well as the App Store. After pairing the app to your Hue bridge, you can see the numeric IDs of all your Hue lights in the Lights
menu.
The poll interval specifies how often WLED asks the hue bridge for a light change. Lower values will mean a quicker response of WLED to hue light changes, but also decrease responsiveness and stability of WLED and potentially the hue bridge. It is recommended to set it to 1000-2000ms.
Due to the nature of the hue protocol, WLED can only sync itself to a native hue bulb. At this time, there is no way to add WLED to the hue bridge and control it individually as if it was a native light.
Please don't expect the same level of stability with this feature active, the ESP may reset itself because of the increased traffic it needs to handle.
With DiyHue you can emulate a hue bridge that will show all WLED strips as Hue Strip Plus which will work with Hue Sync in realtime.
"},{"location":"interfaces/serial/","title":"Serial","text":"WLED 0.13.0 supports multiple protocols over Serial. Serial is available via USB, and on most boards, GPIO1 for TX and GPIO3 for RX.
Pin usage limitation
If GPIO3 is allocated (e.g. for LED output), all Serial functionality except debug output is unavailable. If GPIO1 is allocated, all Serial output is disabled, including the JSON API response, Improv, and tpm2 output.
"},{"location":"interfaces/serial/#adalight-and-tpm2","title":"Adalight and tpm2","text":"Both these protocols are supported and can be used to stream realtime LED data to WLED for direct display, e.g. from an bias lighting program. For tpm2, only data packets are supported and data in 24-bit RGB format is expected. If you want to drive a large amount of LEDs, you may need to increase the Baud rate in WLED Sync settings, as the default baud rate of 115200
is only sufficient for about 50-100 LEDs depending on the refresh rate. Adalight is supported since WLED 0.6.3, tpm2 since version 0.10.2.
You can send commands to the WLED instance via Serial using the JSON API. To request a JSON response containing the state
and info
objects, send {\"v\":true}
.
Improv Serial is supported and can be used to check the installed software version as well as connect your device to WiFi without needing to connect to the WLED access point. Improv is used by the WLED web installer for an easy installation and setup process. Note that the baud rate must remain at the default 115200
setting for the device to be detected as Improv-capable.
Send a lowercase 'v'
character (byte 0x76
) to obtain the ID of the installed WLED version.
To get the colors currently displayed by LEDs:
Send an uppercase 'L'
(byte 0x4C
) to request the current LED data as a tpm2 data packet in 24-bit RGB format.
Send a lowercase 'l'
(byte 0x6C
) to request the current LED data in JSON format. This returns the LED colors as 32-bit integers, of which the lowest byte is the Blue value, then Green, then Red, and the highest byte is the White channel value.
For both of these methods, you may need to increase the baud rate if you have a large amount of LEDs. However, tpm2 requires on average 2-4x less bandwidth than JSON, and should therefore be preferred if your application can parse binary data.
"},{"location":"interfaces/serial/#changing-baud-rate","title":"Changing Baud Rate","text":"There are 2 main method for changing Baud Rate for the serial connection - Persistant: Configure in App under Sync Interfaces. This setting will persist, and WLED will use specified Baud Rate from this point forward. - Temporary: Utilizing the serial connection at the existing Baud Rate, send the specific command byte to have WLED temporarily change to new Baud Rate. This Baud Rate is temporary and will be reset to default or peristant setting on reboot.
Byte Baud Rate0xB0
115200 0xB1
230400 0xB2
460800 0xB3
500000 0xB4
576000 0xB5
921600 0xB6
1000000 0xB7
1500000 - Note: Keep at 115200 to use Improv. Some boards may not support high rates."},{"location":"interfaces/serial/#debugging","title":"Debugging","text":"Compile with the -D WLED_DEBUG
build flag to enable serial debugging using DEBUG_PRINTLN(x)
macros. This will reserve pin GPIO1, therefore it cannot be used for other purposes when debugging.
The UDP notifier function of WLED makes it easy to sync multiple lights to the same color/effect, enabled by default. You can set the specific behavior of it in Sync settings, also you can choose if all aspects or only brightness/color/effects are applied.
Additionally, there is a \"Sync\" quick toggle for it in the main control UI! In UI settings, you can set whether this button only turns on/off sending (default) or also receiving, with the option Sync button toggles both send and receive
.
If your sync settings are not the way you like on boot, check the WLED Broadcast
section in Sync settings, where you can specify what is sent and received by default:
If all checkboxes are disabled, nothing is received by default after each boot. If the sync is toggled on in the main UI and the corresponding checkbox in UI settings is checked, everything is received.
A sync receiver will not assume the state of the last sender directly after booting, a new packet must be send for it to react.
"},{"location":"interfaces/udp-notifier/#sending-settings","title":"Sending settings","text":"Setting Description Send on direct change Whether to send a sync notification when state changed via the web UI or API Send on button press Whether to send sync when toggled by the physical hardware button Send Alexa notifications Whether to send sync after changed by Alexa (you may use Alexa groups instead) Send Hue notifications Whether to send sync after a connected Philips light changed Send Macro notifications Whether to send sync after a macro was triggered Send notifications twice Sends notifications twice (if you have issues with UDP packet loss)The quick toggle in the main UI will only apply to direct changes (UI + API), all other sync type sending behavior remains unaffected.
You can easily group WLED devices (for example all in one room) by changing the UDP port of all devices you want in that group.
"},{"location":"interfaces/udp-notifier/#sync-groups","title":"Sync groups","text":"From v0.13.0, 8 Sync groups are available. This allows syncing select instances only without changing the UDP port. For example, you might use one sync group per room you use WLED devices in. Make sure the sender and receiver you want to sync both have the same sync group ticked (a sender can send to multiple groups and a receiver can listen to multiple groups).
Sync packets received from pre-0.13.0 instances are treated as if sent in sync group 1 only.
"},{"location":"interfaces/udp-notifier/#protocol-description","title":"Protocol description","text":"Warning
Note: this info is partly out of date, see updated functionality in the code (udp.cpp)
When enabled, the module where a value was changed will send an UDP broadcast to a port (default 21324). Other modules that listen on this port will set themselves to the same color.
For interoperability, the protocol was designed so that even modules with different WLED versions can sync. Therefore, if a WLED 0.4 system receives a WLED 0.3 UDP notification it will apply the primary color but keep its current secondary color.
The UDP packet is currently 24 bytes long. It is laid out in the following:
Byte Index Var Name Description Notifier Version 0 - Packet Purpose Byte* 0 1 callMode Packet Reason** 0 2 bri Master Brightness 0 3 col[0] Primary Red Value 0 4 col[1] Primary Green Value 0 5 col[2] Primary Blue Value 0 6 nightlightActive Nightlight running? 0 7 nightlightDelayMins Nightlight Time 0 8 effectCurrent Effect Index 0 9 effectSpeed Effect Speed 0 10 white Primary White Value 1 11 - Version Byte*** 1 12 colSec[0] Secondary Red Value 2 13 colSec[1] Secondary Green Value 2 14 colSec[2] Secondary Blue Value 2 15 whiteSec Secondary White Value 2 16 effectIntensity Effect Intensity 3 17 transitionDelay Transition Duration Upper 4 18 transitionDelay Transition Duration Lower 4 19 effectPalette FastLED palette 5 20-23 - Zeros -*The notifier protocol is only used if this byte is 0. Otherwise, one of the UDP Realtime protocols will be used.
**The callMode variable specifies the reason for the notification. Every color update has the potential to trigger a notification.
callMode Description Behavior 0 Initial Boot Do not notify 1 Direct Change via UI or API notifyDirect? 2 Button was pressed notifyButton? 3 Update by other notification Do not notify 4 Nightlight activated notifyDirect? 5 Other (Req. with &NN) Do not notify 6 Effect changed notifyDirect? 7 Hue light changed notifyHue? 8 Preset Cycle active notifyDirect? 9 Updated via Blynk notifyDirect?***This is the version of the UDP protocol.
UDP Version Description WLED Version 0 Basic Support 0.3 1 White Value supported 0.4p 2 Secondary Color supported 0.4 3 Effect Intensity supported 0.5.0 4 Transition Time supported 0.6.0 5 Palettes supported 0.8.0"},{"location":"interfaces/udp-realtime/","title":"UDP Realtime / tpm2.net","text":""},{"location":"interfaces/udp-realtime/#hyperion","title":"Hyperion","text":"You can now use WLED with the popular Ambilight software Hyperion. Just configure Hyperion to use an UDP device with protocol 0 on port 19446! The maximum number of LEDs supported in this mode is 490. (WLED 0.8.0 and lower: 341)
"},{"location":"interfaces/udp-realtime/#prismatik","title":"Prismatik","text":"Prismatik is another Ambilight option. Select one of the UDP options in the device configuration wizard.
"},{"location":"interfaces/udp-realtime/#tpm2net","title":"TPM2.NET","text":"Supported in latest master and will be available in WLED 0.10.1. Please set the WLED broadcast UDP port to 65506 in Sync settings to enable receiving TPM2.NET data.
"},{"location":"interfaces/udp-realtime/#udp-realtime","title":"UDP Realtime","text":"Additionally, WLED offers a way to directly drive the connected LEDs via UDP. The protocol is referred to as WLED Audio-Reactive-Led-Strip (WARLS), since the support of that project was its primary goal. However, it can also be used for other realtime applications like an ambilight.
WARLS uses the same UDP port the notifier uses (default 21324, can be changed in settings). At the moment, the web UI will be disabled while active, the HTTP API, Alexa and button control remains functional. It uses the current brightness and gamma correction settings.
Byte 0 of the UDP packet tells the server which realtime protocol to use.
Value Description Max. LEDs 1 WARLS 255 2 DRGB 490 3 DRGBW 367 4 DNRGB 489/packet 0 WLED Notifier -In every protocol, Byte 1 tells the server how many seconds to wait after the last received packet before returning to normal mode, in practice you should use 1-2 (seconds) here in most cases so that the module returns to normal mode quickly after the end of transmission. Use 255 to stay on the UDP data without a timeout until a request is requested via another method.
After this the LED color information is transmitted like this:
WARLS
Byte Description 2 + n*4 LED Index 3 + n*4 Red Value 4 + n*4 Green Value 5 + n*4 Blue ValueDRGB: This mode has the difference that the LED indices are not part of the packet, instead every LED is updated. This leads to a higher speed when all LEDs are changed, but a drastically lower speed if only one LED is updated per packet.
Byte Description 2 + n*3 Red Value 3 + n*3 Green Value 4 + n*3 Blue ValueDRGBW: Like DRGB, but supports the White value for RGBW strips.
Byte Description 2 + n*4 Red Value 3 + n*4 Green Value 4 + n*4 Blue Value 5 + n*4 White ValueDNRGB: DRGB, but with 2 additional bytes that signify the starting LED index. This allows for more than 490 LEDs in realtime mode by sending multiple packets.
Byte Description 2 Start index high byte 3 Start index low byte 4 + n*3 Red Value 5 + n*3 Green Value 6 + n*3 Blue ValueWhen realtime mode starts, all LEDs will be black. However, you don't have to change all LEDs using one packet. Changing a single LED therefore only requires a packet of 2+4 bytes. All LEDs maintain their color until it is changed or the module exits WARLS mode because of a timeout.
"},{"location":"interfaces/udp-realtime/#setup-with-arls","title":"Setup with ARLS","text":"The software now supports audio-reactive-led-strip!
Version Info
Since WLED 0.10.2, a WebSocket server is enabled by default and can be used to access a subset of the JSON API.
The server is available at the /ws
endpoint, you can access it like ws://[WLED-IP]/ws
.
You may send any JSON state update to the socket. On change of the lighting state, the server will send a JSON object containing the state and info objects (this is equivalent to HTTP GET /json/si
) to all connected clients. This object will also be sent to a client upon connecting.
You can manually request the full JSON state object by sending {\"v\":true}
to the websocket.
You can also request a live stream of the LED values (e.g. the \"Peek\" feature of WLED-UI) by sending {\"lv\":true}
to the websocket. The returned format is the same as for /json/live
. Only one client can receive this at a time, if a new client requests it the stream will stop for the previous client (but the websocket will stay connected).
There can be a maximum of 4 clients connected at a time. If a fifth client connects, a different client will be disconnected. On ESP8266, it is recommended to have no more than 2 clients connected simultaneously.
"},{"location":"interfaces/json-ir/json_infrared/","title":"Infrared","text":"Version Info
Since v0.13.0, infrared control for any IR remote compatible with your IR receiver with JSON remote.
A dedicated infrared receiver module is required. (KY-022 or TSOP38238 are confirmed to work and inexpensive)
The default sensor pin is GPIO4. It can be changed in the WLED settings.
"},{"location":"interfaces/json-ir/json_infrared/#json-ir-remote","title":"JSON IR Remote","text":"The JSON IR remote allows users to customize IR remote behavior without writing custom C code or compiling. Using the JSON IR remote, you can map buttons from any compatible remote to any HTTP request API or JSON API command.
The map of IR codes to API commands is stored on your ESP's file system in ir.json
. From the \"LED Preferences\" page, set the IR pin and remote type to \"JSON remote\". Once \"JSON remote\" is selected, a file upload control will appear. You can also upload and edit ir.json from the /edit page, which can be reached by going to http://[controller-ip]/edit. If you use the edit page to upload your config file, be sure to name it ir.json
.
LED remotes typically are not sold separately. But you can purchase with an RGB controller for $2-4 on AliExpress and $5-10 on Amazon. When purchasing a remote, be sure that it is an infrared (IR) remote and not a radio (RF) remote as they are not supported at this time.
44-key white ir.json
40-key blue ir.json
40-key black ir.json
38-key ir.json (Sold with WLED compatible SP511E controllers)
32-key ir.json (commonly sold with fairy string lights)
24-key (very common, but buttons need repurposed to be very useful with WLED) ir.json v1 gray buttons load presets 1-4 ir.json v2 gray buttons cycle effects, palettes and change speed
24-key grey ir.json
24-key music ir.json v3
21-key ir.json
18-Key Silver ir.json
6-key ir.json
"},{"location":"interfaces/json-ir/json_infrared/#editing-irjson","title":"Editing ir.json","text":"First see if a JSON file already exists for your remote. If not, see if there is a JSON file for a remote with the same number of buttons. Often remotes with the same number of buttons have different labels but emit the same codes. The JSON keys are the hex encoded IR codes emitted by each button. The keys are strings and case is important, be sure to use the same format as the sample below. It is also the same format used when codes are echoed on the serial console.
In the JSON document, each button object should have a cmd
attribute containing the HTTP request or JSON API command. In addition to HTTP and JSON API commands, several C functions are supported (!incBrightness, !decBrightness, !presetFallback). The !incBrightness and !decBrightness functions, take smaller steps at the dim end of the range with progressively larger steps at the bright end. The !presetFallback function applies a preset (attribute PL) and falls back to the specified effect and palette (attributes FX and FP) if preset does not exist. (see sample below)
If an IR remote button is pressed rapidly or held down, subsequent presses have a different code (0xFFFFFFFF). If your command is repeatable but does not contain the \"~\" character and is not calling incBrightness or decBrightness, then add a \"rpt\" attribute with a value of true. Label and position attributes are ignored by WLED but useful when making edits.
If an ir.json file does not already exist for your remote, you will need to determine what code each button emits. To do this, connect your ESP8266 or ESP32 to a computer and open Arduino or VSCode serial monitor. Then press each button and record the code printed on the serial monitor. You should see something like this:
IR recv\n0xFFDE10\n
You should get a 24-bit hex encoded integer. If you get 0xFFFFFFFF, that means the button has been pressed repeatedly or held down. Try tapping quickly.
"},{"location":"interfaces/json-ir/json_infrared/#tips","title":"Tips","text":"play
or auto
buttons to a playlist. They currently just turn on preset cycling CY=1
or load a playlist of presets 1-5. You can define the playlist in ir.json as in the sample below, or save a playlist as a preset and load that.P1=31&P2=40&PL=~
P1=21&P2=30&PL=~-
{\n \"0xF740BF\": {\n \"label\": \"On/Off\",\n \"cmd\": \"T=2\",\n \"rpt\": true\n },\n \"0xF700FF\": {\n \"label\": \"Speed +\",\n \"cmd\": \"SX=~16\"\n },\n \"0xF720DF\": {\n \"label\": \"Red\",\n \"cmnt\": \"Lava palette + primary, secondary and tertiary colors\",\n \"cmd\": \"FP=8&CL=hFF7F00&C2=hFF0000&C3=hCC3D60\"\n }, \n \"0xF710EF\": {\n \"label\": \"Timer1\",\n \"cmnt\": \"Timer 60 min\",\n \"cmd\": \"NL=60&NT=0\"\n },\n \"0xF730CF\": {\n \"label\": \"Play\",\n \"cmnt\": \"prime example of a playlist that cycles every 180 seconds and continues to repeat\",\n \"cmd\": {\"playlist\":{\"ps\":[1,3,5,7,11,13,17],\"dur\": 1800,\"transition\":7,\"repeat\":0,\"end\":0}}\n }, \n \"0xFF9867\": {\n \"label\": \"Bright+\",\n \"cmnt\": \"smaller steps at beginning, larger steps at the end\",\n \"cmd\": \"!incBrightness\"\n },\n \"0xF78877\": {\n \"label\": \"DIY1\",\n \"cmnt\": \"Preset 1, fallback to Saw(16) - Party(6) if it doesn't exist\",\n \"cmd\": \"!presetFallback\",\n \"PL\": 1,\n \"FX\": 16,\n \"FP\": 6\n },\n}\n
"},{"location":"moonmodules/Installing-and-Compiling/","title":"Installing and Compiling","text":""},{"location":"moonmodules/Installing-and-Compiling/#introduction","title":"Introduction","text":"MoonModules introduces a new naming convention for bin(ary) files which contains configs and presets for used hardware. It also shows the used hardware in the bin name including shield esp flash memory size, audio input.
"},{"location":"moonmodules/Installing-and-Compiling/#naming-convention","title":"Naming convention","text":"Binaries can be downloaded or compiled yourself. See below.
When uploading binaries in Manual OTA update , MoonModules support bin awareness: the UI shows which binary is installed and this is a recommendation for the binary to upload (should support the same hardware).
"},{"location":"moonmodules/Installing-and-Compiling/#installing-or-compiling","title":"Installing or Compiling","text":""},{"location":"moonmodules/Installing-and-Compiling/#installing-a-bin","title":"Installing a bin","text":"There are currently 4 locations where bins can be downloaded.
They can be installed using Manual OTA update from within the WLED UI or use Sergs ESP_Flasher to directly upload a bin using USB to a board.
"},{"location":"moonmodules/Installing-and-Compiling/#serg74","title":"Serg74","text":"https://github.com/srg74/WLED-wemos-shield/tree/master/resources/Firmware/%40MoonModules
Updated frequently with dev versions. Go here for latest features
"},{"location":"moonmodules/Installing-and-Compiling/#wladi","title":"Wladi","text":"https://wled-install.github.io/
Updated periodically with release and dev versions
"},{"location":"moonmodules/Installing-and-Compiling/#wledme","title":"wled.me","text":"https://install.wled.me
Releases only
"},{"location":"moonmodules/Installing-and-Compiling/#moonmodules-release-page","title":"MoonModules release page","text":"https://github.com/MoonModules/WLED/releases
Releases only
"},{"location":"moonmodules/Installing-and-Compiling/#compiling-from-ms-code-platform-io","title":"Compiling from MS Code / Platform IO","text":""},{"location":"moonmodules/Installing-and-Compiling/#platformio-environments","title":"PlatformIO Environments","text":"Serg74: https://github.com/srg74/WLED-wemos-shield/tree/master/resources/Firmware/%40Atuline. Choose latest version. Or https://wled-install.github.io/. For Wemos Shield choose WLEDSR_0.13.3.4_wemos_shield_esp32_16MB_max.bin or WLEDSR_0.13.3.4_wemos_shield_esp32_4MB_M.bin (Pins pre-configured)
Serg74 https://github.com/srg74/WLED-wemos-shield/tree/master/resources/Firmware/%40Aircoookie or. Select folder for WLED AC 0.13.3 or 0.14 beta (preferred) or https://wled-install.github.io/
pka Custom Effects
ARTI-FX are effects which are not compiled in the WLED repository but specified by a file (program file) which is interpreted in real time.
The big advantage of this is that effects are not limited by what is made by WLED programmers but anybody can create effects without releasing a new version of WLED. Furthermore any change in the effect code is instantly shown on leds allowing fast developing of effects.
A disadvantage is that the file needs to be loaded, examined and then run in real-time which is 'per definition' slower then pre-compiled code, although performance is promising already and will get better over time.
"},{"location":"moonmodules/arti-fx/#quick-start","title":"Quick start","text":"To get your first ARTI-FX running, perform the following steps
ARTI-FX examples are stored in Github repository
If you develop effects which you want to share, ask for access on Github.
These effects can be loaded easily within WLED: Give a ARTI-FX segment name the same name as an effect in this repository (case sensitive, without .wled), click on ARTI-FX Editor and click Download 'effect'.wled and press Save.
Alternatively, if you want all the effects in this folder at once, go to the ARTI-FX Editor and click Download presets.json (This will overwrite any existing presets you have). Refresh the WLED page or reboot to see the new presets.
"},{"location":"moonmodules/arti-fx/#create-your-own-arti-fx","title":"Create your own ARTI-FX","text":"A ARTI-FX program typically looks like this:
A program contains structures like if statements, for loops, assignments, calls (e.g. renderFrame) etc., commands like setPixelcolor and variables like ledCount.
"},{"location":"moonmodules/arti-fx/#components","title":"Components","text":"program: Once every effect. Can contain global variables and internal functions. There are 2 special internal functions: renderFrame and renderLed
Global variables: Once every effect, reused between functions. Variables (global and local) are defined by using an assignment e.g. t=0
renderFrame: Once every frame
renderLed: Once every led within a frame
Functions and variables give access to the WLED functionality. The list of functions and variables will grow as we go. A function has parameters (even empty parameters) e.g. setPixelColor(x,y), variables haven't e.g. ledCount.
"},{"location":"moonmodules/arti-fx/#wled-general","title":"WLED general","text":"\"ledCount\": {},\n\"setPixelColor\": {\"pixelNr\":\"int\", \"color\":\"int\"},\n\"leds\": {},\n\"setPixels\": {\"leds\": \"array\"},\n\"hsv\": {\"h\":\"uint8\", \"s\":\"uint8\", \"v\":\"uint8\"},\n\n\"setRange\": {\"from\":\"uint16\", \"to\":\"uint16\", \"color\":\"uint32\"},\n\"fill\": {\"color\":\"uint32\"},\n\"colorBlend\": {\"color1\":\"uint32\", \"color2\":\"uint32\", \"blend\":\"uint16\"},\n\"colorWheel\": {\"pos\":\"uint8\"},\n\"colorFromPalette\": {\"index\":\"uint8\", \"brightness\":\"uint8\"},\n\n\"segcolor\": {\"index\":\"uint8\"},\n\"speedSlider\": {\"return\":\"uint8\"},\n\"intensitySlider\": {\"return\":\"uint8\"},\n
"},{"location":"moonmodules/arti-fx/#wled-sr","title":"WLED SR","text":"\"beatSin\": { \"bpm\":\"uint16\", \"lowest\":\"uint8\", \"highest\":\"uint8\", \"timebase\":\"uint32\", \"phase_offset\":\"uint8\"},\n\"fadeToBlackBy\": {\"fadeBy\":\"uint8\"},\n\"iNoise\": {\"x\":\"uint32\", \"y\":\"uint32\"},\n\"fadeOut\": {\"rate\":\"uint8\"},\n\n\"custom1Slider\": {\"return\":\"uint8\"},\n\"custom2Slider\": {\"return\":\"uint8\"},\n\"custom3Slider\": {\"return\":\"uint8\"},\n\"sampleAvg\": {\"return\": \"double\"},\n
"},{"location":"moonmodules/arti-fx/#arti-fx_1","title":"ARTI-FX","text":"\"counter\": {\"return\": \"uint32\"},\n\n\"shift\": {\"delta\": \"int\"},\n\"circle2D\": {\"degrees\": \"int\"},\n
"},{"location":"moonmodules/arti-fx/#math","title":"Math","text":"\"constrain\": {\"amt\":\"any\", \"low\":\"any\", \"high\":\"any\"},\n\"map\": {\"x\":\"int\", \"in_min\":\"int\", \"in_max\":\"int\", \"out_min\":\"int\", \"out_max\":\"int\"},\n\"seed\": {\"seed\": \"uint16\"},\n\"random\": {\"return\": \"uint16\"},\n\"sin\": {\"degrees\": \"double\", \"return\": \"double\"},\n\"cos\": {\"degrees\": \"double\", \"return\": \"double\"},\n\"abs\": {\"value\": \"double\", \"return\": \"double\"},\n\"min\": {\"value1\": \"double\", \"value2\": \"double\", \"return\": \"double\"},\n\"max\": {\"value1\": \"double\", \"value2\": \"double\", \"return\": \"double\"},\n
"},{"location":"moonmodules/arti-fx/#time","title":"Time","text":"\"hour\": {\"return\":\"uint8\"},\n\"minute\": {\"return\":\"uint8\"},\n\"second\": {\"return\":\"uint8\"},\n\"millis\": {\"return\": \"uint32\"},\n
"},{"location":"moonmodules/arti-fx/#pixelblase-support","title":"Pixelblase support","text":"\"time\": {\"inVal\":\"double\", \"return\": \"double\"},\n\"triangle\": {\"t\":\"double\", \"return\": \"double\"},\n\"wave\": {\"v\":\"double\", \"return\": \"double\"},\n\"square\": {\"v\":\"double\", \"t\":\"double\", \"return\": \"double\"},\n
"},{"location":"moonmodules/arti-fx/#serial-output","title":"Serial output","text":"\"printf\": {\"args\": \"__VA_ARGS__\"}\n
"},{"location":"moonmodules/arti-fx/#details","title":"Details","text":"All variables and values are internally stored as doubles and where needed converted to (unsigned) integers, e.g. to WLED functions or operators like %.
Technical details about external variables and functions can be found in arti_wled.h. Look for arti_external_function, arti_set_external_variable and arti_get_external_variable. Some examples:
"},{"location":"moonmodules/arti-fx/#current-limitations","title":"Current limitations","text":"This page Work In Progress
"},{"location":"moonmodules/contribute-dev/#setup","title":"Setup","text":""},{"location":"moonmodules/contribute-dev/#core-branches","title":"Core branches","text":"You can contribute to the contents on this site as follows:
Go to https://yourfork.github.io/WLED-Docs or https://mm.kno.wled.ge/moonmodules/contribute-docs/ if you have contributor rights
Images can be added by dragging them to the page (see earlier added images and videos for the syntax to be used, use width=\"xxx\" to adjust the size)
Commit (see workflow after commit)
If a commit is done a workflow will be started to create the pages.
Progress can be seen in https://github.com/yourfork/WLED-Docs/actions
This will take some time (about 30s)
After the workflow is completed new version of your kno.wled.ge can be found here:
https://yourfork.github.io/WLED-Docs
"},{"location":"moonmodules/contribute-docs/#create-pull-request","title":"Create pull request","text":"kno.wled.ge not supported help is in maintenance mode and can be found here: https://github.com/Atuline/WLED/wiki
"},{"location":"moonmodules/contribute-docs/#wled-ac","title":"WLED AC","text":"Above can also be done on https://github.com/Aircoookie/WLED-Docs
"},{"location":"moonmodules/fork-comparison/","title":"Fork Comparison","text":"What are the differences between WLED SR, upstream AC WLED, and MoonModules fork?
Feature WLED SR 0.13 MoonModules WLED 0.14 Upstream WLED 0.14 0.14 architecture No Yes (upstream frequently merged) Yes Usermods have own pages in main config menu Audio Reactive only Yes No Segments 2D aware No (XY calculated, mirror not working) Yes Yes Audio reactive Core Usermod Usermod Microphone Profiles No Yes No Audio dynamics limiter No Yes Yes High Definition audio analysis, 32 channel GEQ No Yes (WIP) for ESP32 and ESP32-S3 No ARTI-FX Yes Yes No Expand 1D effects No Yes (+ JMap, Circle and Block) Yes Extended hw info basic Yes No JSON Mapping on 1D effects No Yes No Games usermod (3D to 2D, gyro) No Yes (WIP) No Weather usermod (syncing internet data) No Yes (WIP) No HB effects Fully supported 80% supported (WIP) Not supported classic ESP32 Yes Yes Yes ESP32-S3 No Yes Experimental ESP32-S2 and ESP32-C3 No Experimental Experimental ESP8266 No Yes but no Audio Reactive Yes but no Audio Reactive Bin Awareness Yes Yes No Audioreactive palettes Yes Yes No Extended mic settings in platformIO No Yes No DMX Input No Yes No"},{"location":"moonmodules/mappings/","title":"Mappings","text":""},{"location":"moonmodules/mappings/#introduction","title":"Introduction","text":"There are a few steps between an effect and it's physical presentation on a number of leds.
This are the basic steps:
Optionally there can also be:
Remarks
Below is in processing order
"},{"location":"moonmodules/mappings/#json-mapping","title":"JSON mapping","text":"AKA jmap 1D expansion: maps a 1D effect to a 2D pattern
From excel/vba via /edit and to matrix
Files are here: JSONMappings
json files need to be uploaded to /edit. E.g. if filename is candle33.json, the name of the segment must be candle33 and expand1D must be jmap in order to run the mapping.
"},{"location":"moonmodules/mappings/#segment-to-logical","title":"Segment to Logical","text":"Maps segments to a matrix where (0,0) is always topleft and (width, height) always bottom right. Non serpentine
"},{"location":"moonmodules/mappings/#panel-layout","title":"Panel layout","text":"Takes into account Panel setup and Led panel layout as defined in 2D Configuration (e.g. 1st panel, 1st led, serpentine)
Code: uses customMappingTable
"},{"location":"moonmodules/mappings/#ledmaps","title":"Ledmaps","text":"Code: uses customMappingTable
See also Advanced/Mappings
"},{"location":"moonmodules/mappings/#fork-specific-info","title":"Fork specific info","text":"Feature WLED SR 0.13 MoonModules WLED 0.14 Upstream WLED 0.14 JSON Mapping No Yes No JSON mapping yet although it's based on an idea from AirCoookie Segment to Logical Yes Yes Yes Ledmaps Yes Yes Yes Panel layout Yes Yes Yes"},{"location":"moonmodules/platformio-entries/","title":"Platformio entries","text":"To re-use settings in a consistent way, MoonModules platformio entries conform to the following standard:
"},{"location":"moonmodules/platformio-entries/#overview","title":"Overview","text":"Remarks:
-D WLED_USE_MY_CONFIG -D WLED_WATCHDOG_TIMEOUT=0 #-D WLED_DISABLE_BROWNOUT_DET -D ARDUINO_USB_CDC_ON_BOOT=0 ; needed for arduino-esp32 >=2.0.4; avoids errors on startup ; -D WLED_DISABLE_LOXONE ; -D WLED_DISABLE_ALEXA ; -D WLED_DISABLE_HUESYNC ; -D WLED_DISABLE_MQTT ; -D WLED_DISABLE_INFRARED ; -D WLED_ENABLE_DMX ; -D WLED_DEBUG ; -D SR_DEBUG ; -D MIC_LOGGER
This is also ported to WLEDSR.
"},{"location":"moonmodules/platformio-entries/#wled-ac","title":"WLED AC","text":"No plans yet
"},{"location":"moonmodules/preset-api-commands/","title":"Preset API Commands","text":""},{"location":"moonmodules/preset-api-commands/#new-in-014","title":"New in 0.14","text":"key what value remarks m12 Exand1D 0=Pixels, 1=Bar, 2=Arc, 3=Corner, 4=jMap \ud83c\udf1c, 5=Circles \ud83c\udf1c, 6=Block \ud83c\udf1c ssim sound sim 0=BeatSin, 1=WeWillRockYou, 2=U10_3, 3=U14_3See also Features/Presets
"},{"location":"moonmodules/preset-api-commands/#fork-specific-info","title":"Fork specific info","text":""},{"location":"moonmodules/preset-api-commands/#wled-sr","title":"WLED SR","text":"Not in WLEDSR
"},{"location":"moonmodules/release-notes-v0.14.0-b0/","title":"Release notes v0.14.0-b0","text":""},{"location":"moonmodules/release-notes-v0.14.0-b0/#adding-pong","title":"Adding pong","text":"September 16, 2022
"},{"location":"moonmodules/release-notes-v0.14.0-b0/#adding-pong_1","title":"Adding pong","text":"In games usermod
"},{"location":"moonmodules/release-notes-v0.14.0-b0/#updates-from-audio-reactive","title":"updates from audio-reactive","text":"September 8, 2022
"},{"location":"moonmodules/release-notes-v0.14.0-b0/#updates-from-audio-reactive_1","title":"updates from audio-reactive","text":""},{"location":"moonmodules/release-notes-v0.14.0-b0/#merged-to-upstream","title":"merged to upstream","text":"volume & frequency \"dynamics limiter\" - slower decay of sound volume in effects. Also has an effect on GEQ, as it turns on smoothing for frequency bands.
GEQ frequency scaling: None (as in SR WLED), Linear, Square Root (new default), Logarithmic.
New option \"MIC profile\" - default (same table as in SR WLED), line-in (strictly \"pink noise\"), IMNP441 (optimized), ICS-43434 (optimized). This option causes the use of different \"pink noise tables\" when adjusting the frequency spectrum to human \"hearing sensitivity\". Pink noise calibration is very common when using hardware Equalizers. A good testcase is this Pink Noise Video.
(minor) Showing the \"GEQ input gain\" in percent, next to the slider value.
user-settable \"Trebble Amplification\" for GEQ effects. Will be placed into the Info Page, directly under \"GEQ input gain\".
September 6
Lessons Learnt: When upgrading WLED devices to software using the IDF 4.4.x framework, it seems that a flash erase is needed. Without this, we observed crashes whenever files were written.
Suspected cause: Lorol LittleFS (from standards framework) is not compatible with the built-in littleFS from IDF v4.4 / arduino-esp32 v2.0.4. Could be that the partition table is the problem, so a chip erase is needed to clean the table.
A new merge to mdev has been done: new environment esp32mdev_V4
so that normal compiles are not getting the new framework automatically.
From excel/vba via /edit and to matrix
Files are here: JSONMappings
"},{"location":"moonmodules/release-notes-v0.14.0-b0/#september-2","title":"September 2","text":""},{"location":"moonmodules/release-notes-v0.14.0-b0/#updates-from-audioreactive-prototype_1","title":"updates from audioreactive-prototype","text":"Merged into upstream
"},{"location":"moonmodules/release-notes-v0.14.0-b0/#expand1d-effects","title":"Expand1D effects","text":"Strip bar has been merged to upstream, strip Arc and strip Corner (as opposed to pixel Arc and Corner, see upstream) is \"waiting\" in upstream branch. To be added to MoonModules.
"},{"location":"moonmodules/release-notes-v0.14.0-b0/#usermod-level-up","title":"Usermod level up","text":"each usermod got its own settings page
"},{"location":"moonmodules/release-notes-v0.14.0-b0/#september-1","title":"September 1","text":""},{"location":"moonmodules/release-notes-v0.14.0-b0/#august-31","title":"August 31","text":""},{"location":"moonmodules/release-notes-v0.14.0-b0/#arti-fx","title":"ARTI-FX","text":"+ =
+ =
"},{"location":"moonmodules/release-notes-v0.14.0-b0/#august-29","title":"August 29","text":""},{"location":"moonmodules/release-notes-v0.14.0-b0/#updates-from-audioreactive-prototype_2","title":"updates from audioreactive-prototype","text":""},{"location":"moonmodules/release-notes-v0.14.0-b0/#merged-into-upstream","title":"Merged into upstream","text":"December 23, 2022
Currently implemented for AudioReactive and 4LineDisplay (tested) and all usermods which uses pin variables (testing in progress)
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#mmknowledge","title":"mm.kno.wled.ge","text":"December 21, 2022
MoonModules pages (wich is a fork of upstream pages) is now linked to mm.kno.wled.ge and is integrated in MoonModules WLED.
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#usermod-specific-help","title":"Usermod specific help","text":"December 19, 2022
This goes to https://mm.kno.wled.ge/soundreactive/Sound-Settings/
Also added in Weather usermod and four line display usermod (pages wip)
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#ledmap2d","title":"Ledmap2D","text":"December 5, 2022 In 0.14 ledmaps are only supported for 1D. This fix makes it work for 2D in WLED MM.
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#arti-fx-improvements","title":"ARTI-FX improvements","text":"November 29, 2022
ARTI-FX improvements: - Simplified presets.json (can be downloaded directly into WLED MM in ARTI-FX editor screen) - some bug fixes to let ARTI-FX run better on 2D
And combining ARTI-FX with 1D expansions gives great results and makes ARTI-FX very well performing on large 2D matrices!!!
This is color_fade_pulse (by @atuline) with Circles expansion:
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#improved-lay-out-usermod-settings","title":"Improved lay-out usermod settings","text":"November 20, 2022
Grouping and pre-post texts in usermod settings (to make it more readable)
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#audioreactive-palettes","title":"Audioreactive palettes","text":"November 19, 2022
by NetMindz
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#extended-mic-settings-in-platformio","title":"Extended mic settings in platformIO","text":"November 18, 2022
allowing to create mic specific environments:
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#bin-aware-builds","title":"Bin Aware Builds","text":"October 28, 2022
Upload hardware specific configs based on generated filenames (=> WLED install is aware of underlying hardware).
Ultimate goal of bin awareness is that WLED itself says: hey! I found a new update for you, do you want to install?
plus
(esp32mdev -> esp32_4MB_min. esp32mdevmax -> esp32_4MB_max / esp32_16MB_max)
plus
(0.14.0. sequence of upstream commit . sequence of mm commit (need to be updated together with build date)
=>
=>
(WLED install is aware of the filename of it's bin, WLEDMM_0.14.0.2.1_esp32_16MB.bin in this example)
plus
(Serg and Wladi repo's should use the same names)
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#ota-latest-release","title":"OTA latest release","text":"October 25, 2022
Manual OTA Update is showing the latest MoonModules/WLED release and clicking on the version icon jumps to the release pages on Github, links to Serg74 and Wladi builds are also shown on the release page, so Manual OTA Update will guide you to the version you need!
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#add-circles-and-block-as-1d-expansion","title":"Add Circles and Block as 1D expansion","text":"October 21, 2022
Add Circles and Block as 1D expansion and show virtualStrip effects with \u22ee\u22ee
Tetris effect with block expansion:
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#compatibility-for-sr013-presets","title":"compatibility for SR/0.13 presets","text":"October 20, 2022
Thanks to 'renumbered effect ID's back to WLED SR 0.13 numbering': Add compatibility for SR/0.13 presets. This allows HB effects to be run on 0.14, however this shows that there are some shortcomings in 0.14: e.g. lissajoux not working as at should and overlapping segments not working (e.g. Akemi from Hell): November update: Lissajoux, Akemi from Hell (and others) fixed, overlapping segments working now. Check this in Led Preferences:
(To see them fully working: load them into WLEDSR 0.13!)
To upload HR effects put effects / presets.json in /edit
To start creating your own multiple segment effects put base / presets.json in /edit
Presets.json files are here
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#renumbered-effect-ids-back-to-wled-sr-013-numbering","title":"renumbered effect ID's back to WLED SR 0.13 numbering","text":"October 16, 2022
Important update: renumbered effect ID's back to WLED SR 0.13 numbering so WLED (SR) 0.13 is compatible with MoonModules 0.14 for presets and sync between devices
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#extra-hardware-info-on-info-tab","title":"Extra hardware info on Info tab","text":"October 13, 2022
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#refactored-json-mapping","title":"Refactored JSON Mapping","text":"October 1, 2022
smaller memory footprint so larger mappings can be used, e.g. Snake32:
Files are here: JSONMappings
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#games-usermod-additions","title":"Games usermod additions","text":"September 27, 2022
Added to games usermod:
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#3d-to-2d-mapping","title":"3D to 2D mapping","text":"Adding Frame3D class which takes a 3D coordinate and maps this to 2D matrix (using addEffect(), setPixelColor(floats) and drawLine() added in 0.14 version)
=
"},{"location":"moonmodules/release-notes-v0.14.0-b1/#3d-gyro","title":"3D + Gyro","text":"Refactoring USERMOD_MPU6050_IMU (so that it works!) using latest ElectronicCats/mpu6050 library Embedding this usermod in games usermod and use yaw pitch and roll in Frame3D class
+ =
"},{"location":"moonmodules/release-notes-v0.14.0-b15/","title":"Release notes v0.14.0-b15","text":""},{"location":"moonmodules/release-notes-v0.14.0-b15/#example-mapping-library-for-rings-cubes-and-clouds","title":"Example mapping library for Rings, Cubes and Clouds","text":"2 April 2023
Get them here, upload the presets.json to have them all as presets: MoonModules/WLED-Effects/Ledmaps
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#mm-usermods-have-their-own-icon","title":"MM Usermods have their own icon","text":"2 April 2023
And (therefore) shown on top
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#tablet-pc-mode-support-and-ui-graphics-refactor","title":"Tablet PC Mode support and UI graphics refactor","text":"24 March 2023
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#better-sort-of-presets","title":"Better sort of presets","text":"23 March 2023
simplify sort to better align with quick load labels (sort first) and ir remotes using id (sort after presets)
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#athom-wled-music-controller-support","title":"Athom WLED Music Controller support","text":"21 March 2023
17 March 2023
FreqDist: set to rightshift to move the frequency bands a bit to the right in case most activity is on the left side.
FreqRMS: set to \"on\" to activate a different method for averaging higher frequencies, called \"RMS\" - it preserves peaks better. Downside: could lead to \"overshooting\" in GEQ, as our mic profiles are not adjusted to it yet.
17 March 2023
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#geq-smooth-bars","title":"GEQ Smooth Bars","text":"7 March 2023
New option to the GEQ effect: smooth bars. It's intended for matrices with >24 columns, where you would see a \"staircase\" effect because we only have 16 frequency channels. With the new option enabled, it looks like more channels are availeable and stairs are smoothed out.
and also smooth colors:
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#ledmap-properties","title":"Ledmap properties","text":"1 March 2023
See Advanced/Mapping/0.14 MM
Example: Ring Map
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#aditional-info-in-info-tab","title":"Aditional info in info tab","text":"27 Februari 2023
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#manage-netdebug-netprint-in-settings","title":"Manage NetDebug / NetPrint in settings","text":"24 Februari 2023
NetDebug is called NetPrint in WLEDMM as it is not only used for debut as we have USER_PRINT. It just prints to the network, hence the name.
No need to specify ip address and port in platformio.ini and therefor hardcode in bin/esp32 (but can be set to default). Go to Sync Interfaces / Net Print and specify there. Set output to network pressing Net Print in the info tab (default off after reboot value is saved in cfg.json - bug: not always set correctly after reboot - wip).
Bins WLEDMM_0.14.0-b2.19_esp32_4MB_M_debug and WLEDMM_0.14.0-b2.19_esp32_16MB_M_debug have NetPrint enabled by default. To do: check if NetPrint can be enabled in all bins (without performance/network consequences), also when WLED_DEBUG is off to catch Serial output.
March 8: All _M and _XL bins have NetPrint enabled by default (but not WLED_DEBUG): User info (using USER_PRINT) can be send to network
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#2d-ledmaps","title":"2D Ledmaps","text":"The first one will change colors smoothly, the second one will change colors every 5 seconds.
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#pins","title":"Pins","text":"January 14, 2023
For more information see https://mm.kno.wled.ge/usermods/globalpins/ This page is shown if you press here:
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#generate-presets-and-playlists","title":"Generate presets and playlists","text":"January 12, 2023
Generate presets of all effects and group them together in playlists for 1D or 2D, Volume or FFT, combinations or all
"},{"location":"moonmodules/release-notes-v0.14.0-b15/#i2c-and-spi-pins-make-over","title":"I2C and SPI pins make over","text":"Januari 9, 2023
We were not happy how currently pins are managed. It raises questions in discord we could not answer so we decided to refactor it. It's not easy as a lot is interconnected but we made the first steps:
This will be work in progress the coming weeks to implement in usermods (AudioReactive and 4LD working, others likely working but must be tested)
Overview of usermods available in _all bins:
"},{"location":"moonmodules/release-notes-v0.14.0-b25/","title":"Release notes v0.14.0-b25","text":"MoonModules v0.14.0-b25, release July 15th 2023
This WLED MM release is based on latest stable dev of WLED AC (June 2, 2023). We have also added a few stability patches that arrived in WLED AC after June 2nd. As WLED AC is undergoing a lot of changes, MoonModules built in a longer delay then normal to keep up with upstream until latest upstream is well tested.
Below an overview of major MoonModules specific changes and new features.
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#full-bright-preview","title":"Full Bright Preview","text":"7 July 2023
By @Softhack007
Instead of dimming down, the preview always shows at max brightness - even when the global brightness slider for your LEDs is set to a low value.
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#animartrix-usermod-2d-effects","title":"AnimARTrix Usermod - 2D effects","text":"
29 Jun 2023
By @Netmindz
Usermod to allow access to the AnimARTrix 2D effects by @StefanPetrick, all the effect names are prefixed with Y to group them at the bottom of the list. Animation speed can be controled by slider.
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#wled-instances","title":"WLED Instances","text":"May 2023
Refactor of the Nodes popup
1 July 2023 (audio fastpath, part 1)
Some effects will run up to 60% faster now. A lot of minor speedups to effect core routines were added. Additionally, FastLED color handling code was updated to release 3.6.0.
pixelwave
, freqmatrix
or DJ Light
."},{"location":"moonmodules/release-notes-v0.14.0-b25/#auto-brightness-limiter-works-again","title":"Auto Brightness Limiter works again","text":"
30 June 2023
By @Softhack007
Auto Brightness Limiter bugfixes (from WLED AC) are included in this release.
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#improved-stability","title":"Improved Stability","text":"1 June 2023
By @Troy and @Softhack007 and @ewowi
WLEDMM internal memory handling was optimized and improved for reliability. Loading of ledmaps was optimized to prevent repeated reading of the same file. As a consequence, large setups (>2500 LEDs) and big ledmaps.json files will work much better. We recommend using an ESP32 board with PSRAM for large setups, as JSON files will be processed in external PSRAM if available (PSRAM enabled firmware build needed).
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#peak-unlimited","title":"Peak unlimited","text":"May 16
by @ewowi
Instead of scaling down on pixels when having lots of leds we lower the peak frame rate so we have WYPIWYG (what you peak is what you get)
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#audio-palette-updates","title":"Audio Palette Updates","text":"14 April 2023
By @Netmindz
Fix issues with Audio Responsive Hue being single color and add new Audio Responsive Ramp palette. AR Ramp is designed for use with effects like Fire that expect the palette to start with black, then ramp up
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#soundpressure","title":"SoundPressure","text":"7 April 2023
By @Softhack007
In contrast to \"volume\", sound pressure level changes with the real loudness, as measured by your microphone. It will climb when you turn music louder, and fall when you turn volume down. You need an I2S digital microphone for soundpressure.
ARTI-FX, and the Waverly and Gravimeter effects already support sound pressure. More effects to come. Currently SoundPressure is not transmitted to networked devices with \"UDP sound sync\".
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#dmx-input","title":"DMX Input","text":"6 April 2023
By @Netmindz
Do you have existing tranditional wired DMX setup and just want to attach you WLED device like any other fixture? Well now you can. Same behaviour as existing DMX over ip (ArtNet / e1.31), but now with the stability and realiability without the need to use Ethernet.
Note: only currently on the _v4 builds due the esp_dmx library needing the 2.x ESP32-Arduino platform
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#support-for-pixelart-in-arti-fx","title":"Support for pixelArt in ARTI-FX","text":"5 April 2023
Idea by @Stiw47
ARTI-FX can show multiple frames, each stored as a separate json file in /edit
Program can be found here: https://github.com/MoonModules/WLED-Effects/blob/master/ARTIFX/wled/mario.wled
As ARTIFX does not support strings, jsonToPixels only contains a sequence number, the name of the json files is combination of segment name (that should be called mario), sequence number and \".json\") See https://github.com/MoonModules/WLED-Effects/blob/master/ARTIFX/wled/presets.json for how to add mario in presets
And don't forget to upload latest wledv033.json to /edit (https://github.com/MoonModules/WLED-Effects/blob/master/ARTIFX/wled/wledv033.json)"},{"location":"moonmodules/release-notes-v0.14.0-b25/#add-es8388-as-sound-reactive-input-type","title":"Add ES8388 as Sound Reactive Input type","text":"
5 April 2023
By @Troy and @Netmindz
Can be found in these boards: LyraT v4.3
"},{"location":"moonmodules/release-notes-v0.14.0-b25/#git-log","title":"Git Log","text":"git log mdev --pretty=format:\"%h - %ad - %an : %s &b\" --date=format-local:\"%Y-%m-%d\" --since=\"2023-04-02\"
c0a0f66a - 2023-04-30 - Frank : trying to revive github ci build for new MCUs (#38) as suggested here:\n* https://github.com/platformio/platform-espressif32/issues/1081#issuecomment-1518601054\n\n62910038 - 2023-04-28 - netmindz : Merge pull request #37 from netmindz/mdev Update FX.cpp\n\nd4bdb303 - 2023-04-24 - netmindz : Update FX.cpp Assign proper attribution of DJLight to Stefan Petrick\n\n fb3477e5 - 2023-04-21 - Frank : soundreactive effect updated \n* blurz: some visual improvements\n* Matripix: improved color smoothness, Color by frequency (instead of volume), option to use sound pressure\n* pixelwave: improved color selection, use sound energy instead of volume\n* freqwave: some speedups, option to show frequency with \"musical scale\"\n* gravfreq: fixed some math accidents that lead to horrible flickering\n* default setting improved for some effects\n\nd5a7f5dd - 2023-04-21 - Frank : scrolling text bugfix effect was crashing with too long or undefined segment names.\n\n8e9db0ad - 2023-04-21 - Frank : more accurate FPS forESP32 the standard millis() code is very inaccurate in the \"high FPS\" ranges. This replaces it with the esp32 high resolution timer.\n\n9130e4be - 2023-04-21 - Frank : minor optimization of core LED functions \n* use _fast_ integer types in loops - in contrast to \"uint16_t\" etc, the compiler can leave out range/overflow corrections, so it might run faster.\n* fcn_declare.h: revive \"WLED_USE_REAL_MATH\" option, which can be a bit faster on ESP32.\n\n36356743 - 2023-04-21 - Frank : audio effects: allow to run at full speed \n* set the \"speed\" slider to 255, for running at full speed\n* #FPS (framerate) and #POW (ampere) added to scrolling text\n\n00661de7 - 2023-04-21 - Frank : accept up to 250 fps target in LED preferences warning included.\n\n63a597b9 - 2023-04-20 - Frank : pio: same for -S3 ..... \nTool Manager: toolchain-xtensa-esp32s3@8.4.0+2021r2-patch3 has been installed!\nTool Manager: Installing espressif/toolchain-riscv32-esp @ 8.4.0+2021r2-patch3\nError: Could not find the package with 'espressif/toolchain-riscv32-esp @ 8.4.0+2021r2-patch3' requirements for your system 'linux_x86_64'\nError: Process completed with exit code 1.\n\nb35cd214 - 2023-04-20 - Frank : pio: disable -C3 and -S2 builds until github fixes their build toolds \nTool Manager: toolchain-xtensa-esp32s2@8.4.0+2021r2-patch3 has been installed!\nTool Manager: Installing espressif/toolchain-riscv32-esp @ 8.4.0+2021r2-patch3\nError: Could not find the package with 'espressif/toolchain-riscv32-esp @ 8.4.0+2021r2-patch3' requirements for your system 'linux_x86_64'\n\n33a78bef - 2023-04-20 - Frank : a little less buffer for -S2 the last change caused a build error for ESP32-S2: region `dram0_0_seg' overflowed by 5064 bytes\n\n1b3d9a1a - 2023-04-20 - Frank : more JSON buffer for boards with PSRAM allows to load ledmaps with > 15000 positions!\n\nbcbc0fbd - 2023-04-19 - Frank : Update platformio.ini \n* temporarily remove esp32c3dev_4MB_M from nightly builds, as the github action build currently has strange problems with it\n* -D WLED_USE_PSRAM_JSON for ESP32 boards, as using PSRAM for LED Buffers and Segment Buffers causes slow-down\nd90ee766 - 2023-04-19 - Frank : PSRAM: you can have it, and eat it or not eat it *This patch allows to compile with BOARD_HAS_PSRAM, but not set WLED_USE_PSRAM - reserved pins will be protected, and PSRAM usage will be shown in info.\n* if you add `-D WLED_USE_PSRAM_JSON` then PSRAM will be used for some JSON buffers, but not for LEDs and Segments.\n\ne2d3800f - 2023-04-19 - Frank : woraround for spurious crash in serializePalettes the root cause of the crash is not really clear, as the problem seems to occur randomly, mosr frequent with fresh installations.\nThis workaround prevents the array bounds violation, by re-using the last valid gGradientPalettes entry.\n\na2f15c77 - 2023-04-19 - Frank : WIFI_POWERON_HACK for AP mode reduce TX power - required for C3 mini v1.0.0 (wemos), see https://www.wemos.cc/en/latest/c3/c3_mini_1_0_0.html#about-wifi\n\n0558865c - 2023-04-18 - Troy : Merge pull request #36 from Fonta/patch-1 Fix invalid environment error in PlatformIO\n\n2e118938 - 2023-04-18 - Troy : Merge pull request #35 from troyhacks/DDP-RGBW-Transmit-Fix DDP Transmit RGBW Fix\n\n8d85a524 - 2023-04-17 - Frank : correct some stupid peak detection defaults parameters C1 and C2 control peak detection. Previous defaults (c2=0 !!!) did not make any sense.\n\n3f429439 - 2023-04-17 - Frank : Blurz effect: back to original SR code \nModifications from upstream have made the effect kind of boring non-reactive. So we go back to the original effect.\nHINT: Effect looks best with _segment_ brightness set to max (use _global_ brightness to reduce brightness as you like).\n\n45da3121 - 2023-04-16 - Fonta : Update platformio.ini \n\n6b6c961a - 2023-04-16 - Fonta : Fix invalid environment error in PlatformIO PlatformIO gives error on codm environments\n``Error: Invalid environment name 'codm-controller-0.6'. The name can contain alphanumeric, underscore, and hyphen characters (a-z, 0-9, -, _)``\n\n28c737df - 2023-04-15 - Frank : small fix Serial0 does not exist without ARDUINO_USB_CDC_ON_BOOT\n\n0fd26cc7 - 2023-04-15 - Frank : replace AC WebServer with lost-hope variant temporarily replace the webserver with a modified one that can also show .wled and .log files under /edit.\n\n2585b785 - 2023-04-15 - Frank : remove duplictate dependancies (AsyncTCP 1.1.1) \n* moving \"pbolduc/AsyncTCP.git @ 1.2.0\" on top of lib_deps, to prevent that AsyncTCP 1.1.1 is pulled in (due due dependacies from Aircoookie/ESPAsyncWebServer\n* remove duplicate env.lib_deps from -S2 environments\n\nc295c877 - 2023-04-15 - Frank : moving esp_dmx lib into esp32_4MB_V4_S_base the idea is to keep enable flag and library in the same build env.\n\n244a6137 - 2023-04-15 - Frank : esp32_4MB_V4_M: stay below 100% flash usage \n\n322ab9c5 - 2023-04-15 - Frank : arti-fx error handling improvements \n- if log file cannot be created, switch to serial logging\n- fixing a broken format string\n- usermod_arti: avoid to copy more than what fits into the buffer\n\nb7f1373e - 2023-04-14 - TroyHacks : DDP Transmit RGBW Fix \n\n4294f601 - 2023-04-14 - Frank : npm run build \ncc9a19bc - 2023-04-14 - Frank : partial merge of upstream/main \n* leaving out DotStarHspi5MhzMethod, as we are still on NPB 2.6.9 for eth boards\n* leaving out the index.css/index.css changes, as I'm not sure how to merge this.\n@ewoudwijma we need to merge the JS and CSS parts when you are back; I'll stay with our MM version for now.\n\nee23827f - 2023-04-14 - netmindz : Merge pull request #16 from netmindz/audio-palette-updates Audio palette updates\n\ncc25a21b - 2023-04-14 - Will Tatam : Merge branch 'mdev' into audio-palette-updates \n\n05c3e569 - 2023-04-14 - Frank : optional: warn about functions with high stack usage \n\n3e2a6848 - 2023-04-14 - Frank : arti setup(): attempt to fix memory leak \n- check that programName is not too long (fileNameLength-7 is the limit)\n- try to fix a memory leak, as programText must be free'd in case of error.\n@ewoudwijma please review my changes, I'm not 100% sure I did it right.\n\n10ca7c83 - 2023-04-14 - Frank : enumerateLedmaps: prevent buffer overflow make sure that bounds of char fileName[33] are not exceeded by sprintf.\n\n5f4dd53b - 2023-04-14 - Frank : V4 target: enable warning for variable shadoing \n* pio.ini: add \"-Wshadow=compatible-local\" for V4 targets\n* pio.ini: fix alignment for 8266 build_flags\n* fix one (harmless) case of shadowed vars in MM specific code\n\ndb62153e - 2023-04-13 - Frank : fix for a potential array overrun unguarded sprintf / strcpy are always a risk.\n\n122f54a2 - 2023-04-13 - Frank : prevent heat-up on tiny -C3 boards \n* reduce LED default brightness\n* unset \"disable wifi sleep\" when WLEDMM_WIFI_POWERON_HACK\n\n94a7f562 - 2023-04-13 - Frank : handling of Serial on CDC USB board ... like the typical -C3\n* Replaced a few direct Serial.printf with macros\n* Always check if Serial is connected before printing (CDC sometimes hangs when trying to send/receive without connection)\n\n0081122f - 2023-04-13 - Frank : buildenv improvement for -C3 \n* IRremoteESP8266 @ ~2.8.2\n* -D WLED_DISABLE_ADALIGHT (as most devices don't have a serial-to-USB chip)\n\na193aabd - 2023-04-13 - Frank : Merge pull request #34 from troyhacks/2023-04-12-Art-Net_Transmit_Repair_Bad_Optimization \n\"Unfixing\" an optimization to the Art-Net header.\nThe local \"buffer\" was shadowing the LED buffer (function parameter), so art-net would only send out headers but no LEDs.\n2e0d1046 - 2023-04-13 - Frank : some cleanups and updates for -C3 * remove duplicate env.lib_deps\n* use NeoPixelBus @ 2.7.3\n* added board_build.flash_mode\n\n0afad594 - 2023-04-13 - Frank : MM style buildenv for seeedxiao -C3 \n\n40e614cb - 2023-04-13 - Frank : ups double platform_packages line removed\n\ne9719900 - 2023-04-13 - Frank : pio: added esp32.platformV4_new = espressif32 @ ~5.2.0 \n\n0ae004ff - 2023-04-13 - Frank : buildenv fix: avoid NeoPixelBus 2.7.4 it seems that NPB 2.7.4 introduces new incompatibilities with WLED, that break gh action builds.\n\ndeb09c28 - 2023-04-13 - TroyHacks : Unmessing an optimization to the header - which caused the header to be sent over and over. \n\n04fa3995 - 2023-04-11 - Frank : soundsim bugfix FFT_MajorPeak simulated value was too small.\n\na1bdb47c - 2023-04-10 - Frank : trying to make sound pressure less boring for line-in \"sound pressure\" for line-in was always close to max - which is expected, because the ADC chip utilize the full 24/16bit sample range.\nThe new calculation leads to some more \"movement\".\n\n25122f98 - 2023-04-10 - Frank : temporary disable DMX input on -C3 and -S2 \n\n8ba43b63 - 2023-04-10 - Frank : Sound pressure: modified correction factors for PDM and analog \n\n61949cfd - 2023-04-10 - Frank : Sound Pressure \n- some optimizations \n- slightly extend input range\n- add correction factors for some sound sources\n- gravimeter: tweaking\n\n822fcf27 - 2023-04-08 - Ewoud : ARTI-FX change .wled.log to .log \n\n79c67122 - 2023-04-08 - Will Tatam : Enable WLED_ENABLE_DMX_INPUT again, now we reference a preditacble tag not branch \n\neb3ad99b - 2023-04-08 - Will Tatam : Use taged version of esp_dmx \n\n343252f6 - 2023-04-08 - Will Tatam : Use taged version of esp_dmx \n\n876b08e3 - 2023-04-08 - Ewoud : Temporary disable WLED_ENABLE_DMX_INPUT in esp32_4MB_V4_S_base \n\nca9bd227 - 2023-04-08 - Ewoud : Merge remote-tracking branch 'upstream/main' into mdev Everything merged except platformio.ini\n4ld has not been merged previously\nUpdate version to 0.14.0-b15.22\n\n212126b0 - 2023-04-07 - Ewoud : esp8266_4MB_M: usermods maches max usermods, add net print,set flashsize \n\na6e2cf0b - 2023-04-07 - Ewoud : ARTI-FX: Fix printing to USER_PRINT (if !logToFile) \n\n4aea3970 - 2023-04-07 - Ewoud : ARTI-FX support 8266 (experimental!!) add soundpressure Add ARTI-FX to esp8266_4MB_M (experimental!)\n\n20a91454 - 2023-04-06 - Ewoud : Post marge: regenerate html_settings \n\n6ef2857d - 2023-04-06 - MoonModules : Merge pull request #28 from netmindz/DMX-Input-esp_dmx Dmx input esp dmx\n\n7ffe25d5 - 2023-04-06 - MoonModules : Merge branch 'mdev' into DMX-Input-esp_dmx \n\n6cce70b2 - 2023-04-06 - Frank : gravimeter and waverly: option to show sound pressure level \n* adjusted gravimeter and waverly effects so that \"Sound Pressure\" can be used instead of volume\n* some improvements to gravimeter effect\n* fixing some over/underflows in gravimeter\n* waverly: option \"No Clouds\" to only show lower part\n\n197e120e - 2023-04-06 - Frank : estimated audio sound pressure \n\nb0907762 - 2023-04-06 - Frank : low-cut audio input filtering \n* 40Hz low-cut and DC blocker filter - will remove any signal offsets and also removes rumbling noise up to 12db\n* DC blocker set as default for all sources (prerequisite for later measuring sound pressure)\nadditional filtering options are in the making :-)\n\n00e9c592 - 2023-04-06 - MoonModules : Update readme.md \n\na77900b0 - 2023-04-06 - MoonModules : Update readme.md \n\n669b81de - 2023-04-06 - MoonModules : Update readme.md \n\n753f5621 - 2023-04-06 - Ewoud : ws sendLiveLedsWs: no skiplines to show large matrices uncompressed \n\n7372d304 - 2023-04-05 - MoonModules : Update FUNDING.yml \n\n64041836 - 2023-04-05 - Ewoud : Merge pull request #30 from troyhacks/ES8388-init-fixes ES8388 init optimizations and fixes\n\n95d6d186 - 2023-04-05 - TroyHacks : ES8388 init optimizations and fixes \n\nd64cefb2 - 2023-04-05 - Will Tatam : Fix invert of tx and rx pins \n\ncae1c004 - 2023-04-05 - Ewoud : ARTIFX add support for pixelart + small changes arti_wled.h:\n\ne4243c4d - 2023-04-05 - Ewoud : Merge pull request #5 from netmindz/ES8388 WiP - ES8388\n\n84f316cd - 2023-04-04 - netmindz : Merge pull request #1 from troyhacks/ES8388-troyhacks Working proof of concept for ES8388\n\n111c8c92 - 2023-04-04 - TroyHacks : Merge branch 'ES8388-troyhacks' of https://github.com/troyhacks/WLED into ES8388-troyhacks \n\nf44f307f - 2023-04-04 - TroyHacks : Comments and typos, init optimization and shortening. \n\n7d32bc5f - 2023-04-04 - Troy : Merge branch 'ES8388' into ES8388-troyhacks \n\na6a1bbab - 2023-04-04 - TroyHacks : Remove platform.ini entry for ES8388 \n\nc38baf90 - 2023-04-04 - TroyHacks : Removing local lib copy \n\nd775f7fb - 2023-04-04 - TroyHacks : Removed reliance on the ES8388 library and made things more in line with similar boards with I2C init. \n\n4997145d - 2023-04-04 - Ewoud : Fastled usermod, add Stefan Petrick effects PolarBasics & CircularBlobs CC BY-NC 3.0 licensed effects only include this usermod only if you accept the terms!\nTherefore not enabled in platformio.ini builds.\n\nbd477624 - 2023-04-04 - TroyHacks : Working proof of concept for ES8388 \n\n03570848 - 2023-04-03 - Will Tatam : Merge branch 'mdev' into ES8388 \n\n760ff836 - 2023-04-03 - Will Tatam : Merge branch 'mdev' into ES8388 \n\nd17a41f7 - 2023-04-02 - Bla\u017e Kristan : Merge pull request #3155 from werkstrom/patch-1 Adjustments to Pixel Art Converter\n\n503f71f0 - 2023-04-02 - Blaz Kristan : Npm run build \n\n329899f4 - 2023-04-02 - Ewoud : ooops \n\n3dd78731 - 2023-04-02 - Ewoud : First b15 daily build: add fastled usermod \n\n9307105b - 2023-04-02 - Henrik : Redone in Patch-1 \n\n27e89151 - 2023-04-02 - Ewoud : Versioning: 0.14.0-b15 (use the .21 extension on future commits) \n\n567daf99 - 2023-04-02 - Henrik : Merge branch 'Aircoookie:main' into patch-1 \n\neead626d - 2023-04-02 - Ewoud : 0.14.0-b15.21 release! \n
"},{"location":"moonmodules/release-notes-v0.14.0-b26/","title":"Release notes v0.14.0-b26","text":"Below are the ongoing updates in WLEDMM which are included in release v0.14.0-b26.30
"},{"location":"moonmodules/release-notes-v0.14.0-b26/#some-_s-builds-are-optimized-for-speed","title":"Some_S
builds are optimized for speed","text":"July 21st, 2023
By @Softhack007
Some MoonModules builds are now utilizing compiler option -O2 \"optimize for speed\", instead of -Os \"optimize for size\".
As the firmware size grows with this option, only a few _S
firmware binaries for esp32 are currently build with this higher optimization level:
esp32_4MB_S
(flash usage 87.4% --> 98.8%)esp32_16MB_V4_S
(flash usage 73.3% --> 82.9%)esp32_16MB_S
(includes animartix)esp32S3_8MB_S
for -S3 (up to 45% faster than normal build!)First tests show 20%-35% higher FPS (framerates) in effects!
Known issue: USERMOD_ANIMARTRIX aborts with internal compiler error when building with -O2
:
wled00/../usermods/usermod_v2_animartrix/usermod_v2_animartrix.h: In function 'uint16_t mode_Waves()':\nwled00/../usermods/usermod_v2_animartrix/usermod_v2_animartrix.h:340:1: error: insn does not satisfy its constraints:\n }\n ^\n (insn 811 738 824 24 (set (reg/v:SF 19 f0 [orig:69 result ] [69])\n (mem/u/c:SF (symbol_ref/u:SI (\"*.LC1575\") [flags 0x2]) [0 S4 A32])) \".pio/libdeps/my_esp32_16MB_V4_S_debug/animartrix/ANIMartRIX.h\":345 47 {movsf_internal}\n (nil))\n during RTL pass: postreload\n wled00/../usermods/usermod_v2_animartrix/usermod_v2_animartrix.h:340:1: internal compiler error: in extract_constrain_insn, at recog.c:2210\n libbacktrace could not find executable to open\n Please submit a full bug report, with preprocessed source if appropriate. See <https://gcc.gnu.org/bugs/> for instructions.\n
"},{"location":"moonmodules/release-notes-v0.14.0-b27/","title":"Release notes v0.14.0-b27","text":"Below are the ongoing updates in WLEDMM which are included in release v0.14.0-b27.31
"},{"location":"moonmodules/release-notes-v0.14.0-b27/#topic","title":"Topic","text":"Aug 26st, 2023
what it is.
By @Softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b27/#topic_1","title":"Topic","text":"Date
By @Netmindz
"},{"location":"moonmodules/release-notes-v0.14.0-b28/","title":"Release notes v0.14.0-b28","text":"MoonModules v0.14.0-b28, release December 20th 2023
Below are the WLEDMM specific new features which are included in release v0.14.0-b28.34
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#build-runs-anywhere-usermods","title":"build runs-anywhere usermods","text":"Dec 15th, 2023
WLEDMM now allows you to encapsulate your MoonModules specific code like this:
class ShtUsermod : public Usermod\n{\n private:\n#ifndef _MoonModules_WLED_\n bool enabled = false; // Is usermod enabled or not //WLEDMM not needed - using public attribute of class UserMod\n#endif\n\n public:\n#ifdef _MoonModules_WLED_\n ShtUsermod(const char *name, bool enabled):Usermod(name, enabled) {} //WLEDMM usermod initializer with parameters\n#endif\n\nvoid ShtUsermod::setup()\n{\n if (enabled) {\n\n#ifdef _MoonModules_WLED_\n if ((i2c_sda >= 0) && (i2c_scl >= 0) && pinManager.joinWire(i2c_sda, i2c_scl)) { // WLEDMM pin management done by pinManager.joinWire()\n pinAllocDone = true;\n } else {\n USER_PRINTF(\"[%s] SHT pin allocation failed!\\n\", _name); // WLEDMM using USER_PRINTF for important messages\n cleanup();\n return;\n }\n#else\n PinManagerPinType pins[2] = { { i2c_sda, true }, { i2c_scl, true } };\n if (i2c_sda < 0 || i2c_scl < 0 || !pinManager.allocateMultiplePins(pins, 2, PinOwner::HW_I2C)) { \n DEBUG_PRINTF(\"[%s] SHT pin allocation failed!\\n\", _name);\n cleanup();\n return;\n } else pinAllocDone = true;\n#endif\n }\n initDone = true;\n}\n
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#udp-sound-sync-improvements","title":"UDP Sound Sync improvements","text":"December 2023
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#latency-reduced-drasticially","title":"Latency reduced drasticially","text":"Latency from microphone to receiving sound on the remode unit has been optimized drasticially. Previously the average delay was 30-60ms. With our optimized code, UDP packets are sent out directly when new samples arrive from the driver, resulting in average delay of 10-25ms.
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#new-udp-sync-mode-receive-or-local","title":"New UDP sync mode \"Receive or Local\"","text":"Acts like \"Receive\", however automaticially falls back to local whenever the UDP stream is missing.
Local input when sender is missing.
Automatic switch-over to network sound.
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#udp-sound-sequence-checking-framecounter","title":"UDP sound sequence checking (framecounter)","text":"UDP transport itself does neither guarantee delivery nor sequence.
Leveraging on a previously unused byte in the UDP sound sync format, WLED-MM now checks that a newly received sound sample is \"in sequence\". Too-late packets will be dropped, leading to smoother animations.
By @netmindz
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#presets-name-and-default-checkboxes","title":"Presets name and default checkboxes","text":"Nov 23st, 2023
Default name of new preset now includes the icons (cause it's nice to know if a preset is sound reactive or not) Preset checkboxes have now default of last set values (cause it's handy of you don't want to save brightness it is not saved in next preset save as well)
By @ewowi
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#super-sync","title":"Super Sync","text":"October 15, 2023 By @ewowi
Super Sync runs one effect on multiple instances allowing for higher framerates as each instance runs only part of the effect.
The nodes tab shows more info per instance, info which is needed for SuperSync.
SuperSync takes all the panels in the 2D config setup and each panel will be setup on a different node.
Red: client node is not setup right
SuperSync button: for all nodes with a red yes in the SSync column the desired configuration will be send and configured on that node. After pressing SuperSync all nodes should be in the right config
SuperSync is work in progress. Some effects run perfect, others not yet. This has mostly to do with the random function giving different values on different instances. Some effects have been adapted to give the same values for random using the same random seeds
Example of setup of supersync on 3x3 = 9 nodes:
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#wm8978-support-for-ohmic-pico-dsp","title":"WM8978 support for Ohmic Pico DSP","text":"Oct 20st, 2023
Essentially a similar type of chip to the ES8388 - I2S codec configured over I2C. Configured for line-in with pass-thru on the Ohmic ESP32 Pico D4 DSP board: https://github.com/ohmic-net/puca_dsp
May not work out of the box with all WM8978 boards because of the vast configuration options in the codec, but could easily be adjusted for various configurations. Not that there's many out there. :)
By @troyhacks
"},{"location":"moonmodules/release-notes-v0.14.0-b28/#lots-of-bugfix-back-porting-from-upstream","title":"Lots of bugfix back-porting from upstream","text":"Dec 16th, 2023
Due to technical incompatibilities to latest upstream source code, WLEDMM is still building on the WLED core from summer 2023 (long story...). We have however made an effort to analyze bugfixes from upstream until version 0.14.1-beta, and brought them into WLED-MM if possible.
As a user, you get our latest features, combined with various stability improvements and bugfixing made in upstream WLED. Plus all bugfixing and improvements of MM specific features that were created in the last 3 months.
The detailed list is here: https://github.com/MoonModules/WLED/blob/mdev/CHANGELOG.md
by @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/","title":"Release notes v0.14.3-b3x-daily","text":"Below are the ongoing updates in WLEDMM which has not made it to a release yet (Next major release will be v0.14.3-b32)
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#moonmodules-v0143-b32-work-in-progress","title":"MoonModules v0.14.3-b32 (work in progress)","text":""},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#info-page-improvements","title":"Info Page improvements","text":"May 4th, 2024
System information in the \"Info\" panel re-organized, and PSRAM statistics added.
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#lots-of-bugfix-back-porting-from-upstream","title":"Lots of bugfix back-porting from upstream","text":"ongoing, 2024
Due to technical incompatibilities to latest upstream source code, WLEDMM is still building on the WLED core from summer 2023 (long story...). We have however made an effort to analyze bugfixes from upstream until version 0.14.3, and brought them into WLED-MM if possible. We also pack-ported a few features from upstream 0.15.0-beta.
by @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#updated-dmx-input-now-with-rdm-support","title":"Updated DMX Input - now with RDM support","text":"Feb 10th, 2024
The (wired) DMX Input has been given significant rewrite by @arneboe and now supports RDM - NOTE: you will need to re-enter all 3 pins used when you upgrade to this version
by @arneboe
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#moonmodules-v0141-b30","title":"MoonModules v0.14.1-b30","text":""},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#gamma-correct-palettes-preview","title":"gamma-correct palettes preview","text":"Jan 25th, 2024
old \u00a0 new
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#option-to-disable-sequence-checking-in-sound-sync","title":"option to disable sequence checking in sound sync","text":"Jan 5th, 2024
UDP sound sync - sequence checking can be disabled in settings (useful if several units send sound)
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#new-audio-reactive-effects-enhancing-standard-effects","title":"new audio reactive effects (enhancing standard effects)","text":"Dec 31st, 2023
Audio Reactive standard effects - clap your hands - Popcorn ;-)
back-ported from WLED-SR. These \"audio enhanced\" effects are triggered by sound. Like clapping of hands, music starts, beats, fireworks explosions.
The popcorn audio effect looks particularly great in 2D mode - select 1D-2D mapping \"bars\").
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#build-runs-anywhere-usermods","title":"build runs-anywhere usermods","text":"Dec 15th, 2023
WLEDMM now allows you to encapsulate your MoonModules specific code like this:
class ShtUsermod : public Usermod\n{\n private:\n#ifndef _MoonModules_WLED_\n bool enabled = false; // Is usermod enabled or not //WLEDMM not needed - using public attribute of class UserMod\n#endif\n\n public:\n#ifdef _MoonModules_WLED_\n ShtUsermod(const char *name, bool enabled):Usermod(name, enabled) {} //WLEDMM usermod initializer with parameters\n#endif\n\nvoid ShtUsermod::setup()\n{\n if (enabled) {\n\n#ifdef _MoonModules_WLED_\n if ((i2c_sda >= 0) && (i2c_scl >= 0) && pinManager.joinWire(i2c_sda, i2c_scl)) { // WLEDMM pin management done by pinManager.joinWire()\n pinAllocDone = true;\n } else {\n USER_PRINTF(\"[%s] SHT pin allocation failed!\\n\", _name); // WLEDMM using USER_PRINTF for important messages\n cleanup();\n return;\n }\n#else\n PinManagerPinType pins[2] = { { i2c_sda, true }, { i2c_scl, true } };\n if (i2c_sda < 0 || i2c_scl < 0 || !pinManager.allocateMultiplePins(pins, 2, PinOwner::HW_I2C)) { \n DEBUG_PRINTF(\"[%s] SHT pin allocation failed!\\n\", _name);\n cleanup();\n return;\n } else pinAllocDone = true;\n#endif\n }\n initDone = true;\n}\n
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#udp-sound-sync-improvements","title":"UDP Sound Sync improvements","text":"December 2023
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#latency-reduced-drasticially","title":"Latency reduced drasticially","text":"Latency from microphone to receiving sound on the remode unit has been optimized drasticially. Previously the average delay was 30-60ms. With our optimized code, UDP packets are sent out directly when new samples arrive from the driver, resulting in average delay of 10-25ms.
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#new-udp-sync-mode-receive-or-local","title":"New UDP sync mode \"Receive or Local\"","text":"Acts like \"Receive\", however automaticially falls back to local whenever the UDP stream is missing.
Local input when sender is missing.
Automatic switch-over to network sound.
By @softhack007
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#udp-sound-sequence-checking-framecounter","title":"UDP sound sequence checking (framecounter)","text":"UDP transport itself does neither guarantee delivery nor sequence.
Leveraging on a previously unused byte in the UDP sound sync format, WLED-MM now checks that a newly received sound sample is \"in sequence\". Too-late packets will be dropped, leading to smoother animations.
By @netmindz
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#presets-name-and-default-checkboxes","title":"Presets name and default checkboxes","text":"Nov 23st, 2023
Default name of new preset now includes the icons (cause it's nice to know if a preset is sound reactive or not) Preset checkboxes have now default of last set values (cause it's handy of you don't want to save brightness it is not saved in next preset save as well)
By @ewowi
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#super-sync","title":"Super Sync","text":"October 15, 2023 By @ewowi
Super Sync runs one effect on multiple instances allowing for higher framerates as each instance runs only part of the effect.
The nodes tab shows more info per instance, info which is needed for SuperSync.
SuperSync takes all the panels in the 2D config setup and each panel will be setup on a different node.
Red: client node is not setup right
SuperSync button: for all nodes with a red yes in the SSync column the desired configuration will be send and configured on that node. After pressing SuperSync all nodes should be in the right config
SuperSync is work in progress. Some effects run perfect, others not yet. This has mostly to do with the random function giving different values on different instances. Some effects have been adapted to give the same values for random using the same random seeds
Example of setup of supersync on 3x3 = 9 nodes:
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#wm8978-support-for-ohmic-pico-dsp","title":"WM8978 support for Ohmic Pico DSP","text":"Oct 20st, 2023
Essentially a similar type of chip to the ES8388 - I2S codec configured over I2C. Configured for line-in with pass-thru on the Ohmic ESP32 Pico D4 DSP board: https://github.com/ohmic-net/puca_dsp
May not work out of the box with all WM8978 boards because of the vast configuration options in the codec, but could easily be adjusted for various configurations. Not that there's many out there. :)
By @troyhacks
"},{"location":"moonmodules/release-notes-v0.14.0-b3-daily/#lots-of-bugfix-back-porting-from-upstream_1","title":"Lots of bugfix back-porting from upstream","text":"Dec 16th, 2023
Due to technical incompatibilities to latest upstream source code, WLEDMM is still building on the WLED core from summer 2023 (long story...). We have however made an effort to analyze bugfixes from upstream until version 0.14.1-beta, and brought them into WLED-MM if possible.
As a user, you get our latest features, combined with various stability improvements and bugfixing made in upstream WLED. Plus all bugfixing and improvements of MM specific features that were created in the last 3 months.
by @softhack007
"},{"location":"moonmodules/showcases-hcs/","title":"Human Sized Cube","text":""},{"location":"moonmodules/showcases-hcs/#hardware","title":"Hardware","text":"Idea, design and first build by @troy
Red numbers: Panels: 1..4 are the side panels, 5 is the top panel
result: insta
tuned for HSC by @softhack007 and @ewowi
Setup as 5 horizontal panels (advanced setup) so of no ledmap is used, effects run smooth on the sides (top is the 5th panel)
First two panels start top right, rest top left, see above image
Note: Panel numbering starts at 0
Can be found here
cfg.json can be used to create above setup
presets.json contains a set of well tested presets
ledmap1.json and ledmap2.json are used in effects
import using /edit"},{"location":"moonmodules/showcases-hcs/#fork-specific-info","title":"Fork specific info","text":"Feature WLED SR 0.13 MoonModules WLED 0.14 Upstream WLED 0.14 Ledmaps Yes Yes Yes"},{"location":"moonmodules/super-sync/","title":"Super Sync","text":""},{"location":"moonmodules/super-sync/#introduction","title":"Introduction","text":"
See here for a quick overview https://mm.kno.wled.ge/moonmodules/release-notes-v0.14.0-b3-daily/#super-sync
Further documentation to be done.
Below is in processing order
"},{"location":"moonmodules/super-sync/#json-mapping","title":"JSON mapping","text":""},{"location":"moonmodules/super-sync/#fork-specific-info","title":"Fork specific info","text":"Feature WLED SR 0.13 MoonModules WLED 0.14 Upstream WLED 0.14 Ledmaps Yes Yes Yes"},{"location":"moonmodules/what-is-moonmodules/","title":"What is MoonModules","text":""},{"location":"moonmodules/what-is-moonmodules/#what-are-all-these-acronyms","title":"What are all these acronyms?","text":"WLED MM 0.14 (\ud83c\udf1c) = WLED AC 0.14 + Extra features
WLED AC 0.14 = (WLED AC 0.13 + WLED SR)(2.0).
WLED SR (\ud83c\udfb8) is for the last 2 years maintained mainly by @softhack007 and @ewowi and has been created by the legendary Andrew Tuline (\ud83c\udfb8).
WLED AC 0.14 has been made mainly by @Aircoookie , @blazoncek , @softhack007 and @ewowi.
WLED MM is mainly maintained by @softhack007 @ewowi, @netmindz, @s\u00f6ren and @troy and can be considered similar to what AMG is doing to Mercedes (see amg.wled.me).
"},{"location":"moonmodules/what-is-moonmodules/#compatibility","title":"compatibility","text":"WLED MM is compatible with WLED AC (it's running on average 1 day to 1 week behind WLED AC latest build) for all features that can also be found in WLED AC.
Consider WLED MM as a possible next version of WLED AC (we submit PR's on a regular basis).
"},{"location":"moonmodules/what-is-moonmodules/#why","title":"why?","text":"The reason WLED MM is created is that we have many ideas how to improve WLED AC but we need a \"playground\" to develop and mature those ideas.
WLED MM releases and daily builds are made to deploy - and are deployed - on live situations, not test bench only. Many features added to MM came from live situation feedback. Although new builds may have errors, in practice they tend to be better then earlier versions.
"},{"location":"moonmodules/what-is-moonmodules/#whats-new","title":"What's new?","text":"Our latest work can be found here: mdev.
You can compile it yourself using PlatformIO.ini entry esp32_4MB_max or get a build from Serg74 (daily) or Wladi (periodically).
Get latest release here: https://github.com/MoonModules/WLED/releases
"},{"location":"moonmodules/what-is-moonmodules/#more-info","title":"More info:","text":"Release notes v0.14.0-b3-daily
Release notes v0.14.0-b27
Release notes v0.14.0-b26
Release notes v0.14.0-b25
Release notes v0.14.0-b15
Release notes v0.14.0-b1
Release notes v0.14.0-b0
Installing and compiling
Fork comparison
WLED AC:
WLED MM:
WLED SR:
The Future ???
"},{"location":"moonmodules/wip/","title":"Work in Progress","text":"This page is work in progress
Check WLED MoonModules Wiki for original content
Template text:
"},{"location":"moonmodules/wip/#fork-specific-info","title":"Fork specific info","text":""},{"location":"moonmodules/wip/#wled-sr","title":"WLED SR","text":""},{"location":"soundreactive/Line-Input/","title":"I2S ADC for Line-In","text":"If you want the best experience, then Line-In using I2S will give the best quality. As you are getting a clean audio feed the squelch value should be set to 1 to start with, and a gain of 1 is also likely a good starting point. Automatic Gain Control (AGC) set to \"Normal\" is still recommended, but not strictly required.
Looking to add line-in with I2S support? You might want to try I2S ADC boards that use one of these chips:
Many I2S ADC line-in boards expect an additional MCLK signal (\"Main Clock\" aka \"System Clock\" aka \"Master Clock\" aka \"Memory Clock\"). MCLK is sometimes labelled SCLK for \"system clock\". For these boards with 4 data pins, use the AudioReactive Generic I2S with MCLK
input option, and connect MCLK pin to GPIO pin 0 on the original ESP32.
*NOTE: Technically GPIO 1 and 3 will work on the original ESP32 for MCLK, but these are most often in use for the serial console. If you're using an MCLK-required line-in board on an ESP32-S3 (and possibly other ESP32-XX boards) then the MCLK can be any free GPIO pin. WLED will generally show you which pins are allowed for MCLK on your board.
"},{"location":"soundreactive/Line-Input/#pmod-i2s2","title":"Pmod I2S2","text":"Data Sheet and Information
"},{"location":"soundreactive/Line-Input/#wm8782","title":"WM8782","text":"Buy: AliExpress
Data Sheet
"},{"location":"soundreactive/Line-Input/#ti-pcm1808","title":"TI PCM1808","text":"Buy: Amazon or AliExpress
Top side: Right audio input, Audio Ground, Left audio input.
Right side: The I2S connections -
Left side: Feature settings and 5v input:
In WLED AudioReactive settings you will need to use Generic I2S with MCLK
. You have 3 choices of what MCLK pin you can use - 0, 1, and 3. Pin 0 highly recommended as 1 as 3 will likely be in use on the original ESP32 for the serial console.
5v seems to NEED to be connected. You can connect it to 3.3v but it will glitch randomly. Put that pin on 5v for best function.
3.3v and ground are connected to the same pins on the right side - just need to connect one of each, on either side.
MD1 and MD0 set master/slave modes. It defaults to slave (both pins are internally set to low), which is what you want for WLED. Don't connect these to anything.
FMY (format, FMT in the spec sheet - I assume the \"Y\" is a typo on the silkscreen) is a bit more interesting. By default it's pulled low internally, which the docs claim to be \"I2S, 24-bit\" - which will work fine as a default.
...however, pulling FMY \"high\" (connected to 3.3v) seems to make everything better in WLED. According to the spec sheet, this moves the entire 24 bit sequence one pulse earlier (\"left justified\") and the responsiveness seems to be better overall in WLED. The GEQ visual output is more \"balanced\" with the highs being better represented. The format of the 24 bits is unchanged - both are MSB first - but it seems to be better in WLED when the pin is pulled high. This may also depend on if you're using an IDF v3 build (the default) or IDF v4 (the requirement for ESP32-S3 and other more modern boards, optionally for the original ESP32).
"},{"location":"soundreactive/Line-Input/#es8388-and-ac101","title":"ES8388 and AC101","text":"Because of some confusion with these chips being used on various boards interchangably:
These audio chips reqires I2C commands to initialize properly. \"Line-in mode\" has been hard-coded into the initialization and will be used when \"ES8388\" or \"AC101\" is selected. (While the chips were sometimes used interchangably for the same basic function, the initialization is not the same!)
The on-board microphones are not currently supported by default - line-in is much better regardless.
Note: the underside of ESP32 overhang shows ESP32-A1S 2974. This version uses the ES8388 chip.
Line-in is internally routed to line-out, allowing these boards to be used in the middle of a line-level signal path.
"},{"location":"soundreactive/Line-Input/#pin-config","title":"Pin Config","text":"The LyraT v4.3 and some AiThinker v2.2 boards use the following pin config:
If the above doesn't work for AiThinker v2.2 boards use a chip with the following pins, use if you see errors about I2C:
Note: the underside of ESP32 overhang shows ESP32-A1S B221 and B238 on two boards with this config - the \"B\" or \"B2\" may be hints as to revision.
Older Ai-Thinker AudioKit A1S boards use the AC101 chip. The board sample we have is marked \"v2.2 2957\". There is no stamp on the bottom of the ESP32 antenna overhang. Assume anything lower than that version is an AC101.
Config for the AC101 is:
...although who knows what other revisions may be floating around?!
"},{"location":"soundreactive/Line-Input/#wm8978","title":"WM8978","text":"This audio chip reqires I2C commands to initialize properly. \"Line-in mode\" has been hard-coded into the initialization and will be used when \"WM8978\" is selected.
The on-board microphones are not currently supported - line-in is much better regardless.
Support for the WM8978 chipset is derived from the Puca DSP board:
Curently the Puca DSP on-board microphones may leak some sound in extremely loud environments, but the line-in will overpower this signal when presented. This has been minimized with settings. It technically shouldn't be using any mic signal, but there may be a small voltage leak in the analog signal path.
Line-in should be internally routed to line-out, allowing this board to be used in the middle of a line-level signal path.
"},{"location":"soundreactive/Line-Input/#pin-config_1","title":"Pin Config","text":"The Puca DSP board pins are as follows:
WLED has effects that use the audio data to actually control how the effect behaves, but the new Audio Responsive palettes allow you to make any of the effects respond to audio by selecting one of these palettes
2 SR palettes:
V: selection of FTT values
HSV: Some effects like fire expect the luminosity to rise using HSV
Implemented - Dev branch only
"},{"location":"soundreactive/Sound-Reactive-Palettes/#wled-mm","title":"WLED MM","text":"Released in v0.14.0-b1.13
"},{"location":"soundreactive/Sound-Reactive-Palettes/#wled-ac","title":"WLED AC","text":"Not yet implemented
"},{"location":"soundreactive/Sound-Settings/","title":"Work in Progress","text":""},{"location":"soundreactive/Sound-Settings/#introduction","title":"Introduction","text":"In order to accommodate a wide range of audio inputs, ambient environments and string lengths, we have added user configurable squelch (noise reduction/suppression) and gain controls on the sound settings page that apply to all sound reactive animations.
"},{"location":"soundreactive/Sound-Settings/#press-reset-key-after-changing-sound-source","title":"Press reset key after changing sound source","text":"After changing the sound source (either GPIO pins or Microphone type), it is important to press the \"reset\" (RST) button on your ESP32 - don't forget to \"save\" first. WLED cannot change the sound input configuration \"on the fly\", due to a known hardware problem of ESP32. See https://github.com/espressif/esp-idf/issues/7442 \"only a hard CPU reset can disconnect the I2S signal from built-in ADC\".
"},{"location":"soundreactive/Sound-Settings/#analog-input-pins","title":"Analog Input Pins","text":"We typically recommend using GPIO 36, aka VP or ADC1_CH0 for analog input, however the following pins should also work:
GPIO 32 => ADC1_CH4
GPIO 33 => ADC1_CH5
GPI\u00a0 34 => ADC1_CH6
GPI\u00a0 35 => ADC1_CH7
GPI\u00a0 36 => ADC1_CH0, VP
GPI\u00a0 37 => ADC1_CH1
GPI\u00a0 38 => ADC1_CH2
GPI\u00a0 39 => ADC1_CH3, VN
Do NOT use any of the pins from ADC2, as they will conflict with the WiFi and with I2S sampling.
Remember to press Reset after saving your new analog input configuration.
We have observed problems when using \"analog buttons\" (potentiometer) together with ADC analog sound input. It seems that different drivers (I2S-ADC for sound, analogRead() for potentiometer) are getting into conflict - more details in the related bug report for espressif software. If you plan to attach a potentiometer to your WLED device, we recommend to use an I2S digital microphone to avoid these problems.
More information about analog inputs on our analog microphones page.
"},{"location":"soundreactive/Sound-Settings/#squelch","title":"Squelch","text":"Adjust this value on the Sound Settings page so that the leds are only activated above a certain 'background noise' level.
In order to accommodate a wide range of audio inputs, ambient environments and string lengths, we have added user configurable squelch (noise reduction/suppression) and gain controls on the LED settings page for the volume reactive animations.
See also
\u21d2 Squelch and Gain
\u21d2 Sound setting examples for common microphones
"},{"location":"soundreactive/Sound-Settings/#gain","title":"Gain","text":"Line-in signals are typically much lower than that of some of the microphones. Rather than use an auto gain function, you can manually adjust the gain from 1 to 255, which translates to 0.1 up to almost 6.5 gain. That's equivalent to a range of -20dB up to +16dB.
In addition, the 'Intensity' and \"input level\" sliders can sometimes adjust an animation to simulate increased gain.
"},{"location":"soundreactive/Sound-Settings/#how-to","title":"How To","text":"Here's a method to setup squelch and gain for your SR WLED Device.
From faulty microphones to flaky wiring, to WiFi related issues, particularly in AP mode, getting reliable and spike free sound sampling with WLED and in particular analog sampling has been a challenge. Digital microphones such as the INMP441, the ICS-43434 provide the best results.
"},{"location":"soundreactive/Sound-Settings/#i2s-digital-input","title":"I2S Digital Input","text":"Currently the following I2S options are available:
Some more information can be found on our I2S digital microphones page.
to be extended soon
"},{"location":"soundreactive/Sound-Settings/#i2s-line-in","title":"I2S Line-in","text":"There are solutions available for line-in via I2S. For example, boards/shields with \"es7243\" chip should work already (we have a special driver for these), and the \"es8388\" used in some of the AudioDevKit boards. Please check our Line-Input page for more information.
"},{"location":"soundreactive/Sound-Settings/#agc-improved-autonomous-gain-control","title":"AGC - improved Autonomous Gain Control","text":"We have recently improved the AGC (automatic gain control) algorithm in WLED-SR. It's not enabled by default, however we encourage you to give it a try - all sound reactive effects now support AGC, including 2D and frequency-reactive effects. The only prerequisite for using AGC is that you first adjust \"Squelch\" to define 'silence' (ambient noise level) in your environment - see previous section.
AGC will automatically perform sound input amplification, based on current sound loudness. For example, if you play music and then increase the speaker volume, WLED-SR will adjust internal gain factors to follow your music. Forget about manually changing \"gain\" settings. Just relax and let WLED-SR do it autonomously.
Currently WLED-SR offers four different AGC presets that can be selected in sound settings: * Off - AGC off. WLED will strictly use the Gain value from sound input settings, without any adjustments. * Normal - AGC tries to smoothly follow changes in sound input volume. Recommended as a balanced option for general use. * Vivid - AGC will quickly adjust to changes in sound input volume. Recommended in case you want \"more blinken from your LEDs\". * Lazy - AGC will take some more time before internal gain is adjusted. Recommended for GEQ effects, or when listening to music that features strong \"dynamics\".
"},{"location":"soundreactive/Sound-Settings/#sync","title":"Sync","text":"It is possible to fit a mic or line-in connection to a single WLED device and then send the results of the audio processing to other WLED devices on the same network. Just set the device with the input to Send and the other devices to Receive
NOTE: if you see issues with delay or no data at all, you may se better performance if you disable Wi-Fi Multimedia (WMM) Mode QoS on your wifi router
to be extended soon
"},{"location":"soundreactive/introduction/","title":"Sound Reactive Introduction","text":"In this section you will find everything related to sound for versions >= 0.14.
Aim is to migrate content in Sound Reactive (<=0.13) step by step to here.
"},{"location":"soundreactive/introduction/#fork-specific-info","title":"Fork specific info","text":""},{"location":"soundreactive/introduction/#wled-sr","title":"WLED SR","text":""},{"location":"soundreactive/sync/","title":"Sound Sync","text":"If you have more than one device or wish to use Line Input but your audio source is not right next where your LEDs are, then Audio Sync is the feature you need, no need for multiple mics or long cables. Sound Sync is different from direct LEDs control using protocols like E1.31, DMX, DDP or AdaLight.
For the WLED instance that you wish to be the source, simply set the Sync mode in the Audio Reactive module to Send and then use Recieve on all the WLED instances you wish to use the data
You might have a setup something like this or just a simple wired line-in rather than Bluetooth or Chromecast
UDP Sound Sync is a feature to synchronize (share) the sound input of a 'master' device with one or more 'slave' devices.
UDP Sound Sync does not sync the actual animations, but rather transmits summary audio sampling information to several devices that still run their own animations locally. In a nutshell, it means that several devices can share a single audio source.
"},{"location":"soundreactive/sync/#setup","title":"Setup","text":"Before configuring UDP Sound Sync, make sure you have gone into the WiFi Preferences and clicked on 'Disable WiFi sleep' at the bottom of the page. It has caused us innumerable problems in the past.
In order to configure UDP sound sync, the \u2018master\u2019 needs to be an ESP32 configured as normal, but with Sync Mode set to Send
For devices without an audio input, Audio Reactive must be enabled but with the Sync Mode set to Receive. Make sure the UDP port is the same on all devices.
In order to change the UDP Sync Mode (Disabled/Transmit/Receive), you need to power-cycle the ESP32.
"},{"location":"soundreactive/sync/#technical","title":"Technical","text":"When an ESP32 is configured for audio transmission, it will connect to a UDP Multicast address, and begin sending a single UDP Multicast packet containing the data used to generate sound-reactive animations out to any other devices that are configured to receive on the same network. The following information is transmitted:
"},{"location":"soundreactive/sync/#v1-format-used-in-sr-wled-up-to-013x","title":"V1 format, used in SR WLED up to 0.13.x","text":"#define UDP_SYNC_HEADER \"00001\"\nstruct audioSyncPacket {\n char header[6] = UDP_SYNC_HEADER;\n uint8_t myVals[32]; // 32 Bytes\n int sampleAgc; // 04 Bytes\n int sampleRaw; // 04 Bytes\n float sampleAvg; // 04 Bytes\n bool samplePeak; // 01 Bytes\n uint8_t fftResult[16]; // 16 Bytes - FFT results, one byte per GEQ channel\n double FFT_Magnitude; // 08 Bytes\n double FFT_MajorPeak; // 08 Bytes\n};\n
UDP_SYNC_HEADER is a versioning number that's defined in audio_reactive.h
"},{"location":"soundreactive/sync/#v2-format-wled-version-0140-including-moonmodules-fork","title":"V2 Format - WLED version >= 0.14.0 (including MoonModules fork)","text":"#define UDP_SYNC_HEADER_V2 \"00002\"\n\n// new \"V2\" audiosync struct - 44 Bytes\n struct __attribute__ ((packed)) audioSyncPacket { // WLEDMM \"packed\" ensures that there are no additional gaps\n char header[6]; // 06 Bytes offset 0\n uint8_t pressure[2]; // 02 Bytes, offset 6 - sound pressure as fixed point (8bit integer, 8bit fraction) \n float sampleRaw; // 04 Bytes offset 8 - either \"sampleRaw\" or \"rawSampleAgc\" depending on soundAgc setting\n float sampleSmth; // 04 Bytes offset 12 - either \"sampleAvg\" or \"sampleAgc\" depending on soundAgc setting\n uint8_t samplePeak; // 01 Bytes offset 16 - 0 no peak; >=1 peak detected. In future, this will also provide peak Magnitude\n uint8_t frameCounter; // 01 Bytes offset 17 - track duplicate/out of order packets\n uint8_t fftResult[16]; // 16 Bytes offset 18\n uint16_t zeroCrossingCount; // 02 Bytes, offset 34\n float FFT_Magnitude; // 04 Bytes offset 36\n float FFT_MajorPeak; // 04 Bytes offset 40\n };\n
The V2 format expects that AGC is performed by the sender, so there is no need to transmit \"AGC\" and \"non-AGC\" samples separately. To save bandwidth, the myvals[]
array was removed, and all numbers are either float
or uint8_t
.
SR-WLED 0.13.3 still sends out V1 format, however it is able to receive and decode V2 format, too.
"},{"location":"soundreactive/sync/#values","title":"values","text":"float
, additional accuracy can be provided by using the fraction part of the number - for example sampleSmth= 127.125
. Samples transmitted are the max value from approx 20 milliseconds of sampling, with AGC gain already applied.You might want to take a look at this library, which allows to send and receive WLED Audio Sync data independent from WLED.
When configured to receive audio data from another device, the receiver will disable any onboard microphone sampling and FFT processing, in favor of audio data received from the network. Any time a UDP Multicast packet is received from a transmitter, it will be treated as a discrete microphone sample and stored in memory the same way it would be if it were a local microphone.
239.0.0.1
, and the default UDP port is 11988
.For windows, there is WledSRServer (https://github.com/Victoare/SR-WLED-audio-server-win) which is a small application that is doing the audio capturing, FFT computation and packet sending on the system. It sends out V2 packets.
UDP Sound sync brought to you by @spedione on Discord.
"},{"location":"usermods/4LineDisplay/","title":"Usermod Four line display","text":""},{"location":"usermods/4LineDisplay/#i2c-4-line-display-usermod","title":"I2C 4 Line Display Usermod","text":"First, thanks to the authors of the ssd11306_i2c_oled_u8g2 mod.
Provides a four line display using either 128x32 or 128x64 OLED displays. It can operate independently, but starts to provide a relatively complete on-device UI when paired with the Rotary Encoder UI usermod. I strongly encourage you to use them together.
See the pair of usermods in action
"},{"location":"usermods/4LineDisplay/#installation","title":"Installation","text":"Copy and update the example platformio_override.ini.sample
from the Rotary Encoder UI usermode folder to the root directory of your particular build. This file should be placed in the same directory as platformio.ini
.
USERMOD_FOUR_LINE_DISPLAY
- define this to have this mod included wled00\\usermods_list.cpp - also tells Rotary Encoder usermod, if installed, the display is availableFLD_PIN_SCL
- The display SCL pin, defaults to 5FLD_PIN_SDA
- The display SDA pin, defaults to 4All of the parameters can be configured via the Usermods settings page, inluding GPIO pins.
"},{"location":"usermods/4LineDisplay/#platformio-requirements","title":"PlatformIO requirements","text":"This usermod requires the U8g2
and Wire
libraries. See the platformio_override.ini.sample
found in the Rotary Encoder UI usermod folder for how to include these using platformio_override.ini
.
enabled
- enable/disable usermodpin
- GPIO pins used for display; I2C displays use Clk & Data; SPI displays can use SCK, MOSI, CS, DC & RSTtype
- display type in numeric formatcontrast
- set display contrast (higher contrast may reduce display lifetime)refreshRateSec
- display refresh time in secondsscreenTimeOutSec
- screen saver time-out in secondsflip
- flip/rotate display 180\u00b0sleepMode
- enable/disable screen saverclockMode
- enable/disable clock display in screen saver modei2c-freq-kHz
- I2C clock frequency in kHz (may help reduce dropped frames, range: 400-3400)2021-02 * First public release
2021-04 * Adaptation for runtime configuration.
2021-11 * Added configuration option description.
"},{"location":"usermods/4LineDisplay/#i2c-4-line-display-usermod-alt","title":"I2C 4 Line Display Usermod ALT","text":"Thank you to the authors of the original version of these usermods. It would not have been possible without them! \"usermod_v2_four_line_display\" \"usermod_v2_rotary_encoder_ui\"
The core of these usermods are a copy of the originals. The main changes are to the FourLineDisplay usermod. The display usermod UI has been completely changed.
The changes made to the RotaryEncoder usermod were made to support the new UI in the display usermod. Without the display it, functions identical to the original. The original \"usermod_v2_auto_save\" will not work with the display just yet.
Press the encoder to cycle through the options: Brightness Speed Intensity Palette Effect Main Color (only if display is used) *Saturation (only if display is used)
Press and hold the encoder to display Network Info if AP is active, it will display AP, SSID and password
Also shows if the timer is enabled
See the pair of usermods in action
"},{"location":"usermods/4LineDisplay/#installation_1","title":"Installation","text":"Please refer to the original usermod_v2_rotary_encoder_ui
readme for the main instructions Then to activate this alternative usermod add #define USE_ALT_DISPLAY
to the usermods_list.cpp
file, or add -D USE_ALT_DISPLAY
to the original platformio_override.ini.sample
file
Note: the Four Line Display usermod requires the libraries U8g2
and Wire
.
2021-10 * First public release
"},{"location":"usermods/4LineDisplay/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/4LineDisplay/#wled-ac","title":"WLED AC","text":""},{"location":"usermods/4LineDisplay/#wled-sr","title":"WLED SR","text":""},{"location":"usermods/AutoPlaylist/","title":"Usermod Auto Playlist","text":""},{"location":"usermods/AutoPlaylist/#auto-playlist","title":"Auto Playlist","text":"v2 Usermod to automatically change between two playlists:
Optionally, \"AutoChange\" will advance your music playlist automatically when the musicality suggests a good time to change presets.
Note: The playlist you have designated as \"MusicPlaylist\" must be active for the AutoPlaylist function to take control of your presets.
"},{"location":"usermods/AutoPlaylist/#settings","title":"Settings","text":"AutoChange looks at the properties of the incoming audio to try and determine a good time to change presets in your music playlist.
This is entirely just \"for fun\" and should not to be relied on to be overly accurate, etc. It's a calculation, not a VJ or lighjting artist.
AutoChange works with some new values computed in the AudioReactive usermod:
These values are each calculted as two averages in the AutoPlaylist usermod: * A fast-moving average for each of the 3 values * A slow-moving average for each of the 3 values
Finally, a vector is computed to determine the difference between the two average pools. When this vector is minimal, the preset is changed.
The change threshhold is calculated on the fly and adjusted up or down based on if we are faster or slower than our ideal change window.
\"Change Lockout\" will prevent the usermod from changing the presets more frequently than this number of milliseconds, but \"Ideal Change Min\" and \"Ideal Change Max\" simply influence the calculated change threshold. If the calculated vector is lower than the current change threshold AND change lockout has been exceeded, a preset change will almost always take place (see note).
When a change happens more quickly than \"Ideal Change Min\" or more slowly than \"Ideal Change Max\", the change threshold is adjusted accordingly.
If we haven't seen a change by the time \"Ideal Change Min\" has occured, the change threshold is increased to the minimum distance detected to increase the chances of detecting a change happening within the time window. This also helps AutoChange adjust to different music over time, like when a track changes.
"},{"location":"usermods/AutoPlaylist/#installation","title":"Installation","text":"Add this to build_flags
in your platformio_override.ini file:
-D USERMOD_AUTO_PLAYLIST
Optionally you can add this to enable the usermod's specific debug output:
-D USERMOD_AUTO_PLAYLIST_DEBUG
This debug is also automatically enabled with -D WLED_DEBUG
as well.
No special requirements.
"},{"location":"usermods/AutoPlaylist/#change-log","title":"Change Log","text":"2024-03-25 * Pre-Beta release, docs added.
2024-04-04 * Docs updated with debug flag.
"},{"location":"usermods/Autosave/","title":"Usermod Auto save","text":""},{"location":"usermods/Autosave/#auto-save","title":"Auto Save","text":"v2 Usermod to automatically save settings to preset number AUTOSAVE_PRESET_NUM after a change to any of: * brightness * effect speed * effect intensity * mode (effect) * palette
but it will wait for AUTOSAVE_AFTER_SEC seconds, a \"settle\" period in case there are other changes (any change will extend the \"settle\" period).
It will additionally load preset AUTOSAVE_PRESET_NUM at startup during the first loop()
.
AutoSaveUsermod is standalone, but if FourLineDisplayUsermod is installed, it will notify the user of the saved changes.
Note: WLED doesn't respect the brightness of the preset being auto loaded, so the AutoSaveUsermod will set the AUTOSAVE_PRESET_NUM preset in the first loop, so brightness IS honored. This means WLED will effectively ignore Default brightness and Apply N preset at boot when the AutoSaveUsermod is installed.
"},{"location":"usermods/Autosave/#installation","title":"Installation","text":"Copy and update the example platformio_override.ini.sample
from the Rotary Encoder UI usermode folder to the root directory of your particular build. This file should be placed in the same directory as platformio.ini
.
USERMOD_AUTO_SAVE
- define this to have this usermod included wled00\\usermods_list.cppAUTOSAVE_AFTER_SEC
- define the delay time after the settings auto-saving routine should be executedAUTOSAVE_PRESET_NUM
- define the preset number used by autosave usermodUSERMOD_AUTO_SAVE_ON_BOOT
- define if autosave should be enabled on bootUSERMOD_FOUR_LINE_DISPLAY
- define this to have this the Four Line Display mod included wled00\\usermods_list.cpp also tells this usermod that the display is available (see the Four Line Display usermod readme.md
for more details)Example to add in platformio_override: -D USERMOD_AUTO_SAVE -D AUTOSAVE_AFTER_SEC=10 -D AUTOSAVE_PRESET_NUM=100 -D USERMOD_AUTO_SAVE_ON_BOOT=true
You can also configure auto-save parameters using Usermods settings page.
"},{"location":"usermods/Autosave/#platformio-requirements","title":"PlatformIO requirements","text":"No special requirements.
Note: the Four Line Display usermod requires the libraries U8g2
and Wire
.
2021-02 * First public release 2021-04 * Adaptation for runtime configuration.
"},{"location":"usermods/Autosave/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/Autosave/#wled-sr","title":"WLED SR","text":""},{"location":"usermods/BH1750/","title":"Usermod BH1750","text":""},{"location":"usermods/BH1750/#bh1750-usermod","title":"BH1750 usermod","text":"This usermod will read from an ambient light sensor like the BH1750. The luminance is displayed in both the Info section of the web UI, as well as published to the /luminance
MQTT topic if enabled.
claws/BH1750 @^1.2.0
lib_deps
in your platformio.ini
(or platformio_override.ini
).To enable, compile with USERMOD_BH1750
defined (e.g. in platformio_override.ini
)
[env:usermod_BH1750_d1_mini]\nextends = env:d1_mini\nbuild_flags =\n ${common.build_flags_esp8266}\n -D USERMOD_BH1750\nlib_deps = \n ${esp8266.lib_deps}\n claws/BH1750 @ ^1.2.0\n
"},{"location":"usermods/BH1750/#configuration-options","title":"Configuration Options","text":"The following settings can be set at compile-time but are configurable on the usermod menu (except First Measurement time): * USERMOD_BH1750_MAX_MEASUREMENT_INTERVAL
- the max number of milliseconds between measurements, defaults to 10000ms * USERMOD_BH1750_MIN_MEASUREMENT_INTERVAL
- the min number of milliseconds between measurements, defaults to 500ms * USERMOD_BH1750_OFFSET_VALUE
- the offset value to report on, defaults to 1 * USERMOD_BH1750_FIRST_MEASUREMENT_AT
- the number of milliseconds after boot to take first measurement, defaults to 10000 ms
In addition, the Usermod screen allows you to: - enable/disable the usermod - Enable Home Assistant Discovery of usermod - Configure the SCL/SDA pins
"},{"location":"usermods/BH1750/#api","title":"API","text":"The following method is available to interact with the usermod from other code modules: - getIlluminance
read the brightness from the sensor
Jul 2022 - Added Home Assistant Discovery - Implemented PinManager to register pins - Made pins configurable in usermod menu - Added API call to read luminance from other modules - Enhanced info-screen outputs - Updated readme.md
This Usermod is designed to read a BME280
or BMP280
sensor and output the following: - Temperature - Humidity (BME280
only) - Pressure - Heat Index (BME280
only) - Dew Point (BME280
only)
Configuration is performed via the Usermod menu. There are no parameters to set in code! The following settings can be configured in the Usermod Menu: - Temperature Decimals (number of decimal places to output) - Humidity Decimals - Pressure Decimals - Temperature Interval (how many seconds between temperature and humidity measurements) - Pressure Interval - Publish Always (turn off to only publish changes, on to publish whether or not value changed) - Use Celsius (turn off to use Fahrenheit) - Home Assistant Discovery (turn on to sent MQTT Discovery entries for Home Assistant) - SCL/SDA GPIO Pins
Dependencies - Libraries - BME280@~3.0.0
(by finitespace) - Wire
- These must be added under lib_deps
in your platform.ini
(or platform_override.ini
). - Data is published over MQTT - make sure you've enabled the MQTT sync interface. - This usermod also writes to serial (GPIO1 on ESP8266). Please make sure nothing else is listening to the serial TX pin or your board will get confused by log messages!
In addition to outputting via MQTT, you can read the values from the Info Screen on the dashboard page of the device's web interface.
Methods also exist to read the read/calculated values from other WLED modules through code. - getTemperatureC()
- getTemperatureF()
- getHumidity()
- getPressure()
- getDewPointC()
- getDewPointF()
- getHeatIndexC()
- getHeatIndexF()
To enable, compile with USERMOD_BME280
defined (e.g. in platformio_override.ini
)
[env:usermod_bme280_d1_mini]\nextends = env:d1_mini\nbuild_flags =\n ${common.build_flags_esp8266}\n -D USERMOD_BME280\nlib_deps = \n ${esp8266.lib_deps}\n BME280@~3.0.0\n Wire\n
"},{"location":"usermods/BME280/#mqtt","title":"MQTT","text":"MQTT topics are as follows (<deviceTopic>
is set in MQTT section of Sync Setup menu): Measurement type | MQTT topic --- | --- Temperature | <deviceTopic>/temperature
Humidity | <deviceTopic>/humidity
Pressure | <deviceTopic>/pressure
Heat index | <deviceTopic>/heat_index
Dew point | <deviceTopic>/dew_point
If you are using Home Assistant, and Home Assistant Discovery
is turned on, Home Assistant should automatically detect a new device, provided you have the MQTT integration installed. The device is separate from the main WLED device and will contain sensors for Pressure, Humidity, Temperature, Dew Point and Heat Index.
Jul 2022 - Added Home Assistant Discovery - Added API interface to output data - Removed compile-time variables - Added usermod menu interface - Added value outputs to info screen - Updated readme.md
- Registered usermod - Implemented PinManager for usermod - Implemented reallocation of pins without reboot
Apr 2021 - Added Publish Always
option
Dec 2020 - Ported to V2 Usermod format - Customizable measure intervals
- Customizable number of decimal places
in published sensor values - Pressure measured in units of hPa instead of Pa - Calculation of heat index (apparent temperature) and dew point - 16x oversampling
of sensor during measurement - Values only published if they are different from the previous value
Enables battery level monitoring of your project.
For this to work, the positive side of the (18650) battery must be connected to pin A0
of the d1 mini/esp8266 with a 100k Ohm resistor (see Useful Links).
If you have an ESP32 board, connect the positive side of the battery to ADC1 (GPIO32 - GPIO39)
"},{"location":"usermods/Battery/#features","title":"\u2699\ufe0f Features","text":"define USERMOD_BATTERY
in wled00/my_config.h
USERMOD_BATTERY
define this (in my_config.h
) to have this usermod included wled00\\usermods_list.cpp USERMOD_BATTERY_USE_LIPO
define this (in my_config.h
) if you use LiPo rechargeables (1S) USERMOD_BATTERY_MEASUREMENT_PIN
defaults to A0 on ESP8266 and GPIO35 on ESP32 USERMOD_BATTERY_MEASUREMENT_INTERVAL
ms battery check interval. defaults to 30 seconds USERMOD_BATTERY_MIN_VOLTAGE
v minimum battery voltage. default is 2.6 (18650 battery standard) USERMOD_BATTERY_MAX_VOLTAGE
v maximum battery voltage. default is 4.2 (18650 battery standard) USERMOD_BATTERY_TOTAL_CAPACITY
mAh the capacity of all cells in parralel sumed up USERMOD_BATTERY_CALIBRATION
offset / calibration number, fine tune the measured voltage by the microcontroller Auto-Off --- --- USERMOD_BATTERY_AUTO_OFF_ENABLED
true/false enables auto-off USERMOD_BATTERY_AUTO_OFF_THRESHOLD
% (0-100) when this threshold is reached master power turns off Low-Power-Indicator --- --- USERMOD_BATTERY_LOW_POWER_INDICATOR_ENABLED
true/false enables low power indication USERMOD_BATTERY_LOW_POWER_INDICATOR_PRESET
preset id when low power is detected then use this preset to indicate low power USERMOD_BATTERY_LOW_POWER_INDICATOR_THRESHOLD
% (0-100) when this threshold is reached low power gets indicated USERMOD_BATTERY_LOW_POWER_INDICATOR_DURATION
seconds for this long the configured preset is played All parameters can be configured at runtime via the Usermods settings page.
"},{"location":"usermods/Battery/#important","title":"\u26a0\ufe0f Important","text":"USERMOD_BATTERY_MAX_VOLTAGE
Discharge voltage 2,5V USERMOD_BATTERY_MIN_VOLTAGE
Max. discharge current (constant) 10A (10000mA) max. charging current 1.7A (1700mA) ... ... ... .. .. .. Specification from: Molicel INR18650-M35A, 3500mAh 10A Lithium-ion battery, 3.6V - 3.7V
"},{"location":"usermods/Battery/#useful-links","title":"\ud83c\udf10 Useful Links","text":"2023-01-04
-D USERMOD_BATTERY_USE_LIPO
)2022-12-25
2021-09-02
2021-08-15
USERMOD_BATTERY_MIN_VOLTAGE
to 2.6 volt as default for 18650 batteries2021-08-10
This usermod-v2 modification allows the connection of multiple relays, each with individual delay and on/off mode.
"},{"location":"usermods/MultiRelay/#http-api","title":"HTTP API","text":"All responses are returned in JSON format.
http://[device-ip]/relays
http://[device-ip]/relays?switch=1,0,1,1
The number of values behind the switch parameter must correspond to the number of relays. The value 1 switches the relay on, 0 switches it off.
http://[device-ip]/relays?toggle=1,0,1,1
The number of values behind the parameter switch must correspond to the number of relays. The value 1 causes the relay to toggle, 0 leaves its state unchanged.
Examples: 1. total of 4 relays, relay 2 will be toggled: http://[device-ip]/relays?toggle=0,1,0,0
2. total of 3 relays, relay 1&3 will be switched on: http://[device-ip]/relays?switch=1,0,1
You can toggle the relay state by sending the following JSON object to: http://[device-ip]/json
Switch relay 0 on: {\"MultiRelay\":{\"relay\":0,\"on\":true}}
Switch relay 3 and 4 off: {\"MultiRelay\":[{\"relay\":2,\"on\":false},{\"relay\":3,\"on\":false}]}
wled
/deviceMAC/relay
/0
/command
on
|off
|toggle
wled
/deviceMAC/relay
/1
/command
on
|off
|toggle
When a relay is switched, a message is published:
wled
/deviceMAC/relay
/0
on
|off
#include \"../usermods/multi_relay/usermod_multi_relay.h\"
at the top and usermods.add(new MultiRelay());
at the bottom of usermods_list.cpp
. or#define USERMOD_MULTI_RELAY
in wled.h or -D USERMOD_MULTI_RELAY
in your platformio.iniYou can override the default maximum number of relays (which is 4) by defining MULTI_RELAY_MAX_RELAYS.
Example usermods_list.cpp:
#include \"wled.h\"\n/*\n * Register your v2 usermods here!\n * (for v1 usermods using just usermod.cpp, you can ignore this file)\n */\n\n/*\n * Add/uncomment your usermod filename here (and once more below)\n * || || ||\n * \\/ \\/ \\/\n */\n//#include \"usermod_v2_example.h\"\n//#include \"usermod_temperature.h\"\n#include \"../usermods/usermod_multi_relay.h\"\n\nvoid registerUsermods()\n{\n /*\n * Add your usermod class name here\n * || || ||\n * \\/ \\/ \\/\n */\n //usermods.add(new MyExampleUsermod());\n //usermods.add(new UsermodTemperature());\n usermods.add(new MultiRelay());\n\n}\n
"},{"location":"usermods/MultiRelay/#configuration","title":"Configuration","text":"Usermod can be configured via the Usermods settings page.
enabled
- enable/disable usermodpin
- ESP GPIO pin the relay is connected to (can be configured at compile time -D MULTI_RELAY_PINS=xx,xx,...
)delay-s
- delay in seconds after on/off command is receivedactive-high
- assign high/low activation of relay (can be used to reverse relay states)external
- if enabled, WLED does not control relay, it can only be triggered by an external command (MQTT, HTTP, JSON or button)button
- button (from LED Settings) that controls this relaybroadcast
- time in seconds between MQTT relay-state broadcastsHA-discovery
- enable Home Assistant auto discoveryIf there is no MultiRelay section, just save current configuration and re-open Usermods settings page.
Have fun - @blazoncek
"},{"location":"usermods/MultiRelay/#change-log","title":"Change log","text":"2021-04 * First implementation.
2021-11 * Added information about dynamic configuration options * Added button support.
"},{"location":"usermods/MultiRelay/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/MultiRelay/#wled-sr","title":"WLED SR","text":""},{"location":"usermods/PIRsensorSwitch/","title":"Usermod PIRsensorSwitch","text":""},{"location":"usermods/PIRsensorSwitch/#pir-sensor-switch","title":"PIR sensor switch","text":"This usermod-v2 modification allows the connection of a PIR sensor to switch on the LED strip when motion is detected. The switch-off occurs ten minutes after no more motion is detected.
Story:
I use the PIR Sensor to automatically turn on the WLED analog clock in my home office room when I am there. The LED strip is switched using a relay to keep the power consumption low when it is switched off.
"},{"location":"usermods/PIRsensorSwitch/#web-interface","title":"Web interface","text":"The info page in the web interface shows the remaining time of the off timer. Usermod can also be temporarily disbled/enabled from the info page by clicking PIR button.
"},{"location":"usermods/PIRsensorSwitch/#sensor-connection","title":"Sensor connection","text":"My setup uses an HC-SR501 or HC-SR602 sensor, an HC-SR505 should also work.
The usermod uses GPIO13 (D1 mini pin D7) by default for the sensor signal, but can be changed in the Usermod settings page. This example page describes how to connect the sensor.
Use the potentiometers on the sensor to set the time delay to the minimum and the sensitivity to about half, or slightly above. You can also use usermod's off timer instead of sensor's. In such case rotate the potentiometer to its shortest time possible (or use SR602 which lacks such potentiometer).
"},{"location":"usermods/PIRsensorSwitch/#usermod-installation","title":"Usermod installation","text":"NOTE: Usermod has been included in master branch of WLED so it can be compiled in directly just by defining -D USERMOD_PIRSWITCH
and optionaly -D PIR_SENSOR_PIN=16
to override default pin. You can also change the default off time by adding -D PIR_SENSOR_OFF_SEC=30
.
To query or change the PIR sensor state the methods bool PIRsensorEnabled()
and void EnablePIRsensor(bool enable)
are available.
When the PIR sensor state changes an MQTT message is broadcasted with topic wled/deviceMAC/motion
and message on
or off
. Usermod can also be configured to send just the MQTT message but not change WLED state using settings page as well as responding to motion only at night (assuming NTP and lattitude/longitude are set to determine sunrise/sunset times).
usermod_PIR_sensor_switch.h
before you include other usermods in `usermods_list.cpp'or
#include \"usermod_PIR_sensor_switch.h\"
at the top of the usermod.h
where you need it.Example usermod.h :
#include \"wled.h\"\n\n#include \"usermod_PIR_sensor_switch.h\"\n\nclass MyUsermod : public Usermod {\n //...\n\n void togglePIRSensor() {\n #ifdef USERMOD_PIR_SENSOR_SWITCH\n PIRsensorSwitch *PIRsensor = (PIRsensorSwitch::*) usermods.lookup(USERMOD_ID_PIRSWITCH);\n if (PIRsensor != nullptr) {\n PIRsensor->EnablePIRsensor(!PIRsensor->PIRsensorEnabled());\n }\n #endif\n }\n //...\n};\n
"},{"location":"usermods/PIRsensorSwitch/#configuration-options","title":"Configuration options","text":"Usermod can be configured via the Usermods settings page.
PIRenabled
- enable/disable usermodpin
- dynamically change GPIO pin where PIR sensor is attached to ESPPIRoffSec
- number of seconds after PIR sensor deactivates when usermod triggers Off preset (or turns WLED off)on-preset
- preset triggered when PIR activates (if this is 0 it will just turn WLED on)off-preset
- preset triggered when PIR deactivates (if this is 0 it will just turn WLED off)nighttime-only
- enable triggering only between sunset and sunrise (you will need to set up NTP, Lat & Lon in Time & Macro settings)mqtt-only
- send only MQTT messages, do not interact with WLEDoff-only
- only trigger presets or turn WLED on/off if WLED is not already on (displaying effect)notifications
- enable or disable sending notifications to other WLED instances using Sync buttonHave fun - @gegu & @blazoncek
"},{"location":"usermods/PIRsensorSwitch/#change-log","title":"Change log","text":"2021-04 * Adaptation for runtime configuration.
2021-11 * Added information about dynamic configuration options * Added option to temporary enable/disble usermod from WLED UI (Info dialog)
2022-11 * Added compile time option for off timer. * Added Home Assistant autodiscovery MQTT broadcast. * Updated info on compiling.
"},{"location":"usermods/PIRsensorSwitch/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/PIRsensorSwitch/#wled-sr","title":"WLED SR","text":""},{"location":"usermods/Rotary-Encoder/","title":"Usermod Rotary Encoder","text":""},{"location":"usermods/Rotary-Encoder/#rotary-encoder-ui-usermod","title":"Rotary Encoder UI Usermod","text":"First, thanks to the authors of other Rotary Encoder usermods.
This usermod starts to provide a relatively complete on-device UI when paired with the Four Line Display usermod. I strongly encourage you to try them together.
See the pair of usermods in action
"},{"location":"usermods/Rotary-Encoder/#installation","title":"Installation","text":"Copy and update the example platformio_override.ini.sample
to the root directory of your particular build. This file should be placed in the same directory as platformio.ini
.
USERMOD_ROTARY_ENCODER_UI
- define this to have this user mod included wled00\\usermods_list.cppUSERMOD_ROTARY_ENCODER_GPIO
- define the GPIO function (INPUT, INPUT_PULLUP, etc...)USERMOD_FOUR_LINE_DISPLAY
- define this to have this the Four Line Display mod included wled00\\usermods_list.cpp also tells this usermod that the display is available (see the Four Line Display usermod readme.md
for more details)ENCODER_DT_PIN
\u00a0\u00a0- defaults to 12ENCODER_CLK_PIN
- defaults to 14ENCODER_SW_PIN
\u00a0\u00a0- defaults to 13USERMOD_ROTARY_ENCODER_GPIO
- GPIO functionality: INPUT_PULLUP
to use internal pull-up INPUT
to use pull-up on the PCBNo special requirements.
Note: the Four Line Display usermod requires the libraries U8g2
and Wire
.
2021-02 * First public release
"},{"location":"usermods/Rotary-Encoder/#rotary-encoder-ui-usermod-alt","title":"Rotary Encoder UI Usermod ALT","text":"Thank you to the authors of the original version of these usermods. It would not have been possible without them! \"usermod_v2_four_line_display\" \"usermod_v2_rotary_encoder_ui\"
The core of these usermods are a copy of the originals. The main changes are to the FourLineDisplay usermod. The display usermod UI has been completely changed.
The changes made to the RotaryEncoder usermod were made to support the new UI in the display usermod. Without the display, it functions identical to the original. The original \"usermod_v2_auto_save\" will not work with the display just yet.
Press the encoder to cycle through the options: Brightness Speed Intensity Palette Effect Main Color (only if display is used) *Saturation (only if display is used)
Press and hold the encoder to display Network Info if AP is active, it will display the AP, SSID and Password
Also shows if the timer is enabled.
See the pair of usermods in action
"},{"location":"usermods/Rotary-Encoder/#installation_1","title":"Installation","text":"Please refer to the original usermod_v2_rotary_encoder_ui
readme for the main instructions Then to activate this alternative usermod add #define USE_ALT_DISPLAY
to the usermods_list.cpp
file, or add -D USE_ALT_DISPLAY
to the original platformio_override.ini.sample
file
Note: the Four Line Display usermod requires the libraries U8g2
and Wire
.
2021-10 * First public release
"},{"location":"usermods/Rotary-Encoder/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/Rotary-Encoder/#wled-sr","title":"WLED SR","text":""},{"location":"usermods/Temperature/","title":"Usermod Temperature","text":""},{"location":"usermods/Temperature/#temperature-usermod","title":"Temperature usermod","text":"Based on the excellent QuinLED_Dig_Uno_Temp_MQTT
usermod by srg74 and 400killer! Reads an attached DS18B20 temperature sensor (as available on the QuinLED Dig-Uno) Temperature is displayed in both the Info section of the web UI as well as published to the /temperature
MQTT topic, if enabled. May be expanded with support for different sensor types in the future.
If temperature sensor is not detected during boot, this usermod will be disabled.
"},{"location":"usermods/Temperature/#installation","title":"Installation","text":"Copy the example platformio_override.ini
to the root directory. This file should be placed in the same directory as platformio.ini
.
USERMOD_DALLASTEMPERATURE
- enables this user mod wled00/usermods_list.cppUSERMOD_DALLASTEMPERATURE_FIRST_MEASUREMENT_AT
- number of milliseconds after boot to take first measurement, defaults to 20000 msAll parameters can be configured at runtime via the Usermods settings page, including pin, temperature in degrees Celsius or Farenheit and measurement interval.
"},{"location":"usermods/Temperature/#project-link","title":"Project link","text":"If you are using platformio_override.ini
, you should be able to refresh the task list and see your custom task, for example env:d1_mini_usermod_dallas_temperature_C
.
If you are not using platformio_override.ini
, you might have to uncomment OneWire@~2.3.5 under
[common]
section in platformio.ini
:
# platformio.ini\n...\n[platformio]\n...\n; default_envs = esp07\ndefault_envs = d1_mini\n...\n[common]\n...\nlib_deps =\n ...\n #For Dallas sensor uncomment following line\n OneWire@~2.3.5\n...\n
"},{"location":"usermods/Temperature/#change-log","title":"Change Log","text":"2020-09-12 * Changed to use async non-blocking implementation * Do not report erroneous low temperatures to MQTT * Disable plugin if temperature sensor not detected * Report the number of seconds until the first read in the info screen instead of sensor error 2021-04 * Adaptation for runtime configuration.
"},{"location":"usermods/Temperature/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/Temperature/#wled-sr","title":"WLED SR","text":""},{"location":"usermods/Weather/","title":"Weather usermod","text":"This page is work in progress
\ud83c\udf1c
"},{"location":"usermods/Weather/#introduction","title":"Introduction","text":"The weather usermod shows the temperature of your location from now to the coming days in bars on a 2D matrix display
+ =
"},{"location":"usermods/Weather/#settings","title":"Settings","text":""},{"location":"usermods/Weather/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/Weather/#wled-sr","title":"WLED SR","text":"Not supported
"},{"location":"usermods/Weather/#wled-ac","title":"WLED AC","text":"Not supported
"},{"location":"usermods/mpu6050-IMU/","title":"Usermod PU-6050","text":""},{"location":"usermods/mpu6050-IMU/#mpu-6050-six-axis-gyro-accelerometer-driver","title":"MPU-6050 Six-Axis (Gyro + Accelerometer) Driver","text":"v2 of this usermod enables connection of a MPU-6050 IMU sensor to work with effects controlled by the orientation or motion of the WLED Device.
The MPU6050 has a built in \"Digital Motion Processor\" which does the \"heavy lifting\" integrating the gyro and accelerometer measurements to get potentially more useful gravity vector and orientation output.
It is fairly straightforward to comment out variables being read from the device if they're not needed. Saves CPU/Memory/Bandwidth.
Story:
As a memento to a long trip I was on, I built an icosahedron globe. I put lights inside to indicate cities I travelled to.
I wanted to integrate an IMU to allow either on-board, or off-board effects that would react to the globes orientation. See the blog post on building it https://www.robopenguins.com/icosahedron-travel-globe/ or a video demo https://youtu.be/zYjybxHBsHM .
"},{"location":"usermods/mpu6050-IMU/#adding-dependencies","title":"Adding Dependencies","text":"I2Cdev and MPU6050 must be installed.
To install them, add ElectronicCats/MPU6050 @ 0.6.0 to lib_deps in the platformio.ini file.
For example:
lib_compat_mode = soft\nlib_deps =\n FastLED@3.3.2\n NeoPixelBus@2.5.7\n ESPAsyncTCP@1.2.0\n ESPAsyncUDP@697c75a025\n AsyncTCP@1.0.3\n Esp Async WebServer@1.2.0\n IRremoteESP8266@2.7.3\n ElectronicCats/MPU6050 @ 0.6.0\n
"},{"location":"usermods/mpu6050-IMU/#wiring","title":"Wiring","text":"The connections needed to the MPU6050 are as follows:
VCC VU (5V USB) Not available on all boards so use 3.3V if needed.\n GND G Ground\n SCL D1 (GPIO05) I2C clock\n SDA D2 (GPIO04) I2C data\n XDA not connected\n XCL not connected\n AD0 not connected\n INT D8 (GPIO15) Interrupt pin\n
You could probably modify the code not to need an interrupt, but I used the setup directly from the example.
"},{"location":"usermods/mpu6050-IMU/#json-api","title":"JSON API","text":"This code adds:
\"u\":{\n \"IMU\":{\n \"Quat\": [w, x, y, z],\n \"Euler\": [psi, theta, phi],\n \"Gyro\": [x, y, z],\n \"Accel\": [x, y, z],\n \"RealAccel\": [x, y, z],\n \"WorldAccel\": [x, y, z],\n \"Gravity\": [x, y, z],\n \"Orientation\": [yaw, pitch, roll]\n }\n}\n
to the info object"},{"location":"usermods/mpu6050-IMU/#usermod-installation","title":"Usermod installation","text":"#include \"usermod_mpu6050_imu.h\"
in the top and registerUsermod(new MPU6050Driver());
in the bottom of usermods_list.cpp
.Example usermods_list.cpp:
#include \"wled.h\"\n\n#ifdef USERMOD_MPU6050_IMU\n#include \"../usermods/mpu6050_imu/usermod_mpu6050_imu.h\"\n#endif\n\n#ifdef USERMOD_MPU6050_IMU\n usermods.add(new MPU6050Driver());\n#endif\n
"},{"location":"usermods/mpu6050-IMU/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/mpu6050-IMU/#wled-sr","title":"WLED SR","text":""},{"location":"usermods/mpu6050-IMU/#wled-mm","title":"WLED MM","text":"Repaired / Updated in WLED MM (AC uses old unmaintained library)
"},{"location":"usermods/pinmanager/","title":"Usermod global pins","text":"This page is work in progress
\ud83c\udf1c
"},{"location":"usermods/pinmanager/#i2c-and-spi","title":"I2C and SPI","text":"WLED MM has implemented a more intuitive way of dealing with i2c and spi pins accross usermods. Main changes:
ESP32 \u00a0ESP32-S3 \u00a0ESP32-S2 ESP32-C3 \u00a0ESP8266
Nr of pins and functionality is depending on the board chosen (esp8266, esp32, esp32-c2, esp32-c3, esps32-s3)
four-line-display is an exception, because the driver library has its own \"software I2C\" - slow, but can always be used with any availeable pin.
on both esp32 and 8266, you can decide to not use I2C, and use pins for something else. For example (on 8266), attach some buttons or rotary encoder to gpio 4+5.
After booting WLED MM an overview of allocated pins and possible conflicts is send to Serial output:
"},{"location":"usermods/pinmanager/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/pinmanager/#wled-sr","title":"WLED SR","text":"Pin drop downs not supported
"},{"location":"usermods/pinmanager/#wled-ac","title":"WLED AC","text":"Pin drop downs not supported
"},{"location":"usermods/staircase/","title":"Usermod staircase","text":""},{"location":"usermods/staircase/#usermod-animated-staircase","title":"Usermod Animated Staircase","text":"This usermod makes your staircase look cool by illuminating it with an animation. It uses PIR or ultrasonic sensors at the top and bottom of your stairs to:
The Animated Staircase can be controlled by the WLED API. Change settings such as speed, on/off time and distance by sending an HTTP request, see below.
"},{"location":"usermods/staircase/#wled-integration","title":"WLED integration","text":"To include this usermod in your WLED setup, you have to be able to compile WLED from source.
Before compiling, you have to make the following modifications:
Edit usermods_list.cpp
: 1. Open wled00/usermods_list.cpp
2. add #include \"../usermods/Animated_Staircase/Animated_Staircase.h\"
to the top of the file 3. add usermods.add(new Animated_Staircase());
to the end of the void registerUsermods()
function.
You can configure usermod using the Usermods settings page. Please enter GPIO pins for PIR or ultrasonic sensors (trigger and echo). If you use PIR sensor enter -1 for echo pin. Maximum distance for ultrasonic sensor can be configured as the time needed for an echo (see below).
"},{"location":"usermods/staircase/#hardware-installation","title":"Hardware installation","text":"You may need to use 10k pull-down resistors on the selected PIR pins, depending on the sensor.
"},{"location":"usermods/staircase/#wled-configuration","title":"WLED configuration","text":"The Staircase settings can be changed through the WLED JSON api.
NOTE: We are using curl to send HTTP POSTs to the WLED API. If you're using Windows and want to use the curl commands, replace the \\
with a ^
or remove them and put everything on one line.
To read the current settings, open a browser to http://xxx.xxx.xxx.xxx/json/state
(use your WLED device IP address). The device will respond with a json object containing all WLED settings. The staircase settings and sensor states are inside the WLED \"state\" element:
{\n \"state\": {\n \"staircase\": {\n \"enabled\": true,\n \"bottom-sensor\": false,\n \"top-sensor\": false\n },\n}\n
"},{"location":"usermods/staircase/#enabledisable-the-usermod","title":"Enable/disable the usermod","text":"By disabling the usermod you will be able to keep the LED's on, independent from the sensor activity. This enables you to play with the lights without the usermod switching them on or off.
To disable the usermod:
curl -X POST -H \"Content-Type: application/json\" \\\n -d {\"staircase\":{\"enabled\":false}} \\\n xxx.xxx.xxx.xxx/json/state\n
To enable the usermod again, use \"enabled\":true
.
Alternatively you can use Usermod Settings page where you can change other parameters as well.
"},{"location":"usermods/staircase/#changing-animation-parameters-and-detection-range-of-the-ultrasonic-hc-sr04-sensor","title":"Changing animation parameters and detection range of the ultrasonic HC-SR04 sensor","text":"Using Usermod Settings page you can define different usermod parameters, includng sensor pins, delay between segment activation etc.
When an ultrasonic sensor is enabled you can enter maximum detection distance in centimeters separately for top and bottom sensors.
Please note: using an HC-SR04 sensor, particularly when detecting echos at longer distances creates delays in the WLED software, might introduce timing hiccups in your animation or a less responsive web interface. It is therefore advised to keep the detection distance as short as possible.
"},{"location":"usermods/staircase/#animation-triggering-through-the-api","title":"Animation triggering through the API","text":"In addition to activation by one of the stair sensors, you can also trigger the animation manually via the API. To simulate triggering the bottom sensor, use:
curl -X POST -H \"Content-Type: application/json\" \\\n -d '{\"staircase\":{\"bottom-sensor\":true}}' \\\n xxx.xxx.xxx.xxx/json/state\n
Likewise, to trigger the top sensor:
curl -X POST -H \"Content-Type: application/json\" \\\n -d '{\"staircase\":{\"top-sensor\":true}}' \\\n xxx.xxx.xxx.xxx/json/state\n
MQTT You can publish a message with either up
or down
on topic /swipe
to trigger animation. You can also use on
or off
for enabling or disabling the usermod. Have fun with this usermod. www.rolfje.com
Modifications @blazoncek
"},{"location":"usermods/staircase/#change-log","title":"Change log","text":"2021-04 * Adaptation for runtime configuration.
"},{"location":"usermods/staircase/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/staircase/#wled-sr","title":"WLED SR","text":""},{"location":"usermods/wip/","title":"Work in Progress","text":"This page is work in progress
Check WLED Atuline Wiki for original content
Template text:
"},{"location":"usermods/wip/#fork-specific-info","title":"Fork specific info","text":""},{"location":"usermods/wip/#wled-sr","title":"WLED SR","text":""}]} \ No newline at end of file diff --git a/usermods/AutoPlaylist/index.html b/usermods/AutoPlaylist/index.html index c7507a63d..7f9d123fa 100644 --- a/usermods/AutoPlaylist/index.html +++ b/usermods/AutoPlaylist/index.html @@ -4085,6 +4085,7 @@Optionally, "AutoChange" will advance your music playlist automatically when the musicality suggests a good time to change presets.
+Note: The playlist you have designated as "MusicPlaylist" must be active for the AutoPlaylist function to take control of your presets.