How to Use M5Stack Unit Puzzle?
What is Unit Puzzle?
Recently, M5Stack launched a new product called Unit Puzzle. Unit Puzzle is a multi-color light control unit consisting of an 8x8 RGB array made up of 64 WS2812E RGB LEDs.
I first saw it at a MakerFaire show like this:

That makes me happy, you know that we like LED very much, so I got 10 unit puzzle immediately. Let's have some fun.
Hardware Hookup
About the microcontroller, you guys know what's my favorite. That's right, M5Stack ATOM Lite.
And the unit included a unit puzzle, a connector, a Grove cable. That means we can put all the units together.



Code Part
First Version
//The unit puzzle used WS2812E, which means Adafruit_NeoPixel library is our best choice #include //And define part: #define PIN 26 #define NUMPIXELS 512 //The official recommendation for long-term lighting is 10% brightness, so we use 25 #define BRIGHTNESS 25 // Brightness range(0-255) Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); //I need display letters 'OPENELAB' int letters[8][64] = { {30, 38, 21, 45, 20, 44, 19, 43, 18, 42, 17, 41, 24, 32}, // O {22, 30, 38, 46, 21, 45, 20, 44, 19, 27, 35, 43, 18, 17, 16}, // P {22, 30, 38, 46, 21, 20, 19, 27, 35, 43, 18, 17, 16, 24, 32, 40}, // E {22, 46, 21, 45, 20, 28, 44, 19, 27, 35, 43, 18, 34, 42, 17, 41, 16, 40}, // N {22, 30, 38, 46, 21, 20, 19, 27, 35, 43, 18, 17, 16, 24, 32, 40}, // E {22, 21, 20, 19, 18, 17, 16, 24, 32, 40}, // L {30, 38, 21, 45, 20, 44, 19, 27, 35, 43, 18, 42, 17, 41, 16, 40}, // A {22, 30, 38, 21, 45, 20, 36, 19, 27, 18, 34, 17, 41, 16, 24, 32} // B }; //Initialize the NeoPixel library, set the brightness, turn off all pixels, call the function that displays text, and then loop empty void setup() { pixels.begin(); pixels.setBrightness(BRIGHTNESS); pixels.show(); displayText(); } void loop() { } // Clear all lamp beads void displayText() { pixels.clear(); // Set the position of the lamp beads to display each character for (int charIndex = 0; charIndex < 8; charIndex++) { for (int i = 0; i < 64; i++) { if (letters[charIndex][i] != -1) { int pixelIndex = charIndex * 64 + letters[charIndex][i]; pixels.setPixelColor(pixelIndex, pixels.Color(255, 0, 0)); // Sets the pixel at the specified position to red } } } pixels.show();
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

First Show
Very perfect display, but every pixel 0 lit up. Too weird, it should be used for positioning. Never mind, let's turn it off.

Second Version
// In the define section, increase the color cycle time by 0.5 seconds #define COLOR_CHANGE_INTERVAL 500 // Define the character part to add characters to display red, green and blue in three colors int letters[8][64] = { {30, 38, 21, 45, 20, 44, 19, 43, 18, 42, 17, 41, 24, 32}, // O {22, 30, 38, 46, 21, 45, 20, 44, 19, 27, 35, 43, 18, 17, 16}, // P {22, 30, 38, 46, 21, 20, 19, 27, 35, 43, 18, 17, 16, 24, 32, 40}, // E {22, 46, 21, 45, 20, 28, 44, 19, 27, 35, 43, 18, 34, 42, 17, 41, 16, 40}, // N {22, 30, 38, 46, 21, 20, 19, 27, 35, 43, 18, 17, 16, 24, 32, 40}, // E {22, 21, 20, 19, 18, 17, 16, 24, 32, 40}, // L {30, 38, 21, 45, 20, 44, 19, 27, 35, 43, 18, 42, 17, 41, 16, 40}, // A {22, 30, 38, 21, 45, 20, 36, 19, 27, 18, 34, 17, 41, 16, 24, 32} // B }; unsigned long lastColorChangeTime = 0; int currentColorIndex = 0; uint32_t colors[3] = {pixels.Color(255, 0, 0), pixels.Color(0, 255, 0), pixels.Color(0, 0, 255)}; // Add switching colors in the loop void loop() { unsigned long currentTime = millis(); if (currentTime - lastColorChangeTime >= COLOR_CHANGE_INTERVAL) { lastColorChangeTime = currentTime; displayText(); currentColorIndex = (currentColorIndex + 1) % 3; } } // Make sure the first lamp bead (pixel 0) of all matrices is off for (int charIndex = 0; charIndex < 8; charIndex++) { int firstPixelIndex = charIndex * 64; if (firstPixelIndex < NUMPIXELS) { pixels.setPixelColor(firstPixelIndex, pixels.Color(0, 0, 0));
Second Show
Beautiful

Other Version
// Define the color corresponding to each character uint32_t characterColors[8] = { pixels.Color(255, 0, 0), // O - Red pixels.Color(0, 255, 0), // P - Green pixels.Color(0, 0, 255), // E - Blue pixels.Color(255, 255, 0), // N - Yellow pixels.Color(0, 255, 255), // E - Light blue pixels.Color(255, 0, 255), // L - Magenta pixels.Color(255, 128, 0), // A - Orange pixels.Color(128, 0, 128) // B - Purple };

Summary
Unit Puzzle is a funny neopixel LED matrix. It makes me happy all day long.
Do you have any other fun ways to play? Let’s share it together.
Leave a comment
All blog comments are checked prior to publishing