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.
M5Stack ATOM Echo
View ProductI 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.
M5Stack ATOM Lite
View ProductAnd the unit included a unit puzzle, a connector, a Grove cable. That means we can put all the units together.
Let's put them 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