{"product_id":"library-program-for-ws2812b-neopixels","title":"Library \u0026 Program for Glow: WS2812b [NeoPixels]","description":"\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\u003ch1 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003eCMozESP32Board\u003c\/h1\u003e\n\u003ca id=\"user-content-cmozesp32board\" class=\"anchor\" aria-label=\"Permalink: CMozESP32Board\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/README.md#cmozesp32board\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cp dir=\"auto\"\u003eCode to support the new range of boards CMoz, designed by Pegg Engineering.\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003e--\u0026gt; Web page that writes your Glow code for you!\u003cspan\u003e \u003c\/span\u003e\u003ca href=\"https:\/\/cmoz.github.io\/CMozESP32Board\/\" rel=\"nofollow\"\u003ehttps:\/\/github.com\/cmoz\/CMozESP32Board\/deployments\/github-pages\u003c\/a\u003e\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003eGit Hub Library with full details and library download. \u003ca href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/README.md\"\u003ehttps:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/README.md\u003c\/a\u003e\u003c\/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\u003ch1 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e✨ CMozGlow\u003c\/h1\u003e\n\u003ca id=\"user-content--cmozglow\" class=\"anchor\" aria-label=\"Permalink: ✨ CMozGlow\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/README.md#-cmozglow\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eThe friendly WS2812B library for the CMoz ESP32-S3 Mini\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e— made for wearables and fashion tech by\u003cspan\u003e \u003c\/span\u003e\u003ca href=\"https:\/\/tinkertailor.ca\/\" rel=\"nofollow\"\u003eTinkerTailor.ca\u003c\/a\u003e\u003cspan\u003e \u003c\/span\u003eand the CMozMaker channel.\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003eYour CMoz ESP32-S3 Mini already has one addressable LED on board (on\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eGPIO 3\u003c\/strong\u003e). This library makes it — and any strip you add — glow beautifully with about five lines of code, and it\u003cspan\u003e \u003c\/span\u003e\u003cem\u003etalks to you in plain English when something goes wrong\u003c\/em\u003e.\u003c\/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003eWhy CMozGlow instead of the usual libraries?\u003c\/h2\u003e\n\u003ca id=\"user-content-why-cmozglow-instead-of-the-usual-libraries\" class=\"anchor\" aria-label=\"Permalink: Why CMozGlow instead of the usual libraries?\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/README.md#why-cmozglow-instead-of-the-usual-libraries\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/a\u003e\n\u003c\/div\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e\u003c\/th\u003e\n\u003cth\u003eCMozGlow\u003c\/th\u003e\n\u003cth\u003eTypical LED libraries\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eError messages in plain English\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd\u003e✅\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eerrorText()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003etells you exactly what to fix\u003c\/td\u003e\n\u003ctd\u003e❌ silent failure or a crash\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eBattery-safe power budgeting\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd\u003e✅ set a mA limit, it auto-dims to stay under it\u003c\/td\u003e\n\u003ctd\u003e⚠️\u003cspan\u003e \u003c\/span\u003ehidden or missing\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eLive status pixel\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd\u003e✅ onboard pixel: green = happy, red = error\u003c\/td\u003e\n\u003ctd\u003e❌\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eNon-blocking effects built in\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd\u003e✅\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eupdate()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003ein\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eloop()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003e— no\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003edelay()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eanywhere\u003c\/td\u003e\n\u003ctd\u003e⚠️\u003cspan\u003e \u003c\/span\u003eexamples usually block\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eAsync hardware engine\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd\u003e✅\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eshow()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003ereturns in ~100 µs even on long strips\u003c\/td\u003e\n\u003ctd\u003e⚠️\u003cspan\u003e \u003c\/span\u003eblocks ~30 µs × LED count\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eAutoPilot dual-core mode\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd\u003e✅ one line gives the LEDs their own CPU core\u003c\/td\u003e\n\u003ctd\u003e❌\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eFashion-tech effects\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd\u003e✅ Sequin, Catwalk, Loom, Silk, Aurora, Morse…\u003c\/td\u003e\n\u003ctd\u003e❌ mostly rainbows\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eGamma-corrected colour\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd\u003e✅ on by default — colours look how you mixed them\u003c\/td\u003e\n\u003ctd\u003e⚠️\u003cspan\u003e \u003c\/span\u003eoff by default\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp dir=\"auto\"\u003eBecause effects never block, your buttons, sensors and Bluetooth code keep running while the lights animate — essential for interactive wearables.\u003c\/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e🚀 Quick start (5 minutes)\u003c\/h2\u003e\n\u003ca id=\"user-content--quick-start-5-minutes\" class=\"anchor\" aria-label=\"Permalink: 🚀 Quick start (5 minutes)\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/README.md#-quick-start-5-minutes\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\u003ch3 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e1. Install the library\u003c\/h3\u003e\n\u003ca id=\"user-content-1-install-the-library\" class=\"anchor\" aria-label=\"Permalink: 1. Install the library\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/README.md#1-install-the-library\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003ePlatformIO\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e— add the library folder to your project's\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003elib\/\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003edirectory, or once published:\u003c\/p\u003e\n\u003cdiv class=\"highlight highlight-source-ini notranslate position-relative overflow-auto\" dir=\"auto\"\u003e\n\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e; platformio.ini\u003c\/span\u003e\n\u003cspan class=\"pl-en\"\u003e[env:cmoz_s3_mini]\u003c\/span\u003e\n\u003cspan class=\"pl-k\"\u003eplatform\u003c\/span\u003e  = espressif32\n\u003cspan class=\"pl-k\"\u003eboard\u003c\/span\u003e     = esp32-s3-devkitc-1\n\u003cspan class=\"pl-k\"\u003eframework\u003c\/span\u003e = arduino\n\u003cspan class=\"pl-k\"\u003elib_deps\u003c\/span\u003e  = CMozGlow\u003c\/pre\u003e\n\u003cdiv class=\"zeroclipboard-container\"\u003e\u003csvg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-copy js-clipboard-copy-icon\"\u003e\u003c\/svg\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eArduino IDE\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e—\u003cspan\u003e \u003c\/span\u003e\u003cem\u003eSketch → Include Library → Add .ZIP Library…\u003c\/em\u003e\u003cspan\u003e \u003c\/span\u003eand pick\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eCMozGlow.zip\u003c\/code\u003e. Then in\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eTools\u003c\/strong\u003e:\u003c\/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cstrong\u003eBoard:\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eESP32S3 Dev Module\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eUSB CDC On Boot:\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eEnabled ← don't skip this! It's how\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eSerial\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003e(and CMozGlow's friendly error messages) reach the Serial Monitor over the USB port.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\u003ch3 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e2. Upload your first sketch\u003c\/h3\u003e\n\u003ca id=\"user-content-2-upload-your-first-sketch\" class=\"anchor\" aria-label=\"Permalink: 2. Upload your first sketch\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/README.md#2-upload-your-first-sketch\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cp dir=\"auto\"\u003eOpen\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eFile → Examples → CMozGlow → CMozGlow_Basics\u003c\/strong\u003e, or paste this:\u003c\/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\"\u003e\n\u003cpre\u003e#\u003cspan class=\"pl-k\"\u003einclude\u003c\/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\u0026lt;\u003c\/span\u003eCMozGlow.h\u003cspan class=\"pl-pds\"\u003e\u0026gt;\u003c\/span\u003e\u003c\/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\/\/ ══════════ CHANGE THESE ══════════\u003c\/span\u003e\n\u003cspan class=\"pl-k\"\u003econst\u003c\/span\u003e \u003cspan class=\"pl-c1\"\u003euint8_t\u003c\/span\u003e  \u003cspan class=\"pl-c1\"\u003eEFFECT\u003c\/span\u003e   = \u003cspan class=\"pl-c1\"\u003e8\u003c\/span\u003e;    \u003cspan class=\"pl-c\"\u003e\/\/ 0-9, table below\u003c\/span\u003e\n\u003cspan class=\"pl-k\"\u003econst\u003c\/span\u003e \u003cspan class=\"pl-c1\"\u003euint16_t\u003c\/span\u003e \u003cspan class=\"pl-c1\"\u003eNUM_LEDS\u003c\/span\u003e = \u003cspan class=\"pl-c1\"\u003e1\u003c\/span\u003e;    \u003cspan class=\"pl-c\"\u003e\/\/ onboard only = 1\u003c\/span\u003e\n\u003cspan class=\"pl-k\"\u003econst\u003c\/span\u003e \u003cspan class=\"pl-c1\"\u003euint8_t\u003c\/span\u003e  \u003cspan class=\"pl-c1\"\u003eSPEED\u003c\/span\u003e    = \u003cspan class=\"pl-c1\"\u003e5\u003c\/span\u003e;    \u003cspan class=\"pl-c\"\u003e\/\/ 1 dreamy … 10 party\u003c\/span\u003e\n\u003cspan class=\"pl-k\"\u003econst\u003c\/span\u003e \u003cspan class=\"pl-c1\"\u003euint32_t\u003c\/span\u003e \u003cspan class=\"pl-c1\"\u003eCOLOR\u003c\/span\u003e    = CMozGlow::Color(\u003cspan class=\"pl-c1\"\u003e255\u003c\/span\u003e, \u003cspan class=\"pl-c1\"\u003e42\u003c\/span\u003e, \u003cspan class=\"pl-c1\"\u003e120\u003c\/span\u003e);\n\u003cspan class=\"pl-c\"\u003e\/\/ ══════════════════════════════════\u003c\/span\u003e\n\nCMozGlow \u003cspan class=\"pl-en\"\u003eglow\u003c\/span\u003e(\u003cspan class=\"pl-c1\"\u003eNUM_LEDS\u003c\/span\u003e);        \u003cspan class=\"pl-c\"\u003e\/\/ GPIO 3 is already the default\u003c\/span\u003e\n\n\u003cspan class=\"pl-k\"\u003evoid\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003esetup\u003c\/span\u003e() {\n  Serial.\u003cspan class=\"pl-c1\"\u003ebegin\u003c\/span\u003e(\u003cspan class=\"pl-c1\"\u003e115200\u003c\/span\u003e);\n  \u003cspan class=\"pl-k\"\u003eif\u003c\/span\u003e (!glow.\u003cspan class=\"pl-c1\"\u003ebegin\u003c\/span\u003e()) {\n    Serial.\u003cspan class=\"pl-c1\"\u003eprintln\u003c\/span\u003e(glow.\u003cspan class=\"pl-c1\"\u003eerrorText\u003c\/span\u003e());   \u003cspan class=\"pl-c\"\u003e\/\/ it tells you what to fix!\u003c\/span\u003e\n    \u003cspan class=\"pl-k\"\u003ewhile\u003c\/span\u003e (\u003cspan class=\"pl-c1\"\u003etrue\u003c\/span\u003e) \u003cspan class=\"pl-c1\"\u003edelay\u003c\/span\u003e(\u003cspan class=\"pl-c1\"\u003e1000\u003c\/span\u003e);\n  }\n  glow.\u003cspan class=\"pl-c1\"\u003esetPowerBudgetmA\u003c\/span\u003e(\u003cspan class=\"pl-c1\"\u003e450\u003c\/span\u003e);           \u003cspan class=\"pl-c\"\u003e\/\/ safe on USB or a small LiPo\u003c\/span\u003e\n  glow.\u003cspan class=\"pl-c1\"\u003esetEffect\u003c\/span\u003e(\u003cspan class=\"pl-c1\"\u003eEFFECT\u003c\/span\u003e);\n  glow.\u003cspan class=\"pl-c1\"\u003esetEffectColor\u003c\/span\u003e(\u003cspan class=\"pl-c1\"\u003eCOLOR\u003c\/span\u003e);\n  glow.\u003cspan class=\"pl-c1\"\u003esetEffectSpeed\u003c\/span\u003e(\u003cspan class=\"pl-c1\"\u003eSPEED\u003c\/span\u003e);\n}\n\n\u003cspan class=\"pl-k\"\u003evoid\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003eloop\u003c\/span\u003e() {\n  glow.\u003cspan class=\"pl-c1\"\u003eupdate\u003c\/span\u003e();                        \u003cspan class=\"pl-c\"\u003e\/\/ that's it!\u003c\/span\u003e\n}\u003c\/pre\u003e\n\u003cdiv class=\"zeroclipboard-container\"\u003e\u003csvg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-copy js-clipboard-copy-icon\"\u003e\u003c\/svg\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cp dir=\"auto\"\u003eUpload it. The onboard pixel should start dancing the aurora.\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eChange the\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eEFFECT\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003enumber, re-upload, repeat.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eThat one constant is the whole tour.\u003c\/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\u003ch3 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e3. Add a strip\u003c\/h3\u003e\n\u003ca id=\"user-content-3-add-a-strip\" class=\"anchor\" aria-label=\"Permalink: 3. Add a strip\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/README.md#3-add-a-strip\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cp dir=\"auto\"\u003eConnect your WS2812B strip's\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eDIN to GPIO 3\u003c\/strong\u003e, GND to GND, and 5V to a suitable supply. The onboard pixel becomes\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003epixel 0\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eand your strip continues from\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003epixel 1\u003c\/strong\u003e.\u003c\/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e🧵\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eGolden rule:\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eNUM_LEDS = 1 + your strip length\u003c\/code\u003e. A 12-LED strip means\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eNUM_LEDS = 13\u003c\/code\u003e.\u003c\/p\u003e\n\u003c\/blockquote\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e🎭 The effects\u003c\/h2\u003e\n\u003ca id=\"user-content--the-effects\" class=\"anchor\" aria-label=\"Permalink: 🎭 The effects\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/README.md#-the-effects\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/a\u003e\n\u003c\/div\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e#\u003c\/th\u003e\n\u003cth\u003eName\u003c\/th\u003e\n\u003cth\u003eConstant\u003c\/th\u003e\n\u003cth\u003eWhat it looks like\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e0\u003c\/td\u003e\n\u003ctd\u003eSolid\u003c\/td\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_SOLID\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003esteady colour\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e1\u003c\/td\u003e\n\u003ctd\u003eSequin\u003c\/td\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_SEQUIN\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003erandom glints, like sequins catching stage light\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2\u003c\/td\u003e\n\u003ctd\u003eCatwalk\u003c\/td\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_CATWALK\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003ea bold sweep back and forth with a fading train\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3\u003c\/td\u003e\n\u003ctd\u003eLoom\u003c\/td\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_LOOM\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003etwo colour \"threads\" weaving past each other\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e4\u003c\/td\u003e\n\u003ctd\u003eHeartbeat\u003c\/td\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_HEARTBEAT\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003erealistic lub-dub double pulse\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e5\u003c\/td\u003e\n\u003ctd\u003eFirefly\u003c\/td\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_FIREFLY\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003esoft lights breathing in and out at random spots\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e6\u003c\/td\u003e\n\u003ctd\u003eSilk\u003c\/td\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_SILK\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003ea slow sheen rolling along the strip, like light on fabric\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e7\u003c\/td\u003e\n\u003ctd\u003eEmber\u003c\/td\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_EMBER\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003ewarm campfire glow\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e8\u003c\/td\u003e\n\u003ctd\u003eAurora\u003c\/td\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_AURORA\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003enorthern lights 🇨🇦\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e9\u003c\/td\u003e\n\u003ctd\u003eMorse\u003c\/td\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_MORSE\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003eblinks a real Morse-code message\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp dir=\"auto\"\u003eAll effects respect\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003esetEffectColor()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003e(except Ember and Aurora, which use their own palettes) and\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003esetEffectSpeed(1–10)\u003c\/code\u003e.\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eMorse tip:\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eset your message first —\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eglow.setMorseMessage(\"MEET AT 9\");\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003e— letters, digits and spaces, up to 63 characters. Fantastic for badges and classroom decoding challenges.\u003c\/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e🔋 Power budgeting (please read if it's a wearable!)\u003c\/h2\u003e\n\u003ca id=\"user-content--power-budgeting-please-read-if-its-a-wearable\" class=\"anchor\" aria-label=\"Permalink: 🔋 Power budgeting (please read if it's a wearable!)\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/README.md#-power-budgeting-please-read-if-its-a-wearable\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cp dir=\"auto\"\u003eEach WS2812B can pull up to\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003e60 mA at full white\u003c\/strong\u003e. Thirteen pixels at full white is nearly 0.8 A — more than USB or a small LiPo should give.\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003eCMozGlow protects you:\u003c\/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\"\u003e\n\u003cpre\u003eglow.setPowerBudgetmA(\u003cspan class=\"pl-c1\"\u003e450\u003c\/span\u003e);   \u003cspan class=\"pl-c\"\u003e\/\/ never draw more than ~450 mA\u003c\/span\u003e\u003c\/pre\u003e\n\u003cdiv class=\"zeroclipboard-container\"\u003e\u003csvg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-copy js-clipboard-copy-icon\"\u003e\u003c\/svg\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cp dir=\"auto\"\u003eBefore every frame the library estimates the current draw and, if you'd blow the budget, quietly dims the frame to fit. You can check what happened:\u003c\/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\"\u003e\n\u003cpre\u003eSerial.println(glow.estimatedCurrentmA()); \u003cspan class=\"pl-c\"\u003e\/\/ approx draw of the last frame\u003c\/span\u003e\nSerial.println(glow.powerLimited());       \u003cspan class=\"pl-c\"\u003e\/\/ 1 if it had to auto-dim\u003c\/span\u003e\u003c\/pre\u003e\n\u003cdiv class=\"zeroclipboard-container\"\u003e\u003csvg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-copy js-clipboard-copy-icon\"\u003e\u003c\/svg\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cp dir=\"auto\"\u003eSuggested budgets:\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eUSB port ≈ 450 mA\u003c\/strong\u003e,\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003esmall LiPo (400 mAh) ≈ 250 mA\u003c\/strong\u003e,\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003ededicated 5 V\/2 A supply ≈ 1500 mA\u003c\/strong\u003e. The estimate is an approximation (~20 mA per fully-lit colour channel + ~1 mA idle per chip) — always leave headroom.\u003c\/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e✈️\u003cspan\u003e \u003c\/span\u003eAutoPilot — the LEDs get their own CPU core (advanced)\u003c\/h2\u003e\n\u003ca id=\"user-content-️-autopilot--the-leds-get-their-own-cpu-core-advanced\" class=\"anchor\" aria-label=\"Permalink: ✈️ AutoPilot — the LEDs get their own CPU core (advanced)\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/README.md#%EF%B8%8F-autopilot--the-leds-get-their-own-cpu-core-advanced\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cp dir=\"auto\"\u003eThe ESP32-S3 has two processor cores, and your sketch's\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eloop()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eruns on core 1. AutoPilot starts a small background task on\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003ecore 0\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003ethat animates the LEDs forever:\u003c\/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\"\u003e\n\u003cpre\u003eglow.setEffect(\u003cspan class=\"pl-c1\"\u003eCMOZ_FX_AURORA\u003c\/span\u003e);\nglow.autoUpdate(\u003cspan class=\"pl-c1\"\u003etrue\u003c\/span\u003e);      \u003cspan class=\"pl-c\"\u003e\/\/ ✈️ take off — no update() needed ever again\u003c\/span\u003e\u003c\/pre\u003e\n\u003cdiv class=\"zeroclipboard-container\"\u003e\u003csvg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-copy js-clipboard-copy-icon\"\u003e\u003c\/svg\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cp dir=\"auto\"\u003eThat's it. Your\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eloop()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eis now 100% free for sensors, Bluetooth, touch and servos — the animation literally runs on different silicon. Every CMozGlow call stays safe to use mid-flight (\u003ccode\u003esetEffect()\u003c\/code\u003e,\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003esetPixel()\u003c\/code\u003e,\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003esetBrightness()\u003c\/code\u003e, colours, speed — all of it), because the whole library is guarded by a recursive mutex. Land it any time with\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eglow.autoUpdate(false)\u003c\/code\u003e;\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eautoRunning()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003etells you the current state.\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003eGood to know:\u003c\/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cstrong\u003eWhen to use it\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e— interactive projects where\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eloop()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003edoes real work: capacitive touch sampling, BLE, audio-reactive code, servo easing. For a simple \"lights only\" sketch, plain\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eupdate()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003ein\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eloop()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eis all you need.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eManual\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eshow()\u003c\/code\u003e\/\u003ccode\u003eupdate()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003ecalls are safe but pointless in flight\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e— AutoPilot already renders on schedule, and the frame timer prevents double-drawing.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eCore 0 is also the Wi-Fi\/BLE core.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eThe render task is light (priority 1, sleeps between frames), so they coexist happily — but if you're pushing heavy Wi-Fi traffic\u003cspan\u003e \u003c\/span\u003e\u003cem\u003eand\u003c\/em\u003e\u003cspan\u003e \u003c\/span\u003e500+ LEDs, test your timing.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eIt lands cleanly.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eautoUpdate(false)\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eand\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eend()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003ewait for the task to confirm it has stopped and for the hardware to finish the frame in flight before touching any memory. No dangling tasks, no use-after-free — ever.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp dir=\"auto\"\u003eTry\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eFile → Examples → CMozGlow → CMozGlow_AutoPilot\u003c\/strong\u003e: it counts\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eloop()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003elaps per second so you can\u003cspan\u003e \u003c\/span\u003e\u003cem\u003esee\u003c\/em\u003e\u003cspan\u003e \u003c\/span\u003ehow free your sketch is.\u003c\/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e🚑 Error handling\u003c\/h2\u003e\n\u003ca id=\"user-content--error-handling\" class=\"anchor\" aria-label=\"Permalink: 🚑 Error handling\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/README.md#-error-handling\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cp dir=\"auto\"\u003eEvery call that can fail returns\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003efalse\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eand records a reason:\u003c\/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\"\u003e\n\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eif\u003c\/span\u003e (!glow.setPixel(\u003cspan class=\"pl-c1\"\u003e999\u003c\/span\u003e, \u003cspan class=\"pl-c1\"\u003e255\u003c\/span\u003e, \u003cspan class=\"pl-c1\"\u003e0\u003c\/span\u003e, \u003cspan class=\"pl-c1\"\u003e0\u003c\/span\u003e)) {\n  Serial.\u003cspan class=\"pl-c1\"\u003eprintln\u003c\/span\u003e(glow.\u003cspan class=\"pl-c1\"\u003eerrorText\u003c\/span\u003e());\n  \u003cspan class=\"pl-c\"\u003e\/\/ \"pixel index is past the end of the strip — indexes run 0 to numPixels()-1\"\u003c\/span\u003e\n}\u003c\/pre\u003e\n\u003cdiv class=\"zeroclipboard-container\"\u003e\u003csvg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-copy js-clipboard-copy-icon\"\u003e\u003c\/svg\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cp dir=\"auto\"\u003eTurn the onboard pixel into a live status light — perfect while debugging a costume you can't plug a Serial monitor into:\u003c\/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\"\u003e\n\u003cpre\u003eglow.statusPixel(\u003cspan class=\"pl-c1\"\u003etrue\u003c\/span\u003e);   \u003cspan class=\"pl-c\"\u003e\/\/ pixel 0: dim green = happy, red = an error happened\u003c\/span\u003e\u003c\/pre\u003e\n\u003cdiv class=\"zeroclipboard-container\"\u003e\u003csvg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-copy js-clipboard-copy-icon\"\u003e\u003c\/svg\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCode\u003c\/th\u003e\n\u003cth\u003eMeaning\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_OK\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003eeverything is fine\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_NOT_BEGUN\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003e\n\u003ccode\u003ebegin()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003ewasn't called or failed\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_BAD_PIN\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003ethat GPIO can't drive LEDs (use 0–21 or 33–48)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_BAD_COUNT\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003eLED count must be 1–2000\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_ALLOC\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003eout of memory (very long strip)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_RMT\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003ethe LED peripheral failed to start\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_INDEX\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003epixel index past the end of the strip\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_BAD_EFFECT\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003eeffect number doesn't exist (valid: 0–9)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_BAD_ARG\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003eargument out of range\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_TASK\u003c\/code\u003e\u003c\/td\u003e\n\u003ctd\u003eAutoPilot's background task couldn't start or stop\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp dir=\"auto\"\u003eUse\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eglow.lastError()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003efor the code,\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eglow.errorText()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003efor the sentence,\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eglow.clearError()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eto reset.\u003c\/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e📖 Full API\u003c\/h2\u003e\n\u003ca id=\"user-content--full-api\" class=\"anchor\" aria-label=\"Permalink: 📖 Full API\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/README.md#-full-api\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\"\u003e\n\u003cpre\u003eCMozGlow \u003cspan class=\"pl-en\"\u003eglow\u003c\/span\u003e(numLeds);            \u003cspan class=\"pl-c\"\u003e\/\/ GPIO 3 by default\u003c\/span\u003e\nCMozGlow \u003cspan class=\"pl-en\"\u003eglow\u003c\/span\u003e(numLeds, pin);       \u003cspan class=\"pl-c\"\u003e\/\/ or any valid ESP32-S3 output pin\u003c\/span\u003e\n\n\u003cspan class=\"pl-k\"\u003ebool\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003ebegin\u003c\/span\u003e();                      \u003cspan class=\"pl-c\"\u003e\/\/ call once in setup(); false = check errorText()\u003c\/span\u003e\n\u003cspan class=\"pl-k\"\u003evoid\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003eend\u003c\/span\u003e();\n\n\u003cspan class=\"pl-c\"\u003e\/\/ pixels\u003c\/span\u003e\n\u003cspan class=\"pl-k\"\u003ebool\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003esetPixel\u003c\/span\u003e(i, r, g, b);         \u003cspan class=\"pl-c\"\u003e\/\/ 0-255 each\u003c\/span\u003e\n\u003cspan class=\"pl-k\"\u003ebool\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003esetPixel\u003c\/span\u003e(i, color);           \u003cspan class=\"pl-c\"\u003e\/\/ packed 0xRRGGBB\u003c\/span\u003e\n\u003cspan class=\"pl-c1\"\u003euint32_t\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003egetPixel\u003c\/span\u003e(i);\n\u003cspan class=\"pl-k\"\u003evoid\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003efill\u003c\/span\u003e(color);\n\u003cspan class=\"pl-k\"\u003evoid\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003eclear\u003c\/span\u003e();\n\u003cspan class=\"pl-k\"\u003ebool\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003eshow\u003c\/span\u003e();                       \u003cspan class=\"pl-c\"\u003e\/\/ hand the frame to hardware; returns in ~µs\u003c\/span\u003e\n\u003cspan class=\"pl-c1\"\u003euint16_t\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003enumPixels\u003c\/span\u003e();\n\n\u003cspan class=\"pl-c\"\u003e\/\/ look \u0026amp; feel\u003c\/span\u003e\n\u003cspan class=\"pl-k\"\u003evoid\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003esetBrightness\u003c\/span\u003e(\u003cspan class=\"pl-c1\"\u003e0\u003c\/span\u003e-\u003cspan class=\"pl-c1\"\u003e255\u003c\/span\u003e);         \u003cspan class=\"pl-c\"\u003e\/\/ non-destructive master dimmer\u003c\/span\u003e\n\u003cspan class=\"pl-k\"\u003evoid\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003esetGamma\u003c\/span\u003e(\u003cspan class=\"pl-c1\"\u003etrue\u003c\/span\u003e\/\u003cspan class=\"pl-c1\"\u003efalse\u003c\/span\u003e);         \u003cspan class=\"pl-c\"\u003e\/\/ gamma correction, on by default\u003c\/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\/\/ wearable safety\u003c\/span\u003e\n\u003cspan class=\"pl-k\"\u003evoid\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003esetPowerBudgetmA\u003c\/span\u003e(\u003cspan class=\"pl-smi\"\u003emA\u003c\/span\u003e);         \u003cspan class=\"pl-c\"\u003e\/\/ 0 = unlimited\u003c\/span\u003e\n\u003cspan class=\"pl-c1\"\u003euint16_t\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003eestimatedCurrentmA\u003c\/span\u003e();\n\u003cspan class=\"pl-k\"\u003ebool\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003epowerLimited\u003c\/span\u003e();\n\n\u003cspan class=\"pl-c\"\u003e\/\/ effects (non-blocking)\u003c\/span\u003e\n\u003cspan class=\"pl-k\"\u003ebool\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003esetEffect\u003c\/span\u003e(\u003cspan class=\"pl-c1\"\u003e0\u003c\/span\u003e-\u003cspan class=\"pl-c1\"\u003e9\u003c\/span\u003e);               \u003cspan class=\"pl-c\"\u003e\/\/ or CMOZ_FX_… constants\u003c\/span\u003e\n\u003cspan class=\"pl-k\"\u003evoid\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003esetEffectColor\u003c\/span\u003e(color);\n\u003cspan class=\"pl-k\"\u003ebool\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003esetEffectSpeed\u003c\/span\u003e(\u003cspan class=\"pl-c1\"\u003e1\u003c\/span\u003e-\u003cspan class=\"pl-c1\"\u003e10\u003c\/span\u003e);\n\u003cspan class=\"pl-k\"\u003ebool\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003esetMorseMessage\u003c\/span\u003e(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c\/span\u003eTEXT 123\u003cspan class=\"pl-pds\"\u003e\"\u003c\/span\u003e\u003c\/span\u003e);\n\u003cspan class=\"pl-k\"\u003ebool\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003eupdate\u003c\/span\u003e();                     \u003cspan class=\"pl-c\"\u003e\/\/ call every loop(); true when a frame drew\u003c\/span\u003e\n\u003cspan class=\"pl-k\"\u003estatic\u003c\/span\u003e \u003cspan class=\"pl-k\"\u003econst\u003c\/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c\/span\u003e* \u003cspan class=\"pl-en\"\u003eeffectName\u003c\/span\u003e(id);\n\n\u003cspan class=\"pl-c\"\u003e\/\/ AutoPilot (advanced)\u003c\/span\u003e\n\u003cspan class=\"pl-k\"\u003ebool\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003eautoUpdate\u003c\/span\u003e(\u003cspan class=\"pl-c1\"\u003etrue\u003c\/span\u003e\/\u003cspan class=\"pl-c1\"\u003efalse\u003c\/span\u003e);       \u003cspan class=\"pl-c\"\u003e\/\/ give the LEDs their own CPU core \/ land\u003c\/span\u003e\n\u003cspan class=\"pl-k\"\u003ebool\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003eautoRunning\u003c\/span\u003e();\n\n\u003cspan class=\"pl-c\"\u003e\/\/ errors\u003c\/span\u003e\nCMozError \u003cspan class=\"pl-en\"\u003elastError\u003c\/span\u003e();\n\u003cspan class=\"pl-k\"\u003econst\u003c\/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c\/span\u003e* \u003cspan class=\"pl-en\"\u003eerrorText\u003c\/span\u003e();\n\u003cspan class=\"pl-k\"\u003evoid\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003eclearError\u003c\/span\u003e();\n\u003cspan class=\"pl-k\"\u003evoid\u003c\/span\u003e \u003cspan class=\"pl-en\"\u003estatusPixel\u003c\/span\u003e(\u003cspan class=\"pl-c1\"\u003etrue\u003c\/span\u003e\/\u003cspan class=\"pl-c1\"\u003efalse\u003c\/span\u003e);      \u003cspan class=\"pl-c\"\u003e\/\/ onboard pixel as live status light\u003c\/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\/\/ colour helpers\u003c\/span\u003e\n\u003cspan class=\"pl-en\"\u003eCMozGlow::Color\u003c\/span\u003e(r, g, b);          \u003cspan class=\"pl-c\"\u003e\/\/ pack a colour\u003c\/span\u003e\n\u003cspan class=\"pl-en\"\u003eCMozGlow::Wheel\u003c\/span\u003e(\u003cspan class=\"pl-c1\"\u003e0\u003c\/span\u003e-\u003cspan class=\"pl-c1\"\u003e255\u003c\/span\u003e);            \u003cspan class=\"pl-c\"\u003e\/\/ spin around the rainbow\u003c\/span\u003e\u003c\/pre\u003e\n\u003cdiv class=\"zeroclipboard-container\"\u003e\u003csvg aria-hidden=\"true\" data-component=\"Octicon\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-copy js-clipboard-copy-icon\"\u003e\u003c\/svg\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e🔧 Troubleshooting\u003c\/h2\u003e\n\u003ca id=\"user-content--troubleshooting\" class=\"anchor\" aria-label=\"Permalink: 🔧 Troubleshooting\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/README.md#-troubleshooting\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNothing lights up.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eCheck\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eSerial\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003efor a message from\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eerrorText()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003efirst. Then: is the strip's DIN on GPIO 3? Do the strip and board share a GND? Is\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eNUM_LEDS\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eat least 1?\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eOnly the onboard pixel works.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eNUM_LEDS\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eis probably still 1 — remember to add your strip length. Also check the strip's arrow points\u003cspan\u003e \u003c\/span\u003e\u003cem\u003eaway\u003c\/em\u003e\u003cspan\u003e \u003c\/span\u003efrom the board (data flows in one direction).\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eColours look dim.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eThat's likely the power budget doing its job — check\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003epowerLimited()\u003c\/code\u003e. Raise the budget only if your power source can handle it.\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eColours look \"wrong\" compared to another library.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eCMozGlow gamma-corrects by default so mixed colours look natural. For raw values call\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eglow.setGamma(false);\u003c\/code\u003e.\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eFirst pixel flickers with a long strip.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eLong wire runs benefit from a 300–500 Ω resistor in the data line and a 500–1000 µF capacitor across the strip's power — both available at TinkerTailor.ca. 😉\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eIt compiles and runs, but the Serial Monitor shows nothing.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eIn Tools, make sure\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eBoard = ESP32S3 Dev Module\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eand\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eUSB CDC On Boot = Enabled\u003c\/strong\u003e, then re-upload. Without CDC enabled the S3 sends Serial to a UART you're not connected to.\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eA ctags \"cannot open temporary file\" error before compiling (Windows).\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eNot your sketch — it's stale files in Windows' temp folder. Close the IDE, press Win + R, type\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003e%TEMP%\u003c\/code\u003e, delete what's there, and try again.\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eIt compiles but\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003ebegin()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003ereturns false.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003ePrint\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eerrorText()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003e— it will name the exact problem (bad pin, too many LEDs, out of memory, or the RMT peripheral being used by another library).\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eUsing conductive thread?\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eKeep the data run short and sew a ground line alongside it. WS2812B data is timing-sensitive; below ~30 cm of thread it's usually happy at wearable brightness.\u003c\/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e🧠 How it works (for curious minds)\u003c\/h2\u003e\n\u003ca id=\"user-content--how-it-works-for-curious-minds\" class=\"anchor\" aria-label=\"Permalink: 🧠 How it works (for curious minds)\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/README.md#-how-it-works-for-curious-minds\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cp dir=\"auto\"\u003eCMozGlow drives the LEDs with the ESP32-S3's\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eRMT peripheral\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e— a piece of hardware that generates the WS2812B's fussy 800 kHz waveform all by itself — and it does so\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003easynchronously\u003c\/strong\u003e:\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eshow()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003ebuilds the frame (using a precomputed byte→waveform lookup table), hands it to the hardware, and returns immediately while the LEDs are still being painted. The mandatory ≥280 µs \"latch\" gap is encoded into the tail of every hardware transfer, so there is\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eno busy-waiting anywhere in the library\u003c\/strong\u003e. The next\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eshow()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003esimply checks the previous frame has left the wire — which it long since has at any normal frame rate.\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003eThe practical result: on a 200-LED strip, a traditional blocking send freezes your sketch for ~6 ms\u003cspan\u003e \u003c\/span\u003e\u003cem\u003eevery frame\u003c\/em\u003e; CMozGlow hands it off in roughly 100 µs. Add AutoPilot and the cost to your\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eloop()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eis zero.\u003c\/p\u003e\n\u003cp dir=\"auto\"\u003eIt works on both arduino-esp32 core 2.x and 3.x automatically, and is thread-safe throughout.\u003c\/p\u003e\n\u003chr\u003e\n\u003cp dir=\"auto\"\u003eMade with 💛 in Canada · MIT licensed · Tutorials on the\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eCMozMaker\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eYouTube channel · Parts \u0026amp; conductive fabrics at\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eTinkerTailor.ca\u003c\/strong\u003e\u003c\/p\u003e","brand":"Tinker Tailor","offers":[{"title":"Default Title","offer_id":51526997803241,"sku":null,"price":0.0,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0790\/8006\/3209\/files\/Screenshot2026-07-19113552.png?v=1784471764","url":"https:\/\/www.tinkertailor.ca\/products\/library-program-for-ws2812b-neopixels","provider":"Tinker Tailor","version":"1.0","type":"link"}