{"product_id":"library-program-for-ws2812b-neopixels","title":"Bibliothèque et programme pour Glow : WS2812b [NeoPixels]","description":"\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\n\u003ch1 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e✨ CMozGlow\u003c\/h1\u003e\n\n\u003ca id=\"user-content--cmozglow\" class=\"anchor\" aria-label=\"Permalink: ✨ CMozGlow\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/CMozGlow\/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\n\u003c\/div\u003e\n\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eLa bibliothèque WS2812B conviviale pour le CMoz ESP32-S3 Mini\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e— conçue pour les vêtements connectés (wearables) et la mode technologique par\u003cspan\u003e \u003c\/span\u003e\u003ca href=\"https:\/\/tinkertailor.ca\/\" rel=\"nofollow\"\u003eTinkerTailor.ca\u003c\/a\u003e\u003cspan\u003e \u003c\/span\u003eet la chaîne CMozMaker.\u003c\/p\u003e\n\n\u003cp dir=\"auto\"\u003e\u003cspan\u003e--\u0026gt; Vous voulez que le code soit écrit pour vous et vous souhaitez modifier les effets ? \u003c\/span\u003e\u003ca href=\"https:\/\/cmoz.github.io\/CMozESP32Board\/\" rel=\"nofollow\"\u003eGénérateur de code interactif\u003c\/a\u003e\u003c\/p\u003e\n\n\u003cp dir=\"auto\"\u003eVotre CMoz ESP32-S3 Mini dispose déjà d'une LED adressable intégrée (sur le\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eGPIO 3\u003c\/strong\u003e). Cette bibliothèque permet à cette dernière — et à toute bande LED que vous ajouteriez — de briller magnifiquement avec environ cinq lignes de code, et elle\u003cspan\u003e \u003c\/span\u003e\u003cem\u003evous parle en français clair lorsqu'un problème survient\u003c\/em\u003e.\u003c\/p\u003e\n\n\u003chr\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003ePourquoi CMozGlow plutôt que les bibliothèques habituelles ?\u003c\/h2\u003e\n\n\u003ca id=\"user-content-why-cmozglow-instead-of-the-usual-libraries\" class=\"anchor\" aria-label=\"Permalink: Pourquoi CMozGlow plutôt que les bibliothèques habituelles ?\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/CMozGlow\/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\n\u003c\/div\u003e\n\n\u003ctable\u003e\n\n\u003cthead\u003e\n\n\u003ctr\u003e\n\n\u003cth\u003e\u003c\/th\u003e\n\n\u003cth\u003eCMozGlow\u003c\/th\u003e\n\n\u003cth\u003eBibliothèques LED classiques\u003c\/th\u003e\n\n\n\u003c\/tr\u003e\n\n\n\u003c\/thead\u003e\n\n\u003ctbody\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003cstrong\u003eMessages d'erreur en français clair\u003c\/strong\u003e\u003c\/td\u003e\n\n\u003ctd\u003e✅\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eerrorText()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003evous indique exactement quoi corriger\u003c\/td\u003e\n\n\u003ctd\u003e❌ échec silencieux ou plantage\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003cstrong\u003eGestion intelligente de la batterie\u003c\/strong\u003e\u003c\/td\u003e\n\n\u003ctd\u003e✅ définissez une limite en mA, l'intensité baisse automatiquement\u003c\/td\u003e\n\n\u003ctd\u003e⚠️\u003cspan\u003e \u003c\/span\u003ecachée ou absente\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003cstrong\u003ePixel d'état en direct\u003c\/strong\u003e\u003c\/td\u003e\n\n\u003ctd\u003e✅ pixel intégré : vert = tout va bien, rouge = erreur\u003c\/td\u003e\n\n\u003ctd\u003e❌\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003cstrong\u003eEffets non bloquants intégrés\u003c\/strong\u003e\u003c\/td\u003e\n\n\u003ctd\u003e✅\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eupdate()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003edans\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eloop()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003e— pas de\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003edelay()\u003c\/code\u003e\n\u003c\/td\u003e\n\n\u003ctd\u003e⚠️\u003cspan\u003e \u003c\/span\u003eles exemples sont souvent bloquants\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003cstrong\u003eMoteur matériel asynchrone\u003c\/strong\u003e\u003c\/td\u003e\n\n\u003ctd\u003e✅\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eshow()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003erevient en ~100 µs même sur de longues bandes\u003c\/td\u003e\n\n\u003ctd\u003e⚠️\u003cspan\u003e \u003c\/span\u003ebloque ~30 µs × nombre de LED\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003cstrong\u003eMode AutoPilot double cœur\u003c\/strong\u003e\u003c\/td\u003e\n\n\u003ctd\u003e✅ une ligne permet d'allouer les LED à leur propre cœur CPU\u003c\/td\u003e\n\n\u003ctd\u003e❌\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003cstrong\u003eEffets pour la mode technologique\u003c\/strong\u003e\u003c\/td\u003e\n\n\u003ctd\u003e✅ Sequin, Catwalk, Loom, Silk, Aurora, Morse…\u003c\/td\u003e\n\n\u003ctd\u003e❌ principalement des arcs-en-ciel\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003cstrong\u003eCouleurs corrigées par gamma\u003c\/strong\u003e\u003c\/td\u003e\n\n\u003ctd\u003e✅ activé par défaut — les couleurs correspondent à vos réglages\u003c\/td\u003e\n\n\u003ctd\u003e⚠️\u003cspan\u003e \u003c\/span\u003edésactivé par défaut\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\n\u003c\/tbody\u003e\n\n\n\u003c\/table\u003e\n\n\u003cp dir=\"auto\"\u003eComme les effets ne sont jamais bloquants, vos boutons, capteurs et code Bluetooth continuent de fonctionner pendant l'animation des lumières — essentiel pour les vêtements interactifs.\u003c\/p\u003e\n\n\u003chr\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e🚀 Démarrage rapide (5 minutes)\u003c\/h2\u003e\n\n\u003ca id=\"user-content--quick-start-5-minutes\" class=\"anchor\" aria-label=\"Permalink: 🚀 Démarrage rapide (5 minutes)\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/CMozGlow\/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\n\u003c\/div\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\n\u003ch3 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e1. Installer la bibliothèque\u003c\/h3\u003e\n\n\u003ca id=\"user-content-1-install-the-library\" class=\"anchor\" aria-label=\"Permalink: 1. Installer la bibliothèque\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/CMozGlow\/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\n\u003c\/div\u003e\n\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003ePlatformIO\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e— ajoutez le dossier de la bibliothèque au répertoire\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003elib\/\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003ede votre projet, ou une fois publié :\u003c\/p\u003e\n\n\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  = cmoz\/CMozGlow @ ^1.2.2\u003cbr\u003e\u003cbr\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0790\/8006\/3209\/files\/Screenshot_2026-07-22_162116.png?v=1784815115\" alt=\"\"\u003e\u003cbr\u003e\u003c\/pre\u003e\n\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\n\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eArduino IDE\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e—\u003cspan\u003e \u003c\/span\u003e\u003cem\u003eCroquis → Inclure une bibliothèque → Ajouter la bibliothèque .ZIP…\u003c\/em\u003e\u003cspan\u003e \u003c\/span\u003eet choisissez\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eCMozGlow.zip\u003c\/code\u003e. Puis, dans\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eOutils\u003c\/strong\u003e :\u003c\/p\u003e\n\n\u003cul dir=\"auto\"\u003e\n\n\u003cli\u003e\n\n\u003cstrong\u003eBoard :\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eESP32S3 Dev Module\u003c\/li\u003e\n\n\u003cli\u003e\n\n\u003cstrong\u003eUSB CDC On Boot :\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eEnabled (Activé) ← ne sautez pas cette étape ! C'est ce qui permet au\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eSerial\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003e(et aux messages d'erreur conviviaux de CMozGlow) d'atteindre le Moniteur Série via le port USB.\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0790\/8006\/3209\/files\/Screenshot_2026-07-23_104827.png?v=1784815079\" alt=\"\"\u003e\u003c\/p\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\n\u003ch3 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e2. Téléverser votre premier croquis\u003c\/h3\u003e\n\n\u003ca id=\"user-content-2-upload-your-first-sketch\" class=\"anchor\" aria-label=\"Permalink: 2. Téléverser votre premier croquis\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/CMozGlow\/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\n\u003c\/div\u003e\n\n\u003cp dir=\"auto\"\u003eOuvrez\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eFichier → Exemples → CMozGlow → CMozGlow_Basics\u003c\/strong\u003e, ou collez ceci :\u003c\/p\u003e\n\n\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\/\/ ══════════ MODIFIEZ CECI ══════════\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, tableau ci-dessous\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\/\/ intégré uniquement = 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 doux … 10 festif\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-k\"\u003econst\u003c\/span\u003e \u003cspan class=\"pl-c1\"\u003euint8_t\u003c\/span\u003e  \u003cspan class=\"pl-c1\"\u003eLED_PIN\u003c\/span\u003e  = \u003cspan class=\"pl-c1\"\u003e3\u003c\/span\u003e;    \u003cspan class=\"pl-c\"\u003e\/\/ GPIO 3 = pixel intégré ; changez pour d'autres cartes\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-c1\"\u003eLED_PIN\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\/\/ il vous dit quoi corriger !\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\/\/ sûr sur USB ou petite 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\/\/ c'est tout !\u003c\/span\u003e\n}\u003c\/pre\u003e\n\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\n\n\u003cp dir=\"auto\"\u003eTéléversez. Le pixel intégré devrait commencer à danser comme une aurore.\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eChangez le numéro de l'\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eEFFECT\u003c\/code\u003e, téléversez à nouveau, répétez.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eCette unique constante suffit pour découvrir toutes les options.\u003c\/p\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\n\u003ch3 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e3. Ajouter une bande LED\u003c\/h3\u003e\n\n\u003ca id=\"user-content-3-add-a-strip\" class=\"anchor\" aria-label=\"Permalink: 3. Ajouter une bande LED\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/CMozGlow\/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\n\u003c\/div\u003e\n\n\u003cp dir=\"auto\"\u003eConnectez le\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eDIN\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003ede votre bande WS2812B au\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eGPIO 3\u003c\/strong\u003e, GND au GND, et 5V à une alimentation appropriée. Le pixel intégré devient le\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003epixel 0\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eet votre bande commence à partir du\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003epixel 1\u003c\/strong\u003e.\u003c\/p\u003e\n\n\u003cblockquote\u003e\n\n\u003cp dir=\"auto\"\u003e🧵\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eRègle d'or :\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eNUM_LEDS = 1 + longueur de votre bande\u003c\/code\u003e. Une bande de 12 LED signifie\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eNUM_LEDS = 13\u003c\/code\u003e.\u003c\/p\u003e\n\n\n\u003c\/blockquote\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\n\u003ch3 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e4. Utiliser une broche différente — ou une autre carte\u003c\/h3\u003e\n\n\u003ca id=\"user-content-4-using-a-different-pin--or-a-different-board\" class=\"anchor\" aria-label=\"Permalink: 4. Utiliser une broche différente — ou une autre carte\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/CMozGlow\/README.md#4-using-a-different-pin--or-a-different-board\"\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\n\u003c\/div\u003e\n\n\u003cp dir=\"auto\"\u003eLe GPIO 3 est seulement la broche par\u003cspan\u003e \u003c\/span\u003e\u003cem\u003edéfaut\u003c\/em\u003e, car c'est là que se trouve le pixel intégré de la carte CMoz. N'importe quelle broche de sortie valide fonctionne — passez-la comme second argument :\u003c\/p\u003e\n\n\n\u003cpre\u003eCMozGlow \u003cspan class=\"pl-en\"\u003eglow\u003c\/span\u003e(\u003cspan class=\"pl-c1\"\u003eNUM_LEDS\u003c\/span\u003e, \u003cspan class=\"pl-c1\"\u003e6\u003c\/span\u003e);     \u003cspan class=\"pl-c\"\u003e\/\/ 20 LED sur GPIO 6\u003c\/span\u003e\u003c\/pre\u003e\n\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\n\n\u003cp dir=\"auto\"\u003eChaque exemple dispose d'une constante\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eLED_PIN\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003een haut pour exactement cela. Et CMozGlow n'est pas limité à CMoz — il fonctionne sur n'importe quelle carte de la famille ESP32 :\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eESP32-S3, ESP32-S2, ESP32-C3 et l'ESP32 classique\u003c\/strong\u003e. Il connaît le brochage réel de chaque puce et vous indiquera en français clair si vous choisissez une broche qui ne peut pas piloter de LED :\u003c\/p\u003e\n\n\u003ctable\u003e\n\n\u003cthead\u003e\n\n\u003ctr\u003e\n\n\u003cth\u003epuce\u003c\/th\u003e\n\n\u003cth\u003ebroches fonctionnelles\u003c\/th\u003e\n\n\n\u003c\/tr\u003e\n\n\n\u003c\/thead\u003e\n\n\u003ctbody\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003eESP32-S3\u003c\/td\u003e\n\n\u003ctd\u003e0–21, 33–48\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003eESP32-S2\u003c\/td\u003e\n\n\u003ctd\u003e0–21, 33–46\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003eESP32-C3\u003c\/td\u003e\n\n\u003ctd\u003e0–10, 18–21\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003eESP32 classique\u003c\/td\u003e\n\n\u003ctd\u003e0–5, 12–19, 21–23, 25–27, 32, 33\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\n\u003c\/tbody\u003e\n\n\n\u003c\/table\u003e\n\n\u003cp dir=\"auto\"\u003eSur une carte\u003cspan\u003e \u003c\/span\u003e\u003cem\u003esans\u003c\/em\u003e\u003cspan\u003e \u003c\/span\u003epixel intégré,\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eNUM_LEDS\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eest simplement la longueur de votre bande — la règle d'or ci-dessus ne s'applique qu'aux cartes comme la CMoz qui en possèdent une intégrée.\u003c\/p\u003e\n\n\u003chr\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e🎭 Les effets\u003c\/h2\u003e\n\n\u003ca id=\"user-content--the-effects\" class=\"anchor\" aria-label=\"Permalink: 🎭 Les effets\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/CMozGlow\/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\n\u003c\/div\u003e\n\n\u003ctable\u003e\n\n\u003cthead\u003e\n\n\u003ctr\u003e\n\n\u003cth\u003e#\u003c\/th\u003e\n\n\u003cth\u003eNom\u003c\/th\u003e\n\n\u003cth\u003eConstante\u003c\/th\u003e\n\n\u003cth\u003eDescription\u003c\/th\u003e\n\n\n\u003c\/tr\u003e\n\n\n\u003c\/thead\u003e\n\n\u003ctbody\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e0\u003c\/td\u003e\n\n\u003ctd\u003eSolid\u003c\/td\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_SOLID\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003ecouleur fixe\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e1\u003c\/td\u003e\n\n\u003ctd\u003eSequin\u003c\/td\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_SEQUIN\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003eéclats aléatoires, comme des paillettes sous les projecteurs\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e2\u003c\/td\u003e\n\n\u003ctd\u003eCatwalk\u003c\/td\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_CATWALK\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003eun balayage audacieux avec traînée fondu\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e3\u003c\/td\u003e\n\n\u003ctd\u003eLoom\u003c\/td\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_LOOM\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003edeux \"fils\" colorés qui s'entrecroisent\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e4\u003c\/td\u003e\n\n\u003ctd\u003eHeartbeat\u003c\/td\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_HEARTBEAT\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003ebattement double réaliste (lub-dub)\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e5\u003c\/td\u003e\n\n\u003ctd\u003eFirefly\u003c\/td\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_FIREFLY\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003elumières douces qui respirent à des endroits aléatoires\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e6\u003c\/td\u003e\n\n\u003ctd\u003eSilk\u003c\/td\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_SILK\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003ereflets lents, comme la lumière sur du tissu\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e7\u003c\/td\u003e\n\n\u003ctd\u003eEmber\u003c\/td\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_EMBER\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003elueur chaleureuse de feu de camp\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e8\u003c\/td\u003e\n\n\u003ctd\u003eAurora\u003c\/td\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_AURORA\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003eaurores boréales 🇨🇦\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e9\u003c\/td\u003e\n\n\u003ctd\u003eMorse\u003c\/td\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_FX_MORSE\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003efait clignoter un message en code Morse\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\n\u003c\/tbody\u003e\n\n\n\u003c\/table\u003e\n\n\u003cp dir=\"auto\"\u003eTous les effets respectent\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003esetEffectColor()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003e(sauf Ember et Aurora, qui utilisent leurs propres palettes) et\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003esetEffectSpeed(1–10)\u003c\/code\u003e.\u003c\/p\u003e\n\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eAstuce Morse :\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003edéfinissez votre message en premier —\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eglow.setMorseMessage(\"MEET AT 9\");\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003e— lettres, chiffres et espaces, jusqu'à 63 caractères. Fantastique pour les badges et les défis de décodage en classe.\u003c\/p\u003e\n\n\u003chr\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e🔋 Gestion de la puissance (à lire si c'est un vêtement connecté !)\u003c\/h2\u003e\n\n\u003ca id=\"user-content--power-budgeting-please-read-if-its-a-wearable\" class=\"anchor\" aria-label=\"Permalink: 🔋 Gestion de la puissance (à lire si c'est un vêtement connecté !)\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/CMozGlow\/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\n\u003c\/div\u003e\n\n\u003cp dir=\"auto\"\u003eChaque WS2812B peut consommer jusqu'à\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003e60 mA en blanc total\u003c\/strong\u003e. Treize pixels en blanc total représentent près de 0,8 A — plus que ce qu'un port USB ou une petite batterie LiPo peut fournir.\u003c\/p\u003e\n\n\u003cp dir=\"auto\"\u003eCMozGlow vous protège :\u003c\/p\u003e\n\n\n\u003cpre\u003eglow.setPowerBudgetmA(\u003cspan class=\"pl-c1\"\u003e450\u003c\/span\u003e);   \u003cspan class=\"pl-c\"\u003e\/\/ ne jamais dépasser ~450 mA\u003c\/span\u003e\u003c\/pre\u003e\n\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\n\n\u003cp dir=\"auto\"\u003eAvant chaque image, la bibliothèque estime la consommation de courant et, si vous dépassez le budget, elle réduit silencieusement l'intensité. Vous pouvez vérifier ce qui s'est passé :\u003c\/p\u003e\n\n\n\u003cpre\u003eSerial.println(glow.estimatedCurrentmA()); \u003cspan class=\"pl-c\"\u003e\/\/ consommation approx. de la dernière image\u003c\/span\u003e\nSerial.println(glow.powerLimited());       \u003cspan class=\"pl-c\"\u003e\/\/ 1 si la réduction auto. a eu lieu\u003c\/span\u003e\u003c\/pre\u003e\n\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\n\n\u003cp dir=\"auto\"\u003eBudgets suggérés :\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eport USB ≈ 450 mA\u003c\/strong\u003e,\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003epetite LiPo (400 mAh) ≈ 250 mA\u003c\/strong\u003e,\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003ealimentation dédiée 5 V\/2 A ≈ 1500 mA\u003c\/strong\u003e. L'estimation est une approximation (~20 mA par canal de couleur à pleine puissance + ~1 mA par puce au repos) — gardez toujours une marge.\u003c\/p\u003e\n\n\u003chr\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e✈️\u003cspan\u003e \u003c\/span\u003eAutoPilot — les LED obtiennent leur propre cœur CPU (avancé)\u003c\/h2\u003e\n\n\u003ca id=\"user-content-️-autopilot--the-leds-get-their-own-cpu-core-advanced\" class=\"anchor\" aria-label=\"Permalink: ✈️ AutoPilot — les LED obtiennent leur propre cœur CPU (avancé)\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/CMozGlow\/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\n\u003c\/div\u003e\n\n\u003cp dir=\"auto\"\u003eL'ESP32-S3 possède deux cœurs de processeur, et le\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eloop()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003ede votre croquis s'exécute sur le cœur 1. AutoPilot lance une petite tâche d'arrière-plan sur le\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003ecœur 0\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003equi anime les LED en continu :\u003c\/p\u003e\n\n\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\/\/ ✈️ décollage — plus besoin de update()\u003c\/span\u003e\u003c\/pre\u003e\n\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\n\n\u003cp dir=\"auto\"\u003eC'est tout. Votre\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eloop()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eest maintenant libre à 100 % pour vos capteurs, Bluetooth, tactile et servos — l'animation s'exécute littéralement sur une partie différente du silicium. Chaque appel CMozGlow reste sûr à utiliser en cours de vol (\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, couleurs, vitesse — tout), car toute la bibliothèque est protégée par un mutex récursif. Désactivez-le à tout moment avec\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\u003evous informe de l'état actuel.\u003c\/p\u003e\n\n\u003cp dir=\"auto\"\u003eBon à savoir :\u003c\/p\u003e\n\n\u003cul dir=\"auto\"\u003e\n\n\u003cli\u003e\n\n\u003cstrong\u003eQuand l'utiliser\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e— projets interactifs où le\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eloop()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eeffectue un vrai travail : échantillonnage tactile capacitif, BLE, code audio-réactif, asservissement de servos. Pour un simple croquis \"lumières seulement\", le\u003ccode\u003eupdate()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eclassique dans le\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eloop()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003esuffit amplement.\u003c\/li\u003e\n\u003cli\u003e\n\n\u003cstrong\u003eLes appels manuels \u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eshow()\u003c\/code\u003e\/\u003ccode\u003eupdate()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003esont sans risque mais inutiles en cours d'exécution\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e— AutoPilot effectue déjà le rendu selon le programme, et le minuteur d'image empêche tout double affichage.\u003c\/li\u003e\n\n\u003cli\u003e\n\n\u003cstrong\u003eLe cœur 0 est également le cœur Wi-Fi\/BLE.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eLa tâche de rendu est légère (priorité 1, en veille entre les images), ils cohabitent donc sans problème, mais si vous générez un trafic Wi-Fi intense \u003cem\u003eet\u003c\/em\u003e utilisez plus de 500 LED, vérifiez vos temps de traitement.\u003c\/li\u003e\n\n\u003cli\u003e\n\n\u003cstrong\u003eL'arrêt est propre.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eautoUpdate(false)\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eet\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eend()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eattendent que la tâche confirme son arrêt et que le matériel termine l'image en cours avant toute manipulation de mémoire. Aucune tâche suspendue, aucune erreur d'accès à la mémoire libérée (use-after-free) — jamais.\u003c\/li\u003e\n\n\n\u003c\/ul\u003e\n\n\u003cp dir=\"auto\"\u003eEssayez\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eFichier → Exemples → CMozGlow → CMozGlow_AutoPilot\u003c\/strong\u003e : il compte les tours de\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eloop()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003epar seconde afin que vous puissiez\u003cspan\u003e \u003c\/span\u003e\u003cem\u003econstater\u003c\/em\u003e\u003cspan\u003e \u003c\/span\u003eà quel point votre programme est déchargé.\u003c\/p\u003e\n\n\u003chr\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e🚑 Gestion des erreurs\u003c\/h2\u003e\n\n\u003ca id=\"user-content--error-handling\" class=\"anchor\" aria-label=\"Permalink: 🚑 Gestion des erreurs\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/CMozGlow\/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\n\u003c\/div\u003e\n\n\u003cp dir=\"auto\"\u003eChaque appel susceptible d'échouer renvoie\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003efalse\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eet enregistre une raison :\u003c\/p\u003e\n\n\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\/\/ \"l'index du pixel dépasse la fin du ruban — les index vont de 0 à numPixels()-1\"\u003c\/span\u003e\n}\u003c\/pre\u003e\n\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\n\n\u003cp dir=\"auto\"\u003eUtilisez le pixel embarqué comme voyant d'état en direct — idéal pour déboguer un costume sur lequel vous ne pouvez pas brancher de moniteur série :\u003c\/p\u003e\n\n\n\u003cpre\u003eglow.statusPixel(\u003cspan class=\"pl-c1\"\u003etrue\u003c\/span\u003e);   \u003cspan class=\"pl-c\"\u003e\/\/ pixel 0 : vert pâle = tout va bien, rouge = une erreur est survenue\u003c\/span\u003e\u003c\/pre\u003e\n\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\n\n\u003ctable\u003e\n\n\u003cthead\u003e\n\n\u003ctr\u003e\n\n\u003cth\u003eCode\u003c\/th\u003e\n\n\u003cth\u003eSignification\u003c\/th\u003e\n\n\n\u003c\/tr\u003e\n\n\n\u003c\/thead\u003e\n\n\u003ctbody\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_OK\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003etout est normal\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_NOT_BEGUN\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003e\n\n\u003ccode\u003ebegin()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003en'a pas été appelé ou a échoué\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_BAD_PIN\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003ecette broche GPIO ne peut pas piloter de LED (utilisez 0–21 ou 33–48)\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_BAD_COUNT\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003ele nombre de LED doit être compris entre 1 et 2000\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_ALLOC\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003emémoire insuffisante (ruban trop long)\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_RMT\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003eéchec du démarrage du périphérique LED\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_INDEX\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003el'index du pixel dépasse la fin du ruban\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_BAD_EFFECT\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003ele numéro d'effet n'existe pas (valides : 0–9)\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_BAD_ARG\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003eargument hors limites\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\u003ctr\u003e\n\n\u003ctd\u003e\u003ccode\u003eCMOZ_ERR_TASK\u003c\/code\u003e\u003c\/td\u003e\n\n\u003ctd\u003ela tâche d'arrière-plan d'AutoPilot n'a pas pu démarrer ou s'arrêter\u003c\/td\u003e\n\n\n\u003c\/tr\u003e\n\n\n\u003c\/tbody\u003e\n\n\n\u003c\/table\u003e\n\n\u003cp dir=\"auto\"\u003eUtilisez\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eglow.lastError()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003epour le code,\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eglow.errorText()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003epour la description, et\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eglow.clearError()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003epour réinitialiser.\u003c\/p\u003e\n\n\u003chr\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e📖 API complète\u003c\/h2\u003e\n\n\u003ca id=\"user-content--full-api\" class=\"anchor\" aria-label=\"Permalink: 📖 API complète\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/CMozGlow\/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\n\u003c\/div\u003e\n\n\n\u003cpre\u003eCMozGlow \u003cspan class=\"pl-en\"\u003eglow\u003c\/span\u003e(numLeds);            \u003cspan class=\"pl-c\"\u003e\/\/ GPIO 3 par défaut\u003c\/span\u003e\nCMozGlow \u003cspan class=\"pl-en\"\u003eglow\u003c\/span\u003e(numLeds, pin);       \u003cspan class=\"pl-c\"\u003e\/\/ ou toute broche de sortie ESP32-S3 valide\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\/\/ appeler une fois dans setup() ; false = vérifier 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 chacun\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\/\/ format 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\/\/ transmettre l'image au matériel ; retourne en ~µ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\/\/ aspect\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\/\/ variateur principal non destructif\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\/\/ correction gamma, activée par défaut\u003c\/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\/\/ sécurité portable\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 = illimité\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\/\/ effets (non bloquants)\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\/\/ ou constantes CMOZ_FX_…\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\/\/ à appeler dans chaque loop() ; true lors du rendu\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 (avancé)\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\/\/ attribuer aux LED leur propre cœur CPU \/ arrêter\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\/\/ erreurs\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\/\/ pixel embarqué comme témoin d'état\u003c\/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\/\/ outils couleur\u003c\/span\u003e\n\u003cspan class=\"pl-en\"\u003eCMozGlow::Color\u003c\/span\u003e(r, g, b);          \u003cspan class=\"pl-c\"\u003e\/\/ créer une couleur\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\/\/ parcourir l'arc-en-ciel\u003c\/span\u003e\u003c\/pre\u003e\n\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\n\n\u003chr\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e🔧 Dépannage\u003c\/h2\u003e\n\n\u003ca id=\"user-content--troubleshooting\" class=\"anchor\" aria-label=\"Permalink: 🔧 Dépannage\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/CMozGlow\/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\n\u003c\/div\u003e\n\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eRien ne s'allume.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eConsultez d'abord le message de\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eerrorText()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003edans le\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eSerial\u003c\/code\u003e. Ensuite :\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eLED_PIN\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003ecorrespond-il bien à la broche utilisée par le DIN de votre ruban ? Le ruban et la carte partagent-ils une masse (GND) commune ?\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eNUM_LEDS\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eest-il au moins égal à 1 ?\u003c\/p\u003e\n\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eSeul le pixel embarqué fonctionne.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eNUM_LEDS\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eest probablement resté à 1 — n'oubliez pas d'ajouter la longueur de votre ruban. Vérifiez également que la flèche sur le ruban pointe bien \u003cem\u003eà l'opposé\u003c\/em\u003e de la carte (les données circulent dans une seule direction).\u003c\/p\u003e\n\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eLes couleurs semblent ternes.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eC'est probablement le budget énergétique qui fait son travail — vérifiez\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003epowerLimited()\u003c\/code\u003e. N'augmentez ce budget que si votre source d'alimentation peut le supporter.\u003c\/p\u003e\n\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eLes couleurs semblent \"fausses\" par rapport à une autre bibliothèque.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eCMozGlow effectue une correction gamma par défaut pour que les mélanges de couleurs paraissent naturels. Pour des valeurs brutes, appelez\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eglow.setGamma(false);\u003c\/code\u003e.\u003c\/p\u003e\n\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eLe premier pixel scintille avec un long ruban.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eLes longs câblages bénéficient d'une résistance de 300–500 Ω sur la ligne de données et d'un condensateur de 500–1000 µF aux bornes de l'alimentation — disponibles sur TinkerTailor.ca. 😉\u003c\/p\u003e\n\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eLa compilation et l'exécution fonctionnent, mais le moniteur série n'affiche rien.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eDans Outils, assurez-vous que\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eBoard = ESP32S3 Dev Module\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eet\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eUSB CDC On Boot = Enabled\u003c\/strong\u003e, puis téléversez à nouveau. Sans le CDC activé, le S3 envoie les données série vers un port UART auquel vous n'êtes pas connecté.\u003c\/p\u003e\n\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eErreur ctags \"cannot open temporary file\" avant la compilation (Windows).\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eCela ne vient pas de votre programme — il s'agit de fichiers obsolètes dans le dossier temporaire de Windows. Fermez l'IDE, appuyez sur Win + R, tapez\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003e%TEMP%\u003c\/code\u003e, supprimez le contenu et réessayez.\u003c\/p\u003e\n\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eLa compilation réussit mais\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003ebegin()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003erenvoie false.\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eAffichez\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eerrorText()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003e— il précisera le problème exact (broche incorrecte, trop de LED, mémoire insuffisante ou périphérique RMT utilisé par une autre bibliothèque).\u003c\/p\u003e\n\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eVous utilisez du fil conducteur ?\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003eGardez la ligne de données courte et cousez une ligne de masse le long de celle-ci. Les données des WS2812B sont sensibles au timing ; avec moins de 30 cm de fil, cela fonctionne généralement bien à une luminosité adaptée aux vêtements.\u003c\/p\u003e\n\n\u003chr\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\n\n\u003ch2 class=\"heading-element\" dir=\"auto\" tabindex=\"-1\"\u003e🧠 Fonctionnement (pour les curieux)\u003c\/h2\u003e\n\n\u003ca id=\"user-content--how-it-works-for-curious-minds\" class=\"anchor\" aria-label=\"Permalink: 🧠 Fonctionnement (pour les curieux)\" href=\"https:\/\/github.com\/cmoz\/CMozESP32Board\/blob\/main\/CMozGlow\/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\n\u003c\/div\u003e\n\n\u003cp dir=\"auto\"\u003eCMozGlow pilote les LED avec le\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003epériphérique RMT\u003c\/strong\u003e\u003cspan\u003e \u003c\/span\u003ede l'ESP32-S3 — un composant matériel qui génère seul la forme d'onde complexe de 800 kHz des WS2812B — et il le fait\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003ede manière asynchrone\u003c\/strong\u003e :\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eshow()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003econstruit l'image (via une table de correspondance octet→forme d'onde précalculée), la transmet au matériel et rend la main immédiatement pendant que les LED sont en cours de rafraîchissement. L'intervalle obligatoire de \"verrouillage\" ≥280 µs est encodé à la fin de chaque transfert matériel, donc il n'y a\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eaucune attente active (busy-waiting) dans la bibliothèque\u003c\/strong\u003e. Le prochain\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eshow()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003evérifie simplement que l'image précédente a bien quitté le fil — ce qui est largement le cas à n'importe quel taux de rafraîchissement normal.\u003c\/p\u003e\n\n\u003cp dir=\"auto\"\u003eRésultat pratique : sur un ruban de 200 LED, un envoi bloquant traditionnel fige votre programme pendant ~6 ms \u003cem\u003epar image\u003c\/em\u003e ; CMozGlow gère le transfert en environ 100 µs. Ajoutez AutoPilot, et le coût pour votre\u003cspan\u003e \u003c\/span\u003e\u003ccode\u003eloop()\u003c\/code\u003e\u003cspan\u003e \u003c\/span\u003eest nul.\u003c\/p\u003e\n\n\u003cp dir=\"auto\"\u003eCela fonctionne automatiquement sur les noyaux arduino-esp32 2.x et 3.x, et est thread-safe.\u003c\/p\u003e\n\n\u003chr\u003e\n\n\u003cp dir=\"auto\"\u003eFabriqué avec 💛 au Canada · Sous licence MIT · Tutoriels sur la chaîne YouTube\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eCMozMaker\u003c\/strong\u003e · Pièces \u0026amp; tissus conducteurs sur\u003cspan\u003e \u003c\/span\u003e\u003cstrong\u003eTinkerTailor.ca\u003c\/strong\u003e\u003c\/p\u003e\n\n\n\u003c\/div\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\/fr\/products\/library-program-for-ws2812b-neopixels","provider":"Tinker Tailor","version":"1.0","type":"link"}