{"product_id":"esp32-c3-25-led-matrix-board","title":"ESP32 C3 Board with 25 Lights Matrix","description":"\u003cp\u003eNote: \u003cstrong\u003eLIMITED \u003c\/strong\u003ePRODUCT!\u003c\/p\u003e\n\u003cp\u003eAn ultra-compact ESP32-C3 dev board with a built-in \u003cstrong\u003e5×5 matrix of 25 WS2812B-1515 RGB LEDs\u003c\/strong\u003e — perfect for wearables, IoT sensors, and any project that needs wireless connectivity plus dazzling visual output in a tiny footprint.\u003c\/p\u003e\n\u003cp\u003e\u003ciframe width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/sXc_ZhFLrLg?si=LY6cxA-Ao7xdpNgd\" title=\"YouTube video player\"\u003e\u003c\/iframe\u003e\u003c\/p\u003e\n\u003cp\u003e\u003ciframe width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/8e2qXAOdp-A?si=H6Q1YJNm6kmVIc_f\" title=\"YouTube video player\"\u003e\u003c\/iframe\u003e\u003c\/p\u003e\n\u003ch3\u003eKey Features\u003c\/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSoC: ESP32-C3FH4, RISC-V 32-bit @ 160MHz\u003c\/li\u003e\n\u003cli\u003eMemory: 400KB SRAM, 4MB Flash\u003c\/li\u003e\n\u003cli\u003eWireless: 2.4GHz WiFi + Bluetooth 5 LE (long-range)\u003c\/li\u003e\n\u003cli\u003eSecurity: RSA-3072 secure boot, AES-128-XTS flash encryption\u003c\/li\u003e\n\u003cli\u003eDisplay: 25 × WS2812B-1515 RGB LEDs in a 5×5 matrix\u003c\/li\u003e\n\u003cli\u003eUSB: USB-C (CH340E USB-to-TTL)\u003c\/li\u003e\n\u003cli\u003eGPIO: 11 GPIOs via 2 × 7-pin headers + 4-pin header\u003c\/li\u003e\n\u003cli\u003ePower: 5V → 3.3V DC\/DC (2 channels)\u003c\/li\u003e\n\u003cli\u003eButtons: Enable + User\u003c\/li\u003e\n\u003cli\u003eDimensions: 21 × 18mm | Weight: ~2.3g\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch3\u003eGetting started\u003c\/h3\u003e\n\u003cul\u003e\n\u003cli\u003eCompatible with Arduino IDE, MicroPython, ESP-IDF\u003c\/li\u003e\n\u003cli\u003eTo view Serial Monitor output: \u003cstrong\u003eTools → USB CDC On Boot → Enabled\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003eUpload tip: Hold \u003cstrong\u003eB\u003c\/strong\u003e, press \u0026amp; release \u003cstrong\u003eR\u003c\/strong\u003e, keep holding \u003cstrong\u003eB\u003c\/strong\u003e, trigger upload in Arduino IDE, release \u003cstrong\u003eB\u003c\/strong\u003e when connected\u003c\/li\u003e\n\u003cli\u003eGitHub examples: \u003ca href=\"https:\/\/github.com\/01Space\/ESP32-C3FH4-RGB\" target=\"_blank\"\u003eESP32-C3FH4-RGB\u003c\/a\u003e | \u003ca href=\"https:\/\/github.com\/01Space\/ESP32-PICO-D4-RGB\" target=\"_blank\"\u003eESP32-PICO-D4-RGB\u003c\/a\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch3\u003eRelated products\u003c\/h3\u003e\n\u003cul\u003e\n\u003cli\u003eWant a standard 30-pin ESP32? See the \u003ca href=\"https:\/\/www.tinkertailor.ca\/products\/esp32-development-board\"\u003eESP32 Development Board 30-pin\u003c\/a\u003e.\u003c\/li\u003e\n\u003cli\u003eNeed a compact ESP32-C3 without the LED matrix? Try the \u003ca href=\"https:\/\/www.tinkertailor.ca\/products\/beetle-esp32-c3-risc-v-core-development-board-1\"\u003eBeetle ESP32-C3\u003c\/a\u003e.\u003c\/li\u003e\n\u003cli\u003eWant to prototype NeoPixel effects first? Use the \u003ca href=\"https:\/\/www.tinkertailor.ca\/products\/whoa-neo-tester-get-your-prototyping-on-with-our-unique-mini-8-rgb-led-circuit-board-strip\"\u003eNeo Tester – 8-LED WS2812B Strip\u003c\/a\u003e.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003e \u003c\/p\u003e\n\n\u003cpre data-lang=\"platformio.ini\"\u003e\u003ccode\u003e; ============================================================\n;  Test: demo for the ESP32-C3 25-LED matrix board\n;  tinkertailor.ca\n; ============================================================\n[env:c3_matrix_demo]\nplatform = https:\/\/github.com\/pioarduino\/platform-espressif32\/releases\/download\/stable\/platform-espressif32.zip\nframework = arduino\nboard = esp32-c3-devkitm-1\nmonitor_speed = 115200\n \n; This board sends serial over the built-in USB port\nbuild_flags =\n  -D ARDUINO_USB_MODE=1\n  -D ARDUINO_USB_CDC_ON_BOOT=1\nmonitor_rts = 0\nmonitor_dtr = 0\n \n; Library that drives the LEDs\nlib_deps =\n    adafruit\/Adafruit NeoPixel\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cpre data-lang=\"main.cpp\"\u003e\u003ccode\u003e\/\/ ============================================================\n\/\/  Tinker Tailor demo for the ESP32-C3 5 x 5 LED matrix board\n\/\/  tinkertailor.ca\n\/\/\n\/\/  Five short scenes play one after another:\n\/\/    1. Rainbow wave\n\/\/    2. Beating heart\n\/\/    3. Rain\n\/\/    4. Tinker Tailor fox\n\/\/    5. Twinkling sparkle\n\/\/\n\/\/  Pins on this board:\n\/\/    LED data (25 x WS2812) = GPIO8\n\/\/    Header pins: GND, 3V, GPIO0, GPIO1\n\/\/\n\/\/  The LEDs run row by row, left to right, so the LED at column\n\/\/  x and row y (both counted from 0, top left) is number y * 5 + x.\n\/\/ ============================================================\n\n#include \u0026lt;Arduino.h\u0026gt;\n#include \u0026lt;Adafruit_NeoPixel.h\u0026gt;\n\nconst int LED_PIN = 8;\nconst int GRID = 5;\nconst int LED_COUNT = GRID * GRID;\n\n\/\/ Brightness 0 to 255. These LEDs are very bright, so keep it low.\nconst int BRIGHTNESS = 30;\n\n\/\/ How long each scene plays, in milliseconds\nconst unsigned long SCENE_TIME = 6000;\nconst int SCENE_COUNT = 5;\n\nAdafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);\n\nint currentScene = 0;\nunsigned long sceneStart = 0;\n\n\/\/ Turn column x and row y into the LED number\nint ledIndex(int x, int y) {\n  return y * GRID + x;\n}\n\n\/\/ Scale a colour by an amount from 0.0 (off) to 1.0 (full)\nuint32_t scaled(uint8_t r, uint8_t g, uint8_t b, float amount) {\n  if (amount \u0026lt; 0) amount = 0;\n  if (amount \u0026gt; 1) amount = 1;\n  return strip.Color(r * amount, g * amount, b * amount);\n}\n\n\/\/ ---------- Scene 1: rainbow wave ----------\nvoid sceneRainbow(unsigned long t) {\n  for (int y = 0; y \u0026lt; GRID; y++) {\n    for (int x = 0; x \u0026lt; GRID; x++) {\n      \/\/ Hue is a number from 0 to 65535 around the colour wheel\n      uint16_t hue = (uint16_t)(t * 12 + (x + y) * 6500);\n      strip.setPixelColor(ledIndex(x, y), strip.ColorHSV(hue, 255, 255));\n    }\n  }\n}\n\n\/\/ ---------- Scene 2: beating heart ----------\n\/\/ 1 means the LED is part of the heart\nconst uint8_t heart[GRID][GRID] = {\n  {0, 1, 0, 1, 0},\n  {1, 1, 1, 1, 1},\n  {1, 1, 1, 1, 1},\n  {0, 1, 1, 1, 0},\n  {0, 0, 1, 0, 0}\n};\n\nvoid sceneHeart(unsigned long t) {\n  \/\/ Two quick beats, then a rest, repeating every 1.2 seconds\n  unsigned long beat = t % 1200;\n  float amount = 0.25;\n  if (beat \u0026lt; 150)                  amount = 0.25 + beat \/ 150.0 * 0.75;\n  else if (beat \u0026lt; 300)             amount = 1.0 - (beat - 150) \/ 150.0 * 0.6;\n  else if (beat \u0026lt; 450)             amount = 0.4 + (beat - 300) \/ 150.0 * 0.6;\n  else if (beat \u0026lt; 700)             amount = 1.0 - (beat - 450) \/ 250.0 * 0.75;\n\n  for (int y = 0; y \u0026lt; GRID; y++) {\n    for (int x = 0; x \u0026lt; GRID; x++) {\n      if (heart[y][x]) {\n        strip.setPixelColor(ledIndex(x, y), scaled(255, 20, 80, amount));\n      }\n    }\n  }\n}\n\n\/\/ ---------- Scene 3: rain ----------\nvoid sceneRain(unsigned long t) {\n  \/\/ Each column has its own speed and starting point\n  const int speedMs[GRID]  = {110, 150, 90, 130, 170};\n  const int startAt[GRID]  = {0, 4, 2, 6, 1};\n\n  for (int x = 0; x \u0026lt; GRID; x++) {\n    \/\/ The drop moves down and spends a few steps off screen\n    \/\/ before it comes back at the top\n    int head = (t \/ speedMs[x] + startAt[x]) % 9;\n    for (int tail = 0; tail \u0026lt; 3; tail++) {\n      int y = head - tail;\n      if (y \u0026gt;= 0 \u0026amp;\u0026amp; y \u0026lt; GRID) {\n        float amount = (tail == 0) ? 1.0 : (tail == 1 ? 0.35 : 0.12);\n        strip.setPixelColor(ledIndex(x, y), scaled(40, 120, 255, amount));\n      }\n    }\n  }\n}\n\n\/\/ ---------- Scene 4: fox ----------\n\/\/ 0 = off, 1 = orange fur, 2 = white\nconst uint8_t fox[GRID][GRID] = {\n  {1, 0, 0, 0, 1},\n  {1, 1, 1, 1, 1},\n  {1, 0, 1, 0, 1},\n  {0, 2, 2, 2, 0},\n  {0, 0, 2, 0, 0}\n};\n\nvoid sceneFox(unsigned long t) {\n  \/\/ A gentle glow so the fox looks alive\n  float glow = 0.75 + 0.25 * sin(t \/ 350.0);\n  for (int y = 0; y \u0026lt; GRID; y++) {\n    for (int x = 0; x \u0026lt; GRID; x++) {\n      if (fox[y][x] == 1) {\n        strip.setPixelColor(ledIndex(x, y), scaled(255, 70, 0, glow));\n      } else if (fox[y][x] == 2) {\n        strip.setPixelColor(ledIndex(x, y), scaled(255, 200, 160, glow));\n      }\n    }\n  }\n}\n\n\/\/ ---------- Scene 5: twinkling sparkle ----------\nvoid sceneSparkle(unsigned long t) {\n  for (int i = 0; i \u0026lt; LED_COUNT; i++) {\n    \/\/ Each LED rises and falls on its own timing\n    float wave = sin((t + i * 337) \/ 280.0);\n    float amount = (wave \u0026gt; 0) ? wave * wave : 0;\n    \/\/ Teal and gold, the Tinker Tailor colours\n    if (i % 2 == 0) {\n      strip.setPixelColor(i, scaled(0, 220, 200, amount));\n    } else {\n      strip.setPixelColor(i, scaled(255, 180, 20, amount));\n    }\n  }\n}\n\nvoid setup() {\n  strip.begin();\n  strip.setBrightness(BRIGHTNESS);\n  strip.clear();\n  strip.show();\n  sceneStart = millis();\n}\n\nvoid loop() {\n  unsigned long now = millis();\n  unsigned long t = now - sceneStart;\n\n  \/\/ Move to the next scene when time is up\n  if (t \u0026gt;= SCENE_TIME) {\n    currentScene = (currentScene + 1) % SCENE_COUNT;\n    sceneStart = now;\n    t = 0;\n  }\n\n  strip.clear();\n\n  switch (currentScene) {\n    case 0: sceneRainbow(t); break;\n    case 1: sceneHeart(t);   break;\n    case 2: sceneRain(t);    break;\n    case 3: sceneFox(t);     break;\n    case 4: sceneSparkle(t); break;\n  }\n\n  strip.show();\n  delay(20);\n}\u003c\/code\u003e\u003c\/pre\u003e","brand":"Tinker Tailor","offers":[{"title":"Default Title","offer_id":50068053262569,"sku":"ESP32-C3-MATRIX-LEDS","price":24.75,"currency_code":"CAD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0790\/8006\/3209\/files\/fc275c37-20220815_092535_edited_edited_edited.jpg?v=1769271453","url":"https:\/\/www.tinkertailor.ca\/products\/esp32-c3-25-led-matrix-board","provider":"Tinker Tailor","version":"1.0","type":"link"}